쉽게 풀어쓴 C언어 Express 제7장 반복문 C Express
이번 장에서 학습할 내용 반복의 개념 이해 while 반복문 do-while 반복문 for 반복문 반복 구조는 일련의 처리를 반복할 수 있게 한다. 반복의 개념을 먼저 이해하고 C에서 제공되는 3가지의 반복 구조에 대하여 학습한다. 반복의 개념 이해 while 반복문 do-while 반복문 for 반복문 break와 continue문
반복문 Q) 반복 구조는 왜 필요한가? A) 같은 처리 과정을 되풀이하는 것이 필요하기 때문이다. 학생 30명의 평균 성적을 구하려면 같은 과정을 30번 반복하여야 한다.
프로그램의 흐름을 제어하는 방법 1) 순차구조 2) 선택구조 3) 반복구조 - 차례대로 실행 - 조건을 검사하여 여러 개 의 실행 경로 중에서 하나를 선택 3) 반복구조 - 조건이 만족될 때가지 반복 NO YES
마일을 미터로 바꾸는 프로그램 #include <stdio.h> int main(void) { int meter; meter = 0 * 1609; printf("0 마일은 %d미터입니다\n", meter); meter = 1 * 1609; printf("1 마일은 %d미터입니다\n", meter); meter = 2 * 1609; printf("2 마일은 %d미터입니다\n", meter); return 0; } 같은 처리과정 #1 같은 처리과정 #2 같은 처리과정 #3
반복문의 종류
while 문의 구조 주어진 조건이 만족되는 동안 문장들을 반복 실행한다. 초기식; while (조건식) { 문장; 증감식; 문장; 증감식; } ① 초기식을 실행한다. ② 반복 조건을 나타내는 조건식을 계산한다. ③ 수식의 값이 거짓이면 while 문의 실행이 종료된다. ④ 수식의 값이 참이면 문장이 실행된다. ⑤ 증감식을 실행하고 ②로 돌아간다. while ( 초기식 ; 조건식 증감식 ) { 반복하고자 하는 문장들 }
if 문과 while 문의 비교 if( 조건 ) { ... } while( 조건 ) { ... 조건이 만족되면 한번만 실행된다. 조건이 만족되면 여러 번 반복 실행된다.
i 값이 3으로 증가하였지만 조건에 만족 하지 않아 예제 #include <stdio.h> int main(void) { int meter=0; int i = 0; while(i < 3) { meter = i * 1609; printf("%d 마일은 %d 미터입니다\n", i, meter); i++; // i = i+1 과 동일 } return 0; } 0마일은 0미터 입니다. 1마일은 1609미터 입니다. 3 2 1 2마일은 1609미터 입니다. < 3 i * 1609 = 1609 3218 meter i 값이 3으로 증가하였지만 조건에 만족 하지 않아 출력하지 못하고 프로그램을 종료한다.
예제 2 9 5 4 1 3 2 * n i . . . // while 문을 이용한 구구단 출력 프로그램 #include <stdio.h> int main(void) { int n; int i = 1; printf("출력하고 싶은 단: "); scanf("%d", &n); while (i <= 9) { printf("%d*%d = %d \n", n, i, n*i); i++; // i = i+1 과 동일 } return 0; } 2 9 5 4 1 3 2 n * i 출력하고 싶은 단: 2 2*1=2 2*2=4 2*3=6 2*4=8 2*5=10 . . . 2*9=18
예제 10 2 3 4 1 5 n . . . // while 문을 이용한 제곱값 출력 프로그램 #include <stdio.h> int main(void) { int n; printf("====================\n"); printf(" n n의 제곱 \n"); n = 1; while (n <= 10) { printf("%5d %5d\n", n, n*n); n++; // n= n+1 과 동일 } return 0; } 10 2 3 4 1 5 n ==================== n n의 제곱 1 1 2 4 3 9 4 16 5 25 . . . 10 100
예제 1부터 n까지의 합을 계산하는 프로그램 n이 무엇이 될지 모르는 경우라면 다음과 같이 계산 ... ①빈통을 준비한다. ②통에 1부터 n까지를 넣는다. ③통에 들어 있는 동전의 개수를 출력한다.
예제 6 1 3 1 3 2 3 i n sum #include <stdio.h> int main(void) { int i, n, sum; // 변수 선언 printf("정수를 입력하시오:"); scanf("%d", &n); i = 1; // 변수 초기화 sum = 0; while(i <= n) { sum += i; sum = sum + i 와 동일 i++; // i = i + 1 와 동일 } printf("1부터 %d까지의 합은 %d입니다\n", n, sum); return 0; } 6 1 3 1 3 2 sum i 3 n 정수를 입력하시오:3 1부터 3까지의 합은 6입니다
예제 1 2 3 10 30 60 30 10 20 i n sum // while 문을 이용한 합계 프로그램 #include <stdio.h> int main(void) { int i, n, sum; i = 0; // 변수 초기화 sum = 0; // 변수 초기화 while (i < 3) { printf("값을 입력하시오: "); scanf("%d", &n); sum = sum + n; // sum += n;과 같다. i++; } printf("합계는 %d입니다.\n", sum); return 0; } 1 2 3 10 30 60 30 10 20 i sum n 값을 입력하시오 : 10 값을 입력하시오 : 20 값을 입력하시오 : 30 합계는 60입니다.
예제: 최대값 #include <stdio.h> #include <limits.h> int main(void) { int number, min_value = INT_MAX; printf("정수를 입력하시오\n종료는 Ctrl+z\n"); while(scanf("%d", &number) != EOF) if( number < min_value ) min_value = number; } printf("최소값은 %d“, min_value); return 0; 정수를 입력하시오 종료는 Ctrl+z 10 20 30 5 ^Z 최소값은 5
예제 두수의 최대 공약수 구하기 유클리드 알고리즘 ① 두 수 가운데 큰 수를 x, 작은 수를 y라 한다. ② y가 0이면 공약수는 x와 같다. ③ r ← x % y ④ x ← y ⑤ y ← r ⑥ 단계 ②로 되돌아간다.
예제 12 8 4 x y = r % 나머지 // while 문을 이용한 최대 공약수 구하기 프로그램 #include <stdio.h> int main(void) { int x, y, r; printf("두 정수를 입력 (큰 수, 작은 수): "); scanf("%d%d", &x, &y); while (y != 0) { r = x % y; x = y; y = r; } printf("최대 공약수는 %d입니다.\n", x); return 0; } 12 8 x % y = 4 r 나머지 두 정수를 입력 (큰 수,작은 수): 12 8 최대공약수는 4입니다.
while 문에서 주의할 점 변수가 증가 아니라 감소 반복 루프에 포함되어 있지 않다. 조건뒤에 ;이 있음 int i = 1; { printf("반복중입니다\n"): i--; } 변수가 증가 아니라 감소 int i = 0; while(i < 3) printf("반복중입니다\n"): i++; . 반복 루프에 포함되어 있지 않다. int i = 0; while(i < 3) ; { printf("반복중입니다\n"): i++; . } 조건뒤에 ;이 있음
참과 거짓 #include <stdio.h> int main(void) { int i = 3; while (i) printf("%d은 참입니다.", i); i--; } printf("%d은 거짓입니다.", i); 3은 참입니다. 2은 참입니다. 1은 참입니다. 0은 거짓입니다.
do...while문 반복 조건을 루프의 끝에서 검사 초기식; do { 문장; 증감식; } while (조건식); 주의!
do-while 문 적어도 한번은 반복문장을 실행한다. 문장 조건 참 거짓 초기식; do { 문장; 증감식; 문장; 증감식; } while (조건식); 문장 참 조건 거짓
while 루프와 do-while 루프와의 관계 ; 초기식 ; 초기식 while ( 조건식 ) do { { 문장1 ; 문장1 ; 문장2 ; 문장2 ... ... ; 증감식 ; 증감식 } while ( 조건식 ) ; }
예제 1 i // do..while 문을 이용한 메뉴 #include <stdio.h> int main(void) { int i = 0; do { printf("1---새로 만들기\n"); printf("2---파일 열기\n"); printf("3---파일 닫기\n"); printf("하나를 선택 하시오:\n"); scanf("%d", &i); } while(i < 1 || i > 3); printf("선택된 메뉴=%d\n",i); return 0; } 1 i 1---새로 만들기 2---파일 열기 3---파일 닫기 하나를 선택 하시오: 1 선택된 메뉴=1
for 루프 정해진 횟수만큼 반복하는 구조
for 문의 구조 for ( 초기식; 조건식; 증감식) 문장; ① 초기식을 실행한다. 문장; ① 초기식을 실행한다. ② 반복 조건을 나타내는 조건식을 계산한다. ③ 수식의 값이 거짓이면 for 문의 실행이 종료된다. ④ 수식의 값이 참이면 문장이 실행된다. ⑤ 증감식을 실행하고 ②로 돌아간다.
for 문의 구조 int i; for(i = 0; i < 10; i++) printf("Hello World!\n");
for문의 실행과정
for문의 실행과정 int i; for(i = 0; i < 10; i++) printf("Hello World!\n"); 반복횟수 i의 값 i<10 반복여부 1번째 반복 참 반복 2번째 반복 1 3번째 반복 2 4번째 반복 3 5번째 반복 4 6번째 반복 5 7번째 반복 6 8번째 반복 7 9번째 반복 8 10번째 반복 9 11번째 반복 10 거짓 중지
예제 시작 i=1 , sum=0 i <= 10 sum = sum + i Sum출력 i++ // 반복을 이용한 정수합 프로그램 #include <stdio.h> int main(void) { int i, sum; sum = 0; for(i = 1;i <= 10; i++) sum += i; // sum = sum + i;와 같음 printf("1부터 10까지 정수의 합= %d\n",sum); return 0; } i=1 , sum=0 i가 10보다 작거나 같은 때 까지 10번 반복 NO i <= 10 YES sum = sum + i Sum출력 i++ 1부터 10까지 정수의 합 = 55
예제 1 3 2 3 i n // 반복을 이용한 세제곱값구하기 #include <stdio.h> int main(void) { int i, n; printf("정수를 입력하시오:"); scanf("%d", &n); printf("====================\n"); printf(" i i의 세제곱\n"); for(i = 1;i <= n; i++) printf("%5d %5d\n", i, i*i*i); return 0; } 1 3 2 3 i n 정수를 입력하시오: 3 ==================== i i의 세제곱 1 1 2 8 3 27
예제 // 반복을 이용한 네모 그리기 #include <stdio.h> int main(void) { int i; printf("**********"); for(i = 0;i < 5; i++) printf("* *"); return 0; } ********** * *
예제 3 3 1 2 10 2 1 6 20 i fact n // 반복을 이용한 팩토리얼 구하기 #include <stdio.h> int main(void) { long fact=1; int i, n; printf("정수를 입력하시오:"); scanf("%d", &n); for(i = 1;i <= n; i++) fact = fact * i; printf("%d! 은 %d입니다.\n",n,fact); return 0; } 3 3 1 2 10 2 1 6 20 n i fact 정수를 입력하시오: 3 3! 은 6입니다.
while 루프와 for 루프와의 관계 ; for ( ; ; ) while ( ) { { ... ... } ; ; ; ; ; 초기식 초기식 ; 조건식 ; 증감식 ) while ( 조건식 ) { { 문장1 ; 문장2 ; 문장1 ; ... 문장2 ; ... } 증감식 ; }
팩토리얼 계산 예제(while 버전) // 반복을 이용한 팩토리얼 구하기 #include <stdio.h> int main(void) { long fact = 1; int i = 1, n; printf("정수를 입력하시요: "); scanf("%d", &n); while (i <= n) fact = fact * i; i++; } printf("%d!은 %d입니다.", n, fact); return 0;
다양한 증감수식의 형태 뺄셈 사용 2씩 증가 2를 곱한다. 어떤 수식이라도 가능 for (i = 10; i > 0; i-- ) printf("Hello World!\n"); 뺄셈 사용 for (i = 0; i < 10; i += 2 ) printf("Hello World!\n"); 2씩 증가 for (i = 1; i < 10; i *= 2 ) printf("Hello World!\n"); 2를 곱한다. for (i = 0; i < 100; i = (i * i) + 2 ) printf("Hello World!\n"); 어떤 수식이라도 가능
디양한 for 루프 한부분이 없을 수도 있다. 2개 이상의 변수 초기화 어떤 수식도 가능 무한 반복 루프 for ( ; i<100; i++ ) printf("Hello World!\n"); 한부분이 없을 수도 있다. for (i = 0, k = 0; i < 100; i++ ) printf("Hello World!\n"); 2개 이상의 변수 초기화 for (printf("반복시작”), i = 0; i < 100; i++ ) printf("Hello World!\n"); 어떤 수식도 가능 for ( ; ; ) printf("Hello World!\n"); 무한 반복 루프
중첩 반복문 중첩 반복문(nested loop): 반복문 안에 다른 반복문이 위치
예제 1 9 2 1 2 4 10 1 20 x y ② ① 0부터 9까지 10번 반복 0부터 4까지 5번 반복 // 중첩 for 문을 이용하여 *기호를 사각형 // 모양으로 출력하는 프로그램 #include <stdio.h> int main(void) { int x, y; for(y = 0;y < 5; y++) { for(x = 0;x < 10; x++) printf("*"); printf("\n"); } return 0; } 0부터 9까지 10번 반복 1 9 2 1 2 x 0부터 4까지 5번 반복 4 10 1 20 y ② * * * ******* \n ① ********** \n
예제 #include <stdio.h> int main(void) { int x, y; for(y = 1; y <= 5; y++) for(x = 0; x < y; x++) printf("*"); printf("\n"); // 내부 반복문이 종료될 때마다 실행 } return 0; * ** *** **** *****
continue 문 현재의 반복을 중단하고 다음 반복을 시작하게 한다. ; ; for ( ; ; ) while ( ) do { 초기식 ; 초기식 for ( 초기식 ; 조건식 ; 증감식 ) while ( 조건식 ) do { { 문장1 ; { 문장1 ; 문장1 ; 문장2 ; 문장2 ; 문장2 ; continue ; continue ; continue ; } 증감식 ; 증감식 ; } } while ( 조건식 ) ;
예제 #include <stdio.h> int main(void) { int i; for(i=0 ; i<10 ; i++) if( i%3 == 0 ) continue; printf("%d ", i); return 0; } 3의 배수 는 건너뛴다. 1 2 4 5 7 8
break 문 현재의 반복을 중단하고 루프를 빠져 나온다. ; ; for ( ; ; ) while ( ) do { { { } 초기식 ; 초기식 for ( 초기식 ; 조건식 ; 증감식 ) while ( 조건식 ) do { { 문장1 ; { 문장1 ; 문장1 ; 문장2 ; 문장2 ; 문장2 ; break; break; break; } 증감식 ; 증감식 ; } } while ( 조건식 ) ;
예제 grade < 0.0 count ++ break sum += grade #include <stdio.h> int main(void) { float grade, sum = 0.0, average; int count = 0; while(1) { printf("학생 성적을 입력하시오: "); scanf("%f", &grade); if( grade < 0.0 ) break; count++; sum += grade; } average = sum / count; printf("학생들의 평균은 %f입니다.\n", average); return 0; } 학생 성적을 입력하시오: 90 학생 성적을 입력하시오: 80 학생 성적을 입력하시오: 70 학생 성적을 입력하시오: -1 학생들의 성적의 평균은 82.500000입니다. YES grade < 0.0 음수 입력 시 while문을 나옴 NO count ++ break sum += grade
예제 12.0 9.0 -1 v // break를 이용하여 무한루프를 탈출한다. #include <stdio.h> #include <math.h> int main(void) { double v; while(1) { printf("실수 값을 입력하시오: "); scanf("%lf", &v); if( v < 0.0 ) break; printf("%f의 제곱근은 %f\n", v, sqrt(v)); } return 0; } 12.0 9.0 -1 v 실수 값을 입력하시오: 9.0 9.000000의 제곱근은 3.000000입니다. 실수 값을 입력하시오: 12.0 12.000000의 제곱근은 3.464102입니다. 실수 값을 입력하시오: -1
예제 b B A Q a letter // 소문자를 대문자로 변경한다. #include <stdio.h> int main(void) { char letter; while(1) { printf("소문자를 입력하시오: "); scanf(" %c", &letter); if( letter == 'Q' ) break ; if( letter < 'a' || letter > 'z' ) continue ; letter -= 32; printf("변환된 대문자는 %c입니다.\n", letter); } return 0; } b B A Q a letter 소문자를 입력하시오 : a 변환된 대문자는 A입니다.. 소문자를 입력하시오 : b 변환된 대문자는 B입니다. 소문자를 입력하시오 : Q
예제 – 달력 만들기 #include <stdio.h> #define START_DAY 3 // 첫번째 날이 수요일 #define DAYS_OF_MONTH 31 // 달의 일수 int main(void) { int day, date; printf("=====================\n"); printf("일 월 화 수 목 금 토\n"); printf("=====================\n"); // 월요일부터 수요일까지 for(day = 0; day < START_DAY ; day++) printf(" "); // 공백 출력 for(date = 1; date <= DAYS_OF_MONTH ; date++) { if( day == 7 ) { day = 0; // 일요일이면 줄바꿈을 출력 printf("\n"); } day++; printf("%2d ", date); // 날을 출력한다. } printf("\n=====================\n"); return 0; }
실습 반복문을 사용하여 다음 조건에 맞는 프로그램을 작성하시오 2중 for문을 사용하여 구구단 1~9단을 한번에 출력하는 프로그램. ‘*’ 기호로 삼각형 출력하는 프로그램
1번 결과
2번 결과
실습: 숫자 추측 게임 프로그램이 가지고 있는 정수를 사용자가 알아맞히는 게임 사용자가 답을 제시하면 프로그램은 자신이 저장한 정수와 비교하여 제시된 정수가 더 높은지 낮은지 만을 알려준다.
실행 결과 정답을 추측하여 보시오: 10 제시한 정수가 낮습니다. 정답을 추측하여 보시오: 30 정답을 추측하여 보시오: 60 제시한 정수가 높습니다. 정답을 추측하여 보시오: 59 축하합니다. 시도횟수=4
알고리즘 do 사용자로부터 숫자를 guess로 입력받는다. 시도횟수를 증가한다. if( guess < answer ) 숫자가 낮다고 출력한다. if( guess > answer ) 숫자가 높다고 출력한다. while(guess != answer); “축하합니다”와 시도횟수를 출력한다.
소스 #include <stdio.h> int main(void) { int answer =59; // 정답 int guess; int tries = 0; // 반복 구조 do { printf("정답을 추측하여 보시오: "); scanf("%d", &guess); tries++; if (guess >answer) // 사용자가 입력한 정수가 정답보다 높으면 printf("제시한 정수가 높습니다."); if (guess <answer) // 사용자가 입력한 정수가 정답보다 낮으면 printf("제시한 정수가 낮습니다."); } while (guess !=answer); printf("축하합니다. 시도횟수=%d", tries); return 0; }
도전문제 위의 프로그램이 게임이 되려면 난수를 발생시키는 것이 좋다. 난수는 (rand()%100)으로 발생이 가능하다. stdlib.h 헤더 파일도 포함시켜야 한다.
소스 #include <stdio.h> #include <stdlib.h> int main(void) { int answer; int guess; int tries = 0; answer = (rand()%100); // 정답 // 반복 구조 do { printf("정답을 추측하여 보시오: "); scanf("%d", &guess); tries++; if (guess >answer) // 사용자가 입력한 정수가 정답보다 높으면 printf("제시한 정수가 높습니다."); if (guess <answer) // 사용자가 입력한 정수가 정답보다 낮으면 printf("제시한 정수가 낮습니다."); } while (guess !=answer); printf("축하합니다. 시도횟수=%d", tries); return 0; }
실습 프로그램 1
실습 프로그램 2
실습 프로그램 3
실습 프로그램 1
실습 프로그램 2
Q & A