<제어의 흐름 : 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++;
'컴퓨터 > 언어,프로그래밍' 카테고리의 다른 글
[C언어] C언어 자료의 입/출력 (0) | 2009.03.17 |
---|---|
[C언어] C언어 조건문 (0) | 2009.03.17 |
[C언어] C언어 문자 입/출력 (0) | 2009.03.17 |
[C언어] C언어 함수 (0) | 2009.03.17 |
[C언어] C언어 배열,문자,포인터 (0) | 2009.03.17 |