언어 자료구조 알고리즘/C 언어 문법

22. 제어문 - 반복문

언제나휴일 2009. 8. 19. 05:47
반응형

제어문 - 반복문

 다루는 내용

  - while, do while

  - for

 

 반복문의 경우는 특정 조건이 참일 동안 반복해서 수행하는 구문을 얘기를 한다.  이를 위해서는 반복할 수행구문 외에도 초기 설정, 반복을 할 조건, 반복할 조건에 대한 변화등에 대해 고려를 해야만 한다.  이러한 반복문을 구성하는 요소들은 목적에 따라 생략될 수도 있고 실제 논리 전개 과정에서 순서가 다를 수도 있다.  이를 위해 C언어에서는 반복문으로써 while문, do while문, for문을 제공하고 있으며, 반복문 내부에서 수행할 구문에서 반복문의 조건으로 분기하거나 반복문을 탈출할 수 있게 하기 위해 continu와 break라는 부가적인 문법도 제공하고 있다.

 

먼저, for문에 대해 살펴보기로 하자.

 포맷:

for(초기화 구문; 조건 구문 ; 반복 수행 후 구문)

        statement;     /* 반복 수행할 구문 */


for문의 경우 포맷을 보면 초기화 구문과 조건 구문, 반복 수행 후 구문을 ()안에 ;로 구분을 하고 이후에 반복 수행할 구문을 작성하도록 되어 있다.  참고로, for문 또한 뒤에 하나의 구문만을 반복 수행할 구문으로 취급하기 때문에 블록을 명시하는 습관을 갖는다면 많은 논리적 오류를 줄일 수 있을 것이다.

 

초기화 구문은 for문에 진입했을 때 단 한번 수행되는 구문이다.

조건 구문은 계속 반복을 수행할 것인지를 판단하는 구문으로 연산 결과가 반드시 있어야 한다.  즉, 리턴타입이 void인 함수 호출구문은 올 수가 없다는 것이다.  반면 조건 구문을 공백으로 비어 놓으면 무한 반복하라는 의미가 된다.

반복 수행 후 구문은 for(;;)뒤에 오는 반복 수행 구문을 처리한 후에 수행할 구문이라는 것을 간과하지 않도록 하자.

 

다음의 예는 특정 구간내의 정수의 합을 구하는 로직이다.  이를 위해서는 현재 어느 구간까지 더했는지를 유지할 Loop(반복문) count 변수가 필요할 것이며 현재가지 더한 값을 보관할 변수도 필요할 것이다.  로직을 생각해 보면 Loop count 변수를 시작 값으로 초기화를 하고 하고 해당 변수가 마지막 값보다 작거나 같을 동안 sum에 Loop count를 더해 나가고 수행 후 Loop count를 증가해 나가면 될 것이다.  참고로 이와같은 로직은 스스로 창조의 고통을 느끼면서 해결하려는 노력과 이를 표현하는 것에 대한 어려움을 체험을 해 나가면서 스트레스를 받는 것이 두고 두고 도움이 될 것이라 필자는 확언한다.  제어 구문은 남의 짠 것을 어려운 논리도 쉽게 이해할 수 있을지 모르겠지만 본인이 직접하는 것은 아주 쉬운 논리도 힘들 수 있으며 그를 해결하는 능력은 결국은 본인 내부에서 나와야 한다는 것이 필자의 철학이다.

 

따분한 소리는 뒤로 접고 예를 보도록 하자.

 

#include <stdio.h>
#include <assert.h>

int Sum(int start,int end)
{
    int sum = 0;
    int lcnt = 0; //Loop count 변수

    assert(start<=end); //start<=end 을 만족하는지에 대한 점검 : 선행 조건

 

    for(lcnt = start ; lcnt<=end; lcnt++)
    {
         sum += lcnt;
    }
    return sum;
}


이번에는 while문에 대해서 살펴보도록 하자.
 

 포맷

while (조건 구문)

statement; 


while문의 경우는 for문과 비교했을 때 초기화 구문과 반복 수행 후 구문에 대한 규약이 없다는 것 말고는 다른 부분이 없다.

