Computer Engineering g Programming g 2 제 7 장반복문 Lecturer: JUNBEOM YOO jbyoo@konkuk.ac.kr 본강의자료는생능출판사의 PPT 강의자료 를기반으로제작되었습니다.
이번장에서학습할내용 반복의개념이해 while 반복문 do-while 반복문 for 반복문 break와 continue문 반복구조는일련의처리를반복할수있게한다. 반복의개념을먼저이해하고 C에서제공되는 3가지의반복구조에대하여학습한다. 2
Q) 반복구조는왜필요한가? 반복문 A) 같은처리과정을되풀이하는것이필요하기때문이다. 학생 30 명의평균성적을구하려면같은과정을 30 번반복하여야한다. 3
프로그램의흐름을제어하는방법 순차구조 차례대로실행 선택구조 조건을검사하여여러개의실행경로중에서하나를선택 반복구조 조건이만족될때까지반복 4
마일을미터로바꾸는프로그램 #include <stdio.h> int main(void) int meter; meter = 0 * 1609; printf("0 마일은 %d미터입니다\n", meter); 같은처리과정 #1 meter = 1 * 1609; printf("1 마일은 %d미터입니다\n", meter); 같은처리과정 #2 meter = 2 * 1609; printf("2 마일은 %d미터입니다\n", meter); return 0; 같은처리과정 #3 5
반복문의종류 6
while 문 주어진조건이만족되는동안문장들을반복실행한다. while( 조건식 ) 문장 ; 7
#include <stdio.h> 예제 0 i int main(void) int meter; int i = 0; while(i < 3) meter = i * 1609; printf("%d 마일은 %d 미터입니다 \n", i, meter); i++; return 0; 0 마일은 0 미터입니다 1 마일은 1609 미터입니다 2 마일은 3218 미터입니다 8
반복문의실행과정 9
반복문의실행과정 10
반복문의실행과정 반복횟수 i 의값 i< 3 반복여부 첫번째반복 ( 시작위치 ) 0 참 (1) 반복 두번째반복 ( 시작위치 ) 1 참 (1) 반복 세번째반복 ( 시작위치 ) 2 참 (1) 반복 네번째반복 ( 시작위치 ) 3 거짓 (0) 중지 11
예제 // 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++; 구구단중에서출력하고싶은단을입력하시오 : 9 return 0; 9*1 = 9 9*2 92 = 18 9*3 = 27... Konkuk 9*9 University = 81 12
예제 // while 문을이용한제곱값출력프로그램 #include <stdio.h> int main(void) int n; printf("====================\n"); printf(" n n 의제곱 \n"); printf("====================\n"); n = 1; while (n <= 10) printf("%5d n++; return 0; %5d\n", n, n*n); =================== n n의제곱 =================== 1 1 2 4 3 9 4 16 5 25 6 36 7 49 8 64 9 81 10 100 13
예제 1 부터 n 까지의합을계산하는프로그램 1 + 2 + 3 +... + n n 이무엇이될지모르는경우라면다음과같이계산 1 빈통을준비한다. 2 통에 1 부터 n 까지를넣는다. 3 통에들어있는동전의개수를출력한다.... 14
예제 #include <stdio.h> int main(void) int i, n, sum; // 변수선언 정수를입력하시오 : 3 1 부터 3 까지의합은 6 입니다 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; 15
예제 // while 문을이용한합계프로그램 #include <stdio.h> int main(void) int i, n, sum; i = 0; // 변수초기화 sum = 0; // 변수초기화 while (i < 5) printf(" 값을입력하시오 : "); scanf("%d", &n); sum = sum + n; // sum += n; 과같다. i++; printf(" 합계는 %d입니다.\n", sum); 값을입력하시오 : 10 값을입력하시오 : 20 값을입력하시오 : 30 값을입력하시오 : 40 값을입력하시오 : 50 합계는 150입니다. return 0; 16
센티널 ( 보초값의이용 ) 센티널 : 입력되는데이터의끝을알리는특수한값 100, 200, 300, 400, 500, -1 센티널 17
성적들의평균을구하는문제 성적의평균을구한다. 1. 필요한변수들을초기화한다. 2. 성적을입력받아서합계를구하고성적의개수를센다. 3. 평균을계산하고화면에출력한다. 1. 필요한변수들을초기화한다. (1) sum을 0으로초기화한다. (2) n을 0으로초기화한다. (3) grade를 0으로초기화한다. 18
성적들의평균을구하는문제 2. 성적을입력받아서합계를구하고성적의개수를센다. while 성적이 0보다작지않으면 (1) 사용자로부터성적을읽어서 grade 에저장한다. (2) sum에이점수를누적한다. (3) n을하나증가한다. 3. 평균을계산하고화면에출력한다. (1) sum을 n으로나누어서 average 에저장한다. (2) average를화면에출력한다. 19
센티넬예제 1/2 // while 문을이용한성적의평균구하기프로그램 #include <stdio.h> int main(void) int grade, n; float sum, average; // 필요한변수들을초기화한다. n = 0; sum = 0; grade = 0; printf(" 성적입력을종료하려면음수를입력하시오 \n"); 20
센티넬예제 2/2 // 성적을입력받아서합계를구하고학생수를센다. while (grade >= 0) printf(" 성적을입력하시오 : "); 오 scanf("%d", &grade); sum += grade; n++; sum = sum - grade; // 마지막데이터를제거한다. n--; // 마지막데이터를제거한다. // 평균을계산하고화면에출력한다. average = sum / n; printf(" 성적의평균은 %f입니다.\n", average); 성적입력을종료하려면음수를입력하시 성적을입력하시오 : 10 성적을입력하시오 : 20 성적을입력하시오 : 30 성적을입력하시오 : 40 성적을입력하시오 : 50 성적을입력하시오 : -1 성적의평균은 30.000000 입니다. return 0; 21
예제 두수의최대공약수구하기 유클리드알고리즘 1 두수가운데큰수를 x, 작은수를 y라한다. 2 y가 0이면공약수는 x와같다. 3 r x % y 4 x y 5 y r 6 단계 2 로되돌아간다. 22
예제 // while 문을이용한최대공약수구하기프로그램 #include <stdio.h> int main(void) 두개의정수를입력하시오 ( 큰수, 작은수 ): 12 8 int x, y, r; 최대공약수는 4입니다. printf(" 두개의정수를입력하시오 ( 큰수, 작은수 ): "); scanf("%d%d", &x, &y); while (y!= 0) r = x % y; x = y; y = r; printf(" 최대공약수는 %d 입니다.\n", x); return 0; 23
if 문과 while 문의비교 if 문은 while 문으로변경할수있다. while 문도 if문으로변경할수있다. if( 조건 )...... 조건이만족되면한번만실행된다. while( 조건 )...... 조건이만족되면여러번반복실행된다. 24
while 문에서주의할점 int i = 1; while(i < 10) printf(" 반복중입니다 \n"): i--; int i = 0; while(i < 3) printf(" 반복중입니다 \n"): i++;. 변수가증가아니라감소반복루프에포함되어있지않다. int i = 0; while(i < 3) ; printf(" 반복중입니다 \n"): i++;. 조건뒤에 ; 이있음 25
do...while 문 반복조건을루프의끝에서검사 do 문장 while( 조건 ) 1 문장들이실행된다. 2 조건식이계산된다. 3 결과가참이면 1로돌아간다. 4 결과가거짓이면종료된다. 26
// do..while 문을이용한메뉴 #include <stdio.h> 예제 1---새로만들기 2---파일열기 3---파일닫기 int main(void) 하나를선택하시요. int i = 0; 1 do 선택된메뉴 =1 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; 27
// 반복을이용한글자게임프로그램 #include <stdio.h> int main(void) char answer = 'm' char guess; int tries = 0; do 글자게임예제 printf(" 정답을추측하여보시오 : "); scanf(" %c", &guess); tries++; 정답을추측하여보시오 : a 제시한문자의아스키코드값이낮습니다. 정답을추측하여보시오 : s 제시한문자의아스키코드값이높습니다. 정답을추측하여보시오 : b 제시한문자의아스키코드값이낮습니다. 정답을추측하여보시오 : z 제시한문자의아스키코드값이높습니다. 정답을추측하여보시오 : m 축하합니다. 시도횟수 =5 if( guess > answer ) printf(" 제시한문자의아스키코드값이높습니다.\n"); if( (g guess < answer ) printf(" 제시한문자의아스키코드값이낮습니다.\n"); while(guess!= answer); printf(" 축하합니다. 시도횟수 =%d \n", tries); return 0; 28
for 루프 정해진횟수만큼반복하는구조 29
for 문의구조 for ( 초기화 ; 조건식 ; 증감식 ) 문장 ; 1 초기화를실행한다. 2 반복조건을나타내는조건식을계산한다. 3 수식의값이거짓이면 for 문의실행이종료된다. 4 수식의값이참이면문장이실행된다. 5 증감을실행하고 2로돌아간다. 30
for 문의구조 int i; for(i = 0; i < 10; i++) printf("hello World!\n"); 31
for 문의실행과정 32
for 문의실행과정 int i; for(i = 0; i < 10; i++) printf("hello World!\n"); 반복횟수 i의값 i<10 반복여부 1 번째반복 0 참 반복 2 번째반복 1 참반복 3 번째반복 2 참반복 4 번째반복 3 참반복 5 번째반복 4 참반복 6 번째반복 5 참반복 7 번째반복 6 참반복 8 번째반복 7 참반복 9 번째반복 8 참반복 10 번째반복 9 참반복 11번째반복 10 거짓중지 33
예제 // 반복을이용한정수합프로그램 #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; 1 부터 10 까지의정수의합 =55 34
예제 // 반복을이용한세제곱값구하기 #include <stdio.h> int main(void) int i, n; printf(" 정수를입력하시요 :"); scanf("%d", &n); 정수를입력하시요 :5 ==================== i i의세제곱 ==================== 1 1 2 8 3 27 4 64 5 125 printf("====================\n"); printf(" i i의세제곱 \n"); printf("====================\n"); for(i = 1;i <= n; i++) printf("%5d %5d\n", i, i*i*i); return 0; 35
예제 // 반복을이용한팩토리얼구하기 #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; 정수를입력하시요 :10 10! 은 3628800입니다. 36
while 루프와 for 루프와의관계 37
다양한증감수식의형태 for (i = 10; i > 0; i-- ) 뺄셈사용 printf("hello World!\n"); for (i =0; i<10; i+=2) printf("hello World!\n"); for (i = 1; i < 10; i *= 2 ) printf("hello World!\n"); for (i = 0; i < 100; i = (i * i) + 2 ) printf("hello World!\n"); for ( ; i<100; i++ ) printf("hello World!\n"); for (i = 0, k = 0; i < 100; i++ ) printf("hello World!\n"); for (printf(" 반복시작 ), i = 0; i < 100; i++ ) printf("hello World!\n"); 2 씩증가 2를곱한다. 어떤수식이라도가능한부분이없을수도있다. 2개이상의변수초기화어떤수식도가능 38
중첩반복문 중첩반복문 (nested loop): 반복문안에다른반복문이위치 39
예제 // 중첩 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; ********** ********** ********** ********** ********** 40
예제 #include <stdio.h> int main(void) int s, t; float score, total, average; for(s = 0;s < 20; s++) total = 0; for(t = 0;t < 5; t++) printf("%d 번학생에대한 % 번째성적 : "); scanf("%f", &score); total += score; average = total / 5.0; printf("%d번학생의성적평균 : %f\n", average); return 0; 41
break 문 break 문은반복루프를빠져나오는데사용된다. 42
예제 // break를이용하여무한루프를탈출한다. #include <stdio.h> #include <math.h> int main(void) id) double v; while(1) printf(" 실수값을입력하시오 : "); scanf("%lf", &v); if( v < 0.0 ) break; printf("%f의제곱근은 %f입니다.\n", v, sqrt(v)); 실수값을입력하시오 : 9.0 9.000000의제곱근은 3.000000입니다. 실수값을입력하시오 :120 12.0 12.000000의제곱근은 3.464102입니다. 실수값을입력하시오 : 25.0 25.000000의제곱근은 5.000000입니다. 실수값을입력하시오 : -1 return 0; 43
예제 // break 를이용하여무한루프를탈출한다. #include <stdio.h> int main(void) float grade, sum = 0.0, average; int count = 0; 학생성적을입력하시오 : 90 학생성적을입력하시오 : 90 학생성적을입력하시오 : 80 학생성적을입력하시오 : 70 학생성적을입력하시오 : -1 학생들의성적의평균은 82.500000입니다. while(1) printf(" 학생성적을입력하시오 : "); scanf("%f", &grade); if( grade < 0.00 ) break; count++; sum += grade; average = sum / count; printf(" 학생들의성적의평균은 %f입니다.\n", average); return 0; 44
goto 문의사용 #include <stdio.h> int main(void) int x, y; for(y = 1; y < 10000; y++) for(x = 1; x < 50; x++) if( _kbhit() ) goto OUT; printf("*"); printf("\n"); OUT: return 0; 45
continue 문 현재의반복을중단하고다음반복을시작하게한다. 46
예제 sum = 245 47
예제 // 소문자를대문자로변경한다. #include <stdio.h> int main(void) char letter; while(1) printf(" 소문자를입력하시오 : "); scanf(" %c", &letter); 소문자를입력하시오 : a 변환된대문자는 A입니다. 소문자를입력하시오 : b 변환된대문자는 B입니다. 소문자를입력하시오 : c 변환된대문자는 C입니다. 소문자를입력하시오 : Q if( letter == 'Q' ) break ; if( letter < 'a' letter > 'z' ) continue ; letter -= 32; printf(" 변환된대문자는 %c 입니다.\n", letter); return 0; 48
예제 // 복리이자계산 #include <stdio.h> #define RATE 0.07 // 이율 #define INVESTMENT 10000000 // 초기투자금 #define YEARS 10 // 투자기간 int main(void) int i; double total = INVESTMENT; // 원리금합계 printf("==============\n"); printf(" 연도원리금 \n"); printf("==============\n"); ============== 연도원리금 ============== 1 10700000.0 2 11449000.0 3 12250430.0 4 13107960.1 5 14025517.3 6 15007303.5 7 16057814.8 8 17181861.8 9 18384592.1 10 19671513.6 for(i = 1; i <= YEARS; i++) total = total * ( 1 + RATE ); // 새로운원리금계산 printf("%2d %10.1f\n", i, total); return 0; 49
예제 #include <stdio.h> #define START_DAY 3 // 첫번째날이수요일 #define DAYS_OF_MONTH 31 // 달의일수 int main(void) id) 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; 50
Q&A 51