07 제어구조

Download Report

Transcript 07 제어구조

Part 07 제어 구조
©우균, 창병모
© 우균, 창병모
1
이 장의 내용

제어 흐름

If 문

switch 문

while 문

do-while 문

for 문

중첩 루프, 무한 루프, 기타2
© 우균, 창병모
2
7.1 제어 흐름
© 우균, 창병모
3
제어 흐름(flow of control)

제어 흐름이란 ?



프로그램에서 실행되는 문장들의 실행 순서
특별히 지정하지 않으면, 프로그램의 실행은 첫 번째 문장에서
시작하여 한 번에 한 문장씩 순차적으로 실행된다
제어 구조(control construct)

프로그램에서 실행되는 문장들의 실행 순서를 제어하는 문장
© 우균, 창병모
4
제어 구조(control construct)

C 언어 제어구조


조건문(conditional statement)



조건문, 루프, 분기문, 함수 호출 등은 제어 흐름, 즉 실행 순서를 변경한다.
if 문, if-else 문, switch 문
if 문은 조건에 따라 실행할 문장을 선택한다.
반복문(repetition statement) 혹은 루프(loop)
while 문, for 문, do-while 문
 루프는 특정 문장을 여러 번 반복해서 실행하게 한다.


분기문(branching statement)


goto 문, return 문, break 문, continue 문
함수 호출(function call)
© 우균, 창병모
5
7.2 if 문
© 우균, 창병모
6
if 문

형식
if (조건식)
조건식
참
문장1;
거짓

문장 1
제어 흐름


조건식이 참이면 문장1을 실행하고, 다음 문장으로 진행
조건식이 거짓이면 문장1을 실행하지 않고, 다음 문장으로 진행
© 우균, 창병모
7
if 문 예

if (x > 0)
printf ("x가 양수이다.");

if (a < min)
min = a;

