쉽게풀어쓴 C 언어 Express 제 6 장조건문
이번장에서학습할내용 조건문이란? if 문 if, else 문 중첩 if 문 switch 문 break 문 continue 문 goto 문 5 장까지는문장들이순차적으로실행된다고하였다. 하지만필요에따라서조건이만족되면문장의실행순서를변경할수있는기능이제공된다.
조건문 조건에따라서여러개의실행경로가운데하나를선택 문장이실행되는순서에영향을주는문장 조건에따라서여러개의같은처리를반복
일상생활에서의조건문의예 만약비가오지않으면테니스를친다. 만약결석이 1/3이상이면 F학점을받는다. 만약시간이없는경우에는택시를탄다. 만약날씨가좋고공휴일이면공원에산책을간다. 점수가 60점이상이면합격이고그렇지않으면불합격이다. 조건문은프로그램의흐름을변경합니다.
if 문 조건에따라서결정을내리는경우에사용 if( 조건식 ) 문장 ; 조건식이참으로계산되면 문장이실행된다.
if 문
if 문의예 number 가 0 보다크면 if( number > 0 ) printf(" 양수입니다 \n"); 양수입니다 를출력한다. if 문이끝나면 if 문다음문장이실행된다. if ( temperature < 0 ) printf(" 현재영하입니다.\n"); // 조건이참일때만실행 printf(" 현재온도는 % 도입니다.\n", temperature); // 항상실행
복합문 복합문 (compound statement) 중괄호를사용하여문장들을그룹핑하는것, 블록 (block) 이라고도한다. 단일문대신들어갈수있다. if( score >= 60 ) printf(" 합격입니다.\n"); printf(" 장학금도받을수있습니다.\n"); 조건식이참이면 2 개의문장이묶여서실행된다.
예제 #include <stdio.h> int main(void) int number; printf(" 정수를입력하시오 :"); scanf("%d", &number); if( number > 0 ) printf(" 양수입니다."); printf(" 입력된값은 %d 입니다.", number); 정수를입력하시오 : 양수입니다. 25 return 0; 입력된값은 25 입니다.
// if 문을사용하여절대값을구하는프로그램 #include <stdio.h> int main(void) int number; 예제 printf(" 정수를입력하시오 :"); scanf("%d", &number); 만약사용자가 -5 를입력하였다면 if( number < 0 ) number = -number; -5 < 0 이므로해당조건문실행 printf(" 절대값은 %d 입니다.\n", number); 정수를입력하시오. -5 절대값은 5 입니다. return 0;
중간점검 1. 중괄호로묶은여러개의문장을무엇이라고하는가? 2. C 에서참과거짓은어떤정수로표시되는가? 3. if 문안의조건식으로많이사용되는수식의종류는무엇인가? 4. if 문이끝나면어떤문장이실행되는가? 5. 조건에따라서실행되어야하는문장이두개이상이면어떻게하여야하는가?
if-else 문 날씨가좋은가? 거짓 참 테니스를친다. 공부를한다. if( 조건식 ) 문장 1; else 문장 2; 조건식이참이면실행된다. 조건식이거짓이면실행된다.
if-else 문
if-else 문 if ( score >= 60 ) printf(" 합격입니다.\n"); else printf(" 불합격입니다.\n"); if ( score >= 60 ) else printf(" 합격입니다.\n"); printf(" 장학금도받을수있습니다.\n"); printf(" 불합격입니다.\n"); printf(" 공부하세요.\n"); score가 60이상이면실행 score가 60미만이면실행 score가 60이상이면실행 score가 60미만이면실행
복잡한조건식도가능 학점결정코드 if( score >= 80 && score < 90 ) grade = 'B'; 공백문자들의개수를세는코드 if( ch == ch == \n ch == \t ) white_space++;
// if-else 문을이용하여홀수와짝수를구분한다. #include <stdio.h> int main(void) int number; 예제 #1 printf(" 정수를입력하시오 :"); scanf("%d", &number); if( number % 2 == 0 ) printf(" 입력된정수는짝수입니다.\n"); else printf(" 입력된정수는홀수입니다.\n"); return 0; PASS 2 로나누어서나머지가 0 이면짝수이다. 정수를입력하시오 : 50 입력된정수는짝수입니다.
// 나눗셈을하기전에분모가 0인지를 if-else 문을이용하여검사 #include <stdio.h> int main(void) int n1, n2, n3; printf(" 정수를입력하시오 : "); scanf("%d", &n1); 예제 #2 정수를입력하시오 : 정수를입력하시오 : 결과는 1 입니다. 5 4 printf(" 정수를입력하시오 : "); scanf("%d", &n2); PASS if( n2 == 0 ) printf("0으로나눌수는없습니다.\n"); else n3 = n1 / n2; printf(" 결과는 %d입니다.\n", n3); return 0; // 분모가 0 인지검사 // 나눗셈실행
예제 #3 // 윤년판단프로그램 #include <stdio.h> 연도를입력하시오 : 2005 2005년은윤년이아닙니다. int main(void) int year; printf(" 연도를입력하시오 : "); scanf("%d", &year); if((year % 4 == 0 && year % 100!= 0) year % 400 == 0) printf("%d 년은윤년입니다.\n", year); else printf("%d 년은윤년이아닙니다.\n", year); PASS return 0;
중간점검 1. 변수 n 의값이 100 보다크거나같으면 large", 100 보다작으면 small" 을출력하는 if-else 문을작성하라.
중첩 if if 문에다시 if 문이포함 if( 조건식 1 ) if( 조건식 2 ) 문장 ;
중첩 if if( score >= 80 ) if( score >= 90 ) printf(" 당신의학점은 A 입니다.\n"); If 문안의문장자리에 if 문이들어간경우 if( score >= 80 ) if( score >= 90 ) printf(" 당신의학점은 A입니다.\n"); else printf(" 당신의학점은 B입니다.\n"); If 문안의문장자리에 if-else 문이들어간경우
if 와 else 의매칭문제 else 절은가장가까운 if 절과매치된다. if(score > 80) if( score >= 90) O printf( 당신의학점은 A입니다 \n ); X else printf( 당신의학점은 B입니다 \n ) if( score >= 80 ) if( score >= 90 ) else printf(" 당신의학점은 A 입니다.\n"); printf(" 당신의학점은 A 나 B 가아닙니다.\n"); 만약다른 if 절과 else 절을매치시키려면중괄호를사용하여블록으로묶는다.
중첩 if if( score > 80 ) if( score > 90 ) printf(" 당신의학점은 A 입니다.\n"); else else printf(" 당신의학점은 B 입니다.\n"); if( score > 70 ) printf(" 당신의학점은 C 입니다.\n"); else printf(" 당신의학점은 D 또는 F 입니다.\n"); If-else 절안에다른 if-else 절이포함될수있다.
#include <stdio.h> int main(void) int n1, n2, n3, min; 정수 3 개중의최소값찾기 printf(" 정수 3 개를입력하시오 :"); scanf("%d %d %d", &n1, &n2, &n3); if( n1 < n2 ) if( n1 < n3 ) min = n1; else min = n3; else if( n2 < n3 ) min = n2; else min = n3; printf(" 제일작은수는 %d 입니다 \n", min); return 0; 10 < 20 이고 10 < 30 이므로실행 정수 3 개를입력하시오 :10 20 30 제일작은수는 10 입니다.
연속적인 if if( 조건식 1 ) 문장 1; else if( 조건식 2 ) 문장 2; else if( 조건식 3 ) 문장 3; else 문장 4;
연속적인 if
#include <stdio.h> 학점결정예제 int main(void) int score; printf(" 성적을입력하시오 : "); scanf("%d", &score); if (score >= 90) printf(" 합격 : 학점 A\n"); else if (score >= 80) printf(" 합격 : 학점 B\n"); else if (score >= 70) printf(" 합격 : 학점 C\n"); else if (score >= 60) printf(" 합격 : 학점 D\n"); else printf(" 불합격 : 학점 F\n"); return 0; 성적을입력하시오 : 88 합격 : 학점 B
// 문자들을분류하는프로그램 #include <stdio.h> int main(void) char ch; printf(" 문자를입력하시오 : "); scanf("%c", &ch); 문자분류예제 PASS if( ch >= 'A' && ch <= 'Z' ) printf("%c는대문자입니다.\n", ch); else if( ch >= 'a' && ch <= 'z' ) printf("%c는소문자입니다.\n", ch); else if( ch >= '0' && ch <= '9' ) printf("%c는숫자입니다.\n", ch); else printf("%c는기타문자입니다.\n", ch); 문자를입력하시오 : c 는소문자입니다. c return 0;
실습 : 이차방정식
계수 a 를입력하시오 : 3 계수 b 를입력하시오 : 8 계수 c 를입력하시오 : 5 방정식의근은 -1 입니다. 방정식의근은 1.75 입니다. 실행결과
알고리즘 사용자로부터 a, b, c를읽는다. if a == 0이면일차방정식의근을구한다. 실근을출력한다. else 판별식을계산한다. if 판별식 >= 0 근의공식을이용하여실근을구한다. 실근을출력한다. else 실근은없다는메시지출력
소스 #include <stdio.h> #include <math.h> int main(void) double a, b, c, dis; printf(" 계수 a 를입력하시오 : "); scanf("%lf", &a); printf(" 계수 b 를입력하시오 : "); scanf("%lf", &b); printf(" 계수 c 를입력하시오 : "); scanf("%lf", &c);
소스 if( a == 0 ) else return 0; printf(" 방정식의근은 %f 입니다.", -c/b); dis = sqrt(b*b - 4.0*a*c); if( dis >= 0 ) else printf(" 방정식의근은 %f 입니다.", (-b+dis)/(2.0*a)); printf(" 방정식의근은 %f 입니다.", (-b-dis)/(2.0*a)); printf(" 실근이존재하지않습니다 "); 계수 a 를입력하시오 : 3 계수 b 를입력하시오 : 8 계수 c 를입력하시오 : 5 방정식의근은 -1 입니다. 방정식의근은 1.75 입니다.
실습 : 산술계산기 수식을입력하시오 ( 예 : 2 + 5) >>2 + 5 2 + 5 = 7
소스 #include <stdio.h> int main(void) char op; int x, y, result; printf(" 수식을입력하시오 "); printf("( 예 : 2 + 5) "); printf(">>"); scanf("%d %c %d", &x, &op, &y); if( op == '+' ) result = x + y; else if( op == '-' ) result = x - y; else if( op == '*' ) result = x * y; else if( op == '/' ) result = x / y; else if( op == '%' ) result = x % y; else printf(" 지원되지않는연산자입니다. "); 수식을입력하시오 ( 예 : 2 + 5) >>2 + 5 2 + 5 = 7 printf("%d %c %d = %d ", x, op, y, result); return 0;
중간점검 1. n 의값이각각 -1, 0, 5 인경우에다음의코드에의하여생성되는출력은무엇인가? if( n == 0 ) printf("a"); else if( n > 3 ) else printf("b"); printf("c"); 2. 컵의사이즈를받아서 100ml 미만은 small, 100ml 이상 200ml 미만은 medium, 200ml 이상은 large 라고출력하는연속적인 if-else 문을작성하시오.
switch 문 여러가지경우중에서하나를선택하는데사용 switch( 조건식 ) case c1: 문장 1; case c2: 문장 2;...... case cn: 문장 n; default: 문장 d; 제어식의값이 c1 이면실행된다. 제어식의값이 c2 이면실행된다. 일치하는값이없으면실행된다.
switch 문의순서도 case case c1 c1 참 문장문장 1 1 break break 거짓 case case c2 c2 참 문장문장 2 2 break break... 거짓 case case cn cn 참 문장문장 n n break break 거짓 default default
switch 문의실행순서 break 는문장의실행을끝내고 switch 문을탈출하는데사용합니다.
예제 int main(void) int number; printf(" 정수를입력하시오 :"); scanf("%d", &number); switch(number) case 0: case 1: printf(" 없음 \n"); break ; printf(" 하나 \n"); break ; case 2: default: printf(" 둘 \n"); break ; printf(" 많음 \n"); 정수를입력하시오 : 하나 1
사용자가 1 을입력하는경우
break 가생략되는경우 break 를만날때까지계속문장을실행합니다.
의도적인 break 생략 switch(number) case 0: case 1: case 2: case 3: default: printf(" 없음 \n"); printf(" 하나 \n"); printf(" 두서너개 \n"); printf(" 많음 \n"); 2 개의경우를하나로묶어서처리하기위하여이러한기법을사용
default 문 어떤 case 문과도일치되지않는경우에선택
switch 문과 if-else 문 int main(void) int number; scanf("%d", &number); if( number == 0 ) printf(" 없음 \n"); else if( number == 1 ) printf(" 하나 \n"); else if( number == 2 ) printf(" 둘 \n"); else printf(" 많음 \n"); switch(number) case 0: case 1: case 2: default: printf(" 없음 \n"); printf(" 하나 \n"); printf( 둘 \n"); printf(" 많음 \n");
switch 문에서주의할점 switch(number) case x: // 변수는사용할수없다. printf("x 와일치합니다. "); case (x+2): // 변수가들어간수식은사용할수없다. printf(" 수식과일치합니다. "); case 0.001: // 실수는사용할수없다. printf(" 실수 "); case 001 : // 문자열은사용할수없다. printf(" 문자열 ");
예제 // 달의일수를계산하는프로그램 #include <stdio.h> int main(void) int month, days; printf(" 달을입력하시오 : "); scanf("%d", &month); switch(month) case 2: days = 28; case 4: case 6: case 9: case 11: days = 30; default: days = 31; printf("%d 월의일수는 %d 입니다.\n", month, days); return 0; 달을입력하시오 : 12 12 월의일수는 31 입니다.
#include <stdio.h> int main(void) char op; int x, y, result; 실습 : 산술계산기 수식을입력하시오 ( 예 : 2 + 5) >>2 + 5 2 + 5 = 7 10 % 3 printf(" 수식을입력하시오 "); printf("( 예 : 2 + 5) "); printf(">>"); scanf("%d %c %d", &x, &op, &y); switch(op) case '+': result = x + y; case '-': result = x - y; default: printf(" 지원되지않는연산자입니다. "); printf("%d %c %d = %d ", x, op, y, result); return 0;
도전문제 위의프로그램은단순히산술연산자만을처리한다. 비트연산자 (&,, ^) 을추가하여보자. 비트연산자인경우에는 16 진수로입력값과결과값을출력하여보자.
중간점검 1. case 절에서 break 문을생략하면어떻게되는가? 2. 변수 fruit 의값이각각 1, 2, 5 일때, 다음의코드의출력을쓰시오. switch(fruit) case 1: printf(" 사과 ); case 2: printf( 배 ); case 3: printf(" 바나나 ); default: printf( 과일 );
Q & A