5장에서 살펴본 프로그램 6-1-2를 다시 한번 생각해보자. 이 프로그램에 포함된 while 문의 반복 회수를 추적하기 위해서 count 변수가 사용되었다. 이와 같이 반복 회수를 추적하는 변수를 루프제어변수(loop control variable)라 한다.

다음은 루프제어변수의 관점에서 프로그램 6-1-2를 분석한 구조를 보여준다.

 

루프제어변수의 관점에서 3가지의 행동이 while 문과 연관되는 것을 알 수 있다: 루프제어변수 초기화, 반복 조건(루프제어변수 포함) 평가, 루프제어변수 변경.

while 구조에 진입하기 전에 루프제어변수를 초기화하고, while 문의 각 반복 초기에 반복 계속 여부를 판단하기 위해서 반복 조건을 평가한다. 반복 조건에는 루프제어변수가 반드시 포함된다. 그리고 반복 종료 직전에 루프제어변수를 변경한다. 이러한 루프제어변수의 변경은 반복 조건에 영향을 미치기 위해서 절대적으로 필요하다.

여러분은 루프제어변수의 초기값, 최종값, 변경되는 값을 알면 while 문의 반복 회수를 미리 알 수 있다. 가령, 위의 경우에 루프제어변수 count의 초기값이 0이고, 최종값은 9이며, 각 반복시에 변경되는 값은 1이다. 이 결과로부터 while 문의 반복 회수는 10임을 알 수 있다.

C는 반복 회수를 미리 알 수 있는 반복 구조를 while 문 보다 효과적으로 표현할 수 있는 for 문을 제공한다.

다음은 for 문의 일반 형식이다.

 

          for (초기화리스트; 반복 조건; 변경리스트)
             문장들;

초기화리스트에는 루프제어변수에 대한 초기값 설정이 표현되며, 반복 조건은 루프제어변수와 그 최종값을 비교하여 반복의 계속 여부를 판단하는 조건 식이 표현되고, 변경리스트에는 루프제어변수의 값 변경이 표현된다.

for 문의 실행 의미는 while 문과 비교하면 쉽게 이해할 수 있다. 다음은 for 문 구조와 while 문 구조를 비교한다.


<그림 6.1>

따라서 for 문의 의미는 다음과 같다: 먼저 초기화리스트를 수행하고, 반복 조건을 평가한다. 반복 조건이 참으로 평가되면, 문장을 수행하고, 다음에 변경리스트를 수행한 후에 다음번째 반복으로 이동한다. 만약에 반복 조건이 거짓으로 평가되면 for 문을 탈출한다.

for 문의 의미는 실로 대응되는 while 문의 의미와 동일하다는 것을 알 수 있다. 따라서 for 문은 항상 의미가 동일한 while 문으로 변환시킬 수 있다.

다음 프로그램은 프로그램 6-1-2에서 while 문 대신에 for 문을 사용하여 다시 작성한 것이다. 프로그램 6-1-5와 6-1-2의 실행 결과는 동일하다. 두 프로그램간에 차이점을 살펴보라.

       
 

     #include <stdio.h>
     main()
     {
           int n, sum = 0;
           for( count =0 ; count < 10 ; count = count + 1) {
                scanf("%d", &n);
                sum = sum + n;
            }
            printf("%d\n", sum);
      }

 
     
위의 프로그램에서 루프제어변수 count의 증가분은 1이다. 그러나 반드시 1일 필요는 없다. 임의의 값일 수 있다. 다음 프로그램에서는 for 문의 각 반복 종료 직전에 count의 값이 2씩 증가한다.

       
 

     #include <stdio.h>
     main()
     {
           int n, sum = 0;
           for( count =0 ; count < 10 ; count = count + 2) {
                scanf("%d", &n);
                sum = sum + n;
              }
            printf("%d\n", sum);
      }

 
     
위의 프로그램의 for 문에서 count가 2씩 증가하기 때문에 반복 회수는 프로그램 6-1-5에 비해서 절반으로 줄어든다는 것을 유의하라.

while 문처럼 for 문에서도 break 문과 continue 문을 사용할 수 있다. 다음 프로그램들은 프로그램 6-1-36-1-4를 while 문 대신에 for 문을 사용하여 다시 작성한 것이다.

       
 

     #include <stdio.h>
     main()
     {
           int n, sum = 0;
           for( count =0 ; count < 10 ; count = count + 1) {
                scanf("%d", &n);
                if ( n == 999 )
                        break;
                sum = sum + n;
                }
            printf("%d\n", sum);
      }

 
     
 

       
 

     #include <stdio.h>
     main()
     {
           int n, sum = 0;
           for( count =0 ; count < 10 ; count = count + 1) {
                scanf("%d", &n);
                if ( n <= 0 )
                        continue;
                sum = sum + n;
                }
            printf("%d\n", sum);
      }

 
     


프로그램 6-1-76-1-3과 의미가 동일하며, 프로그램 6-1-86-1-4와 의미가 동일하다.

다음은 for 문에 대한 알고리즘 구조를 보여준다.

 

for 문은 반복 회수를 미리 알고 있고, 따라서 실행시에 반복 회수를 추적해야 하기 때문에, 루프제어변수가 반드시 필요하다.