주의!
C 언어에서는 0은 거짓으로 0 이외의 값은 모두 참으로 간주한다.
if (x)
printf("x가 0이 아님“);
© 우균, 창병모
8
if-else 문

if-else 문은 조건에 따라 실행할 문장을 선택할 수 있다.

구문 형식
if (조건식)
문장1;
else
문장2;

조건식
참
거짓
문장 2
문장 1
제어 흐름

조건식이 참이면 문장1을 실행하고, 거짓이면 문장 2 실행
© 우균, 창병모
9
if-else 문 예

a, b 값 중 작은 값을 min에 대입하는 문장
if (a < b)
min = a;
else
min = b;
© 우균, 창병모
10
복합문(compound statement)

중괄호로 둘러싸인 문장들의 집합

필요하면 변수 혹은 상수들을 먼저 선언할 수 있다.

구문 형식
{
선언들;
문장 1;
문장 2;
...
문장 n;
}

주의!

복합문도 하나의 문장처럼 사용될 수 있다
© 우균, 창병모
11
minmax.c
실행결과:
입력 1: 20
입력 2: 35
작은 값: 20
큰 값: 35
© 우균, 창병모
12
중첩된 if(nested if)

if 문 내에 또 다른 if 문을 포함할 수 있다.


이미 결정한 사항에 기초하여 또 다른 결정을 할 수 있다.
예
if (num1 < num2)
if (num1 < num3)
min = num1;
else
min = num3;
© 우균, 창병모
13
min.c
실행결과:
입력 1: 20
입력 2: 35
작은 값: 20
큰 값: 35
© 우균, 창병모
14
중첩된 if 문

중첩된 if 문에서, else 절은 짝이 없는 가장 가까운 if와 짝이 된다.
if (num1 < num2)
if (num1 < num3)
min = num1;
else
min = num3;

vs
if (num1 < num2)
{
if (num1 < num3)
min = num1;
}
else min = num3;
© 우균, 창병모
15
중첩된 if 문을 이용한 다중선택

형식
if (조건식1)
문장1;
else if (조건식2)
문장2;
...
else if (조건식n)
문장n;
조건식1
거짓
조건식2
거짓
조건식n
거짓
© 우균, 창병모
참
문장 1
참
문장 2
참
문장 n
16
grade.c
실행결과:
점수 입력: 85
점수: 85
© 우균, 창병모
학점: B
17
7.3 switch 문
© 우균, 창병모
18
switch 문

switch 문


정수 수식 값에 따라 여러 경로 중에서 한 경로를 선택할 수 있다.
switch 문의 구문 형식
switch ( 수식 ) {
case 상수1: 문장들1
case 상수2: 문장들2
...
case 상수n: 문장들n
default : 문장들n+1
}
© 우균, 창병모
19
switch 문

switch 문의 실행 흐름
수식
(1) 수식의 값을 계산한다.
(2) 수식의 값을 각 case의 상수 값과
비교한다.
(3) 일치된 case 값이 있으면 그 case
절의 문장들을 실행한다.
(3.1) 그 case 절의 마지막 문장이
break이면 switch 문을 빠져 나온다.
값==상수1
문장들1
거짓
값==상수2
참
문장들2
거짓
...
거짓
(3.2) 그렇지 않은 경우에는 다음
case 절의 문장들을 실행한다.
값==상수n
(4) 일치된 case 값이 없으면 default
절의 문장들을 실행한다.
문장들n+1
© 우균, 창병모
참
참
문장들n
거짓
20
switch 문 이용한 학점 수 계산
switch (grade) {
case 'A':
ACount = ACount + 1;
break;
case 'B':
BCount = BCount +1;
break;
case 'C':
CCount = CCount + 1;
break;
case 'D':
DCount = DCount + 1;
break;
case 'F':
FCount = FCount + 1;
break;
default:
printf ("오류: %c 학점은 없습니다.", grade);
}© 우균, 창병모
21
switch 문 이용한 학점 수 계산

char 형 변수 grade에 따라 해당 학점의 수 증가하는 코드

ACount부터 FCount는 int 변수

보통 switch 문을 벗어나기 위해 각 case 절의 마지막에
break 문을 사용한다.
© 우균, 창병모
22
실행결과:
점수 입력 (0 ~ 100): 86
점수: 86
학점: B
© 우균, 창병모
23
7.4 while 문
© 우균, 창병모
24
while 문

while 문


조건이 거짓이 될 때까지 동일한 문장을 반복해서 실행한다.
구문 형식
조건식
while (조건식)
문장1;
거짓
참
문장

제어 흐름


조건식을 계산하고, 그 값이 참(0이 아닌 값)인 동안 문장 1를
반복해서 실행한다.
조건이 거짓이 되면 while 문을 종료하고 다음 문장을 실행한다.
© 우균, 창병모
25
odd.c
실행결과:
1부터 100까지 홀수의 합은 2500 입니다.
© 우균, 창병모
26
Average1.c
© 우균, 창병모
실행결과:
점수 입력 (0은 끝):
85
90
75
99
64
0
총점: 413
평균: 82.60 27
7.5 do-while 문
© 우균, 창병모
28
do-while 문

do-while 문



루프 본체를 먼저 실행하고 조
건을 검사하고 그 값이 참인 동
안 반복한다
루프 본체를 적어도 한 번 실행
구문 형식
do {
문장1;
...
문장n;
} while (조건식);
© 우균, 창병모
문장1
...
문장n
조건식
거짓
참
29
max.c
© 우균, 창병모
실행결과:
점수 입력 (0은 끝):
수를 입력하세요
85
170
88
192
0
30
가장 큰 수는 192 입니다.
7.6 for 문
© 우균, 창병모
31
for 문

for 문


보통 정해진 회수만큼 반복할 때 사용된다.
구문 형식
for ( 수식1 ; 수식2 ; 수식3 )
문장1;

제어 흐름
수식1: 초기화를 위한 수식
루프를 시작하기 전에 한번 계산
 수식2: 부울 조건식
문장1 실행 전에 계산
값이 참(0이 아닌 값)이면 문장1 실행
거짓(값이 0)이면 루프를 벗어남
 수식3: 수식2의 변수 증가/감소 위한 식
문장1 실행 후에 계산
수식1
수식2
거짓
참

© 우균, 창병모
문장1
수식3
32
for 문 예

for 루프를 사용해서 1부터 100까지의 자연수의 합 계산
for (count = 1; count <= 100; count++)
total = total + count;
for (count = 100; count > 0; count--)
total = total + count;
© 우균, 창병모
33
for 문과 while 문
for ( 수식1 ; 수식2 ; 수식3 )
문장1;

vs
수식1 ;
while ( 수식2 ) {
문장1;
수식3 ;
}
© 우균, 창병모
34
three.c
실행결과:
3의 배수를 몇 개 프린트할까요? 10
3 6 9 12 15 18 21 24 27
© 우균, 창병모
30
35
tempTable.c
© 우균, 창병모
실행결과:
0.00 도 F = -17.78 도 C
10.00 도 F = -12.22 도 C
20.00 도 F = -6.67 도 C
30.00 도 F = -1.11 도 C
40.00 도 F =
4.44 도 C
50.00 도 F = 10.00 도 C
60.00 도 F = 15.56 도 C
70.00 도 F = 21.11 도 C
80.00 도 F = 26.67 도 C
90.00 도 F = 32.22 도 C
36
100.00 도 F = 37.78
도 C
Average2.c
© 우균, 창병모
37
7.7 중첩루프, 무한루프, 기타
© 우균, 창병모
38
중첩 루프(nested loop)

루프의 본체 내에 다른 루프를 포함할 수 있다.

예를 들어





while 루프 내에 다시 while 루프가 포함될 수 있다.
for 루프 내에 다시 for 루프가 포함될 수 있다.
while 루프 내에 for 루프가 포함될 수 있다.
…
바깥 루프의 각 반복에 대해서 안쪽 루프가 완전히 실행
되므로 이차원의 반복적인 일을 수행할 수 있다.
© 우균, 창병모
39
multiply.c
© 우균, 창병모
40
실행결과
실행결과:
1 단
1 X 1 = 1
1 X 2 = 2
1 X 3 = 3
1 X 4 = 4
1 X 5 = 5
1 X 6 = 6
1 X 7 = 7
1 X 8 = 8
1 X 9 = 9
2 단
2 X 1
2 X 2
2 X 3
2 X 4
2 X 5
2 X 6
2 X 7
2 X 8
© 우균,
2 창병모
X 9
=
=
=
=
=
=
=
=
=
2
4
6
8
10
12
14
16
18
실행결과:
...
9
9
9
9
9
9
9
9
9
9
단
X 1
X 2
X 3
X 4
X 5
X 6
X 7
X 8
X 9
=
=
=
=
=
=
=
=
=
9
18
27
36
45
54
63
72
81
41
무한 루프(infinite loop)

루프의 조건이 항상 참이면 루프는 무한히 반복된다.

예
while (1) // 경고: 무한 루프이다!
printf (“무한 루프”);
int count = 1;
while (count != 100)
count += 2;
int count = 1;
while (count <= 100) { //경고: 이것이 무한 루프이다!
printf(“%d\n", count);
count--;
}
© 우균, 창병모
42
무한 루프(infinite loop)
for (i = 0; ;i++)
printf("루프 반복: %d\n", i);

프로그래머는 무한 루프를 피하기 위해서 프로그램을 주
의 깊게 설계해야 한다 !
© 우균, 창병모
43
break 문

루프 내에서 break 문

루프의 실행이 중단되고 루프 다음에 위치한 문장이 실행된다.
while (1) {
scanf("%d",&j)
if (j == 0)
break;
result = i/j;
}
© 우균, 창병모
44
continue 문

루프 내에서 continue 문


루프 조건을 다시 계산하고,
그 조건이 참이면 루프 본체를 다시 실행한다.
for (i = 0, sum = 0; i <= n; i++) {
if (i % 2 == 0)
continue;
sum += i;
}
© 우균, 창병모
45
Key Point
© 우균, 창병모
46
Key Point 1

if 문은 조건에 따라 실행할 문장을 선택한다.

루프는 특정 문장을 여러 번 반복해서 실행하게 한다.

C 언어에서 조건문, 루프, 분기문, 함수 호출 등은 제어
흐름, 즉 실행 순서를 변경한다.

if-else 문은 조건에 따라 실행할 문장을 선택할 수 있다.

중첩된 if 문에서, else 절은 짝이 없는 가장 가까운 if와 짝
이 된다.
© 우균, 창병모
47
Key Point 2

switch 문은 한 개의 정수 값에 따라서 여러 개의 경로 중
에서 한 경로를 선택할 수 있다.

보통 switch 문을 벗어나기 위해 각 case 절의 마지막에
break 문을 사용한다.

while 문은 그 조건이 거짓이 될 때까지 동일한 문장을 반
복해서 실행한다.

for 문은 보통 루프가 정해진 회수만큼 실행될 때 사용된
다.

do-while 문은 루프 본체를 적어도 한 번 실행한다.

프로그래머는 무한 루프를 피하기 위해서 프로그램을 주
의 깊게 설계해야 한다.
© 우균, 창병모
48
프로그래밍 실습
© 우균, 창병모
49
▶ 프로그래밍 실습

1. 프로그램 7.6은 (0보다 작거나 100보다 큰) 잘못된 점
수가 입력되어도 전혀 오류 메시지를 내지 못한다.


이 프로그램을 0부터 100까지의 유효한 점수만을 입력 받을 수
있도록 확장해보자.
잘못된 점수가 입력되면 유효한 점수가 입력될 때까지 반복해서
다시 입력받도록 한다.
© 우균, 창병모
50
▶ 프로그래밍 실습

2. 실습 1의 프로그램을 확장하여




입력된 각 점수에 대해서 학점을 결정하여 출력하고
모든 점수의 합과 평균도 출력하도록 확장하라.
프로그램 7.4를 참조하여 입력 점수에 대해서 학점을 결정한다.
3. 실습 2의 프로그램을 확장하여


학점, 점수의 합, 평균뿐만 아니라 각 학점의 수를 계산하는 프로
그램을 작성하라.
switch 문을 이용하여 해당 학점을 결정하고 해당 학점의 수를 증
가시키도록 한다.
© 우균, 창병모
51