7. while 문의 흐름 제어

39
7. while 문문 문문 문문

Upload: yvonne-gilliam

Post on 04-Jan-2016

57 views

Category:

Documents


0 download

DESCRIPTION

7. while 문의 흐름 제어. while 문. 기타 제어문. 1. 3. 이 장에서 다룰 내용. do ~ while 문. 2. 01_while 문. while 문의 실행 순서 조건식이 참인 동안 반복할 문장 수행 중괄호가 끝나는 곳에서 조건식으로 돌아와 같은 동작 반복. 01_while 문. for 문과 while 문의 사용 형식 비교 0~9 까지 출력하는 예. int i; for(i=0; i

TRANSCRIPT

Page 1: 7. while  문의 흐름 제어

7. while 문의 흐름 제어

Page 2: 7. while  문의 흐름 제어

이 장에서 다룰 내용

while 문1.

do ~ while 문2.

기타 제어문3.

Page 3: 7. while  문의 흐름 제어

01_while 문

while 문의 실행 순서 조건식이 참인 동안 반복할 문장 수행 중괄호가 끝나는 곳에서 조건식으로 돌아와 같은 동작 반복

Page 4: 7. while  문의 흐름 제어

01_while 문

for 문과 while 문의 사용 형식 비교 0~9 까지 출력하는 예

int i;for(i=0; i<10; i++){

printf(“%d \n”, i);}

int i;i = 0;

while(i<10){

printf(“%d \n”, i);i++;

}

① 초기값을 for 문 밖으로 이동② 증감식을 for 문의 끝으로 이동③ for 를 while 로

Page 5: 7. while  문의 흐름 제어

[ 기본예제 7-1] for 문을 while 문으로 바꾸기 ①

01 #include <stdio.h>0203 int main()04 {05 int i;06 i=0;0708 while ( i < 5 ){09 printf("while 문을 공부합니다 .\n");10 i++;11 }12 }

초기값 지정

조건식

증감식

Page 6: 7. while  문의 흐름 제어

01_while 문

for 문을 while 문으로 변환하는 방법

Page 7: 7. while  문의 흐름 제어

[ 기본예제 7-2] for 문을 while 문으로 바꾸기 ②

01 #include <stdio.h>0203 int main()04 {05 int hap=0;06 int i;0708 [ ① ]09 while ( i<=10 ) {10 hap = hap + i;11 [ ② ]12 }1314 printf(" 1 에서 10 까지의 합 : %d \n", hap);15 }

초기값 지정

조건식

i = 1;

i ++;

증감식

Page 8: 7. while  문의 흐름 제어

01_while 문

무한루프를 위한 while 문 조건식이 무조건 참이어야 함 for( ; ; ) 와 동일한 역할 while(1) 로 표현

Page 9: 7. while  문의 흐름 제어

[ 기본예제 7-3] while 문의 무한루프 만들기

01 #include <stdio.h>0203 int main()04 {05 int a, b;0607 while ( 1 )08 {09 printf (" 더할 두 수 입력 ( 멈추려면 Ctrl+C) :

") ;10 scanf("%d %d", &a, &b);1112 printf("%d + %d = %d \n", a, b, a+b);13 }14 }

무한루프

입력 값을 공백으로 분리

출력

Page 10: 7. while  문의 흐름 제어

[ 응용예제 7-4] 무한루프를 활용한 계산기

01 #include <stdio.h>0203 int main()04 {05 int a, b;06 char ch;0708 [ ① ]09 {10 printf (" 계산할 두 수를 입력 ( 멈추려면

Ctrl+C) : ") ;11 scanf("%d %d", &a, &b);1213 printf(" 계산할 연산자를 입력하세요 : ");14 scanf("%*c%c", &ch);1516 [ ② ](ch)17 {

while(1)

무한루프

키보드로 숫자 2 개를 입력받음

연산자 입력

switch

Page 11: 7. while  문의 흐름 제어

[ 응용예제 7-4] 무한루프를 활용한 계산기

18 case '+' :19 printf("%d + %d = %d 입니다 . \n", a, b, a+b);20 break;21 case '-' :22 printf("%d - %d = %d 입니다 . \n", a, b, a-b);23 break;24 case '*' :25 printf("%d * %d = %d 입니다 . \n", a, b, a*b);26 break;27 case '/' :28 printf("%d / %d = %f 입니다 . \n", a, b, a/(float)b);29 break;30 case '%' :31 printf("%d %% %d = %d 입니다 . \n", a, b, a%b);32 break;

