Transcript c4_revised

Slide 1

4장 제어문



선택문: if 문, if – else 문, switch 문



반복문: while 문, for 문, do – while 문





연산자: 관계 연산자와 논리 연산자, 증감연산자,
복합치환연산자, 컴마연산자
분기문: break, continue, goto

1


Slide 2

문장과 실행 순서
 문장(statement)






단문(simple statement)
수식 ;
(예) a = b + c;
printf("Hello");
제어문(control statement): 프로그램의 실행 순서를 제어함
 선택문: if, if – else, switch
 반복문: for, while, do – while
 분기문: goto, break, continue
복합문(compound statement)
{
… 여러 개의 문장들로 이루어진 복합문은
문장;
문법적으로는 한 문장으로 취급.

문장;
}

 문장의 실행 순서



기본적으로 순차적으로 수행
제어문을 사용하면 선택 실행 또는 반복 실행 가능
C 언어 프로그래밍

2


Slide 3

if 문
 if 문
if (조건식)
문장

… 조건식이 참일 때만
문장 실행

if (score < 60)
printf("You have failed.\n");

 (예 4.1) 두 변수 중 큰 값 구하기
max = a;
if ( b > a )
max = b;

… a를 최대값 max라고 가정
… b가 a보다 크면

b가 max가 된다.

C 언어 프로그래밍

3


Slide 4

if 문 (2)
 복합문을 사용한 if 문
if (조건식) {
문장
문장

}

… 조건식이 참일 때에 수행하는 문장이
여러 개 이면 복합문 사용

 예: 두 변수 a, b를 비교하여 큰 값을 a에 작은 값을 b에 넣기
if (a < b) {
tmp = a;
a = b;
b = tmp;
}

… a가 b보다 작으면
a와 b를 서로 교환함

a

2

1

b
3

tmp

C 언어 프로그래밍

4


Slide 5

관계 연산자
 조건식과 연산자



조건식은 대개 값들의 비교로 이루어짐
값의 비교에 관계 연산자와 논리 연산자가 주로 사용됨

 관계 연산자



동등 연산자: ==, !=

C 언어 프로그래밍

5


Slide 6

C언어에서의 참, 거짓
 C언어에서의 참, 거짓



nonzero 수식
zero 수식

 참 (True)
 거짓 (False)

 관계 연산 수식의 값



참이면 1
거짓이면 0

printf("%d %d \n", 100 > 50, 100 < 50);

… [출력] 1 0

 조건식으로 임의의 수식을 사용할 수 있음
1. if ( a )
printf("non zero\n");
2. if (a = 5)
printf("a is five\n");

… a가 0이 아니면(참 이면)
출력
… 수식 a=5의 값은 5이므로 항상 참
(잘못된 예: =는 ==으로 고쳐야 함)

C 언어 프로그래밍

6


Slide 7

논리 연산자
 논리 연산자

 연산자 우선 순위
1. 괄호
2. 단항연산자
3. 곱셈, 나눗셈
4. 덧셈, 뺄셈
5. 관계연산자
6. 동등연산자
7. 논리곱
8. 논리합
9. 치환연산자

> >= < <=
== !=
&&
||

C 언어 프로그래밍

7


Slide 8

예제
 예제





a가 0이상, 100미만이다.
a가 0미만이거나 100이상이다.
x, y, z 중에서 x가 가장 작은 수이다.
a와 b의 합이 c와 d의 차보다 작다.

a>=0 && a<100
a<0 || a>=100
x <= y && x <= z
a + b < c – d

if (a >= 0 && a < 100)
printf("a is between 0 and 100\n");

 (예 4.5) 문자 c가 영문자가 아니면 에러메시지 출력
if ( ! ( c >= 'A' && c <= 'Z' | | c >= 'a' && c <= 'z' ) )
드모르간 법칙
!(p && q)  !p || !q
printf("c is not alphabet\n");
!(p || q)  !p && !q
또는
if ( ! ( c >= 'A' && c <= 'Z' ) && ! (c >= 'a' && c <= 'z' ) )
printf("c is not alphabet\n");

C 언어 프로그래밍

8


Slide 9

논리연산자의 단축 평가 *
 논리 연산의 단축평가


나머지 수식의 결과에 관계없이 연산 결과를 알 수 있을 때에
나머지 수식의 평가를 하지 않는다.

수식1 && 수식2

