개정판 누구나 즐기는 C언어 콘서트 제6장 반복문 출처: pixabay
이번 장에서 학습할 내용 반복의 개념 이해 while 반복문 do-while 반복문 for 반복문 반복 구조는 일련의 처리를 반복할 수 있게 한다. 반복의 개념을 먼저 이해하고 C에서 제공되는 3가지의 반복 구조에 대하여 학습한다. 반복의 개념 이해 while 반복문 do-while 반복문 for 반복문 break와 continue문
이번 장에서 만들 프로그램
반복문 Q) 반복 구조는 왜 필요한가? A) 같은 처리 과정을 되풀이하는 것이 필요하기 때문이다. 학생 30명의 평균 성적을 구하려면 같은 과정을 30번 반복하여야 한다.
마일을 미터로 바꾸는 프로그램 #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 문): 특정한 조건이 만족되면 계속 반복한다. 횟수 제어 반복(for 문): 정해진 횟수만큼 반복한다.
중간 점검 1. 프로그램에 반복 구조가 필요한 이유는 무엇인가? 2. 반복문에는 _______, _______문이 있다.
while 문
while 문의 흐름도
칠판에 “수업시간에 떠들지 않겠습니다.”를 10번 쓰기 #include <stdio.h> int main(void) { int i = 0; while (i < 10) printf("수업 시간에 떠들지 않겠습니다.\n"); i++; } return 0;
반복 제어 변수 출력하기 #include <stdio.h> int main(void) { int i = 0; while (i < 10) printf("i=%d ", i); i++; } return 0;
마일을 미터로 변환하기 1 2 3 i #include <stdio.h> int main(void) { int meter; int i = 0; while(i < 3) { meter = i * 1609; printf("%d 마일은 %d 미터입니다\n", i, meter); i++; } return 0; } 1 2 i 3 0 마일은 0 미터입니다 1 마일은 1609 미터입니다 2 마일은 3218 미터입니다
팩토리얼 계산하기 #include <stdio.h> int main(void) { int i = 5; long factorial = 1; while (i >= 1) factorial *= i; i--; } printf("%d \n", factorial); return 0;
구구단 출력 // 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++; } return 0; } 구구단 중에서 출력하고 싶은 단을 입력하시오: 9 9*1 = 9 9*2 = 18 9*3 = 27 .... 9*9 = 81
예제 // 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++; } return 0; } ==================== n n의 제곱 1 1 2 4 3 9 4 16 5 25 6 36 7 49 8 64 9 81 10 100
1부터 1000까지의 합 1부터 n까지의 합을 계산하는 프로그램 n이 무엇이 될지 모르는 경우라면 다음과 같이 계산
1부터 1000까지의 합 #include <stdio.h> int main(void) { int i, n, sum; // 변수 선언 i = 1; // 변수 초기화 sum = 0; while(i <= 1000) { sum += i; // sum = sum + i;와 같다. i++; // i = i + 1과 같다. } printf("합은 %d입니다\n", sum); return 0; }
Lab: 반복을 사용하여 도형을 그리자 반복 루프와 윈도우의 GDI 그래픽을 이용하여 사각형 10개를 화면 에 그려보자.
윈도우에서 사각형 그리기 #include <windows.h> #include <stdio.h> int main(void) { HDC hdc = GetWindowDC(GetForegroundWindow()); Ellipse(hdc, 100, 100, 200, 200); return 0; }
윈도우에서 사각형 그리기 #include <windows.h> #include <stdio.h> int main(void) { HDC hdc = GetWindowDC(GetForegroundWindow()); int x = 30; // 첫 번째 사각형의 x좌표 int y = 100; // 첫 번째 사각형의 y좌표 int i = 0; // 반복 제어 변수 while (i < 10) { Rectangle(hdc, x, y, x + 60, y + 60); x += 70; i++; } return 0;
Lab: 최대 공약수 찾기 두수의 최대 공약수 구하기 유클리드 알고리즘 ① 두 수 가운데 큰 수를 x, 작은 수를 y라 한다. ② y가 0이면 공약수는 x와 같다. ③ r ← x % y ④ x ← y ⑤ y ← r ⑥ 단계 ②로 되돌아간다.
Lab: 최대 공약수 찾기 // 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 최대 공약수는 4입니다.
if 문과 while 문의 비교 if( 조건 ) { ... } while( 조건 ) { ... } 조건이 만족되면 한번만 실행된다. 조건이 만족되면 여러 번 반복 실행된다.
do...while문
do-while 문 적어도 한번은 반복문장을 실행한다.
예제 // do..while 문을 이용한 메뉴 1---새로만들기 #include <stdio.h> 2---파일열기 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---새로만들기 2---파일열기 3---파일닫기 하나를 선택하시요. 1 선택된 메뉴=1
중간 점검 1. 다음 코드의 출력을 쓰시오. int n = 0; while (n > 0) { printf("%d\n", n); n = n - 3; } 2. 1번 문제의 반복 구조를 do-while로 변경하면 출력이 어떻게 변화 되는가?
Lab: 숫자 추측 게임 프로그램이 가지고 있는 정수를 사용자가 알아맞히는 게임 사용자가 답을 제시하면 프로그램은 자신이 저장한 정수와 비교하 여 제시된 정수가 더 높은지 낮은지 만을 알려준다.
실행 결과
알고리즘 do 사용자로부터 숫자를 guess로 입력받는다. 시도횟수를 증가한다. if( guess < answer ) 숫자가 낮다고 출력한다. if( guess > answer ) 숫자가 높다고 출력한다. while(guess != answer); “축하합니다”와 시도횟수를 출력한다.
Lab: 숫자 추측 게임 #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 헤더 파일도 포함 시켜야 한다.
for 루프 정해진 횟수만큼 반복하는 구조
for 문의 구조
for 문의 구조
10번 출력하기 “Hello World!”를 화면에 10번 출력하기 Hello World!
10번 출력하기 #include <stdio.h> int main(void) { int i; for(i = 0;i < 10; i++) printf(“Hello World! \n“); return 0; }
10번 출력하기
사각형 그리기
사각형 그리기 // 반복을 이용한 네모 그리기 #include <stdio.h> int main(void) { int i; printf("**********"); for(i = 0;i < 5; i++) printf("* *"); return 0; }
팩토리얼 구하기 Factorial 1부터 어떤 양의 정수 n까지의 정수를 모두 곱한 것을 말하며 n! 로 나타낸다. 0!=1이다. (예) 3! = 3 X 2 X 1 n! = nX(n-1)X(n-2)X...X2X1
팩토리얼 계산하기 // 반복을 이용한 팩토리얼 구하기 #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; }
팩토리얼 계산 예제(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;
다양한 증감수식의 형태 뺄셈 사용 for (i = 0; i < 10; i += 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 ( ; ; ) printf("Hello World!\n"); 무한 반복 루프 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"); 어떤 수식도 가능
중간 점검 1. 다음 코드의 출력을 쓰시오. for(i = 1; i < 5; i++) printf("%d ", 2 * i); 2. 다음 코드의 출력을 쓰시오. for(i = 10; i > 0; i = i - 2) printf("Student%d\n", i);
중첩 반복문 중첩 반복문(nested loop): 반복문 안에 다른 반복문이 위치
사각형 그리기 *기호를 사각형 모양으로 출력하는 프로그램을 작성해보자.
사각형 그리기 // 중첩 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; }
Lab: 구구단 출력
Sol: 구구단 출력 #include <stdio.h> int main(void) { int i, k; for(i=1;i<=9;i++){ for(k=1;k<=9;k++){ printf("%d X %d = %d \n", i, k, i*k); } return 0;
break 문 break 문은 반복 루프를 빠져 나오는데 사용된다.
예제 다음 프로그램은 사용자로부터 10개의 실수를 받아서 합계를 출력 한다. 사용자가 중간에 음수를 입력하면 반복 루프를 조기에 종료시 킨다.
예제 # include <stdio.h> int main(void) { int i; double number, sum = 0.0; for (i = 1; i <= 10; i++) printf("%d번째 실수를 입력하시오: ", i); scanf("%lf", &number); if (number < 0.0) break; sum += number; } printf("합계 = %f", sum); return 0;
continue 문 현재의 반복을 중단하고 다음 반복을 시작하게 한다.
continue 문 예제 0부터 10까지의 정수 중에서 짝수만을 출력하는 프로그램
continue 문 예제 #include <stdio.h> int main(void) { int i; for(i=0 ; i<10 ; i++) if( i%2 == 0 ) continue; printf("정수: %d \n", i); return 0; } 2의 배수 는 건너뛴다.
중간 점검 1. _______ 문이 반복문에서 실행되면 현재의 반복을 중단하고 다음번 반복 처리가 시작된다. 2. _______ 문이 반복문에서 실행되면 반복문을 빠져 나온다. 3. 다음 코드의 출력을 쓰시오. int i; for(i = 1; i < 10; i++) { if( i % 3 == 0 ) break; printf("%d\n", i); }
Lab: 산수 문제 자동 출제 초등학교 학생들을 위한 산수 문제를 자동으로 출제하는 프로그램 을 작성해보자. 덧셈 문제들을 자동으로 생성하여야 한다. 피연산자 는 0에서 99사이의 숫자의 난수로 하자. 한번이라도 맞으면 종료한 다.
Sol: 구구단 출력 #include <stdio.h> #include <stdlib.h> int main(void) { int i, ans; printf("산수 문제를 자동으로 출제합니다. \n"); while(1) { int x = rand() % 100; int y = rand() % 100; printf("%d + %d = ", x, y); scanf("%d", &ans); if (x + y == ans) { printf("맞았습니다.\n"); break; } else printf("틀렸습니다.\n"); return 0; Sol: 구구단 출력
Lab: 앵그리 공 “앵그리 버드”라는 게임이 있었다. 여기서 유사한 게임 “앵그리 공” 을 제작하여 보자. 공을 발사하여서 초기 속도와 초기 각도에 의하 여 비행하게 해보자.
필요한 변수 int x; - 공의 현재 x좌표이다. int y; - 공의 현재 y좌표이다. int vx; - 공의 x 방향 속도이다. int vy; - 공의 y 방향 속도이다.
핵심 코드
Sol: 앵그리 공 #include <windows.h> #include <stdio.h> int main(void) { HDC hdc = GetWindowDC(GetForegroundWindow()); int x = 30, y = 200; int vx = 50, vy = -50; int i; MoveToEx(hdc, 30, 200, NULL); LineTo(hdc, 800, 200); for (i=0; i<20; i++) { vy = vy + 10; x = x + vx; y = y + vy; Ellipse(hdc, x, y, x+10, y+10); Sleep(100); }
Q & A