즉, 초기화 구문이 필요한 경우에 while문 이전에 초기화를 설정을 해야 하고 반복 수행 후 구문은 반복 수행할 구문 아래에 작성을 해야 한다는 것이다.  이처럼 규약이 없다는 것은 유연성 측면에서는 뛰어날 수 있지만 프로그래밍에서 로직을 생각함에 있어서 초기화 구문에 대한 고민과 반복 수행 후 구문에 대한 생각이 부족해 질 수가 있다.  for문과 while문은 프로그래머의 선호에 따라 선택의 문제일 뿐 서로 사용 목적이 크게 다르지 않으며 for문으로 작성된 로직은 while문으로 작성이 가능하며 그 역 또한 가능하다.

 

다음은 앞서 for문에서 예를 들었던 것을 while문으로 다시 한 번 보기로 하자.

 

#include <stdio.h>
#include <assert.h>

int Sum(int start,int end)
{
    int sum = 0;
    int lcnt = 0;

    assert(start<=end);

    lcnt = start;

    while(lcnt<=end)
    {
         sum += lcnt;
       lcnt++;
    }
    return sum;
}



이번에는 do while에 대해 살펴보도록 하자.
 포맷

do

{

           statement;

}while(조건 구문);


 do while문의 경우는 반복 수행 구문을 수행을 먼저하고 조건을 비교를 함으로써 최소한 한 번은 반복 수행구문을 수행하는 것을 보장해 주는 반복구문이다.  이의 경우도 충분히 for문이나 while문으로 대체할 수는 있지만 로직을 생각함에 있어 do while이 적합하다고 생각이 든다면 이를 사용함으로써 개발 비용을 줄일 수 있는 좋은 선택이 될 수 있을 것이다.

 

예를 들어 프로그램 사용자로부터 수를 메뉴를 선택하고 선택한 키에 따라 특정 기능을 수행하는 것을 반복을 수행하되 종료키가 있다라고 가정을 하자.  이에 대한 로직은 생각하는 이에 따라 do while문이 적합하게 생각할 수도 있고 혹은 for문(while문 포함)이 적합하게 생각할 수도 있을 것이다.  이 때 do while문을 선택하는 것이 나쁜 선택이라고 단언할 수는 없을 것이며 선택의 문제가 될 수 있을 것이다.

 

#include <stdio.h>
#include <conio.h>

void main()
{
    int i = 0;
    int sum_even = 0; //짝수의 합을 보관할 변수
    int sum_odd = 0;  //홀수의 합을 보관할 변수
    int cnt_even=0;   //짝수의 개수를 보관할 변수
    int cnt_odd=0;     //홀수의 합을 보관할 변수

 

    do
    {
          printf("수를 입력하세요 0을 입력하면 빠져나갑니다.\n");
          scanf("%d",&i);  //수를 입력 받음

          fflush(stdin);      //stdin 버퍼 flush
          if(i!=0)           //입력받은 수가 0이 아니라면
         {
              if(i%2)       //i를 2로 나누어서 나머지가 1이라면
             {
                  sum_odd += i;  //i를 홀수의 합에 더한다.
                  cnt_odd++;     //홀수의 개수를 증가
             }
            else  //i를 2로 나누어서 나머지가 1이 아니라면
            {
                  sum_even += i;  //i를 짝수의 합에 더한다.
                  cnt_even++;     //작수의 개수를 증가
            }
       }
   }while(i); //i가 참일 동안(즉, 0이 아닐 동안)

   printf("짝수 개수:%d 짝수의 합:%d\n",cnt_even,sum_even);
   printf("홀수개수:%d 홀수의합:%d\n",cnt_odd,sum_odd);

 }


 여러분은 위의 로직을 for문과 while문으로 변경하는 것을 해 보기를 바란다.

또한, 많은 이들이 제어문의 문법 요소를 익히고 실습을 해 보는 다이아몬드를 그리기, 피보나치 수열 구하기 등의 다양한 반복문을 사용하는 로직을 스스로 생각하고 이를 pseudo code로 기술하고 코드로 구체화시키는 등의 작업을 해 보아야 할 것이다.

반응형

'언어 자료구조 알고리즘 > C 언어 문법' 카테고리의 다른 글

24. 배열의 사용  (0) 2009.08.19
23.배열  (0) 2009.08.19
21.제어문 - 선택문  (0) 2009.08.19
20. 제어문 - 조건문  (0) 2009.08.19
19. 기본입출력 - 입력  (0) 2009.08.19
18. 기본 입출력 - 출력  (0) 2009.08.19
17.기본 입출력 개요  (0) 2009.08.19
16. 지시/주소/인덱스/간접연산자  (0) 2009.08.19
15. 비트/ 쉬프트 연산자  (0) 2009.08.19
14. 비교/논리 연산자  (0) 2009.08.19