for 문의 알고리즘의 헤더는 루프제어변수초기값, 최종값, 증가분을 각각 표현한다. 이 알고리즘 구조는 for 문의 형식과 유사하며, 그 의미도 유사하게 해석된다.

즉, 루프제어변수초기값을 설정하고, 루프제어변수의 값이 최종값을 넘어서지 않는지를 판단하고, 그렇다면 본체를 수행하고, 루프제어변수의 값을 증가분만큼 증가시키고, 다음 반복으로 이동한다. 그렇지 않으면 for 구조를 탈출한다.

위의 구조에서 '←' 기호는 배정을 의미한다. 즉, 오른쪽에 위치한 값을 왼쪽에 위치한 변수에 배정한다.

      분석    
 

 

 

분석 사항

                    내용
 

문제 입력

    은행 구좌 초기 입금액 (int balance)  
    년 이율 ( 기호 상수 : INTEREST)
 

문제 출력

    10년후 은행 구좌 금액 (int balance)
 

추가된 변수

    반복 회수를 제어하기 위한 변수(int count)
 

관계식

     1년후 구좌금액 : balance = (1+INTEREST)*balance


문제 입력은 은행 구좌 최초 입금액과 은행의 년 이율이다. 년 이율은 고정된 값으로 생각할 수 있기 때문에 기호상수로 정의하여 사용한다. 문제의 출력은 10년후 동일한 은행 구좌에 포함된 금액이다.

이율이 년 단위이기 때문에, 년 단위로 은행 구좌 금액을 계산한다. 따라서 년 이율을 적용한 은행 구좌 금액 계산이 10번 반복되므로, 여러분은 문제 해결을 위해서 반복 구조를 생각한다. 따라서 반복 구조의 반복 회수를 제어하기 위한 변수 count를 생각한다.

위 문제에서 10년 후의 구좌 금액을 계산하므로, 반복 구조의 반복 회수가 10이다. 반복 구조의 반복 회수를 미리 알 수 있으므로, while 문보다는 for 문을 사용하여 반복 구조를 표현하는 것이 더 적절하다는 것을 알 수 있다.

 
     


      설계    
 


분석 결과에 따라서 for 문의 반복 구조를 사용하여 문제 해결 과정을 설계한다. 앞에서 다룬 for 문을 알고리즘 구조를 사용하여 다음과 같이 설계한다.


 

 
     

      구현    
 

알고리즘 6-4에 대한 C 프로그램 버전을 다음과 같이 작성된다.

 
     

여러분은 프로그램 6-4를 쉽게 이해할 수 있을 것으로 생각한다. for 문의 헤더에서 두 가지 사항을 설명한다. 먼저, 루프제어변수 count 선언이 초기값 설정과 함께 for 문 헤더에 이루어지고 있음을 볼 수 있다. C에서 for 문의 초기화리스트에서 루프제어변수를 선언과 함께 초기화시키는 것은 올바르다.

두 번째는 변경리스트에 관한 것이다. 여러분은 지금까지 count++와 같은 문장을 다루지 않았다. '++'는 증가 연산자로서, 7주차 강의에서 다룰 것이나, 이 연산자가 for 문에서 자주 사용되므로 여기서 간단히 소개한다.

다음 두 문장의 의미는 동일하다.

 

 

count++;
count = count + 1;

즉, count의 변수 값을 1만큼 증가시킨다.

 

[프로그램 단위 입력 실행] 다음 실습창을 통해서 프로그램 6-4의 실행과정을 알아본다

(여러분은 실습창의 왼편에 위치한 '새프로그램 입력' 버튼을 클릭하여 새로운 프로그램을 입력하여 실행시켜 볼 수 있다. )

 

 

[문장 단위 입력 실행] 여러분은 다음 실습창에서 C 프로그램을 한 문장씩 입력하여 실행시켜  볼 수 있다. 새로운 프로그램을 한 문장씩 입력하고 오른쪽 창에서 그 실행 결과를 살펴 보시오.

사용법

1.아래의 실습창중 < C 문장 입력 > 란을 통하여 C문장 한문장씩 입력하고 Enter 키입력 버튼을 클릭하 면 해당 문장에 대한 시각화가 오른쪽에 나타나게 됩니다.
2.제어문장(while,for,if~else,do~while)은 아래의 실습창중 < 제어구조 문장 입력 >을 통하여 입력하고 제어구조 입력 버튼을 클릭하게 되면 새로운 창이 생성되어 제어구조문장 내부를 단계별로 실행할수 있습니다.
3.scanf()함수 호출시 조그만 새로운창이 생성되어 입력받게 됩니다.
4.
printf()
함수실행은 오른쪽실습창 하단 < printf 실행 창 >에 나타나게 됩니다.
5.현재 count++ 문장은 지원하지 않습니다. count = count + 1 문장을 사용해 주십시요

자세한 사용법은 여기를 클릭하여 주십시요

 


top으로... 다음페이지로.. 이전페이지로.. home으로..

top으로... 다음페이지로.. 이전페이지로.. home으로..

top으로... 다음페이지로.. 이전페이지로.. home으로..

 

top으로... 다음페이지로.. 이전페이지로.. home으로..