1 제 5 장 제어문
목차목차 if ~ else switch while do ~ while for continue, break, return goto 연습문제
3 목차목차 if ~ else 의 개념 흐름도 사용법 다중 if ~ else 다중 if ~ else 흐름도 중첩 if ~ else 조건 연산자를 이용한 if ~ else 구현 주의사항
4 if ~ else 의 개념 – 조건식을 검사하고 참이면 if() 문 수행 – 조건식이 참이면 수행되는 문장은 하나 이상임 – 하나 이상의 문장을 수행하기 위해서는 중괄호가 필요함 예제 간이 예제예 제 if ( 내가 빵이 있으면 ) 너에게 주겠다. if (bread == TRUE) puts( “ 드세요 ” ); if ( 내가 빵이 있으면 ) 먹겠다. else 굶겠다. if (bread == TRUE) puts( “ 냠냠 ” ); elseputs( “ 배고파 ” ); 간이 예제예 제 if ( 내가 빵이 있으면 ) { 1/3 은 먹는다. 1/3 은 저장한다. 1/3 은 버린다. } 물을 먹는다. if (bread == TRUE) { EAT = ON; SAVE = ON; TRASH = ON; } WATER = ON;
5 if ~ else 의 개념 else 가 있는 경우와 else 가 없는 경우 1.else 가 없는 경우 2. else 가 있는 경우 문장 1; if( 조건식 ) 문장 2; 문장 3; 문장 1; if( 조건식 ) 문장 2; else 문장 3; 문장 4;
6 흐름도
7 사용법 한 문장만 수행하는 경우 ( 중괄호를 사용하지 않아도 됨 ) –if(imsi == 5) puts(“right”); –if(imsi == 5) { puts(“right”); } 두 문장 이상 수행하는 경우 ( 중괄호 필수 ) if(imsi == 5) { puts(“FIVE”); puts(“right”); } –if(imsi == 5) { pus(“FIVE”); puts(“right”); } –if(imsi == 5) { puts(“FIVE”); puts(“right”); }
8 다중 if ~ else 문장 1; if( 조건식 1) 문장 2; elseif( 조건식 2) 문장 3; elseif( 조건식 3) 문장 4; else 문장 5; 문장 6;
9 다중 if ~ else 흐름도
10 다중 if ~ else 예제 ( 학점 출력 ) –if((grade >= 90) && (grade <= 100)) puts(“A 학점 ”); elseif((grade >= 80) && (grade < 90)) puts(“B 학점 ”); elseif((grade >= 70) && (grade < 80)) puts(“C 학점 ”); elseif(grade < 70) puts(“F 학점 ”);
11 중첩 if ~ else 중첩 if ~ else 의 개념 –if() 나 else 의 안에 또 다른 if~else 가 존재하는 형태 예제 –if(watch > 2) if(computer > 3) if(USE_memory > 5) puts(“ 좋은 물건 많네 ”); puts(“ 마감시간 입니다.”);
12 중첩 if ~ else 주의사항 (else 의 수행여부 검토 ) –if(watch > 2) if(computer > 3) if(USE_memory > 5) puts(“ 좋은 물건 많네 ”); elseputs(“ 물건 별로 없네.”); 마지막의 else 는 언제 수행되는가 ? –else 는 가장 최근의 if() 와 결합되므로 USE_momory 가 5 보다 클 때 수행됨 – 하지만 중첩 if~else 이기 때문에 watch 나 computer 의 값도 같이 살펴야 함
13 조건 연산자를 이용한 if ~ else 구현 if ~ else 사용조건 연산자 사용 if(x < 0) printf(“%d\n”, x * -1); elseprintf(“%d\n”, x); printf(“%d\n”, (x < 0) : (x * -1) ? x);
14 조건 연산자를 이용한 if ~ else 구현 예제 ( 학점구하기 ) if ~ else –if((score 90)) puts(“A 학점 ”); elseif((score 80)) puts(“B 학점 ”); elseif((score 70)) puts(“C 학점 ”); elseif((score 60)) puts(“D 학점 ”); elseif(score <= 60) puts(“F 학점 ”); 조건 연산자 (score 90) ? puts("A 학점 ") : (score 80) ? puts("B 학점 ") : (score 70) ? puts("C 학점 ") : (score 60) ? puts("D 학점 ") : puts("F 학점 ");
15 예제예제 if ~ else 를 이용한 홀수, 짝수 구하기
16 예제예제
17 주의사항 조건식에서의 주의사항 – 할당과 비교문을 조심해야 함 –if(grade = 95) puts(“ 높은 점수입니다.”); ‘=‘ 은 할당문이기 때문에 if() 의 결과는 항상 참이 되어 grade 의 값에 상관없이 무조건 수행됨 조건식의 결과 값이 ‘0’ 이 아니면 무조건 참 1.if(1) { … } – 무조건 if() 문을 수행 2.if(x) { … } –x 가 0 이 아니면 if() 문 수행 3.if(x > 5) { … } –x 가 5 보다 크면 if() 문 수행 4.if(x++) { … } –x 가 0 이 아니면 if() 문 수행
18 주의사항 else 결합에서의 주의사항 –else 에 있는 puts() 문은 수행되는가 ? –else 의 위에 있는 세 개의 if() 문 중에서 어느 if() 문과 결 합되어 있는가 ?
19 목차목차 switch 의 개념 사용법 주의사항
20 switch 의 개념 다중 if ~ else 의 효과적인 표현 switch() 의 조건식에서는 실수를 사용할 수 없음
21 사용법 switch( 수식 ) { case 상수 1 : 수행문 ; … break; case 상수 1 : 수행문 ; … break; default: 수행문 ; … break; } switch(operator) { case1: puts(“1 번 case”); break; case2: puts(“2 번 case”); break; defaultputs(“error”); }
22 예제예제 입력한 숫자 들에 대한 각 각의 출현 개 수 구하기
23 주의사항 1.switch ~ case 에서의 수식과 상수는 정수만이 올 수 있음 –switch() 에서의 수식은 결과 값이 정수여야 함 – 부동 소주점이나 문자열은 switch() 의 수식문에 올 수 없음 switch(5.5), switch(5.0), switch(7.7)( 사용될 수 없음 ) switch(“imsi”), switch(“576”)( 사용될 수 없음 )
24 주의사항 break 문을 조심하지 않으면 논리에러가 발생할 수 있음
25 목차목차 사용법 흐름도 예제 주의사항
26 사용법 간이 예제예 제 while( 조건식 ) 수행문 ; i = 1; while(i <= 10) printf(“%d\n”, i++); while( 조건식 ) { 수행문 ; … } i = 1; while(i <= 10) { printf(“%d\n”, i); i++; }
27 흐름도
28 예제예제 1 부터 100 까지 더하기
29 예제예제 문자열 암호화
30 예제예제 단어 자르기
31 주의사항 회전 수 i = 0;i = 0; while(i < 10)while(i <= 10) { … }{ … } while() 이 10 번 회전 while() 이 11 번 회전
32 목차목차 사용법 흐름도 예제
33 사용법 간이 예제예 제 do 수행문 ; while ( 조건식 ); intnum = 1; doprintf(“num = %d\n”, num++); while (num != 1024); do{ 수행문 ; … } while( 조건식 ); do{ puts(“=== menu ===”); puts(“1. 짜장면 ”); puts(“2. 짬뽕 ”); scanf(“%d”, &num); … } while(num != 0);
34 흐름도
35 예제예제 메뉴선택
36 예제예제 itoa() 함수 만들기 ( 숫자를 입력하 면 문자열로 변 경한다.)
37 목차목차 사용법 흐름도 수행순서 초기식, 조건식, 증감식 for() 와 while() 중 어느 것을 선택해야 하나 ? for() 와 while() 비교 중첩 for() 쉼표연산자와 for() 예제 for() 문 종합예제 주의사항
38 사용법 간이 예제예 제 for( 초기식 ; 조건식 ; 증감식 ) 수행 문 ; for(i = 1;i <= 10;i++) printf(“%d “, i); for( 초기식 ; 조건식 ; 증감식 ) 수행문 ; sum = 0; for(i = 1;i <= 10;i++) sum += i; for( 초기식 ; 조건식 ; 증감식 ) { 수행문 ; … } for(i = 1;i <= 100;i++) { printf(“%d “, i); if(i % 10 == 0) putchar(‘\n’); }
39 흐름도
40 for() 문의 수행순서 for( 초기식① ; 조건식② ; 증감식④ ) { ③ } 1, 2, 3, 4, 2, 3, 4, 2, 3, 4 …
41 for() 문의 수행순서 for(i = 0;i < 10;i++) { … } –i 에 0 을 할당한다. (i = 0) –i 가 10 보다 작은지를 비교한다. (i < 10) – 참이면 for() 문을 수행하고 거짓이면 for() 문을 빠져 나간다. (i 의 값은 0 이므로 참이다.) –for() 문에 걸리는 본체를 수행한다. ( 중괄호 부분 ) –i 의 값을 증가 시킨다. (i++) : i 는 이제 0 에서 1 이 된다. –i 가 10 보다 작은지를 비교한다. (i < 10) : i 는 1 이므로 참이다. – 참이면 for() 문을 수행하고 거짓이면 for() 문을 빠져 나간다. –for() 문에 걸리는 본체를 수행한다. –i 의 값을 1 증가 시킨다. (i++) : i 는 이제 1 에서 2 가 된다. –…
42 초기식, 조건식, 증감식 –for( 초기식 ; 조건식 ; 증감식 ) 초기식 –for() 문을 수행할 때 가장 먼저 수행되는 것은 초기식과 조건식이 며 이 둘 중에서도 먼저 수행 됨 –for() 문에 사용되는 변수의 초기 값을 지정함 i = 0 j = 1024 count = -25 ch = ‘a’ big = 2.5
43 초기식, 조건식, 증감식 조건식 – 조건식은 검사 대상의 참, 거짓을 판별하기 위하여 사용하며 참일 때는 for() 문을 수행하지만 거짓일 때는 for() 문을 더 이상 수행하지 않음 – 조건식은 for() 문의 수행 여부를 결정해야 하므로 초기식 바로 다음에 수행 – 조건식에 올 수 있는 것은 참과 거짓을 구별하는 내용이므로 다음과 같은 것들이 모두 올 수 있다. i < j i == j ch == ‘a’ ch != ‘x’ strcmp(imsi, “right”) 증감식 i++ i += 5 j--
44 초기식, 조건식, 증감식 증감식 i++ i += 5 j--
45 for() 와 while() 중 어느 것을 선택해 야 하나 ? for() 는 회전 횟수가 정해진 곳에서 사용하 며 while() 은 회전 횟수가 정해지지 않은 곳 에서 사용함 확실한 범위를 알면 for() 문을 사용하고 그 렇지 않으면 while() 을 사용함
46 for() 와 while() 중 어느 것을 선택해 야 하나 ? for() 를 사용하는 경우 for(i = 0 ; i < 10 ; i++) –10 번 회전한다는 것을 미리 알았으므로 for() 를 사용함 for(j = 10 ; j < 270 ; j += 2) –10 부터 270 이라는 정확한 범위를 알았으므로 for() 문을 사용함.
47 for() 와 while() 중 어느 것을 선택해 야 하나 ? while() 을 사용하는 경우 while(ch != 'n') { … ch = getchar(); } –ch 가 ‘n’ 이 아닐 동안 이므로 몇 번 회전할 지 알 수 없으므로 while() 을 사용함 while(strcmp(warning, "red")) { … } –warning 이 ‘red’ 가 아닐 동안 회전해야 하므로 몇 번 회전할지 알 수 없으므로 while() 이 사용됨
48 for(), while() 의 비교 –for() 에는 초기식과 조건식, 증감식을 한 라인에 사용하지만 while() 은 세 라인으로 나뉘어 짐 –for() 문이 한 라인에 초기치와 증감치 조건식이 몰려 있기 때문에 분석이 용이함 –for() 문에서 초기값 설정이나 조건식, 증감식의 생략은 가능하나 while() 은 불가능함 for() 문 사용 while() 문 사용 for(i = 0 ; i < 10 ; i++) { … }i = 0; while(i < 10) { … i++; }
49 중첩 for() for() 문 안에 또 다른 for() 문이 존재하는 경 우 for(i = 0;i < 5;i++) for(j = 0;j < 7;j++) printf(“%d, %d\n”, i, j);
50 사용법
51 쉽표 연산자와 for() 쉼표 연산자를 사용하지 않은 경우 쉼표 연산자를 사용한 경우
52 예제예제 1 부터 100 까지의 숫자 중 짝수만 출력하기
53 예제예제 구구단 출력
54 for() 문 종합문제
55 목차목차 continue break return –break, continue 는 반복문의 제어를 이동 시킬 때 사용하며 return 은 함수를 끝낼 때 사용 함.
56 continue 반복문의 처음으로 제어권을 넘김
57 예제예제 continue ( 짝수 출력 )
58 break 반복문을 빠져 나 감
59 return 함수의 수행을 끝내고 호출한 쪽으로 제어권을 넘김 return 100; return 100 * 1024; return x* y; return &imsi; return imsi[0];
60 목차목차 goto 의 개념 사용법 전문가들도 추천하는 사용처 예제
61 goto 의 개념 프로그램에서 보기 힘든 제어문 중의 하나 goto 문은 논리적인 흐름을 깨트릴 수 있어 서 대부분의 책들이 goto 문의 폐단에 집중 되어 있음 하지만 시스템 프로그램에서는 종종 사용 되는 것을 볼 수 있음
62 사용법 gotolabel; … label: goto 다음에 옮겨갈 장소를 적음 label 옆은 세미콜론이 아니라 콜론임에 유 의 다른 함수로의 분기는 불가능함
63 사용법
64 전문가들도 추천하는 사용처 – 다중 for() 나 while() 을 한번에 빠져나감
65 예제예제 컴퓨터가 생 각하는 숫자 맞추기
부터 1000 까지의 합을 구하는 프로그램을 작성하시오. 2. 구구단을 출력하는 프로그램을 작성하시오. (2 단부터 9 단까지 ) 출력 :2 x 1 = 2 2 x 2 = 4 … 3.1 부터 12 까지의 수 중에서 하나를 입력 받고 이에 해당 하는 달을 영어로 출력하시오. 입력 :8 출력 :August
67 4. 국어, 영어, 수학 점수를 입력 받고 총점과 평균을 구하 는 프로그램을 작성하시오. 입력 : 출력 : 국어 영어 수학 총점 평균 =================== 사용자에게 하나의 정수를 입력 받고 그에 해당하는 배 수를 출력하시오. ( 범위 :1 부터 100 사이 ) 입력 :8 출력 : … 사용자로부터 문자열을 받아들이고 그 문자열의 길이를 출력하시오. 입력 :I am archie. 출력 :12
68 1. 사용자로부터 하나의 정수 값을 입력 받고 그 정수 값에 해당하는 구구단을 출력하는 프로그램을 작성하시오. 입력 :7 출력 :7 x 1 = 7 7 x 2 = 14 7 x 3 = 21 … 2. 문자열 ( 영어 알파벳 ) 을 입력 받고 문자가 출현한 횟수를 구하는 프로그램을 작성하시오. 입력 :oaudfanwetrnlrgeoparhaeo 출력 :[a] : 3 번 출현 [b] : 0 번 출현 …
69 3. 문자열을 입력 받고 문자열 중에서 영어 알파벳이 아닌 것을 빼고 출력하시오. 입력 :I love77 you. Really? 출력 :I love you Really
사람에 대한 국어, 영어, 수학 점수를 입력 받고 다음과 같이 그래프로 표현하시오. ( 별 하나는 5 점이며 10 개의 별마다 스페이스 추가 ) 입력 : … 출력 : 국어 영어 수학 총점 평균 =================== ********** ***** ********** ** …
71 2. 사칙 연산을 하는 프로그램을 작성하시오. ( 단, 우선순위는 없으며 앞에서부터 처리 ) 입력 :5 + 3 * 7 출력 :56// 만약 우선순위를 처 리한다면 105 가 출력된다. // 할 수 있다면 우선순 위의 개념을 넣어보자. // 이때는 스택의 개념 이 필요하다 개의 정수 값을 받아 들이고 이중에서 가장 큰 수와 가장 작은 수를 출력하시오.