쉽게풀어쓴 C 언어 Express 제 7 장반복문 C Express
이번장에서학습할내용 반복의개념이해 while 반복문 do-while 반복문 for 반복문 break 와 continue 문 반복구조는일련의처리를반복할수있게한다. 반복의개념을먼저이해하고 C 에서제공되는 3 가지의반복구조에대하여학습한다.
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); 같은처리과정 #1 같은처리과정 #2 meter = 2 * 1609; printf("2 마일은 %d 미터입니다 \n", meter); return 0; 같은처리과정 #3
반복문의종류 이빠질때까지반복하세요 번반복하세요 반복문
중간점검 1. 프로그램에반복구조가필요한이유는무엇인가? 2. 반복문에는, 문이있다.
while 문 주어진조건이만족되는동안문장들을반복실행한다. while( 조건식 ) 문장 ;
예제 #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 미터입니다
예제 // 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 9*1 = 9 return 0; 9*2 = 18 9*3 = 27... 9*9 = 81
// 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
예제 1 부터 n 까지의합을계산하는프로그램 1 + 2 + 3 +... + n n 이무엇이될지모르는경우라면다음과같이계산 1 빈통을준비한다. 2 통에 1 부터 n 까지를넣는다. 3 통에들어있는동전의개수를출력한다....
예제 #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;
예제 // 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;
센티널 ( 보초값의이용 ) 센티널 : 입력되는데이터의끝을알리는특수한값 100, 200, 300, 400, 500, -1 센티널
성적들의평균을구하는문제 성적의평균을구한다. 1. 필요한변수들을초기화한다. 2. 성적을입력받아서합계를구하고성적의개수를센다. 3. 평균을계산하고화면에출력한다. 1. 필요한변수들을초기화한다. (1) sum 을 0 으로초기화한다. (2) n 을 0 으로초기화한다. (3) grade 를 0 으로초기화한다.
성적들의평균을구하는문제 2. 성적을입력받아서합계를구하고성적의개수를센다. while 성적이 0 보다작지않으면 (1) 사용자로부터성적을읽어서 grade 에저장한다. (2) sum 에이점수를누적한다. (3) n 을하나증가한다. 3. 평균을계산하고화면에출력한다. (1) sum 을 n 으로나누어서 average 에저장한다. (2) average 를화면에출력한다.
센티넬예제 1/2 // while 문을이용한성적의평균구하기프로그램 #include <stdio.h> int main(void) int grade, n; float sum, average; // 필요한변수들을초기화한다. n = 0; sum = 0; grade = 0; printf(" 종료시음수입력 \n");
// 성적을입력받아서합계를구하고학생수를센다. while (grade >= 0) printf(" 성적을입력하시오 : "); scanf("%d", &grade); sum += grade; n++; 센티넬예제 2/2 sum = sum - grade; // 마지막데이터를제거한다. n--; // 마지막데이터를제거한다. // 평균을계산하고화면에출력한다. average = sum / n; printf(" 성적의평균은 %f 입니다.\n", average); 성적입력을종료하려면음수를입력하시오성적을입력하시오 : 10 성적을입력하시오 : 20 성적을입력하시오 : 30 성적을입력하시오 : 40 성적을입력하시오 : 50 성적을입력하시오 : -1 성적의평균은 30.000000 입니다. return 0;
예제 : 최대값 #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
예제 두수의최대공약수구하기 유클리드알고리즘 1 두수가운데큰수를 x, 작은수를 y라한다. 2 y가 0이면공약수는 x와같다. 3 r x % y 4 x y 5 y r 6 단계 2로되돌아간다.
예제 // 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;
if 문과 while 문의비교 if( 조건 )...... 조건이만족되면한번만실행된다. while( 조건 )...... 조건이만족되면여러번반복실행된다.
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++;. 변수가증가아니라감소 반복루프에포함되어있지않다. 조건뒤에 ; 이있음
참과거짓 #include <stdio.h> int main(void) int i = 3; while (i) printf("%d 은참입니다.", i); i--; printf("%d 은거짓입니다.", i); 3 은참입니다. 2 은참입니다. 1 은참입니다. 0 은거짓입니다.
중간점검 1. if 문과 while 문을비교하여보라. 똑같은조건이라면어떻게동작하는가? 2. while 루프를이용하여무한루프를만들어보라. 3. 다음코드의출력을쓰시오. int n = 10; while (n > 0) printf("%d\n", n); n = n - 3;
실습 : 반감기 반감기 : 방사능물질의양이 ½ 로되는시간
실행결과 반감기를입력하시오 ( 년 ): 10 10 년후에남은양 =50.000000 20 년후에남은양 =25.000000 30 년후에남은양 =12.500000 40 년후에남은양 =6.250000 1/10 이하로되기까지걸린시간 =40 년 단로그함수는사용하지않는다! 반복문을사용한다.
알고리즘 사용자로부터반감기를입력받는다. while( 물질의양 > 초기물질의양 *0.1) 반감기만큼시간을더한다. 물질의양은 1/2 로줄어든다. 현재물질의양을출력한다. 10% 이하로되기까지걸린시간을출력한다.
소스 #include <stdio.h> int main(void) int halflife; double initial; double current; int years=0; printf(" 반감기를입력하시오 ( 년 ): "); scanf("%d", &halflife); initial = 100.0; current = initial; while( current > initial/10.0 ) years += halflife; current = current / 2.0; printf("%d 년후에남은양 =%f", years, current); printf("1/10 이하로되기까지걸린시간 =%d 년 ", years); return 0;
도전문제 위와비슷한문제를하나더작성해보자. 세균이 1 시간마다 4 배씩증가한다고가정하자. 이세균 10 마리를배양하면 7 시간후의세균의수는얼마나될까? 역시지수함수나로그함수를이용하지말고반복구조만을사용하여서해결하여보자. 종이를한번접으면면적이 1/2 로줄어든다. 종이를몇번접어야원래면적의 1/100 로줄어드는가? 역시로그함수나지수함수를사용하지말고반복구조를이용하여서해결하여보자.
do...while 문 반복조건을루프의끝에서검사 do 문장 while( 조건 )
do-while 문 적어도한번은반복문장을실행한다.
// 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;
중간점검 1. 다음코드의출력을쓰시오. int n = 0; do printf("%d\n", n); n = n + 3; while(n < 10);
실습 : 숫자추측게임 프로그램이가지고있는정수를사용자가알아맞히는게임 사용자가답을제시하면프로그램은자신이저장한정수와비교하여제시된정수가더높은지낮은지만을알려준다.
실행결과 정답을추측하여보시오 : 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); return 0; printf(" 축하합니다. 시도횟수 =%d", tries);
도전문제 위의프로그램이게임이되려면난수를발생시키는것이좋다. 난수는 (rand()%100) 으로발생이가능하다. stdlib.h 헤더파일도포함시켜야한다.
정해진횟수만큼반복하는구조 for 루프
for 문의구조 for ( 초기식 ; 조건식 ; 증감식 ) 문장 ; 1 초기식을실행한다. 2 반복조건을나타내는조건식을계산한다. 3 수식의값이거짓이면 for 문의실행이종료된다. 4 수식의값이참이면문장이실행된다. 5 증감식을실행하고 2 로돌아간다.
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번째반복 0 참 반복 2번째반복 1 참 반복 3번째반복 2 참 반복 4번째반복 3 참 반복 5번째반복 4 참 반복 6번째반복 5 참 반복 7번째반복 6 참 반복 8번째반복 7 참 반복 9번째반복 8 참 반복 10번째반복 9 참 반복 11 번째반복 10 거짓중지
예제 // 반복을이용한정수합프로그램 #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
예제 // 반복을이용한세제곱값구하기 #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;
예제 // 반복을이용한네모그리기 #include <stdio.h> int main(void) int i; printf("**********"); for(i = 0;i < 5; i++) printf("* *"); printf("**********"); return 0; ********** * * * * * * * * * * **********
예제 // 반복을이용한팩토리얼구하기 #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입니다.
while 루프와 for 루프와의관계 초기식 while ( 조건식 ) 문장1 ; 문장2 ;... 증감식 ; for ( 초기식 ; 조건식 ; 증감식 ) 문장 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; 정수를입력하시요 : 10 10! 은 3628800입니다.
다양한증감수식의형태 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"); for (printf(" 반복시작 ), i = 0; i < 100; i++ ) printf("hello World!\n"); 한부분이없을수도있다. 2 개이상의변수초기화 어떤수식도가능
중간점검 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; ********** ********** ********** ********** **********
예제 #include <stdio.h> int main(void) int x, y; for(y = 1; y <= 5; y++) for(x = 0; x < y; x++) printf("*"); printf(""); // 내부반복문이종료될때마다실행 return 0; * ** *** **** *****
중간점검 1. 다음코드의출력을쓰시오. for(i = 1; i < 6; i++) for(j = 5; j >= 1; j--) printf("%d 곱하기 %d은 %d\n", i, j, i*j);
실습 : 직각삼각형찾기 각변의길이가 100 보다작은삼각형중에서피타고라스의정리가성립하는직각삼각형은몇개나있을까?
실행결과 3 4 5 4 3 5 5 12 13...
알고리즘 for(a=1;a<=100;a++) for(b=1;b<=100;b++) for(c=1;c<=100;c++) if( a*a + b*b == c*c ) a 와 b 와 c 를화면에출력한다.
소스 #include <stdio.h> int main(void) int a, b, c; for(a=1; a<=100; a++) return 0; for(b=1; b<=100; b++) for(c=1; c<=100; c++) if( (a*a+b*b)==c*c ) printf("%d %d %d", a, b, c);
도전문제 위와비슷한문제를하나더작성해보자. 라스베가스와같은도박장에가면주사위게임이있다. 주사위 2 개를던졌을때, 합이 6 이되는경우를전부출력하여보자. 예를들어서 (1, 5), (2, 4),... 와같이출력되면된다. 또주사위 3 개를사용하여서합이 10 이되는경우를전부출력하여보자.
break 문 break 문은반복루프를빠져나오는데사용된다. break 를만나면탈출할수있읍니다. break 반복루프
예제 #include <stdio.h> #define SEED_MONEY 1000000 int main(void) int year=0, money=seed_money; while(1) year++; printf("%d", year); return 0; money += money*0.30; if( money > 10*SEED_MONEY ) break; 원금의 10 배가되면
예제 // break를이용하여무한루프를탈출한다. #include <stdio.h> #include <math.h> int main(void) double v; 실수값을입력하시오 : 9.0 9.000000 의제곱근은 3.000000 입니다. 실수값을입력하시오 : 12.0 12.000000 의제곱근은 3.464102 입니다. 실수값을입력하시오 : 25.0 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;
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; OUT 으로 goto ***************************** ******************** ***************************** ******************** ***********
continue 문 현재의반복을중단하고다음반복을시작하게한다.
예제 #include <stdio.h> int main(void) int i; for(i=0 ; i<10 ; i++) if( i%3 == 0 ) continue; printf("%d ", i); 3 의배수는건너뛴다. return 0; 1 2 4 5 7 8
예제 // 소문자를대문자로변경한다. #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;
중간점검 1. 문이반복문에서실행되면현재의반복을중단하고다음번반복처리가시작된다. 2. 문이반복문에서실행되면반복문을빠져나온다. 3. 다음코드의출력을쓰시오. int i; for(i = 1; i < 10; i++) if( i % 3 == 0 ) break; printf("%d\n", i);
실습 : 파이구하기 파이를계산하는가장고전적인방법은 Gregory-Leibniz 무한수열을이용하는것
실행결과 반복횟수 :100000 Pi = 3.141583 계속하려면아무키나누르십시오...
알고리즘 사용자로부터반복횟수 loop_count 를입력받는다. 분자 = 4.0; 분모 = 1.0; sum = 0.0; while(loop_count > 0) sum = sum + 분자 / 분모 ; 분자 = -1.0* 분자 ; 분모 = 분모 + 2.0; --loop_count; sum 을출력한다.
실습코드 #include <stdio.h> int main(void) double divisor, divident, sum; int loop_count; divisor = 1.0; divident = 4.0; sum = 0.0; printf(" 반복횟수 :"); scanf("%d", &loop_count); while(loop_count > 0) sum = sum + divident / divisor; divident = -1.0 * divident; divisor = divisor + 2; loop_count--; printf("pi = %f", sum); return 0;
예제 #include <stdio.h> int main(void) int i, years; double total, rate, investment; printf(" 원금 : "); scanf("%lf", &investment); printf(" 이율 (%%): "); scanf("%lf", &rate); printf(" 기간 ( 년 ): "); scanf("%d", &years); printf("=================="); printf(" 연도원리금 "); printf("==================");
예제 total = investment; rate /= 100.0; for(i = 0; i < years; i++) total = total * ( 1 + rate ); // 새로운원리금계산 printf("%2d %10.1f", i+1, total); return 0; 원금 : 1000000 이율 (%): 8 기간 ( 년 ): 10 ================== 연도원리금 ================== 1 1080000.0 2 1166400.0 3 1259712.0 4 1360489.0 5 1469328.1 6 1586874.3 7 1713824.3 8 1850930.2 9 1999004.6 10 2158925.0
예제 #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;
Q & A