수식1 | | 수식2

 수식1 이 거짓이면 연산결과가 거짓
(수식2를 평가하지 않음)
 수식1이 참이면 연산결과가 참
(수식2를 평가하지 않음)

if ( a != 0 && b / a > 10 )


a가 0이 아닐 때에만 계산함

C 언어 프로그래밍

9


Slide 10

if – else 문
 if – else 문
if (조건식)
문장1
else
문장2

… 참일 때 수행
… 거짓일 때 수행

 (예 4.9) y를 x로 나눈 몫을 출력
if (x == 0)
printf("0으로 나눌 수 없습니다.\n");
else
printf("몫 = %d\n", y / x );

C 언어 프로그래밍

10


Slide 11

조건 연산자
 조건 연산자: ? :
조건식 ? 수식1 : 수식2



3항 연산자: 피연산자가 3개
조건식: 참
 수식값 = 수식1
조건식: 거짓  수식값 = 수식2

 예: 두 수의 a, b의 최대값을 max에 저장
1. max = (a > b) ? a : b;
2. (a>b) ? (max=a) : (max=b);

… 뒤의 두 괄호는 반드시 필요함

3. if ( a > b )
max = a;
else
max = b;

C 언어 프로그래밍

11


Slide 12

예제
 (연습 4.4-1) 연도를 입력 받아서 평년과 윤년을 판단하는 프로그램
윤년: (1) 4로 나누어지고 100으로 나누어지지 않는 연도
(2) 400으로 나누어지는 연도



flag 변수 사용: 이 프로그램은 조건식의 결과를 변수 isleap에 저장하고
if문의 조건식에 저장된 변수값을 사용함
C 언어 프로그래밍

12


Slide 13

중첩된 if문
 중첩된 if 문


if와 else의 목표문으로 if 또는 if – else 문을 사용한 것

 (예 4.11) 변수 a, b의 부호에 따라서 다음 표와 같이 출력

C 언어 프로그래밍

13


Slide 14

중첩된 if문 – 다단계 if문
 다단계 if문
if (조건식1)
문장1
else if (조건식2)
문장2

else if (조건식n)
문장n
else
문장n+1

C 언어 프로그래밍

14


Slide 15

예제
 (예 4.12) 점수에 따른 등급 부여
A: 90점이상, B: 80점대, C: 70점대, D: 60점대, F: 60점미만
int score;
/* 점수 */
char grade;
/* 등급 */
...
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';


위에서 80점대를 다음과 같이 작성하지 않도록 주의
else if (score >= 80 && score < 90) grade = 'B'

score < 90 의미가 포함됨
C 언어 프로그래밍

15


Slide 16

switch 문
 switch문

label

switch (정수식)
{
case 값1 : 문장1; …
break;
case 값2 : 문장2; …
break;

case 값n : 문장n; …
break;
default : 문장n+1; …
}



정수식?
=값1
문장들1

=값2
문장들2

=값n
문장들n

기타
문장들
n+1

break: switch문 종료
break가 없으면 다음 문장 실행

정수식 값에 해당하는 case의 문장부터 실행
해당하는 case가 없으면 default의 문장부터 실행
C 언어 프로그래밍

16


Slide 17

예제
 (예 4.14) 점수에 따른 등급 부여
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';
}

… 성적의 10자리를 얻는다.
… break가 없으므로 다음 문장을 실행

C 언어 프로그래밍

17


Slide 18

예제
 (예 4.43) 다음과 같이 소득에 따른 세금 계산
소득 (만원)
0 ~ 100
100 ~ 200
200 ~ 400
400 ~


기본 세금 초과분에 대한 세율(%)
0.00
10
10.00
14
24.00
20
64.00
30

세금 계산식
소득(income)
0 ~ 100
100 ~ 200
200 ~ 400
400 ~

세금(tax)
tax = income * 0.1
tax = 100*0.1 + (income-100)*0.14
tax = 100*0.1 + 100*0.14 + (income-200)*0.2
tax = 100*0.1 + 100*0.14 + 200*0.2 +
(income-400)*0.3

C 언어 프로그래밍

18


Slide 19

예제

C 언어 프로그래밍

19


Slide 20

while문
 while문
while (조건식)
문장

… 조건식이 참인 동안
문장 반복 실행

while (조건식) {
문장
문장

}

 (예 4.18) 음수 또는 0이 입력될 때까지의 입력된 정수의 합을 계산

