본문 바로가기

컴퓨터/언어,프로그래밍

[C언어] C언어 반복문'

C 프로그래밍


<제어의 흐름 : while문, for문>


1. 개  요

  프로그램의 실행을 제어하는데 if문이나 if_else문과 더불어 가장 많이 사용하는 제어문은 반복처리에 적합한 while문과 for 문이 있다.

   일반적으로 자료처리를 컴퓨터에 의존하는 가장 큰 이유 중의 하나는 동작의 반복에 있다고 본다. 대량의 데이터가 있을 때 특정한 문장을 반복적으로 실행시키는 제어기법은 상당한 편리성을 제공해 준다.


2. while 문

   while 문은  프로그램의 반복처리에서 가장 많이 이용되는 제어문 중의 하나로 프로그램을 중심으로 기술하고자 한다.

    main()

    {

    int  i = 1, tot = 0;

    while(i <= 5) {

         tot += i;

             ++i;

    }

    printf("\ntotal = %d\n\n", tot);

    }


먼저 i는 1로 tot는 0으로 초기화된다. 코드

    while(i <= 5) {

     tot += i;

         ++i;

    }


는 while문 또는 while 루프이다. 기호 <=는 ‘작거나 같음’을 나타내는 연산자이다. i가 5보다 작거나 같은가 검사한다. 만일 그렇다면 중괄호로 묶인 문장의 군이 실행되고, 제어가 while 루프의 처음으로 되돌아가며, 이 과정이 다시 시작된다. while 루프는 검사가 실패할 때까지, 즉 i가 5보다 작지 않고 5와 같지 않을 때까지 반복적으로 실행된다. 즉 while 안에 잇는 식의 값이 거짓이 되는 시점에서 제어는 while문 바로 다음에 나오는 문장으로 전달된다. 이 경우에서는 printf()문이 된다 문장

    tot += i;

는 i의 값에 의해 tot에 저장된 값을 증가시킨다. 같은 의미로

    tot = tot + i;

와 같이 쓸수 있다. 변수 tot에는 tot의 전의 값에 i의 값을 더한 것이 치환된다. 기호 ++는 증가연산자를 나타낸다. 문장

    ++i;

는 i값에 1을 증가시킨다. 프로그램을 손으로 계산하면 while 루프는 i값을 1, 2, 3, 4, 5로 가지며, 다섯 번 실행됨을 알 수 있다. 제어가 while문을 벗어났을 때 i의 값은 6, 그리고 tot값은

    1 + 2 + 3 + 4 + 5

또한 15이다. 그리고 printf() 명령문은 이 값을 정수로 프린트한다.

  복합문은 중괄호로 에워싸여 구성하고 있는 문장들의 군이다. 문법적으로 복합문은 그 자체로 문장이다. 복합문은 문장이 사용될 수 있는 데에는 어느 곳에서라도 이용될 수 있다. while문의 형식은

        while (식)

          (문장)

이며, 이때 문장은 단순문장이거나 복합문장이다. C 언어에서 영 아닌(nonzero)값은 참을 나타내는 것으로 영값은 거짓을 나타내는 것으로 간주한다. while문이 실행될 때 식은 평가된다. 만일 식이 영이 아니면 (참) 문장이 실행되고, 제어는 while 루프의 처음으로 되돌아간다. 이 과정은 식이 영의 값을 가질 때까지 계속된다. 이 시점에서 제어는 다음 문장으로 전달된다. i가 5보다 작거나 같으면 i <= 5와 같은 논리식은 int값 1(참)을 갖는다. 그렇지 않으면 논리식은 int값 0(거짓)을 갖는다.

3. for 문  

while문과 더불어 사용할 수 있는 반복 구조는 for문이다. for문의 형식은 while문과 밀접하게 관계되어 있고 그만큼 많이 이용되는 구조로 형식은 아래와 같다.

    for(식1; 식2; 식3)

    문장