Page 12: 7. while  문의 흐름 제어

[ 응용예제 7-4] 무한루프를 활용한 계산기

33 default :34 printf(" 연산자를 잘못 입력했습니다 . \n");35 }36 }37 }

Page 13: 7. while  문의 흐름 제어

02_do~while 문

do~while 문 조건식을 확인하기 전에 ‘반복할 문장’을 수행 무조건 한 번은 실행됨 형식은 while 문과 동일하지만 , 조건식이 아래에 위치

Page 14: 7. while  문의 흐름 제어

[ 기본예제 7-5] do~while 문의 사용 예 ①

01 #include <stdio.h>0203 int main()04 {05 int a = 100;0607 while ( a == 200 )08 {09 printf ("while 문 내부에 들어 왔습니다 .\n") ;10 }1112 do {13 printf ("do ~ while 문 내부에 들어 왔습니다 .\

n") ;14 } while ( a == 200 ) ;15 }

while 문 실행 : 조건식 먼저 판단

do~while 문 실행 :먼저 실행한 후에 조건식 판단

Page 15: 7. while  문의 흐름 제어

[ 응용예제 7-6] do~while 문의 사용 예 ②

01 #include <stdio.h>0203 int main()04 {05 int menu;0607 [ ① ]{08 printf("\n 손님 주문하시겠습니까 ? \n");09 printf("<1> 스테이크 <2> 스파게티 <3> 물 ");10 printf("<4> 빵 <5> 그만 시킬래요 ==> ");11 scanf("%d", &menu);1213 switch(menu)14 {15 case 1 : printf("# 스테이크 알겠습니다 .\n"); break;

do do 문이므로 한번은 꼭 수행

메뉴 출력

메뉴 선택

선택한 메뉴에 따라 주문을 접수

Page 16: 7. while  문의 흐름 제어

[ 응용예제 7-6] do~while 문의 사용 예 ②

16 case 2 : printf("# 스파게티 알겠습니다 .\n"); break;17 case 3 : printf("# 물 알겠습니다 .\n"); break;18 case 4 : printf("# 빵 알겠습니다 .\n"); break;19 case 5 : printf(" 안녕히 가세요 .\n"); break;20 default : printf(" 잘못 주문하셨습니다 .\n");21 }22 } [ ② ](menu != 5);23 }

while 선택한 메뉴가 5 가

아닌 동안 계속 수행

Page 17: 7. while  문의 흐름 제어

03_ 기타 제어문

break 문 for, while, do~while 과 같은 반복문을 탈출할 때 사용 if 문과 결합하여 무한루프 안에 사용

• 무한루프를 돌다 특정 조건을 만족하면 프로그램을 종료하는 역할

Page 18: 7. while  문의 흐름 제어

[ 기본예제 7-7] break 문의 사용 예 ①

01 #include <stdio.h>0203 int main()04 {05 int i;0607 for( i=1 ; i<=100 ; i++)08 {09 printf("for 문을 %d 회 실행했습니다 .\n", i);10 break;11 }1213 printf("for 문을 종료했습니다 .\n");14 }

100 번 반복

출력

무조건 for 문을 빠져나감

Page 19: 7. while  문의 흐름 제어

[ 기본예제 7-8] break 문의 사용 예 ②

01 #include <stdio.h>0203 int main()04 {05 int a, b;0607 while ( 1 )08 {09 printf (" 더할 두 수 입력 ( 멈추려면 0 을 입력 ) : ") ;10 scanf("%d %d", &a, &b);1112 if (a == 0)13 break;1415 printf("%d + %d = %d \n", a, b, a+b);16 }

무한 루프

키보드로 숫자 두 개를 입력받음

입력값이 0 이면 무조건 for 문을 빠져나감

Page 20: 7. while  문의 흐름 제어

[ 기본예제 7-8] break 문의 사용 예 ②

1718 printf("0 을 입력해서 for 문을 탈출했습니다 .\n");19 }

Page 21: 7. while  문의 흐름 제어

[ 기본예제 7-9] break 문의 사용 예 ③

01 #include <stdio.h>0203 int main()04 {05 int i;06 i = 0;07 for ( ; ; )08 {09 printf (" %d \n", i) ;10 i ++ ;11 if (i < 10)12 { break; }13 }1415 }

무한루프

i 값 출력 후 1 을 더해줌

i 가 10 보다 작으면 반복문의 블록을 무조건 빠져나감