... sum : 누계

C 언어 프로그래밍

20


Slide 21

반복제어 변수
 (예 4.19) 1부터 10까지의 정수의 합 계산
sum = 1 + 2 + 3 + … + 10;
sum = 0;
sum = sum + 1;
sum = sum + 2;

sum = sum + 10;
sum = 0;
i = 1;
while ( i <= 10 ) {
sum = sum + i;
i = i + 1;
}

i=1~10 에 대해서 다음 문장 반복수행
sum = sum + i

변수 i가 반복제어변수

… 합의 초기값은 0
…초기화
…검사
 반복제어변수:
- 반복할 때마다 값이 변화
…갱신
- 변수 값에 따라서
반복수행 여부결정

C 언어 프로그래밍

21


Slide 22

예제
 (예 4.21) 실수 r의 n제곱을 계산 (n은 정수)



곱의 초기값 = 1 (곱셈 항등원)
반복제어: n을 초기값에서 시작하여 반복할 때마다 1씩 감소시켜서
n이 0이 될 때까지 반복하면 n의 초기값 횟수만큼 반복 수행

n번 반복하면 rn이 계산됨

C 언어 프로그래밍

22


Slide 23

for문
 for문
… 수식2가 참인
동안 반복

for (수식1; 수식2; 수식3)
문장


반복제어변수를 사용하는 경우에 적합
수식1: 초기화
수식2: 조건식
수식3: 갱신

 예: N번 반복 실행
1. for (i = 1; i <=N; i = i+1 )
문장
2. for (i = 0; i < N; i = i+1 )
문장

… 1부터 N까지
… 0부터 N-1까지

C 언어 프로그래밍

23


Slide 24

예제
 (예 4.22) 1부터 10까지의 정수의 합 계산

 (예 4.24-1) 수열 an = 2an-1 – 1 (a1=3)의 a10 구하기

 (예 4.24-2) Fibonacci수열 Fn = Fn-2 + Fn-1 (F1=0, F2=1)의 F20
구하기

1

a: Fn-2, b: Fn-1, c: Fn

2

3
a + b = c

4



a + b = c
C 언어 프로그래밍

24


Slide 25

무한 루프와 공문
 무한루프


반복조건이 항상 참인 반복문

for ( ; ; )
문장

… 수식2가 생략되면 참(true)으로 간주함

while (1)
문장

… 조건식 1은 참(true)이다



무한 루프인 반복문은 내부에서 반복문을 종료할 수 있어야 함.
 break

 공문(null statement): ; 만으로 이루어진 아무 동작도 하지 않는 문장
while (조건식) ;

while(조건식)
;

C 언어 프로그래밍

 무한 루프 발생 가능

25


Slide 26

반복문 설계
 반복 자료 입력을 종료 시키는 방법




입력 자료 수를 먼저 입력하여 이 횟수 만큼 반복 입력
정상적으로 사용되지 않는 자료(보초)를 마지막에 입력
입력 함수의 파일 끝(EOF) 반환 기능 이용 (Ctrl-Z 또는 Ctrl-D 입력)

 (예 4.26) EOF를 만날 때 까지 정수를 입력하여 평균 계산

C 언어 프로그래밍

26


Slide 27

예제
 네제곱표 만들기





출력
1 1
3 81
5 625
7 2401
9 6561
for (a=1; a<=13; a = a+2)
11 14641
printf("%d %d \n",a, a*a*a*a);13 28561

#include
main()
{
int a;








}
문제점: 각 열이 나란하게 출력되지 않음
 해결책: 출력의 각 필드 폭을 일정하게 함

C 언어 프로그래밍

27


Slide 28

잘못된 입력 처리하기 *
 scanf() 함수의 반환값


scanf() 함수는 성공적으로 입력된 변수의 개수를 반환함.

 정수가 아닌 입력에 대해서 반복 종료


(예 4.26)의 반복문 에서 EOF를 1로 바꾸면 파일 끝뿐만 아니라
정수가 아닌 입력에 대해서도 반복을 종료함

 정수가 아닌 입력을 무시하고 계속 입력*


scanf("%*s") 를 사용하면 잘못된 입력을 무시하고 다음 자료 입력

C 언어 프로그래밍

28


Slide 29

형식지정출력 - 예제
 (예 4.27) 네제곱표 만들기
출력
1 1
3 81
5 625
7 2401
9 6561
11 14641
13 28561


