7. while 문의 흐름 제어
DESCRIPTION
7. while 문의 흐름 제어. while 문. 기타 제어문. 1. 3. 이 장에서 다룰 내용. do ~ while 문. 2. 01_while 문. while 문의 실행 순서 조건식이 참인 동안 반복할 문장 수행 중괄호가 끝나는 곳에서 조건식으로 돌아와 같은 동작 반복. 01_while 문. for 문과 while 문의 사용 형식 비교 0~9 까지 출력하는 예. int i; for(i=0; iTRANSCRIPT
7. while 문의 흐름 제어
이 장에서 다룰 내용
while 문1.
do ~ while 문2.
기타 제어문3.
01_while 문
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 로
[ 기본예제 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 }
초기값 지정
조건식
증감식
01_while 문
for 문을 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 ++;
증감식
01_while 문
무한루프를 위한 while 문 조건식이 무조건 참이어야 함 for( ; ; ) 와 동일한 역할 while(1) 로 표현
[ 기본예제 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 }
무한루프
입력 값을 공백으로 분리
출력
[ 응용예제 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
[ 응용예제 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;
[ 응용예제 7-4] 무한루프를 활용한 계산기
33 default :34 printf(" 연산자를 잘못 입력했습니다 . \n");35 }36 }37 }
02_do~while 문
do~while 문 조건식을 확인하기 전에 ‘반복할 문장’을 수행 무조건 한 번은 실행됨 형식은 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 문 실행 :먼저 실행한 후에 조건식 판단
[ 응용예제 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 문이므로 한번은 꼭 수행
메뉴 출력
메뉴 선택
선택한 메뉴에 따라 주문을 접수
[ 응용예제 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 가
아닌 동안 계속 수행
03_ 기타 제어문
break 문 for, while, do~while 과 같은 반복문을 탈출할 때 사용 if 문과 결합하여 무한루프 안에 사용
• 무한루프를 돌다 특정 조건을 만족하면 프로그램을 종료하는 역할
[ 기본예제 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 문을 빠져나감
[ 기본예제 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 문을 빠져나감
[ 기본예제 7-8] break 문의 사용 예 ②
1718 printf("0 을 입력해서 for 문을 탈출했습니다 .\n");19 }
[ 기본예제 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 보다 작으면 반복문의 블록을 무조건 빠져나감
03_ 기타 제어문
break 문의 탈출 범위 현재 실행중인 반복문 블록을 무조건 빠져나오는 명령문 [ 기본예제 7-9] 의 수정
• i 값이 0 부터 시작하므로 첫번째 루프를 돌 때 프로그램 종료• 1~9 까지 출력하려면 부등호를 수정해야 함
for( ; ; ){ ...
if(i < 10){ break; }
}
if (i >= 10)
[ 응용예제 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 값
03_ 기타 제어문
블록의 끝으로 가는 continue 문 블록의 끝으로 이동한 후 반복문을 처음부터 다시 수행
[ 기본예제 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 값 누적
누적된 값 출력
03_ 기타 제어문
지정한 위치로 이동하는 goto 문 지정된 레이블 (label) 로 건너뛰게 하는 명령문 프로그램의 흐름을 복잡하게 만드는 단점이 있음
[ 기본예제 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 레이블
03_ 기타 제어문
호출한 곳으로 돌아가는 return 문 현재 실행중인 함수를 끝내고 , 해당 함수를 호출한 곳으로 돌아가게 함 return 문을 만나면 프로그램이 종료되는 효과
[ 기본예제 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 까지 반복합계 누적
출력
현재 함수를 호출한 곳으로 복귀
한 번도 출력되지 않음
[ 예제모음 _16] 원하는 배수의 합계를 구하는 계산기
실행결과
예제설명
① 입력한 두 수 사이의 합계를 구하되 , 원하는 배수를 선택하여 합계를 구하는 프로그램이다 .• 100~200 사이의 수 중에서 4 의 배수들의 합계를 구함
예제모음 _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
변수 선언과 초기화
시작값 , 끝값 , 배수값 입력
예제모음 _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 값이 끝값보다 작은 동안 반복
출력
입력한 값이 배수라면 합계에 누적
[ 예제모음 _17] 입력한 문자열의 종류 구분하기
실행결과
예제설명
① 입력한 문자열에 대문자와 소문자 그리고 숫자가 각각 몇 개 입력되었는 지 세는 프로그램이다 .
예제모음 _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];
문자열 배열과 문자형 변수 선언
문자열 입력받기
대소문자 , 숫자 개수 초기화
입력받은 문자열에서 공백이 나오기 전까지 각 문자의 종류를 구분
문자열에서 한 글자 추출
예제모음 _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)
출력
[ 예제모음 _18] 입력한 숫자만큼 별표 출력
실행결과
예제설명
① 0~9 까지 입력한 숫자만큼의 별 모양을 출력하는 프로그램이다 .• 5914 를 입력하면 각 줄에 별을 5 개 , 9 개 , 1 개 , 4 개를
출력한다 .
예제모음 _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];
문자열 배열과 문자형 변수 선언
문자열 입력
첫 문자 추출
정수형 변수 선언
예제모음 _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 값을 증가시킴
요약
① for 문과 같이 특정 동작의 반복을 위해 사용② while 문의 형식while while 문문
while ( 초기값 ){
반복할 문장들 ;}
① while 문과 거의 동일하지만 , 조건과 상관없이 무조건 반복할 문장을 한 번은 수행
② do~while 문의 형식
do ~ while do ~ while 문문
do{
반복할 문장들 ;} while ( 조건식 );
① break 문 : 현재의 반복문을 무조건 탈출② continue 문 : 무조건 블록의 끝으로 이동한 후 다시 반복문의
처음으로 돌아감③ return 문 : 현재 함수를 호출한 곳으로 돌아감 .
• main() 함수에서 return 을 만나면 프로그램을 종료
기타 제어문기타 제어문