Page 22: 7. while  문의 흐름 제어

03_ 기타 제어문

break 문의 탈출 범위 현재 실행중인 반복문 블록을 무조건 빠져나오는 명령문 [ 기본예제 7-9] 의 수정

• i 값이 0 부터 시작하므로 첫번째 루프를 돌 때 프로그램 종료• 1~9 까지 출력하려면 부등호를 수정해야 함

for( ; ; ){ ...

if(i < 10){ break; }

}

if (i >= 10)

Page 23: 7. while  문의 흐름 제어

[ 응용예제 7-10] break 문의 사용 예 ④

01 #include <stdio.h>0203 int main()04 {05 int hap = 0;06 int i;0708 for ( i=1 ; i<=100 ; i++)09 {10 hap = hap + i;1112 if ( )13 break;14 }1516 printf(" 1~100 의 합에서 최초로 1000 이 넘는 위치는 ? : %d\

n", i);17 }

100 번 반복 실행

i 값을 hap 에 누적

hap 이 100 보다 크거나 같으면 블록을 빠져나감

블록을 빠져나간 순간의 i 값

Page 24: 7. while  문의 흐름 제어

03_ 기타 제어문

블록의 끝으로 가는 continue 문 블록의 끝으로 이동한 후 반복문을 처음부터 다시 수행

Page 25: 7. while  문의 흐름 제어

[ 기본예제 7-11] continue 문의 사용 예

01 #include <stdio.h>0203 int main()04 {05 int hap = 0;06 int i;0708 for ( i=1 ; i<=100 ; i++ )09 {10 if ( i % 3 == 0 )11 continue;1213 hap += i;14 }1516 printf(" 1~100 까지의 합 (3 의 배수 제외 ): %d\n",

hap);17 }

1 부터 100 까지 반복

나머지 값이 0 일 때 (3 의 배수 ) 블록의 끝으로 이동

3 의 배수가 아닌 i 값 누적

누적된 값 출력

Page 26: 7. while  문의 흐름 제어

03_ 기타 제어문

지정한 위치로 이동하는 goto 문 지정된 레이블 (label) 로 건너뛰게 하는 명령문 프로그램의 흐름을 복잡하게 만드는 단점이 있음

Page 27: 7. while  문의 흐름 제어

[ 기본예제 7-12] goto 문의 사용 예

01 #include <stdio.h>0203 int main()04 {05 int hap = 0;06 int i;0708 for( i=1 ; i<=100 ; i++)09 {10 hap += i;1112 if (hap > 2000)13 goto mygoto;14 }1516 mygoto :17 printf ("1 부터 %d 까지 합하면 2000 이 넘어요 .\n", i);18 }

1 부터 100 까지 반복합계 누적

누적된 값이 2000 이 넘으면 mygoto 로 무조건 이동

mygoto 레이블

Page 28: 7. while  문의 흐름 제어

03_ 기타 제어문

호출한 곳으로 돌아가는 return 문 현재 실행중인 함수를 끝내고 , 해당 함수를 호출한 곳으로 돌아가게 함 return 문을 만나면 프로그램이 종료되는 효과

Page 29: 7. while  문의 흐름 제어

[ 기본예제 7-13] return 문의 사용 예

01 #include <stdio.h>0203 int main()04 {05 int hap = 0;06 int i;0708 for( i=1 ; i<=100 ; i++)09 hap += i;1011 printf("1 부터 100 까지의 합은 %d 입니다 .\n", hap);12 return 0;1314 printf(" 프로그램의 끝입니다 .");15 }

1 부터 100 까지 반복합계 누적

출력

현재 함수를 호출한 곳으로 복귀

한 번도 출력되지 않음

Page 30: 7. while  문의 흐름 제어

[ 예제모음 _16] 원하는 배수의 합계를 구하는 계산기

실행결과

예제설명

① 입력한 두 수 사이의 합계를 구하되 , 원하는 배수를 선택하여 합계를 구하는 프로그램이다 .• 100~200 사이의 수 중에서 4 의 배수들의 합계를 구함

Page 31: 7. while  문의 흐름 제어

예제모음 _16 소스

01 #include <stdio.h>0203 int main()04 {05 int start, end;06 int basu, i;07 int hap = 0;0809 printf(" 합계의 시작값 ==> ");10 scanf("%d", &start);11 printf(" 합계의 끝값 ==> ");12 scanf("%d", &end);13 printf(" 배수 ==> ");14 scanf("%d", &basu);15