문제점: 각 열이 나란하게 출력되지 않음
 해결책: 출력의 각 필드 폭을 일정하게 함

C 언어 프로그래밍

29


Slide 30

형식지정 출력
 필드 폭과 정렬:

 printf 함수의 형식지정자

C 언어 프로그래밍

30


Slide 31

예제
출력

 네제곱표
printf("%2d %6d\n",a, a*a*a*a);

 연월일을 2003/04/05 형식으로 출력
yr = 2003; mo = 4; day = 5;
printf("%4d/%02d/%02d\n", yr, mo, day);

1
3
5
7
9
11
13

1
81
625
2401
6561
14641
28561

 화씨,섭씨온도 환산표 (0도부터 100도까지 5도간격)
printf("%4s %6s\n", "화씨", "섭씨");
for (f = 0; f <= 100; f = f + 5) {
c = (f - 32.0) * 5.0 / 9.0;
printf("%4d %6.1f\n", f, c);
}

C 언어 프로그래밍

… 환산표 헤더

31


Slide 32

증감 연산자
 증감 연산자



증가연산자:
감소연산자:

i++
i--

 i = i+1
 i = i-1

 증감 연산 수식의 값
사전증감: ++i, --i 는 먼저 증감  증감이후의 값을 사용

사후증감: i++, i-- 는 나중에 증감  증감이전의 값을 사용
(예)
i = 5;
a = ++i;
i++; a = i;
결과: i=6, a=6


i = 5;
a = i++;
결과: i=6, a=5

a = i; i++;

C 언어 프로그래밍

32


Slide 33

복합 치환 연산자
 복합 치환 연산자
var op= 수식


 var = var op 수식

op: 산술연산자(+ – * / %), 비트연산자(11장)

 (예 4.30)
치환연산자 사용
a=a+2
count = count – 1
sum = sum + j
d = d / 12
n = n * (k+1)

복합치환연산자 사용
a += 2
count –= 1
sum += j
d /= 12
n *= k+1
… 괄호 불필요

C 언어 프로그래밍

33


Slide 34

예제
 (예 4.31) 다음과 같은 수열의 20항까지 출력, 20항까지의 합 출력


1 2 4 7 11 16 …
증가량이 1, 2, 3, …과 같이 1씩 증가함

C 언어 프로그래밍

34


Slide 35

실습 문제
 while 반복문을 사용하여 십진수를 입력하면 그것을 ASCII 값으로
하는 문자를 출력하는 프로그램을 작성하라. (단, 끝날때는 999를
입력한다고 하자.)

 자료의 개수를 입력하고, 그 개수 만큼의 자료를 입력하면 합과
평균을 구하는 프로그램을 작성하라.

C 언어 프로그래밍

35


Slide 36

do – while문
 do-while문
do
문장
while (조건식);

… 조건에 관계없이 문장이
적어도 한번은 실행됨

do {
문장;
문장;

} while (조건식);

… 세미콜론(;)으로 끝남에 주의

 (예 4.32) 정상적인 메뉴 입력이 들어올 때까지 반복 입력

C 언어 프로그래밍

36


Slide 37

중첩된 반복문
 (예 4.33) 다음과 같은 구구단 표 출력
2*1= 2 2*2= 4 2*3= 6 ... 2*6=12 2*7=14 2*8=16 2*9=18
3*1= 3 3*2= 6 3*3= 9 ... 3*6=18 3*7=21 3*8=24 3*9=27
...



안쪽 반복문의 반복 횟수가 고정됨

 중첩된 반복문



반복문 안에 반복문이 포함된 것
바깥 반복문과 안쪽 반복문은 가능한 한 같은 반복제어변수를
사용하지 않아야 함.

C 언어 프로그래밍

37


Slide 38

예제
 (예 4.34) 오른쪽과 같이 10줄을 출력




*
**
***
****
*****

i번째 줄은 i개의 *를 출력함
안쪽 반복문의 반복 횟수가 바깥 반복문의 반복제어 변수에 의해서
정해짐.

C 언어 프로그래밍

38


Slide 39

연습 문제
 1. 다음과 같이 10줄을 출력하는 프로그램을 작성하시오.
*
**
***
****
*****
 2. 반복문을 사용하여 15+25+…+105 을 계산하는 프로그램을
작성하시오. 단 5제곱을 계산할때도 반복문을 사용하시오.

