개정판 누구나 즐기는 C언어 콘서트 제5장 조건문 출처: pixabay
이번 장에서 학습할 내용 조건문이란? if 문 if, else 문 중첩 if 문 switch 문 break문 continue문 5장까지는 문장들이 순차적으로 실행된다고 하였다. 하지만 필요에 따라서 조건이 만족되면 문장의 실행 순서를 변경할 수 있는 기능이 제공된다. 조건문이란? if 문 if, else 문 중첩 if 문 switch 문 break문 continue문 goto문
이번 장에서 만들 프로그램
3가지의 기본 제어 구조
자동차가 주행하는 도로와 유사
왜 조건문이 필요한가? 상황에 따라서 결정을 다르게 해야 함.
if-else 문
예제 시험점수가 60점 이상이면 합격이고 60점 미만이면 불합격을 화면 에 출력하고자 한다면 if ( score >= 60 ) { printf("합격입니다.\n"); } else { printf("불합격입니다.\n");
생략할 수 있는 것 만약 조건에 따라 실행되는 문장이 하나이면 중괄호는 생략할 수 있 다. else 절은 생략될 수 있다. if ( score >= 60 ) printf("합격입니다.\n"); else printf("불합격입니다.\n"); if ( score >= 60 ) printf("합격입니다.\n");
예제 #1 사용자로부터 입력받은 온도를 if-else 문을 이용하여 검사한 후에 영상이면 “영상의 날씨입니다”를 출력하고 그렇지 않으면 “영하의 날씨입니다”를 출력한다.
예제 #1 #include <stdio.h> int main(void) { int temperature; printf("온도를 입력하시오:"); scanf("%d", &temperature); if (temperature > 0) // temperature가 0보다 크면 아래 문장을 실행 printf("영상의 날씨입니다.\n"); else // temperature가 0 이하이면 아래 문장을 실행 printf("영하의 날씨입니다.\n"); printf("현재 온도는 %d도입니다.\n", temperature); // 항상 실행 return 0; }
예제 #2 사용자로부터 입력받은 정수가 홀수인지 짝수인지를 말해주는 프로 그램을 작성하여 보자.
예제 #2 #include <stdio.h> int main(void) { int number; printf("정수를 입력하시오:"); scanf("%d", &number); if (number % 2 == 0) // number를 2로 나눈 나머지가 0이면 짝수이다. printf("입력된 정수는 짝수입니다.\n"); else // 그렇지 않으면 홀수이다. printf("입력된 정수는 홀수입니다.\n"); return 0; }
예제 #3 예를 들어서 시험 성적이 60점 이상이면 합격과 동시에 장학금도 받을 수 있다고 출력하려면 어떻게 해야 할까?
예제 #3 #include <stdio.h> int main(void) { int score; printf("성적을 입력하시오:"); scanf("%d", &score); if (score >= 60) // 성적이 60점 이상이면 printf("합격입니다.\n"); printf("장학금도 받을 수 있습니다.\n"); } else // 그렇지 않으면 printf("불합격입니다.\n"); printf("다시 도전하세요.\n"); return 0;
복합문 복합문(compound statement) 중괄호를 사용하여 문장들을 그룹핑하는 것, 블록(block)이라고도 한다. 단일문 대신 들어 갈 수 있다. if( score >= 60 ) { printf("합격입니다.\n"); printf("장학금도 받을 수 있습니다.\n"); } 조건식이 참이면 2개의 문장이 묶여서 실행된다.
조건 연산자 조건 연산자는 ? 기호와 : 기호로 이루어진다. ? 앞에 있는 것이 조 건이다. 조건이 참이면 값1이 반환된다. 조건이 거짓이면 값2가 반 환된다. big = (x > y) ? x : y;
예제 #include <stdio.h> int main(void) { int x, y; printf("첫번째 수="); scanf("%d", &x); printf("두번째 수="); scanf("%d", &y); printf("큰수=%d \n", (x > y) ? x : y); printf("작은수=%d \n", (x < y) ? x : y); }
논리 연산자
AND 연산자 나이가 30살 이하이고 토익 성적이 700점 이상이라는 조건을 걸었 다고 가정하자.
OR 연산자 나이가 30살 이하이거나 토익 성적이 700점 이상이면 된다고 하자.
NOT 연산자 NOT 연산자는 피연산자의 값이 참이면 연산의 결과값을 거짓으로 만들고, 피연산자의 값이 거짓이면 연산의 결과값을 참으로 만든다.
예제 #include <stdio.h> int main(void) { int number; printf("정수를 입력하시오: "); scanf("%d", &number); if ( number >= 0 && number <= 100) printf("입력한 정수가 0에서 100 사이에 있습니다. \n"); else printf("입력한 정수가 0에서 100 사이가 아닙니다. \n"); return 0; }
단축 연산 if( (2 > 3) && (++x < 5) ) { ... }
Lab: 윤년 판단 윤년인지 아닌지를 판단하는 프로그램을 if 문을 사용하여 작성하여 보자.
Sol: 윤년 판단 #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; }
Lab: 동전 던지기 게임 프로그램을 실행할 때마다 실제 동전을 던지는 것처럼 앞면과 뒷면 이 랜덤하게 나와야 한다. #include <stdlib.h> int main(void) { int coin; coin = rand(); return 0; }
Sol: 동전 던지기 게임 #include <stdio.h> #include <stdlib.h> int main(void) { printf("동전 던지기 게임을 시작합니다.\n"); int coin = rand() % 2; if (coin == 0) printf("앞면입니다.\n"); else printf("뒷면입니다.\n"); return 0; }
중간 점검 1. 변수 n의 값이 100보다 크거나 같으면 “large", 100보다 작으 면 ”small"을 출력하는 if-else 문을 작성하라.
연속적인 if
학점 부여 프로그램
Sol: 동전 던지기 게임 // 성적을 받아서 학점을 결정하는 프로그램 #include <stdio.h> int main(void) { int score; char grade; printf("성적을 입력하시오: "); scanf("%d", &score); if (score >= 90) grade = 'A'; else if (score >= 80) grade = 'B'; else if (score >= 70) grade = 'C'; else if (score >= 60) grade = 'D'; else grade = 'F'; printf("학점 %c \n", grade); return 0; }
계산기 프로그램
Sol: 동전 던지기 게임 // 간단한 산술 계산기 프로그램 #include <stdio.h> int main(void) { char op; int x, y; printf("수식을 입력하시오: "); scanf("%d %c %d", &x, &op, &y); if (op == '+') printf("%d \n", x + y); else if (op == '-') printf("%d \n", x - y); else if (op == '*') printf("%d \n", x * y); else if (op == '/') printf("%d \n", x / y); else printf("지원되지 않는 연산자입니다. \n"); return 0; }
Lab: 세개의 정수 중에서 큰 수 찾기 사용자로부터 받은 3개의 정수 중에서 가장 큰 수를 찾는 프로그램 을 작성해보자.
Sol: 세개의 정수 중에서 큰 수 찾기 #include <stdio.h> int main(void) { int a, b, c, largest; printf("3개의 정수를 입력하시오: "); scanf("%d %d %d", &a, &b, &c); if (a > b && a > c) // a가 b보다 크고 a가 c보다 크면 largest = a; else if (b > a && b > c) // b가 a보다 크고 b가 c보다 크면 largest = b; else // 그렇지 않으면 c가 최대값인 것은 자명하다. largest = c; printf("가장 큰 정수는 %d이다. \n", largest); return 0; }
중간 점검 n의 값이 각각 -1, 0, 5인 경우에 다음의 코드에 의하여 생성되는 출 력은 무엇인가? 2. 컵의 사이즈를 받아서 100ml미만은 small, 100ml이상 200ml미만은 medium, 200ml 이상은 large라고 출력하는 연속적인 if-else 문을 작성하시오. if( n == 0 ) printf("A"); else if( n > 3 ) printf("B"); else printf("C");
switch 문 여러 가지 경우 중에서 하나를 선택하는데 사용 switch(제어식) { case c1: 문장1; break; 문장1; break; case c2: 문장2; ... case cn: 문장n; default: 문장d; } 제어식의 값이 c1이면 실행된다. 제어식의 값이 c2이면 실행된다. 일치하는 값이 없으면 실행된다.
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; } } 정수를 입력하시오: 1 하나
사용자가 1을 입력하는 경우 1 switch(number) { case 0: printf("없음\n"); break ; default: printf("많음\n"); break; } }
break가 생략되는 경우 1 break를 만날 때까지 계속 문장을 실행합니다. switch(number) { case 0: printf("없음\n"); break ; case 1: printf("하나\n"); case 2: printf("둘\n"); default: printf("많음\n"); break; } } break를 만날 때까지 계속 문장을 실행합니다.
의도적인 break생략 2개의 경우를 하나로 묶어서 처리하기 위하여 이러한 기법을 사용 switch(number) { case 0: printf("없음\n"); break; case 1: printf("하나\n"); case 2: case 3: printf("두서너개\n"); default: printf("많음\n"); } 2개의 경우를 하나로 묶어서 처리하기 위하여 이러한 기법을 사용
default 문 5 어떤 case문과도 일치되지 않는 경우에 선택 switch(number) { case 0: printf("없음\n"); break ; case 1: printf("하나\n"); case 2: printf("둘\n"); default: printf("많음\n"); break; } } 어떤 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: printf("없음\n"); break; case 1: printf("하나\n"); case 2: printf(“둘\n"); default: printf("많음\n"); }
달이 주어지면 그 달의 일수 를 출력하는 프로그램
Sol: 동전 던지기 게임 // 달의 일수를 계산하는 프로그램 #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; Sol: 동전 던지기 게임
Lab: 원이나 사각형 그리기 사용자가 “r”을 입력하면 사각형이 그려지고 “c”을 입력하면 원이 그려지는 프로그램을 작성하여 보자.
윈도우에서 그림 그리기 콘솔 윈도우의 크기를 변경하면 그림이 지워집니다! 주의하세요. #include <windows.h> #include <stdio.h> int main(void) { HDC hdc = GetWindowDC(GetForegroundWindow()); Rectangle(hdc, 100, 100, 200, 200); // 사각형을 그린다. Ellispe(hdc, 100, 100, 200, 200); // 원을 그린다. } 콘솔 윈도우의 크기를 변경하면 그림이 지워집니다! 주의하세요.
Sol: 원이나 사각형 그리기 #include <windows.h> #include <stdio.h> int main(void) { HDC hdc = GetWindowDC(GetForegroundWindow()); char command; printf("명령어를 입력하시오(r 또는 c): "); command = getchar(); if (command == 'r') { Rectangle(hdc, 100, 100, 200, 200); } else if (command == 'c') { Ellipse(hdc, 100, 100, 200, 200); else { printf("잘못된 명령어입니다. \n"); return 0;
Lab: 가위, 바위, 보 게임 컴퓨터와 사람이 대결하는 가위, 바위, 보 게임을 작성해보자.
Sol: 원이나 사각형 그리기 #include <stdio.h> #include <stdlib.h> int main(void) { int user, computer; printf("가위, 바위, 보 게임에 오신 것을 환영합니다. \n"); printf("하나를 선택하세요(가위-0, 바위-1, 보-2): "); scanf("%d", &user); // 사용자로부터 정수를 입력받는다. computer = rand() % 3; // 컴퓨터가 난수를 발생하여서 정수를 선택한다. printf("사용자=%d \n", user); printf("컴퓨터=%d \n", computer); if ((user + 1) % 3 == computer) printf("컴퓨터 승리 \n"); else if (computer == user) printf("비겼음 \n"); else printf("사용자 승리 \n"); return 0; } Sol: 원이나 사각형 그리기
Q & A