쉽게 풀어쓴 C언어 Express 제6장 조건문 C Express
이번 장에서 학습할 내용 조건문이란? if 문 if-else 문 중첩 if 문 switch 문 break문 continue문 5장까지는 문장들이 순차적으로 실행된다고 하였다. 하지만 필요에 따라서 조건이 만족되면 문장의 실행 순서를 변경할 수 있는 기능이 제공된다. 조건문이란? if 문 if-else 문 중첩 if 문 switch 문 break문 continue문 goto문
조건문 조건에 따라서 여러 개의 실행 경로 가운데 하나를 선택 문장이 실행되는 순서에 영향을 주는 문장 조건에 따라서 여러 개의 같은 처리를 반복
일상 생활에서의 조건문의 예 만약 비가 오지 않으면 테니스를 친다. 만약 결석이 1/3이상이면 F학점을 받는다. 만약 시간이 없는 경우에는 택시를 탄다. 만약 날씨가 좋고 공휴일이면 공원에 산책을 간다. 점수가 60점 이상이면 합격이고 그렇지 않으면 불합격이다. 조건문은 프로그램의 흐름을 변경합니다.
if 문 조건에 따라서 결정을 내리는 경우에 사용 조건에 따라서 결정을 내리는 경우에 사용 if (조건식) 문장; 조건식이 참으로 계산되면 if (조건식) 문장; 문장이 실행된다.
if 문의 예 if (number > 0) printf("양수입니다\n"); if (temperature < 0) printf("현재 영하입니다.\n"); // 조건이 참일 때만 실행 printf("현재 온도는 %d도 입니다.\n", temperature); // 항상 실행
복합문 복합문(compound statement) 중괄호를 사용하여 문장들을 묶은 것 블록(block)이라고도 함 단일문(simple statement) 대신 사용 가능 if (score >= 60) { printf("합격입니다.\n"); printf("장학금도 받을 수 있습니다.\n"); } 조건식이 참이면 2개의 문장이 모두 실행된다.
예제 #include <stdio.h> int main(void) { int number; printf("정수를 입력하시오: "); scanf("%d", &number); if (number > 0) printf("양수입니다.\n"); printf("입력된 값은 %d입니다.\n", number); return 0; } 정수를 입력하시오: 25 양수입니다. 입력된 값은 25입니다.
예제 // if 문을 사용하여 절댓값을 구하는 프로그램 #include <stdio.h> int main(void) { int number; printf("정수를 입력하시오: "); scanf("%d", &number); if (number < 0) number = -number; printf("절댓값은 %d입니다.\n", number); return 0; } 만약 사용자가 -5를 입력하였다면 -5 < 0이므로 해당 조건문 실행 정수를 입력하시오: -5 절댓값은 5입니다.
if-else 문 if (조건식) 문장1; else 문장2; 조건식이 참이면 실행된다. 조건식이 거짓이면 실행된다.
if-else 문 if (score >= 60) printf("합격입니다.\n"); else { printf("합격입니다.\n"); printf("장학금도 받을 수 있습니다.\n"); } else printf("불합격입니다.\n"); printf("공부하세요.\n"); score가 60이상이면 실행 score가 60미만이면 실행
복잡한 조건식도 가능 학점 결정 코드 if (score >= 80 && score < 90) grade = 'B'; 공백 문자들의 개수를 세는 코드 if (ch == ' ' || ch == '\n' || ch == '\t') white_space++;
예제 #1 // if-else 문을 이용하여 홀수와 짝수를 구분한다. #include <stdio.h> int main(void) { int number; printf("정수를 입력하시오: "); scanf("%d", &number); if (number % 2 == 0) printf("입력된 정수는 짝수입니다.\n"); else printf("입력된 정수는 홀수입니다.\n"); return 0; } 2로 나누어서 나머지가 0이면 짝수이다. 정수를 입력하시오: 입력된 정수는 짝수입니다. 50
예제 #2 // 나눗셈을 하기 전에 분모가 0인지를 if-else 문을 이용하여 검사 #include <stdio.h> int main(void) { int n1, n2, n3; printf("정수를 입력하시오: "); scanf("%d", &n1); scanf("%d", &n2); if (n2 == 0) { // 분모가 0인지 검사 printf("0으로 나눌 수는 없습니다.\n"); } else { n3 = n1 / n2; printf("결과는 %d입니다.\n", n3); } return 0; } 정수를 입력하시오: 결과는 1입니다. 5 4
예제 #3 // 윤년 판단 프로그램 #include <stdio.h> 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); return 0; } 연도를 입력하시오: 2015년은 윤년이 아닙니다. 2015
중첩 if if 문에 다시 if 문이 포함된 경우 if (조건식1 ) if (조건식2 ) 문장;
if 문 안의 문장 자리에 if-else 문이 들어간 경우 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 문에 매치된다. Dangling else problem if (score > 80) if (score >= 90) printf("당신의 학점은 A입니다\n"); else printf("당신의 학점은 B입니다\n") 만약 다른 if 문과 else 절을 매치시키려면 중괄호를 사용하여 블록으로 묶는다. if (score >= 80) { if (score >= 90) printf("당신의 학점은 A입니다.\n"); } else printf("당신의 학점은 A나 B가 아닙니다.\n");
중첩 if if (score > 80) { if (score > 90) printf("당신의 학점은 A입니다.\n"); else printf("당신의 학점은 B입니다.\n"); } else { if (score > 70) printf("당신의 학점은 C입니다.\n"); printf("당신의 학점은 D 또는 F입니다.\n"); } if-else 안에 다른 if-else 문이 포함될 수 있다.
정수 3개중의 최솟값 찾기 #include <stdio.h> int main(void) { int n1, n2, n3, min; printf("정수 3개를 입력하시오:"); scanf("%d %d %d", &n1, &n2, &n3); if (n1 < n2) if (n1 < n3) min = n1; else min = n3; if (n2 < n3) min = n2; 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 문장1; else if (조건식2 ) 문장2; else if (조건식3 ) 문장3; else 문장4;
학점 결정 예제 #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); if ('A' <= ch && ch <= 'Z’) printf("%c는 대문자입니다.\n", ch); else if ('a' <= ch && ch <= 'z’) printf("%c는 소문자입니다.\n", ch); else if ('0' <= ch && ch <= '9’) printf("%c는 숫자입니다.\n", ch); else printf("%c는 기타문자입니다.\n", ch); return 0; } 문자를 입력하시오: c는 소문자입니다. c
계산기 예제 #include <stdio.h> int main(void) { char op; int x, y, result; printf("수식을 입력하시오.\n"); printf("(예: 2 + 5)\n"); 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("지원되지 않는 연산자입니다.\n"); return 1; } printf("%d %c %d = %d\n", x, op, y, result); return 0; 수식을 입력하시오. (예: 2 + 5) >> 2 + 5 2 + 5 = 7
switch 문 여러 가지 경우 중에서 하나를 선택하는 데 사용 break는 switch 문을 탈출하는 데 사용합니다. { case c1: 문장1; break; case c2: 문장2; ... case cn: 문장n; default: 문장d; } 조건식의 값이 c2이면 실행된다. 일치하는 값이 없으면 실행된다. break는 switch 문을 탈출하는 데 사용합니다.
예제 int main(void) { int number; printf("정수를 입력하시오: "); scanf("%d", &number); switch (number) { case 0: printf("없음\n"); break ; case 1: printf("하나\n"); case 2: printf("둘\n"); default: printf("많음\n"); break; } return 0; } 정수를 입력하시오: 하나 1
break가 생략된 경우 switch (number) { // number = 1 case 0: printf("없음\n"); default: printf("많음\n"); break; } break를 만날 때까지 계속 문장을 실행합니다.
의도적인 break 생략 여러 경우를 하나로 묶어서 처리하기 위하여 이러한 기법을 사용 switch (number) { case 0: printf("없음\n"); break; case 1: printf("하나\n"); case 2: case 3: printf("두서너개\n"); default: printf("많음\n"); } 여러 경우를 하나로 묶어서 처리하기 위하여 이러한 기법을 사용
default 어떤 case에도 매치되지 않는 경우에 수행 switch (number) { // number = 5 printf("없음\n"); break ; case 1: printf("하나\n"); case 2: printf("둘\n"); default: printf("많음\n"); break; }
switch 문에서 주의할 점 case label에는 정수형 상수 수식만 허용됨 case label들의 값은 서로 달라야 함 switch (number) { case x: // 변수는 사용할 수 없다. printf("x와 일치합니다. "); break; case (x+2): // 변수가 들어간 수식은 사용할 수 없다. printf("수식과 일치합니다. "); case 0.001: // 실수는 사용할 수 없다. printf("실수"); case "001": // 문자열은 사용할 수 없다. printf("문자열"); }
switch 문과 if-else 문 switch는 if-else보다 실행 속도가 빠르지만 사용에 제약이 있음 switch (number) { case 0: printf("없음\n"); break; case 1: printf("하나\n"); case 2: printf(“둘\n"); default: printf("많음\n"); } if (number == 0) printf("없음\n"); else if (number == 1) printf("하나\n"); else if (number == 2) printf("둘\n"); else printf("많음\n");
switch 예제 // 달의 일수를 계산하는 프로그램 #include <stdio.h> int main(void) { int month, days; printf("달을 입력하시오: "); scanf("%d", &month); switch (month) { case 2: days = 28; break; case 4: case 6: case 9: case 11: days = 30; default: days = 31; } printf("%d월의 일수는 %d입니다.\n", month, days); return 0; } 달을 입력하시오: 12 12월의 일수는 31입니다.
switch 예제 // 학점 부여 프로그램 #include <stdio.h> int main(void) { int score; char grade; printf("성적을 입력하시오(0~100): "); scanf("%d", &score); switch (score / 10) { case 10: case 9: grade = 'A'; break; case 8: grade = 'B'; break; case 7: grade = 'C'; break; case 6: grade = 'D'; break; default: grade = 'F'; break; } printf("성적 = %d, 학점 = %c\n", score, grade); return 0; 성적을 입력하시오(0~100): 85 성적 = 85, 학점 = B
계산기 예제 #include <stdio.h> int main(void) { char op; int x, y, result; printf("수식을 입력하시오.\n"); printf("(예: 2 + 5)\n"); printf(">> "); scanf("%d %c %d", &x, &op, &y); switch (op) { case '+': result = x + y; break; case '-': result = x – y; break; case '*': result = x * y; break; case '/': result = x / y; break; case '%': result = x % y; break; default: printf("지원되지 않는 연산자입니다.\n"); return 1; } printf("%d %c %d = %d\n", x, op, y, result); return 0; 수식을 입력하시오. (예: 2 + 5) >> 2 + 5 2 + 5 = 7
goto문 무조건 어떤 위치로 점프 특별한 경우가 아니면 사용하지 않는 것이 좋음