이다. 모두 3개의 식이 있다면 다음과 같이 쓸 수 있다.

    식1;

    while(식2) {

    문장

        식3;

    }

  전형적으로 식1은 초기값을 치환시킨다. 식2는 조건을 검사하고, 식3은 저장된 값을 증가시킨다. 식3이 루프 몸체에서 마지막으로 실행됨을 주의하라. for 루프는 식2가 영이 아닌 값(참)에 있는 한 반복하여 수행된다. 예를 들어 위의 프로그램을 while루프 대신에 for 루프를 이용하여 1부터 10까지의 합을 구하는 프로그램을 작성하면 아래와 같다.

     main()

    {

    int i, tot = 0;

        for(i = 1; i <= 10; ++i)

       tot += i;

    printf("\ntotal=%d\n\n", tot);

    }

  부동형 수의 합을 계산하기 위해 다음의 프로그램과 같이 for 루프를 이용할 수 있다. 프로그램이 진행되어 가는 과정에서 횟수와 항목, 그리고 합이 누진되어 가는 과정을 인쇄할 수 있다.

    /*** 합계계산 ***/

    main()

    {

    int        i;

    double    x, tot = 0.0;

    printf("\n%12s%12s%15s\n", "count", "item", "running total");

        for(i = 1; scanf("%lf", &x) == 1; ++i)

       printf("\n%12d%12.1f%15.3f", i, x, tot += x);

    printf("\n\n");

    }


  이 프로그램이 컴파일되고 실행될 때 데이터의 값으로 아래와 같은 값을 주었다고 가장하자.

  2.2  -30.673  77.11111  -1.09  1.1335577e+2

그러면 다음과 같은 결과 값을 출력하게 될 것이다. 

    count        item     running total       

        1         2.2             2.200

        2       -30.7           -28.473

        3        77.1            48.638

        4        -1.1            47.548

        5       113.4           160.904   

위의 프로그램을 분석해 보면 아래와 같다.

    printf("\n%12s%12s%15s\n", "count", "item", "running total");

  이 문장은 머리부분을 프린트한다. 머리부분을 프린트하기 위해 형식에서 필드폭이 선택된다.

    for(i = 1; scanf("%lf", &x) == 1; ++i)

            printf("\n%12d%12.1f%15.3f", i, x, tot += x);

  for 루프의 몸체는 다음과 같은 식이 참(true)이면 계속 실행된다.    

    scanf("%lf", &x) == 1

  함수 scanf()는 하나의 int값을 반환하는데, 이 값은 성공적인 변환작업이 이루어질 때 제시된다. 즉, 수를 읽어들이고, 이 수를 double형으로 변환시키며, x의 주소에 값이 저장될 때 값 1이 반환된다. 기호 ==는 등호를 나타낸다.

  만약 scanf()로 반환되는 값이 1이면 식은 참이고, 그렇지 않으면 거짓(false)이다. 파일종료마크(end-of-file)가 읽혔을 때, scanf()는 전형적으로 -1값을 반환한다. 따라서 루프는 파일종료마크가 읽히거나 숫자가 아닌 자료를 읽었을 때 종료된다. printf() 문에서 필드폭은 이전의 printf()문의 필드폭에 대응한다.

    tot += x;

  tot의 값은 x의 값에 의하여 증가되고, 식의 값은 전체가 tot의 새로운 값이 된다. 따라서 매회 수행되는 합은 변수 tot에 누적된다. 이 치환문은  tot = tot + x; 와 같다.

  여기에서는 x의 값과 이전의 tot의 값을 더하여 새로운 tot의 값에 치환시킨 것으로 간주한다. 형식의 구조는 다음과 같다.

       변수 op = 식

이때 op는 +, -, *, /와 같은 연산자로

    변수 = 변수 op (식)

와 같다.

  C 프로그램에서 상징적 이름 EOF는 보통 파일 종료마크와 관련된 값을 지정하기 위하여 사용된다. 일반적으로 EOF값은 키보드에서 control-d 키와 바로 캐리지 리턴 키를 입력함으로써 들어온다. 그러나 이것은 시스템에 따라 다르다. 따라서 EOF가 효과를 갖기 위해 다른 것을 타자할 수 도 있다.

  또한 위의 1에서 10까지 더하는 프로그램을  랙 문을 사용하여 다양하게 변화시킬 수 있다. 즉 for문에서 식은 전부 혹은 일부를 생략할 수 있다. 그러나 두 개의 세미콜론(;)은 존속해야 되는데 그 예들을 기술하면 아래와 같다.

  1) for문 안의 초기 값이 생략된 경우

     I=1;

     tot=0;

     for( ; I<=10; ++i)

       tot+=i;

  2) for문 안의 초기 값과 계산식이 생략된 경우

     I=1;

     tot=0;

     for( ; I<=10; )

        tot+=i++;

  3) for문의 모든 식이 생략될 경우 조건식은 항상 참이 되어 for루프는 무한루프가 된다.

     I=1;

     tot=0;

     for( ; ; ) {

       tot+=i++;


제주삼다수, 2L,... 오뚜기 진라면 매운... 상하목장 유기농 흰... 남양 프렌치카페 카... 고려인삼유통 홍삼 ... 종근당건강 오메가3... 요이치 카링 유무선...