쉽게풀어쓴 C 언어 Express 제 7 장반복문 컴퓨터프로그래밍기초
이번장에서학습할내용 반복의개념이해 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); meter = 1 * 1609; printf("1 마일은 %d미터입니다\n", meter); 같은처리과정 #1 같은처리과정 #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++; return 0; 9*3 93 =27 구구단중에서출력하고싶은단을입력하시오 : 9 9*1 = 9 9*2 = 18... 9*9 = 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
성적들의평균을구하는문제 while 성적이 0 보다작지않으면 2. 성적을입력받아서합계를구하고성적의개수를센다. (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); 성적입력을종료하려면음수를입력하시오성적을입력하시오 : 10 성적을입력하시오 : 20 성적을입력하시오 : 30 sum += grade; n++; sum = sum - grade; // 마지막데이터를제거한다. n--; // 마지막데이터를제거한다. // 평균을계산하고화면에출력한다. average = sum / n; printf(" 성적의평균은 %f 입니다.\n", average); 성적을입력하시오 : 40 성적을입력하시오 : 50 성적을입력하시오 : -1 성적의평균은 30.000000 입니다. return 0; 컴퓨터프로그래밍기초 21
예제 두수의최대공약수구하기 유클리드알고리즘 Euclid discovered: For all integers a, b, gcd(a, b) = gcd((a mod b), b). 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) int x, y, r; 두개의정수를입력하시오 ( 큰수, 작은수 ): 12 8 최대공약수는 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) int i = 0; printf(" 반복중입니다 \n"): i--; 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> 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); 1---새로만들기 2---파일열기 3---파일닫기하나를선택하시요. 1 선택된메뉴 =1 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( 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 번학생에대한 %d 번째성적 :, s+1, t+1); scanf("%f", &score); total += score; average = total / 5.0; printf("%d번학생의성적평균 : %f\n", s+1, average); return 0; 컴퓨터프로그래밍 기초 41
break 문 break 문은반복루프를빠져나오는데사용된다. 컴퓨터프로그래밍기초 42
예제 // break를이용하여무한루프를탈출한다. #include <stdio.h> #include <math.h> h> 실수값을입력하시오 : 9.0 9.000000의제곱근은 3.000000입니다. 실수값을입력하시오 : 12.0 int main(void) 12.000000의제곱근은 3.464102입니다. 실수값을입력하시오 :250 25.0 double v; 25.000000의제곱근은 5.000000입니다. 실수값을입력하시오 : -1 while(1) printf(" 실수값을입력하시오 : "); scanf("%lf", &v); if( v < 0.0 ) break; printf("%f의제곱근은 %f입니다.\n", v, sqrt(v)); return 0; 컴퓨터프로그래밍기초 43
예제 // break 를이용하여무한루프를탈출한다. #include <stdio.h> 학생성적을입력하시오 : 90 int main(void) float grade, sum = 0.0, average; int count = 0; while(1) printf(" 학생성적을입력하시오 : "); scanf("%f", &grade); 학생성적을입력하시오 : 90 학생성적을입력하시오 :80 학생성적을입력하시오 : 70 학생성적을입력하시오 : -1 학생들의성적의평균은 82.500000입니다. 컴퓨터프로그래밍기초 if( grade < 0.0 ) break; count++; sum += grade; average = sum / count; printf(" 학생들의성적의평균은 %f입니다.\n", average); return 0; 44
#include <stdio.h> int main(void) id) int x, y; goto 문의사용 -skip 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 = 2450 컴퓨터프로그래밍기초 47
예제 // 소문자를대문자로변경한다. #include <stdio.h> int main(void) id) 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.0707 // 이율 #define INVESTMENT 10000000 // 초기투자금 #define YEARS 10 // 투자기간 int main(void) int i; double total = INVESTMENT; // 원리금합계 printf("==============\n"); printf(" 연도원리금 \n"); printf("==============\n"); ") ============== 연도원리금 ============== 1 10700000.00 2 11449000.0 3 12250430.0 4 13107960.1 5 14025517.3 6 15007303.5 7 16057814.8 8 17181861.8 9 18384592.11 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) 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