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