::
조건부 실행문
조건부 수행문 if/else: 교재 31장
2
MJU CE C Language Programming학습 내용
조건부 수행문의 작성법❖
if-else 문
조건식의 이해
dangling else 문제의 이해
연말정산 프로젝트3
MJU CE C Language Programming조건부 수행문이란?
"if statement" "if문" 으로도 부름.4
MJU CE C Language ProgrammingC언어 문법
if ( 조건 ) {
// true시 실행 부분 }
else {
// false시 실행 부분 }
5
MJU CE C Language Programming두가지 스타일
// Linux 스타일 if ( n>0 ){
printf("양수");
} else {
printf("양수 아님");
}
// Windows 스타일 if ( n>0 )
{
printf("양수");
}
else {
printf("양수 아님");
}
블록의 내부는 들여쓰기 한다.
(indentation)
6
MJU CE C Language Programming좋은 작성 방법
먼저 껍데기를 전부 입력한 후
내용을 추가한다.if ( ) {
}
else {
}
if ( n > 90 ) {
printf("우수");
}
else {
printf("보통");
}
7
MJU CE C Language Programming조건식1: 비교
a > 0
b < 100
c >= 99 (*주의: => 로 쓰면 안된다)
d <= 100
a == b ( * 주의: a = b 로 쓰면 안된다.)
a != b8
MJU CE C Language Programming연습 lab12_01
정수 하나를 입력한 후, 입력된 정수가 자연수인지 음 수인지를 출력하는 C프로그램을 작성하라.
출력을 "자연수" 혹은 "음수"가 되게 하면 된다.9
MJU CE C Language Programminglab12_02
표준 입력에서 읽은 정수 N이 있을 때, 변수 negN 에 는 N과 절대값이 같은 음수를 저장하고 그 결과 값을 출력한다. (주의: 무조건 부호를 바꾸는 것이 아니다)
출력은 if-else 문이 끝난 후에 한번만 출력한다.10
MJU CE C Language Programming예제
tax = 0;if (income > 1000){
printf("과세 대상입니다.\n");
tax = income * 0.05;
} else {
printf("비과세 대상입니다.\n");
tax = 0;
}11
MJU CE C Language ProgrammingBad Indentation
if (income > 1000){
printf("과세 대상입니다.\n");
tax = income * 0.05;
} else
{printf("과세 대상입니다.\n"); tax = 0;
}
12
MJU CE C Language Programmingelse에서 할 일이 없으면
if (expr)
{
…
}
else
{
// 일부러 비웠음.
}13
MJU CE C Language Programming실습12_03: 비교식이 아닌 경우의 규칙
CFL 로 된 다음의 코드를 C언어로 작성, 실행하여 입 력 값에 따라서 어떻게 분기가 되는지 출력을 해보고 어떤 규칙성이 있는지를 서술하라.14
MJU CE C Language Programming실습 해설
15
MJU CE C Language Programming코딩 표준
조건식에 정수 또는 정수식을 사용할 수 있지만 반드시 비교식 또는 논리식으로 사용한다.
예:
if ( n + k ){
…
}
if ( n+k != 0 ){
…
}16
MJU CE C Language Programming실습 lab12_04
아래의 코드에 추가하여 몇 가지 비교 식을(참인 경우, 아닌 경우 포함) 변수에 assign하여 값을 출력해보라.
(파일: compare.c result.txt)
결과로서 알 수 있는 사실을 result.txt에 적어서 함께 제출한다.
int value1, value2;
value1 = ( 3 > 4 );
value2 = (1 != 1);
…17
MJU CE C Language Programming비교식은 정수 값
비교식도 수식이다:
int value1, value2;
value1 = 3 > 4;
value2 = 1 != 1;18
MJU CE C Language Programming블록 내의 블록 indentation
// Linux style if (expr){
if (expr){
...
} }
// Windows style if (expr)
{
if (expr) {
...
} }
19
MJU CE C Language Programminglab12_05/vat.c
K나라에서는 1000원 넘는 물건을 판매할 때 는 부가가치세 10%를, 아니면 5%를 붙여서받는다.
물건값을 입력하면 세 금을 포함한 총 금액을 계산하여 출력하는 프 로그램을 작성한다. (출 력 원단위)
Flowchart 참조.1000 초과
1.1을 곱한다
T F
출력
물건값입력
1.05를 곱한다
20
MJU CE C Language Programminglab12_07 vat2.c
vat.c 를 else가 없는 구조로바꾸어보라. (힌트: 어느 한쪽을 default로 계산하고 나서 조건이 만족되면 바꾸면 된다.)
21
MJU CE C Language Programming블럭내 문장이 하나이면
statement 하나인 경우 블럭 기호 { ... } 생략 가능
그러나 생략하지 말 것 (습관) if (expr)
statement;
if (expr) {
statement;
}
나쁜 습관
좋은 습관
22
MJU CE C Language Programming주의 사항
if ( a > b ) ;
{
//
}23
MJU CE C Language Programming복잡한 조건 만들기: 논리 연산
함수: 논리 값(0, non-zero) 논리값(0,1)and or not
x y x && y x || y !x
0 0 0 0 1
0 non-zero 0 1 1
non-zero 0 0 1 0
non-zero non-zero 1 1 0
24
MJU CE C Language Programming이항 논리 연산: && ||
&& -- 논리 곱(logical AND)
if ( a < b && b < c ) { … }
|| -- 논리 합(logical OR)
if ( a < 0 || b < 0 ){ … }25
MJU CE C Language Programming단항 논리 연산
! 논리 부정 (logical negation)
if ( !(a>b) ){…}== if ( a <= b ){…}
26
MJU CE C Language Programminglab12_08 괄호넣기
주어진 수가 3자리 수이면 "YES"를 출력.
Hint: 100 보다 같거나 크고 또 1000보다는 작으면 된다. ( && 사용)27
MJU CE C Language Programming범위를 따지는 수식: Good and Bad
수학 식으로: a < x < b 일 경우,
if ( a < x && x < b ) .. Good
if ( x > a && b > x ) … Bad
수학 식으로 x < a or x > b 경우
if ( x < a || b < x ) .. Good
if ( a < x || x > b ) .. Bada b
a b
28
MJU CE C Language Programming숙제 lab12_09/quadrant.c
x 와 y의 값 (정수) 을 입력하면 해당 점이 속한 사분면이
어느것인지 출력하라. (1 또는 3 처럼 정수만을 출력한다)
경계선에 있는 것은 0을 출력한다.2사분면 1사분면
3사분면 4사분면
x
y
29
MJU CE C Language Programmingif –else 의 연속
if ( score > 90 ){
printf("A 학점\n");
} else if ( score > 80 ){
printf("B 학점\n");
} else if ( score > 70 ){
printf("C 학점\n");
} else { // 주의
printf("F 학점\n");
}30
MJU CE C Language ProgrammingLinux Style Indentation
if ( score > 90 ){
printf("A 학점\n");
} else if ( score > 75 ){
printf("B 학점\n");
} else if ( score > 50 ){
printf("C 학점\n");
} else {
printf("F 학점\n");
}31
MJU CE C Language Programming
if ( score > 90 )
{
printf("A 학점\n");
}
else if ( score > 75 )
{
printf("B 학점\n");
}
else
{
printf("B 학점\n");
}
if ( score > 90 )
{
printf("A 학점\n");
}
else
if ( score > 75 )
{
printf("B 학점\n");
}
else
{
printf("B 학점\n");
}Windows Style Indentation
Bad
Good
32
MJU CE C Language Programming자주 범하는 실수
if ( score > 90 ){
printf("A 학점\n");
} else ( score > 75 ){
printf("B 학점\n");
}33
MJU CE C Language Programmingelse 의 중요성
if ( score > 90 ){
printf("A 학점\n");
}
if ( score > 75 ){
printf("B 학점\n");
}
if ( score > 50 ){
printf("C 학점\n");
} ...What's wrong?
34
MJU CE C Language Programming주의 사항
마지막 else에는 조건을 붙이지 않는다.
앞에서 이미 테스트한 조건은 중복하지 않는다.
if (score>90){
…
} else if (score >80 && score<=90){
…
} …35
MJU CE C Language Programminglab12_11 / score.c
정수 변수 score 값을 표준 입력에서 읽어 들이고,
90점 이상이면 A를, 80이상이면 B,
70이상이면 C, 60이상이면 D, 아니면 F를 출력한다.
위의 표현에는 상식에 의거해서 생략된 부분이 있음에 유의할 것.(앞장에서 설명한 부분임)
36
MJU CE C Language Programming:: Block 의 중요성
38
MJU CE C Language Programming블록이 생략된 형태
if ( x > 0 )
printf("0보다 큽니다.\n");
else
printf("0보다 크지 않습니다.\n");NOT Recommented!!!
39
MJU CE C Language Programming문제 1
if ( x > 0 ) pos_count++;
printf("0보다 큽니다.\n");
else neg_count++;
printf("0보다 크지 않습니다.\n");개수를 세야지…
40
MJU CE C Language Programming문제2. Dangling 'else' Problem
여러 개의 if else 들이 사용된 경우 if 의 개수와 else 의 개수가 짝이 맞지 않는 문제41
MJU CE C Language Programming실습: lab12_12 (else.c 배포)
#include <stdio.h>
int main(){
int x,y;
scanf("%d %d", &x, &y);
if (x>0)
if (y>0)
printf("둘다 양수\n");
else
printf("x는 0 이하\n");
}
주어진 프로그램은 x 가 0보다 크고 y가 0보다 크면 둘다 양수라고 출력하고 x 가 음 수이면 "x는 음수"라고 출력하려고 의도한 프로그램이다.
의도대로 되는 지 여러 가지 경우를 테스트해보라.
만일 의도대로 되지 않는다면 그 이유는 무엇인가?42
MJU CE C Language Programming속지말자 들여쓰기
공백 문자(space, newline)들은 컴파일러에게 아무 의미가 없 음
들여쓰기는 사람이 보기 위한 것.if (expr)
if (expr) statement;
else
statement;
if (expr)
if (expr)
statement;
else statement;
43
MJU CE C Language Programmingdangling else 규칙
Ambiguous else는 가장 가까운 if의 짝이 된다.if (expr) if (expr) statement; else statement;
Yes
No
의도를 명확히
44
if (expr){
if (expr){
S1;
}else { } S2;
}
if (expr)
if (expr) S1;
else S2;
if (expr)
if (expr) S1;
else S2;
좋은 놈 이상한 놈 나쁜 놈
45
MJU CE C Language Programming실습 lab12_13/else.c
lab12_12의 else.c 는 블럭을 활용했다면 문제를 일 으키지 않았을 것이다. 블럭 기호(중괄호)를 이용하여 else.c 를 수정하여 의도 대로 되도록 만들어 보라.46
MJU CE C Language Programming권고: 블록 + 들여쓰기
if (expr){
if (expr){
S1;
} else {
S2;
}
}if (expr)
if (expr) else S1;
S2;
이런 의도였다면
의도대로 된다.
47
MJU CE C Language Programming권고: 블록 + 들여쓰기
if (expr){
if (expr){
S1;
}
} else {
S2;
}if (expr)
if (expr) else S1;
S2;
이런 의도였다면
의도대로 된다.
48
MJU CE C Language Programming코딩 표준 (연속된 else if)
if ( ){
…
} else if ( ){
…
} else {
…
}
if ( )
{
}
else if ( )
{
}
else
{
} LinuxStyle
Windows Style
49
MJU CE C Language Programming숙제 ex1258
주어진 프로그램에서 a 가 더 작거나 같은 경우는 실행 을 하지 않아야 하는데 실행을 한다.
틀린 부분을 찾아서 수정하라.50
MJU CE C Language Programming숙제 ex1259
주어진 프로그램은 a가 큰 경우에 두 printf문장들을 실행하고 아닌 경우에는 실행하지 않기로 생각하고 짠 프로그램인데 의도와 다르게 실행된다.
프로그램의 오류를 찾아 수정하라.
result.txt에는 이것이 코딩 표준과 어떤 관계가 있는 지 기술하라.:: Nested 'if' statments
52
MJU CE C Language ProgrammingNested if statements
if 문 블록 안에 또 다른 if문 블록홀수 짝수
10 이상 10 미만
53
MJU CE C Language Programming방법 1
두 조건을 &&로
if ( num >= 10 && num % 2 != 0 ){
// 10 이상의 홀수
} else if (num >= 10 && num % 2 == 0 ){
// 10 이상의 짝수
} else if (num < 10 && num % 2 != 0 ){
// 10 미만의 홀수
} else {
/// 10 미만의 짝수
}54
MJU CE C Language Programming방법 2
if (num>= 10){
if (num%2!=0){
} else {
}
} else {
if (num%2!=0){
} else {
}
}55
MJU CE C Language Programming방법 1이 나쁜 이유
if ( num >= 20 && num % 2 != 0 ){
// 10 이상의 홀수
} else if (num >= 20 && num % 2 == 0 ){
// 10 이상의 짝수
} else if (num < 10 && num % 2 != 0 ){
// 10 미만의 홀수
} else {
/// 10 미만의 짝수
}칼을 두 번 쓰면
세 조각이 나는 수가 있다.
56
MJU CE C Language Programming방법 2가 좋은 이유
if (num>= 10){
if (num%2!=0){
} else {
}
} else {
if (num%2!=0){
} else {
}
}구조적으로 되어 있다.
(properly nested)
여기서는 틀림 없이
num>= 10
57
MJU CE C Language Programming실습lab12_14/simpletax.c
소득세가 다음과 같이 계산된다. 소득액(원 단위)과 나이를 각기 정 수로 입력했을 때 (둘 사이는 하나 이상의 빈 칸으로 구분) 세액을 계 산하는 프로그램을 작성하라. (세액만을 출력)
세율을 나타내는 변수는 float로 한다.
변수가 그 내용을 잘 나타내도록 이름을 짓도록 한다.
세액 = 소득 * 해당 세율
세율:60세 미만 60세 이상
1000 이하 5% 4%
1001~2000 6% 5%
2000 초과 8% 7%
다음 쪽에 계속
소득: income 세금 tax 비율 rate 나이 age
58
MJU CE C Language Programming두가지 approach
나이 먼저 test, 혹은 소득 먼저 테스트60미만
60이상
1000이하 1001 ~ 2000 2000초과
1000이하 1001 ~ 2000 2000초과
1000이하 60미만 60이상 1001 ~ 2000
60미만 60이상 2000초과
60미만 60이상
59
MJU CE C Language ProgrammingHint:
우선 껍데기(if 와 else의 구조)부터 다 만들고 시작한 다.60
MJU CE C Language Programming용어
세액: 정부에 내는 세금 액수 tax
세율: 과세 소득에 곱해서 세액을 계산하기 위한 비율 tax rate
공제(액): 총 소득 중에서 일부 소득에 대해서 세금을 면제해주는 일(또는 액수), exemption
과세 대상 소득(taxable income) 총 소득에서 공제액 을 뺀 액수61
MJU CE C Language Programminglab12_15: calctax.c
소득세율은 소득에 따라 결정된다.
1000만원 이하는 5%, 1000만원을 초과하는 금액에 대해서는
초과분 1000만원까지에 대해서는 10%를 적용하며,
그 나머지 소득에 대해서는 세율이 20% 라고 하자.
만일 홍길동씨의 소득이 1300만원이라면 이중 1000만원에 대해서는 5%,
나머지 300에 대해서는 10%을 세금으로 낸다는 뜻이다.
(1300만원 전체에 대한 10%가 아니다.)
자신의 소득을 입력하였을 때 세액을 계산하는 프로그램을 작성하라.
사용예:
총 소득은 얼마입니까? (만원 단위) 2300
총 세금은 2100000 원 입니다.62
MJU CE C Language Programming과제 lab12_16: tax.c
연말 세금 계산 프로그램을 작성하라. 총 수입에서 공제액을 뺀 액수를 과세 대상 소득이라 하고, 과세 대상 소득에 세율을 적용한 것이 세금이다.
단, 세율은 단순 세율이 아니고 누진세이다. (즉 많이 번 사람은 높은 비율로 세금을 낸다.)
입력 데이터는: 올해의 소득, 부양가족 수, 신용카드 사용액, 의료비 지출, 기부금
순서로 만 단위 정수로 입력한다.
공제 내역은 다음과 같다.
본인 공제 100만원, 부양 가족 1인당 100씩 공제
신용카드는 1000만원을 초과하는 경우에만 초과 분의 10%를 공제
의료비는 수입의 5%를 초과하는 경우에만 의료비 전액 공제
기부금은 전액 공제
공제액이 소득액을 넘으면 세금은 0원
과세대상소득액 1000 이하에 대해서는 1%
1000 초과분 2000이하에 대해서는 3 %
2000 초과분 3000이하에 대해서는 10 %
3000 초과분은 20 %를 적용한다.
출력: 각 항목별 공제액(부양가족 공제, 신용카드공제, 의료비 공제 순서)
과세 대상 소득액 , 총 세금액63
MJU CE C Language Programming실행 예제
=======================================================
데이터를 입력합니다. (금액은 전부 만원 단위로 입력하세요)
=======================================================
올해의 총 소득액은? 5000 부양 가족 수? 2
신용카드 사용액? 2500 의료비? 700
기부금? 500
=======================================================
공제액 안내입니다.
=======================================================
가족 공제는 3000000원입니다.
신용카드 공제는 1500000원입니다.
의료비 공제는 7000000원입니다.
기부금 공제는 5000000원입니다.
총 공제액은 16500000원입니다.
총 과세 소득액은 33500000원입니다.
=======================================================
세금 안내입니다.
=======================================================
총 세금은 2100000 원입니다.
64
MJU CE C Language Programming단계별 작성
버전1: 알고리즘을 pseudo-code*로 작성
버전2: 변수 설정 및 입력 테스트.* 주의:변수명은 용도를 명확히 하도록 작명 예: int total_income; // 총 수입
Good
int i;
Bad
테스트 파일 testdata 작성
$ a.out < testdata 처럼 실행
버전3 : 공제액 계산, 과세 대상 소득 계산 및 확인
버전4 : 누진세 계산65
MJU CE C Language Programmingpseudo-code란
프로그래밍 언어의 문법에 맞추지 않고무엇을 하는지를 알기 쉽게 써 놓은 가짜 코드 (C언어 로 쉽게 옮길 수 있도록 적절한 덩어리가 되어야 한다 .)
예:
- 신용 카드 사용액을 입력한다.
- 신용카드 사용액이 1000 이상인가?이상이면: 신용카드공제 초과분의 10%로 아니면: 신용카드공제 0
66
MJU CE C Language Programming테스트의 중요성
한 두 가지 경우만 테스트하고 끝?
요구사항 예:"신용카드 사용액이 1000만원 이상이면…"
1000만원 이상인 경우와 미만인 경우를 모두 테스 트를 해야한다.
67
MJU CE C Language Programming각 단계에서의 실행 결과도 제출
"test.txt"파일에는- 0단계를 제외한 각 단계별로 각각 어떤 테스트 데이 터를 이용하여 결과가 어떻게 나왔는지 작성
68
MJU CE C Language ProgrammingSummary
Syntax:❖
if (expr){ 블록 }❖
if (expr) { 블록 } else { 블록 }
expr 값이 non-zero true 로 간주;zero false
dangling else주의 블록을 항상 쓰면 문제없다.69
MJU CE C Language ProgrammingProject: 누진 전기요금
기본요금(원) 전력량 요금(원/㎾h) 1단계 100㎾h 이
하 사용 370 370 100㎾h
이하 사용 55.10 52.40 2단계 101~200
㎾h 사용 820 670 101~200㎾h 사용 113.80 89.30 3단계 201~300
㎾h 사용 1,430 1,150 201~300㎾h 사용 168.30 132.50 4단계 301~400
㎾h 사용 3,420 2,830 301~400㎾h 사용 248.60 192.50 5단계 401~500
㎾h 사용 6,410 5,360 401~500㎾h 사용 366.40 288.90 6단계 500㎾h 초
과 사용 11,750 9,770 500㎾h
초과 사용 643.90 521.70
부가가치세(10%)와
전력산업기반기금(세전 요금합계x0.037원)
:: switch-case 문
71
MJU CE C Language ProgrammingSwitch ?
공통점?72
MJU CE C Language Programmingif의 한계
Too many if-else's
간단한 syntax의 필요
여럿 중 하나의 선택
switch-case문73
MJU CE C Language Programming예제
채점 결과를 A~J까지로 구분
A는 10점 B는 9점, C는 8점,D는 7.5점, E는 7점 F는 6점 그 이하는 5점if (grade=='A')
score = 10;
else if (grade == 'B')
score = 9;
else if (grade == 'C')
score = 8;
…
…
74
MJU CE C Language ProgrammingSwitch의 syntax
switch (grade){
case 'A': score = 10; break;
case 'B': score = 9; break;
case 'C': score = 8; break;
…
default: score = 5; break;
}
75
MJU CE C Language ProgrammingBreak 가 없으면
X?
switch(X){
case A:
case B:
…
default:
} =A =B =C 기타
아니고...
76
MJU CE C Language Programming이렇게 된다
switch(X){ X?
case A:
case B:
…
default:
}
=A
=B
=C
기타
…
77
MJU CE C Language ProgrammingBreak의 사용
X?
switch(X){
case A:
…
break;
case B:
…
break;
…
default:
}
=A
=B
=C
기타
…
break;
break;
break;
78
MJU CE C Language ProgrammingRemember
각 case의 수행문 끝에 break를 잊지 말자! (일부러 그러한 경우가 아니라면)
Make sure you 'break', unless you don't really want it.79
MJU CE C Language Programming실습 lab12_17 (case.c)
표준 입력에서 문자 하나를 입력한다. 이 문자가 'a', 'e', 'i', 'o', 'u' 중 하나이면 각각 "아", "에", "이", "오", "우"로 출력하 고, 아닌 경우는 "아무것도 아님"을 출력하라. if 를 쓰지 않는다 .
실행 예:$ a.out a아
$ a.out u우$ a.out
x아무것도 아님
80
MJU CE C Language Programming여러 경우가 같은 처리를...
switch(c){
case 'a' : case 'e' : case 'i' : case 'o' :
case 'u' : vowel++; break;
default: others++; break;
}
81
MJU CE C Language Programming모양을 좀 바꾼다면:
switch(c){
case 'a' : case 'e' : case 'i' : case 'o' : case 'u' :
vowel++; break;
default: others++; break;
}
82
MJU CE C Language Programming언제 if, 언제 switch?
if:❖
binary decision❖
정수의 범위에 따른 결정❖
실수 값 범위에 따른 결정
switch-case❖
multi-way decision❖
정수 값에 의한 결정83
MJU CE C Language Programming과도한 사용...
문제: 영문자 대문자의 개수를 세어 출력하는 프로그 램에 대한 모 군의 답안:if (c =='A') capital ++;
if (c =='B') capital ++;
if (c =='C') capital ++;
if (c =='D') capital ++;
if (c =='E') capital ++;
...
if (c =='Z') capital ++;