C 언어 프로그래밍

39


Slide 40

break문
 break문


switch 또는 반복문(while, for, do-while)의 실행을 종료함.

while (조건식1) {
문장; …
if (조건식2) break;
문장; …
}

… 무한루프에서는 반드시 사용

C 언어 프로그래밍

40


Slide 41

예제
 (예 4.35) 양수가 입력되는 동안 입력의 합 계산
sum = 0;
scanf("%d", &number);
while (number > 0) {
sum = sum + number;
scanf("%d", &number);
}
/* 예 4.18 */
break를 사용
sum = 0;
while (1) { /* 무한 루프 */
scanf("%d", &number);
if (number <= 0) break;
sum = sum + number;
}
C 언어 프로그래밍

41


Slide 42

continue문
 continue문


반복문에서 반복 문장의 현재 단계의 수행을 종료하고 다음 반복 시도

while (조건식1) {
문장; …
if (조건식2) continue;
문장; …
}

for (수식1; 조건식1; 수식3) {
문장; …
if (조건식2) continue;
문장; …
}

… for문의 continue는 while문과
동작에 차이가 있다.

C 언어 프로그래밍

42


Slide 43

goto문
 분기문



실행순서를 원하는 곳으로 이동
(예) break, continue, goto

 goto문
goto label;

label: 문장



바깥 반복문

안쪽 반복문

사용을 권장하지 않음
중첩된 반복문에서 안쪽 반복문에서
한번에 바깥 반복문을 빠져 나올 때 유용

goto end;
break

end: 문장

C 언어 프로그래밍

43


Slide 44

내장 치환
 내장 치환(embedded assignment)




치환연산자가 보통 수식에 포함되어 사용되는 것
z = (x=6) + 7;
(a = b+c ) != 5;
조건식에 내장 치환을 사용하면 프로그램이 간결해질 수 있음

 (예 4.39) 한 줄의 문자를 입력하여 소문자를 대문자로 변환
c = getchar();
while (c != '\n') {
if (c >= 'a' && c <= 'z') /* 소문자이면 */
c = c - 'a' + 'A'; /* 대문자로 변환 */
putchar(c);
/* 문자 출력 */
c = getchar(); /* 다시 문자 입력 */
}
/* 예 4.17 */

C 언어 프로그래밍

while ( (c = getchar() ) != '\n') {
if (c >= 'a' && c <= 'z')
c = c - 'a' + 'A';
putchar(c);
}
조건식에 내장 치환 사용

44


Slide 45

컴마 연산자
 컴마(comma) 연산자 ,



여러 개의 수식을 묶어서 하나의 수식으로 만드는 역할
{ }를 사용하여 여러 개의 문장을 하나로 묶는 복합문의 역할과 유사
i = 0, j = 0



… 하나의 수식

수식의 값: 컴마 연산자로 결합된 마지막 수식의 값

a = 10, b = a + 20




... 수식의 값 = b의 값 = 30

수식 위치에 여러 개의 수식을 넣어야 하는 경우에 유용함
(예) for문의 수식, 반복문의 조건식 등.
가장 우선 순위가 낮은 연산자

 (예 4.40) 두 개의 반복제어변수를 사용하는 반복문
for (i=0, j=0; i+j <= 50; i++, j += 2)
printf(" (%d, %d)\n", i, j);

C 언어 프로그래밍

45


Slide 46

예제
 0 또는 음수가 입력될 때까지의 입력된 정수의 합을 계산
sum = 0;
scanf("%d", &number);
while (number > 0) {
sum = sum + number;
scanf("%d", &number);
}
/* 예 4.18 */

(예 4.41 참고)

마지막에 있는 조건식의 결과가
컴마 수식의 수식의 값

sum = 0;
while (scanf("%d", &number), number > 0)
sum = sum + number;

C 언어 프로그래밍

46


Slide 47

실습 문제 (선택문)
 2차 방정식
의 세 계수 a, b, c를 입력
받아서 근을 구하는 프로그램 작성



단,

C 언어 프로그래밍

47


Slide 48

실습 문제 (반복문)
 무리수 e는 다음의 무한 급수로 표현된다.





소수점이하 14자리까지 정확하도록 무리수 e를 구하는 프로그램
작성하시오.
프로그램의 결과를 수학함수를 사용한 결과 exp(1.0)과 비교하시오.

C 언어 프로그래밍

48