320 likes | 514 Views
제 13 강. 조건부 수행문. 학습 내용. 조건부 수행문의 작성법 if 문 if-else 문 조건식의 이해 dangling else 문제의 이해. if 문. if (expr) statement; 예 : if (i<0){ i = -i; } if (i<0){ printf(“Error”); exit(0); // 프로그램 종료 } if (i) printf(“Not zero”);. Flow Chart equivalent. F. T. if (i<0) i = -i;.
E N D
제 13 강 조건부 수행문
학습 내용 • 조건부 수행문의 작성법 • if 문 • if-else 문 • 조건식의 이해 • dangling else 문제의 이해
if 문 • if (expr) statement; • 예: • if (i<0){ i = -i; } • if (i<0){ printf(“Error”); exit(0); // 프로그램 종료} • if (i) printf(“Not zero”);
Flow Chart equivalent F T • if (i<0) i = -i; expression statement
lab13_01 • if (a>b) c = 0; 에 해당하는 CFL 프로그램을 작성하여 실행하여보라
lab13_02 • 아래의 if 문에 해당하는 CFL을 작성하시오. • if (a==0){ • b = 1; • c = 1; • } • d = 1;
if –else 문 • if (expr) { • … • } else { • … • }; expression statement1 statement2
lab13_03 • if (a>b){ • b = a; • } else { • a = b; • } CFL 로 작성하시요.
블럭내 문장이 하나이면 • statement 하나인 경우 블럭 기호 { ... } 생략 가능 • 그러나 생략하지 말 것 (습관) • if (expr) statement; • else statement;
기본적인 조건식 • 어떠한 수식도 가능 • 비교 연산이 많이 쓰임 • >, <, >=, <=, ==, != • 두 가지 조건을 동시에 만족: 논리적 and (&&) • if ((i>0) && (i<100)){ … } // 1부터 99사이인 경우에만 수행 • 두 가지 조건 중 한가지라도 만족: 논리적 or (||) • if ((i>0) || (j>0)){ … } // i 또는 j가 0보다 크면 수행
실습 lab13_04/abs.c • scanf로 읽어 들인 정수의 절대값을 출력하는 프로그램을 작성하라. if만을 쓰고 else는 쓰지 않고 해보라.
실습 lab13_05/hour.c • 시간과 분을 두개의 정수로(scanf) 입력 받는다. 이 시간은 군대식 (14시 30분처럼) 시간을 나타낸다. 이 시간을 • 오전 0시 1분 (0 1 경우) • 오전 10시 30분 (10 30 경우) • 오후 12시 5분 (12 5 - 특수한 경우이므로 주의) • 오후 2시 5분 (14 5) • 처럼 출력하는 프로그램 hour.c를 작성하라. • if와 else를 사용한다. 공통부분은 가능한 두 번 쓰지 않도록 한다. • 분 단위가 59가 넘으면 오류로 표시한다.
Cascaded if's • if (A && B) ... • if (A) if (B) ...
lab13_06 ifif.c • scanf로 입력된 정수가 세자리 양의 정수인지 알아보는 프로그램을 작성하라. 단, if 문의 조건에서 &&를 쓰지 않는다. • YES 또는 NO를 출력한다. • 10, 99, 100, 333, 999, 1000, 2000에 대해서 모두 테스트해보라. • (세자리 수인지 직접 물어볼 수 없으므로 수의 범위를 확인 하면 된다.)
#include<stdio.h> • int main(){ • int hh, mm; • scanf("%d %d", &hh, &mm); • if (mm>59){ • printf("Error\n"); • } else { • if (hh>=0 && hh<12){ • printf("오전 "); • } else { • printf("오후 "); • } • if (hh>=0 && hh<13) • printf("%d 시 %d 분\n", hh, mm); • else • printf("%d 시 %d 분\n", hh-12, mm); • } • }
조건의 만족이란? • 수식의 evaluation 결과가 NON-ZERO • if (1) • always true • if (0) • always false • if (0.1) • always true • if (“Hello”) • always true 그러나 쓰지마세요 그러나 쓰지마세요
예제: 숫자와 영소문자 세기 • int c, letter, digit, etc; • letter= digit =etc=0; • while ((c=getchar())!=EOF){ • if ((c>=‘a’) && (c<=‘z’)) letter++; • else if ((c>=‘0’) && (c<=‘9’)) digit++; • else etc++; • }
잘못된 예제: if 와 if-else차이 • int c, letter, digit, etc; • // 영소문자, 숫자, 기타의 개수를 센다. • letter=digit=etc=0; • while ((c=getchar())!=EOF){ • if ((c>='a') && (c<='z')) letter++; • if ((c>='0') && (c<='9')) digit++; • etc++; • }
실습 lab13_07/count.c • 앞의 예제를 else를 이용하여 수정하여 영소문자의 개수, 숫자문자의 개수, 기타 문자의 개수를 정확히 세도록 만들어보라. • 예를 들어 입력이 abcd12.5 였다면 newline을 포함하여 letter 4개, digit 3개 기타 2개가 될 것이다.
Dangling 'else' • if .. if .. else 처럼 있으면 이 else는 앞의 if에 대응되는 else일까 아니면 뒤에 대응되는 else일까?
실습: lab13_08(else.c) 전페이지의 질문에 대하여 이 프로그램의 실행 결과를 보고 답변을 해보라. (프로그램 안에 comment로 넣어서 제출) • #include <stdio.h> • int main(){ • int x,y; • x = 1; y = 1; • if (x>0) • if (y>0) printf("둘 다 양수\n"); • else • printf("x는 음수\n"); • x = -1; • if (x>0) • if (y>0) printf("둘 다 양수\n"); • else • printf("x는 음수\n"); • }
속지말자 들여쓰기 • 공백 문자들은 컴파일러에게 아무 의미가 없음 • 오로지 토큰만이 소용있음. • 들여쓰기는 사람이 보기 위한 것. if (expr) if (expr) statement; else statement; if (expr) if (expr) statement; else statement;
if A if B C else D A no else B C D
if A if B C else D A B no else C D
실습 lab13_09/else2.c • else.c를 수정하여 의도대로 되도록 만들어 보라. 적절히 블록 기호를 이용한다.
dangling else 규칙 • Ambiguous else는 가장 가까운 if에 붙는다. if (expr) if statement; else statement; if (expr) if (expr) statement; else statement; 바람직한 들여쓰기
권고 사항 • 반드시 { } 블럭을 사용하자. • if ((c>=‘a’) && (c<‘z’)) • letter++; • 추가시 • if ((c>=‘a’) && (c<‘z’)) • letter++; • total++; • // anything wrong ?
블럭을 사용했더라면... • 최초: • if ((c>=‘a’) && (c<‘z’)){ • letter++; • } • 추가시: • if ((c>=‘a’) && (c<‘z’)){ • letter++; • total++; • } • // safer !
실습 lab13_10/tax.c • 세금 계산 프로그램: A 나라에서 소득세는 다음과 같이 계산된다. 소득액(만원 단위)과 나이를 한 줄에 정수로 입력했을 때 (둘 사이는 하나 이상의 빈 칸으로 구분) 세액을 계산하는 프로그램을 작성하라. (세율과 세액을 둘 다 출력) • 세액 = 소득 * 세율 • 세율:
실습 lab13_11/tax2.c • 소득세율은 소득에 따라 결정된다. 1000만원 이하는 5%, 1000만원을 초과하는 금액에 대해서는 초과분 1000만원까지에 대해서 10%를 적용하며, 그 나머지 소득에 대해서 세율이 20%라고 하자. • 만일 홍길동씨의 소득이 1300만원이라면 이중 1000만원에 대해서는 5%, 나머지 300만원에 대해서는 10%를 세금으로 낸다는 뜻이다. (1300만원 전체에 대한 10%가 아니다.) • 자신의 소득을 입력하였을 때 세액을 계산하는 프로그램을 작성하라. • 사용 예:총 소득은 얼마입니까? (만원 단위)2300총 세액은 YYY입니다.
Summary • Syntax: • if (expr) statement; • if (expr) statement; else statement; • Statement can be replaced by a block • non-zero means true;zero means false • beware of dangling else