반복문: while, for (1)
Chan-Su Shin
반복문
• while 문
• for 문
• do-while 문
while ( expr ) { statements;
}
next statement;
for (expr1; expr2; expr3) { statements;
}
next statement;
while 문
while ( expr ) { statements;
}
next statement;
1. expr 가 참인 거짓인지 판별한다.
2. 참이면 statements들을 하나씩 수행한 후에 1번으로 돌아가 반복한다.
3. 거짓이면 next statement부터 수행한다.
예제 (1 – while 문)
• 1부터 10까지 더한 값을 출력 int k = 1, sum = 0;
while ( k <= 10 ) {
sum = sum + k;
k = k + 1;
}
printf(“ k = %d, sum = %d\n”, k, sum);
sum += k;
k++;
예제 (2 – while 문)
• n!을 계산하여 출력
int k = 1, factorial = 1;
while ( k <= n ) {
factorial *= k;
k++;
}
printf(“%d\n”, factorial);
int k = 1, factorial = 1;
while ( k++ <= n ) { factorial *= k;
}
printf(“%d\n”, factorial);
int factorial = 1;
while ( n > 0 ) {
factorial *= n--;
}
printf(“%d\n”, factorial);
예제 (3 – while 문)
• 입력되는 문자들 중에서 알파벳 소문자와 대문자의 개수를 출력 int l_count = 0, s_count = 0
char c;
while ( ( c = getchar( ) ) != EOF ) { // EOF은 <enter><ctrl+Z><enter>
if ( ‘a’ <= c && c <= ‘z’ ) s_count++;
if ( ‘A’ <= c && c <= ‘Z’ ) l_count++;
printf(“Large = %d, Small = %d\n”, l_count, s_count);
}
printf(“Final: Large = %d, Small = %d\n”, l_count, s_count);
예제 (3 – while 문, getch, getchar, getche)
• 문자를 입력 받는 세 가지 함수들
buffer 사용
입력한 data가 프로그램 수행 시
사용되는 시점
enter key 인식
문자 입력시 화면에 반환 여부
(echo)
헤더파일
getchar() ○ "enter" key 입력 후 ‘\n' ○ stdio.h
getch() 문자 입력 즉시 '\r' conio.h
getche() 문자 입력 즉시 '\r' ○ conio.h
• putch(c), putchar(c) 함수는 문자 c를 출력하는 함수들
예제 (4 – while 문)
• 주의할 점
int k = 3;
while ( k-- ) {
printf(“%d\n”, k);
}
printf(“outside \n”);
int k = 3;
while ( k++ ) {
printf(“%d\n”, k);
}
printf(“outside \n”);
for 문
1. expr1을 수행한다.
2. expr2 가 참인지 거짓인지 판별한다.
3. 참이면
1. statements을 수행하고 2. expr3을 수행한 후에 3. 2번으로 돌아간다.
4. 거짓이면
1. next statements를 수행한다.
for (expr1; expr2; expr3) { statements;
}
next statement;
int k, sum = 0;
for ( k = 1; k <= 10; k++ ) { sum = sum + k;
}
printf(“sum = %d\n”, sum);
for 문
(1) (2) (4)
for ( 초기값 지정 수식; 반복 조건식; 증감식 ) {
반복할 내용(3) }
계속 수행할 내용;
for 문 vs. while 문
for (expr1; expr2; expr3) { statements;
}
next statement;
expr1;
while ( expr2 ) { statements;
expr3;
}
next statement;
for 문 vs. while 문
int k, sum = 0;
for ( k = 1; k <= 10; k++ ) { sum = sum + k;
}
printf(“sum = %d\n”, sum);
int k, sum = 0;
k = 1;
while ( k <= 10 ) {
sum = sum + k;
k++;
}
printf(“sum = %d\n”, sum);
• expr1은 for 문의 제어 변수를 초기화하는 역할
• expr2는 for 문의 반복, 탈출여부를 판단하는 역할
• expr3는 for 문의 제어 변수를 변화시키는 역할
예제 (for 문)
int k, sum = 0;
k = 1;
for ( ; k <= 10; k++ ) { sum = sum + k;
}
printf(“%d\n”, sum);
int k, sum = 0;
k = 1;
for ( ; k <= 10; ) {
sum = sum + k;
k++;
}
printf(“%d\n”, sum);
예제 (for 문)
int k, sum = 0;
k = 1;
for ( ; ; ) {
sum = sum + k;
k++;
}
printf(“%d\n”, sum);
• expr2가 생략되면 무조건 참으로 판별한다.
예제2 (for 문)
int k, sum = 0;
for (k=1; k <= n; k++) { if( k%3 == 0 )
sum = sum + k*k;
}
printf(“%d\n”, sum);
• 1부터 n 사이의 수 중에서 3의 배수의 제곱의 합을 출력하라.
int k, sum = 0;
for (k=0; k <= n; k=k+3) {
sum = sum + k*k;
}
printf(“%d\n”, sum);
다함께~ (while/for 문)
// while 문 사용
• 자연수 n이 소수인지를 판별하여 그 결과를 출력하라.
// for 문 사용
다함께2 (while/for 문)
• 두 수 A와 B가 주어져 있을 때, A와 B의 최대공약수를 출력하라.
– 유클리디(Eulcid) 호제법
다함께2 (while/for 문)
• 두 수 A와 B가 주어져 있을 때, A와 B의 최대공약수를 출력하라.
– 유클리디(Eulcid) 호제법
// while 문 사용 // for 문 사용
for문과 while문을 중첩하여 반복하기
int i, j, k, a = 0, b = 0, c = 0;
for (i=1; i <= 3; i+=2) { a++;
for (j=1; j <= 4; j+=2) { b++;
} }
printf(“%d, %d, %d\n”, a, b, c);
• for문(while문) 내부에 다른 for문(while문)이 올 수도 있다!
– 사실, 반복문 내부에 반복문이 계속해서 중첩해서 올 수 있다.
– i의 값에 따라 j의 값의 변화를 추적해보자.