변수 선언과 초기화

시작값 , 끝값 , 배수값 입력

Page 32: 7. while  문의 흐름 제어

예제모음 _16 소스

16 i = start;17 while (i <= end)18 {19 if (i % basu == 0)20 hap = hap + i;2122 i++;23 }24 printf("%d 부터 %d 까지의 %d 배수의 합계 ==> %d\n",

start, end, basu, hap);25 }

i 값이 끝값보다 작은 동안 반복

출력

입력한 값이 배수라면 합계에 누적

Page 33: 7. while  문의 흐름 제어

[ 예제모음 _17] 입력한 문자열의 종류 구분하기

실행결과

예제설명

① 입력한 문자열에 대문자와 소문자 그리고 숫자가 각각 몇 개 입력되었는 지 세는 프로그램이다 .

Page 34: 7. while  문의 흐름 제어

예제모음 _17 소스

01 #include <stdio.h>0203 int main()04 {05 char str[100];06 char ch;0708 int da_cnt = 0, so_cnt=0, digit_cnt=0;09 int i;1011 printf(" 문자열을 입력 (100 자 이내 ) : ");12 scanf("%s", str);1314 i = 0;15 do {16 ch = str[i];

문자열 배열과 문자형 변수 선언

문자열 입력받기

대소문자 , 숫자 개수 초기화

입력받은 문자열에서 공백이 나오기 전까지 각 문자의 종류를 구분

문자열에서 한 글자 추출

Page 35: 7. while  문의 흐름 제어

예제모음 _17 소스

1718 if(ch >= 'A' && ch <= 'Z')19 da_cnt++;20 if(ch >= 'a' && ch <= 'z')21 so_cnt++;22 if(ch >= '0' && ch <= '9')23 digit_cnt++;2425 i++;26 } while (ch != '\0');2728 printf(" 대문자 %d 개 , 소문자 %d 개 , 숫자 %d 개 \n",

da_cnt, so_cnt, digit_cnt);29 }

A~Z 면 대문자 개수 1 개 증가

a~z 면 소문자 개수 1 개 증가

0~9 면 숫자 1 개 증가

다음 문자를 위해 i 값 증가 (+1)

출력

Page 36: 7. while  문의 흐름 제어

[ 예제모음 _18] 입력한 숫자만큼 별표 출력

실행결과

예제설명

① 0~9 까지 입력한 숫자만큼의 별 모양을 출력하는 프로그램이다 .• 5914 를 입력하면 각 줄에 별을 5 개 , 9 개 , 1 개 , 4 개를

출력한다 .

Page 37: 7. while  문의 흐름 제어

예제모음 _18 소스

01 #include <stdio.h>0203 int main()04 {05 char str[100];06 char ch;0708 int i, k;09 int star;1011 printf(" 숫자를 여러 개 입력 : ");12 scanf("%s", str);1314 i = 0;15 ch = str[i];

문자열 배열과 문자형 변수 선언

문자열 입력

첫 문자 추출

정수형 변수 선언

Page 38: 7. while  문의 흐름 제어

예제모음 _18 소스

16 while (ch != '\0') {17 star = (int)ch - 48;1819 for(k=0 ; k<star ; k++)20 printf("*");2122 printf("\n");23 i = i + 1;24 ch = str[i];25 }26 }

문자가 있는 동안 실행 반복

문자를 숫자로 변환 ( 문자 5는 아스키값 53 이므로 숫자 4 로 만들려면 48 을 빼야한다 )

별의 개수만큼 * 기호 출력

다음 줄로 넘어감

다음 문자를 알아내기 위해 i 값을 증가시킴

Page 39: 7. while  문의 흐름 제어

요약

① for 문과 같이 특정 동작의 반복을 위해 사용② while 문의 형식while while 문문

while ( 초기값 ){

반복할 문장들 ;}

① while 문과 거의 동일하지만 , 조건과 상관없이 무조건 반복할 문장을 한 번은 수행

② do~while 문의 형식

do ~ while do ~ while 문문

do{

반복할 문장들 ;} while ( 조건식 );

① break 문 : 현재의 반복문을 무조건 탈출② continue 문 : 무조건 블록의 끝으로 이동한 후 다시 반복문의

처음으로 돌아감③ return 문 : 현재 함수를 호출한 곳으로 돌아감 .

• main() 함수에서 return 을 만나면 프로그램을 종료

기타 제어문기타 제어문