C언어 프로그래밍의 이해 Ch05. 명령문
목차 5.1 선택문 5.2 분기문 5.3 반복문 5.4 블록문 if 문 ? 문 switch 문 return 문 break 문 continue 문 goto 문 5.3 반복문 for 문 while 문 do-while 문 5.4 블록문 2
1교시
Ch05. 명령문 5.1 선택문 if문 if문의 일반 형식 statement는 하나의 명령문, 명령문들의 블록, 또는 (비어 있는 명령문일 때) 아무 것도 없이 구성될 수 있으며, else절은 선택사항 만일 expression이 참이라면, 특정 명령문 또는 명령 블록이 실행되고, else절의 특정 명령문 또는 명령 블록이 실행 실행은 if문에만 연관된 코드 또는 else문에만 연관된 코드 중 하나가 실행되며, 이들 모두가 실행되는 것은 아님 if (expression) statement; else statement; 4
5.1 선택문 [따라하기1] Ch05. 명령문 121 Enter #include <stdio.h> int main(void) { int number; printf("숫자를 입력하세요 : "); scanf("%d", &number); if(number%2 ==1) /* number를 나눈 나머지가 1일 때만 다음 문장이 실행 */ printf("입력하신 숫자는 홀수 입니다.\n"); if(number%2 == 0) /* number를 나눈 나머지가 0일 때만 다음 문장이 실행 */ printf("입력하신 숫자는 짝수 입니다.\n"); return 0; } 121 Enter 5
5.1 선택문 [따라하기2] Ch05. 명령문 122 Enter #include <stdio.h> int main(void) { int number; printf("숫자를 입력하세요 : "); scanf("%d", &number); if(number%2 ==1) /* number를 나눈 나머지가 1일 때만 다음 문장이 실행 */ printf("입력하신 숫자는 홀수 입니다.\n"); else /* number를 나눈 나머지가 0일 때만 다음 문장이 실행 */ printf("입력하신 숫자는 짝수 입니다.\n"); return 0; } 122 Enter 6
5.1 선택문 중첩 if문 if문 또는 else문 내에 다시 포함된 또 다른 if문 Ch05. 명령문 5.1 선택문 중첩 if문 if문 또는 else문 내에 다시 포함된 또 다른 if문 중첩 if문은 프로그램 작성시 매우 일반적인 것 중첩 if에서, else문은 항상 else문과 같은 블록에 존재하는 가장 가까운 if문과 연관 ANSI C 표준은 15개까지의 중첩을 허용 실제 대부분의 컴파일러들은 그 이상을 제공하나, 과다한 중첩은 프로그램의 의미에 혼동을 가져올 수 있음 if(i) { if(j) statement 1; if(k) statement 2; /* 이 if문은 */ else statement 3; /* 바로 다음의 else문과 연관된다. */ } else statement 4; /* if(i)와 연관된다. */ 7
Ch05. 명령문 5.1 선택문 중첩 if문 8
5.1 선택문 [따라하기3] Ch05. 명령문 15 Enter #include <stdio.h> int main(void) { int age; printf("나이를 입력하세요 : "); scanf("%d", &age); if(age < 18) { printf("당신은 미성년자로서, 청소년 요금을 적용 받습니다.\n"); } else { printf("당신은 성년으로서, "); if(age < 65) printf("일반 요금을 적용 받습니다.\n"); else printf("경로우대 요금을 적용 받습니다.\n"); return 0; 15 Enter 9
5.1 선택문 if-else if 구조 조건들은 하향식으로 평가 Ch05. 명령문 5.1 선택문 if-else if 구조 조건들은 하향식으로 평가 참인 조건을 만나면, 그것과 연관된 명령문이 수행되고 나머지들은 그냥 지나침 만일 어떤 조건도 참이 되지 않는다면, 마지막 else문이 수행 만일 마지막 else문이 존재하지 않으면, 어떠한 행위도 일어나지 않음 if(expression) statement; else if(expression) . else 10
5.1 선택문 [따라하기4] Ch05. 명령문 32 Enter #include <stdio.h> int main(void) { int age; printf("나이를 입력하세요 : "); scanf("%d", &age); if(age < 18) printf("당신은 미성년자로서, 청소년 요금을 적용 받습니다.\n"); else if(age < 65) printf("당신은 성년으로서, 일반 요금을 적용 받습니다.\n"); else printf("당신은 성년으로서, 경로우대 요금을 적용 받습니다.\n"); return 0; } 32 Enter 11
5.1 선택문 [따라하기5] Ch05. 명령문 10 Enter #include <stdio.h> int main(void) { int month; printf("달을 입력하세요 : "); scanf("%d", &month); if(month == 12 || month == 1 || month == 2) printf("%d월은 겨울 입니다.\n", month); else if(month == 3 || month == 4 || month == 5) printf("%d월은 봄 입니다.\n", month); else if(month == 6 || month == 7 || month == 8) printf("%d월은 여름 입니다.\n", month); else if(month == 9 || month == 10 || month == 11) printf("%d월은 가을 입니다.\n", month); else printf("잘못 입력하셨습니다.\n"); return 0; } 10 Enter 12
5.1 선택문 ? 선택 ? 연산자는 다음의 하나의 if-else문의 일반 형식을 축약하는데 사용 Ch05. 명령문 5.1 선택문 ? 선택 ? 연산자는 다음의 하나의 if-else문의 일반 형식을 축약하는데 사용 ?는 피연산자가 3개이므로 3항 연산자라 함 if(Exp1) Exp2; else Exp3; Exp1 ? Exp2 : Exp3 if(x>9) y = 100; else y = 200; y = x>9 ? 100 : 200; 13
5.1 선택문 [따라하기6] Ch05. 명령문 70 Enter #include <stdio.h> int main(void) { int age; printf("나이를 입력하세요 : "); scanf("%d", &age); if(age < 18) { printf("당신은 미성년자로서, 청소년 요금을 적용 받습니다.\n"); } else { printf("당신은 성년으로서, "); age < 65 ? printf("일반 요금을 적용 받습니다.\n") : printf("경로우대 요금을 적용 받습니다.\n"); return 0; 70 Enter 14
2교시
5.1 선택문 switch 문 정수 또는 문자 상수들에 대한 연산문의 값을 시험하는 내장된 복수 분기 선택문 여러개의 if-else문이 필요할 때 사용되는 다중 조건문 연산문의 시험 후에 일치하는 것이 있으면, 그 상수와 연관된 명령문을 실행 연산문과 일치하는 어떤 case문의 상수도 없을 때 default문의 명령문열이 실행 switch문에서 break문을 만날 때, 프로그램의 제어는 그 switch문 전체를 빠지고 다음 문장으로 점프 switch (expression) { case constant1: statement sequence break; case constant2: case constant3: . default: } 16
5.1 선택문 switch 문 switch문의 세 가지 특성 switch문은 단지 같은지의 여부에 대해서만 시험한다는 점에서 if문과 다름 switch문 expression(연산문)은 동시에 두 개의 case문이 같은 상수값을 가질 수 없음 문자 상수가 switch문에 사용될 때, 이것은 자동적으로 정수로 변환 17
5.1 선택문 [따라하기7] Ch05. 명령문 #include <stdio.h> int main(void) { int toss; printf("1부터 3사이의 숫자를 입력하세요 : "); scanf("%d", &toss); switch(toss) { case 1: printf("가위~!!\n"); break; case 2: printf("바위~!!\n"); case 3: printf("보~!!\n"); 18
5.1 선택문 [따라하기7] Ch05. 명령문 2 Enter 4 Enter default: printf("1부터 3사이의 숫자가 아닙니다~!!\n"); } return 0; 2 Enter 4 Enter 19
5.1 선택문 switch 문 switch문 내부에 사용된 break문도 선택사항 만일 break문이 없다면, 실행은 다음의 break문 또는 switch문의 끝에 도달할 때까지 계속해서 다른 case문들을 수행 case문들이 break문 없이 사용될 때, 불필요한 중복을 피할 수 있고 좀더 효율적인 코드를 만들 수 있음 20
5.1 선택문 [따라하기8] Ch05. 명령문 #include <stdio.h> int main(void) { int month; printf("달을 입력하세요 : "); scanf("%d", &month); switch(month) { case 12: case 1: case 2: printf("%d월은 겨울 입니다.\n", month); break; case 3: case 4: case 5: printf("%d월은 봄 입니다.\n", month); 21
5.1 선택문 [따라하기8] Ch05. 명령문 break; case 6: case 7: case 8: printf("%d월은 여름 입니다.\n", month); case 9: case 10: case 11: printf("%d월은 가을 입니다.\n", month); default: printf("잘못 입력하셨습니다.\n"); } return 0; 22
Ch05. 명령문 5.1 선택문 [따라하기8] 2 Enter 10 Enter 17 Enter 23
5.1 선택문 중첩된 switch 문 case문에 해당되는 명령문열에 포함된 또 다른 switch문 switch (x) { switch(y) { case 0: printf("divide by zero error"); break; case 1: process(x,y); } case 2: . 24
5.2 분기문 분기문 일련의 절차지향적 명령문들의 제어를 무조건적으로 바꾸기 위한 명령문 Ch05. 명령문 5.2 분기문 분기문 일련의 절차지향적 명령문들의 제어를 무조건적으로 바꾸기 위한 명령문 C에서는 무조건 분기를 수행하는 4개의 명령문들을 제공 return, goto, break, continue return문과 goto문은 프로그램의 어디서나 사용 break문과 continue문은 반복문의 본체 문장들과 함께 사용 25
5.2 분기문 return 문 특정 함수로부터 리턴하기 위해서 사용 Ch05. 명령문 5.2 분기문 return 문 특정 함수로부터 리턴하기 위해서 사용 이때 return문은 함수를 호출한 다음 지점으로 (다시 되돌아가) 분기 return문은 특정 함수에서 필요한 만큼 사용할 수 있다. 그러나, 함수에서 첫 번째 return문을 만나면 그 함수에 대한 실행을 바로 중지 함수의 끝인 닫는 중괄호(})도 역시 그 함수의 실행을 끝내고 (리턴값이 없는) return문과 같은 효과 return expression; 26
5.2 분기문 break문의 사용 경우 switch문내의 case문을 종료하기 위해서 사용 정상적인 루프 조건 시험을 무시하고 강제로 루프 반복 중에 반복을 종료하기 위해서 사용 break문이 루프 내부에서 발견되면, 루프는 그 즉시 종료되며 프로그램 제어는 반복 루프 다음 문장으로 이동 #include <stdio.h> void main(void) { int t; for(t=0; t<100; t++) { printf("%d ", t); if(t==10) break; } break문이 반복 루프의 조건 t<100을 무시 t=10 이면, 루프는 종료 0부터 10까지 출력 27
5.2 분기문 break문은 단지 자신이 포함된 가장 안쪽 루프만을 중지 Ch05. 명령문 5.2 분기문 break문은 단지 자신이 포함된 가장 안쪽 루프만을 중지 표준 라이브러리 함수 exit()는 전체 프로그램을 끝냄 for(t=0; t <100; ++t) { count = 1; for(;;) { printf("%d ", count); count++; if(count==10) break; } 화면에 1부터 10까지를 100번 출력 컴파일러가 break문을 만날 때마다, 제어는 바깥쪽 루프로 넘어감 28
5.2 분기문 [따라하기9] Ch05. 명령문 #include <stdio.h> int main(void) { int i, sum = 0; for ( i = 1 ; i <= 10; i++ ){ if ( i == 5 ) break; /* i 값이 5가 되면 루프를 빠져 나간다. */ sum += i; } printf("Sum=%d\n", sum); /* 1+2+3+4 의 결과 출력 */ return 0; 29
5.2 분기문 continue 문 continue문은 강제로 반복 루프를 종료하는 것이 아니라 루프의 다음 반복을 계속 실행 Ch05. 명령문 5.2 분기문 continue 문 continue문은 강제로 반복 루프를 종료하는 것이 아니라 루프의 다음 반복을 계속 실행 해당 루프의 continue문에서 루프의 끝까지의 문장들은 그냥 지나침 30
5.2 분기문 [따라하기10] Ch05. 명령문 #include <stdio.h> int main(void) { int i, sum = 0; for ( i = 1 ; i <= 10; i++ ){ if ( i == 5 ) continue; /* i 값이 5가 루프의 나머지 부분을 지나치고 다음 조건을 수행 */ sum += i; } printf("Sum=%d\n", sum); /* 1+2+3+4+6+7+8+9+10의 결과 출력 */ /* 5는 계산되지 않음 */ return 0; 31
5.2 분기문 goto 문 goto 문은 무조건 분기문, goto 문은 특정 라벨문으로 이동 Ch05. 명령문 5.2 분기문 goto 문 goto 문은 무조건 분기문, goto 문은 특정 라벨문으로 이동 goto문을 이용한 1에서 100까지를 반복하는 루프의 예 goto 문은 되도록 사용하지 않기를 권장 대부분의 프로그래머들은 goto문을 사용하면 프로그램을 읽는데 상당한 문제가 있다고 생각 많은 goto 문의 사용은 프로그램의 제어를 매우 복잡하게 할 수 있는 부작용 goto label; …. label; x =1; loop1: x++; if(x<100) goto loop1; 32
3교시
5.3 반복문 반복문 (또는 루프(loop)) for 문 어떤 조건에 도달할 때까지 특정 명령문들의 집합을 반복적으로 실행 Ch05. 명령문 5.3 반복문 반복문 (또는 루프(loop)) 어떤 조건에 도달할 때까지 특정 명령문들의 집합을 반복적으로 실행 for 문 반복조건이 미리 정해져 있거나, 알려진 경우에 사용 initialization(초기화)는 일반적으로 루프 제어 변수를 설정하기 위해서 사용된 치환문 형식 condition(조건)은 루프의 끝나는 시점을 결정하는 관계 연산문 increment(증가분)은 루프가 반복될 때마다 루프 제어 변수가 어떻게 변하는지를 정의 for(initialization; condition; increment) statement; 34
5.3 반복문 for 문 condition(조건)이 참인 동안에는 실행을 계속 Ch05. 명령문 5.3 반복문 for 문 condition(조건)이 참인 동안에는 실행을 계속 조건이 거짓이 되면, 프로그램 실행은 for문 다음의 문장으로 이동 #include <stdio.h> void main(void) { int x; for(x=1; x <= 100; x++) printf("%d ", x); } 35
5.3 반복문 [따라하기11] Ch05. 명령문 #include <stdio.h> int main(void) { int i, n; printf("숫자를 입력하세요 : "); scanf("%d", &n); for ( i = 1; i <= n; i++ ) printf("%10d%10d\n", i, i * i ); return 0; } 36
5.3 반복문 [따라하기12] Ch05. 명령문 #include <stdio.h> int main(void) { int i=1,j=0; for ( i = 1; i <= 100; i++ ){ if( (i % 5) == 0 ) /* 5의 배수만 출력해주는 조건 */ printf("%d ",i ); j++; if( (j % 4) == 0 ) /* 하나의 라인에 4개의 숫자 출력 */ printf("\n"); } return 0; 37
Ch05. 명령문 5.3 반복문 향상된 for 문 for 루프는 어떤 프로그래밍 환경에서도 그 기능, 융통성 및 응용성을 향상시킬 수 있도록 하기 위해서 다양한 형식을 제공 for 루프를 제어하기 위해서 하나 이상의 변수들을 콤마 연산자를 사용하는 것 for 루프문을 구성하는 세 가지 부분 각각은 어떠한 타당한 연산문도 사용할 수 있음 for(x=0, y=0; x+y<10; ++x) { y = getchar(); y = y - '0'; /* y에서 0의 ASCII 코드값을 빼기 */ …. } 38
5.3 반복문 [따라하기13] Ch05. 명령문 #include <stdio.h> int sqrnum(int num); int readnum(void); int prompt(void); void main(void) { int t; for(prompt(); t=readnum(); prompt()) /* 0이 입력되면 루프 종료*/ sqrnum(t); } prompt(void) printf("숫자를 입력하세요 : "); return 0; 39
5.3 반복문 [따라하기13] Ch05. 명령문 7 Enter 5 Enter 6 Enter 4 Enter 0 Enter readnum(void) { int t; scanf("%d", &t); return t; } sqrnum(int num) printf("%d\n", num*num); return num*num; 7 Enter 5 Enter 6 Enter 4 Enter 0 Enter 40
5.3 반복문 (초기화; 조건; 증가분)의 형식에서 어떤 부분들은 없어도 됨 Ch05. 명령문 5.3 반복문 (초기화; 조건; 증가분)의 형식에서 어떤 부분들은 없어도 됨 for (x=0; x != 123;) scanf("%d", &x); /* 증가분 없음, 키보드에서 123입력 시 루프 종료*/ gets(s); /* 문자열을 s로 읽기 */ if(*s) x = strlen(s); /* 문자열의 길이 */ else x = 10; for( ; x<10; ) { printf("%d", x); ++x; } 41
5.3 반복문 무한 루프 무한루프는 반복문을 끝내지 않고 무한으로 실행하는 것을 의미 Ch05. 명령문 5.3 반복문 무한 루프 무한루프는 반복문을 끝내지 않고 무한으로 실행하는 것을 의미 의도적으로 무한 루프가 필요한 경우에 어떤 루프문을 사용하든 상관없지만, 대개는 for문을 사용 다음과 같이 for 루프의 세 가지 부분을 모두 비우면, 끊임없이 반복 실행하는 루프가 됨 조건 연산문이 비어 있으면, 항상 참인 것으로 가정 break를 이용하여 무한루프를 나올 수 있음 for( ; ; ) printf(" This loop will run forever.\n); for( ; ; ) { ch = getchar(); /* 문자 읽기 */ if(ch=='A') break; /* 루프 종료 */ } 루프는 A가 입력될 때까지 계속 실행된다 42
5.3 반복문 본체 없는 for 루프 for문의 본체 부분에 명령문이 없을 수도 있음 Ch05. 명령문 5.3 반복문 본체 없는 for 루프 for문의 본체 부분에 명령문이 없을 수도 있음 이것은 어떤 알고리즘의 효율성을 증진시키고 시간 지연을 위해서 사용될 수 있음 for( ; *str == ' '; str++); for(t=0; t<SOME_VALUE; t++); 43
5.3 반복문 while 문 일반형식 statement(명령문)는 빈 문장, 하나의 문장, 또는 문장들의 블록 등이 될 수 음 Ch05. 명령문 5.3 반복문 while 문 일반형식 statement(명령문)는 빈 문장, 하나의 문장, 또는 문장들의 블록 등이 될 수 음 condition(조건)은 어떤 조건 연산문 while 루프도 for문처럼 이 조건이 참인 동안 반복 조건이 거짓이면, 프로그램의 제어는 while루프 바로 다음의 문장으로 이동 while(condition) statement; 44
5.3 반복문 while 문 사용자가 A를 입력할 때까지 단순히 반복하는 키보드 입력 루틴 wait_for_char(void) { char ch; ch = '\0'; /* ch 초기화 */ while(ch != 'A') ch = getchar(); return ch; } 45
5.3 반복문 [따라하기14] Ch05. 명령문 /* n 개의 정수 중에 최대값을 계산 */ #include <stdio.h> int main(void) { int cnt = 0, n; float max, x; printf("최대값을 계산 합니다.\n"); printf("얼마나 많은 숫자의 계산을 원하십니까?"); scanf("%d", &n); while( n <= 0 ) { printf("\n에러: 양수를 입력하세요.\n\n"); } printf("\n%d개의 정수를 입력하세요 : ", n); scanf("%f", &x); 46
5.3 반복문 [따라하기14] Ch05. 명령문 max = x; while (++cnt < n) { scanf("%f", &x); if (max < x) } printf("\n최대값은 %g입니다.\n", max); return 0; 47
Ch05. 명령문 5.3 반복문 while 문 while 루프를 종료하는데 여러 개의 조건들이 필요하다면, 하나의 변수가 공통적으로 조건 연산문을 형성 다음에서 3개의 루틴들 중 어떤 것이든 거짓을 리턴하면 루프를 종료할 수 있음 void func1(void) { int working; working = 1; /* 참 값 */ while(working) { working = process1(); if(working) working = process2(); working = process3(); } 48
5.3 반복문 while 문 do-while문 while 루프의 본체에 어떤 문장도 포함하지 않을 수 있음 Ch05. 명령문 5.3 반복문 while 문 while 루프의 본체에 어떤 문장도 포함하지 않을 수 있음 do-while문 루프의 시작 부분에 루프 조건이 있는 for와 while 루프와는 달리, 루프의 끝 부분에서 조건을 검사 do-while 루프에서는 최소한 한 번은 본체를 실행한다는 것을 의미 while((ch=getchar()) != 'A'); /*A를 입력할때까지 무한 반복*/ do{ statement; } while(condition); 49
5.3 반복문 [따라하기15] Ch05. 명령문 /* n 개의 정수중에 최대값을 계산 do-while 버전 */ #include <stdio.h> int main(void) { int cnt = 0, n; float max, x; printf("최대값을 계산 합니다.\n"); do{ printf("얼마나 많은 숫자의 계산을 원하십니까?"); scanf("%d", &n); if (n <= 0 ) printf("\n에러: 양수를 입력하세요.\n\n"); }while( n <= 0 ); printf("\n%d개의 정수를 입력하세요 : ", n); scanf("%f", &x); 50
5.3 반복문 [따라하기15] Ch05. 명령문 max = x; while (++cnt < n) { scanf("%f", &x); if (max < x) } printf("\n최대값은 %g입니다.\n", max); return 0; 51
5.4 블록문 블록문(block statement) 특정 단위로 다루려고 하는 관련된 문장들의 집합 Ch05. 명령문 5.4 블록문 블록문(block statement) 특정 단위로 다루려고 하는 관련된 문장들의 집합 블록을 구성하는 문장들은 논리적으로 한 울타리에 놓는다. 블록은 여는 중괄호({)로 시작하여 닫는 중괄호(})로 종료 if문과 같은 어떤 다른 문장으로 인해 요구되는 복수 개의 문장들이 필요할 때 사용 #include <stdio.h> void main(void) { int i; { /* 블록문 */ i = 120; printf("%d", i); } 52
4교시
Ch05. 명령문 Ch05. 실습 과제 <1>다음을 참고로 표준입력으로 받은 년도의 윤년을 판단하는 프로그램을 if 문을 사용하여 작성하시오. <2>다음을 참고로 년도를 입력 받아 그 해의 띠를 출력하는 프로그램을 switch 문을 이용하여 작성하시오. ① 기원 연수가 4로 나누어 떨어지는 해는 우선 윤년으로 하고, ② 1번 중에서 100으로 나누어 떨어지는 해는 평년으로 하며, ③ 다만 400으로 나누어 떨어지는 해는 윤년으로 정한다. 2008 년 쥐(자)띠이며, 다음 해는 소(축)띠, 그 다음 해는 호랑이(인)띠, 계속해서 토기(묘)띠, 용(진)띠, 뱀(사)띠, 말(오)띠, 양(미)띠, 원숭이(신)띠, 닭(유)띠, 개(술)띠, 돼지(해)띠이다. 이와 같이 12 개의 띠가 돌아가며 계속된다. 54
Ch05. 실습 과제 <3>문자열을 입력 받아 문자열의 길이를 출력하는 프로그램 작성 <4>차례대로 3명의 나이를 입력 받고, for()문을 사용해 3명의 나이를 평균을 구하는 프로그램을 작성 <5>1에서 100까지의 정수 중에서 3, 5, 7의 배수를 제외한 수를 한 행에 10개씩 출력하는 프로그램 작성 55
Q&A 56