고급 선택 제어문과 반복문 Chapter 9 C에서의 다중 선택 제어문 선 검사 반복 구조와 for 문 후 검사 반복 구조와 do-while 문 카운터 제어 루프, sentinel 제어 루프, 중첩 루프 4장의 강의 자료 참고할 것!!
복합 서술문(complex predicates) 필요한 경우 : 간단한 논리식이 아닌 중첩된 if 문이 필요 사례 1: 변수 semester_average의 값이 80~89 사이에 있는지 검사 사례 2: 재학생(student_status의 값이 ‘u’)이고 성적 우수자(grade_point_average의 값이 3.5 이상)인 학생 사례 3: 재학생이거나 성적 우수자인 학생 논리식 : 식이 계산 결과가 참(0이외의 값)이나 거짓(0)을 갖는 식 논리 연산자 : && (AND), || (OR), ! (NOT) 사례 1: (semester_average >= 80) && (semester_average >= 89) 사례 2: (student_status==‘u’)&&(grade_point_average>=3.5) 사례 3: (student_status==‘u’)||(grade_point_average>=3.5) 논리 연산자의 우선순위 NOT 연산자, 단항 산술 연산자 이항 산술 연산자 관계 연산자 AND 연산자 OR 연산자 예제 9.6 : x + y >= && ! (x – y) || x * y – 16 == 4
논리식과 평가 결과의 예 int var1 = 15, var2 = 5, is_done = 1; double var3 = 3.5; char var4 = 'c'; (var1 <= 10) && (var2 == 5) 0 (var1 <= 10) || (var2 == 5) 1 ! var1 || ! (! var2) 1 ! var1 || var2 1 var1 && var2 && var3 1 var1 && (var2 - 5) && var3 0 (var3 == 3.5) || (var4 == 'c') 1 ! is _done 0 is_done || (var4 != 'c') 1 ! var3 && var2 0 !(var3 || var2) 0
if 문을 이용한 다중 선택 제어 예제 9.8 90점 이상은 A, 80점 이상은 B, 70점 이상은 C, 60점 이상은 D, 나머지 점수는 F 학점을 주는 다섯 개의 단일 if 문 if (semester_average >= 90) letter_grade = 'A'; /* end if */ if (semester_average < 90 && semester_average >= 80) letter_grade = 'B'; /* end if */ if (semester_average < 80 && semester_average >= 70) letter_grade = 'C'; if (semester_average < 70 && semester_average >= 60) letter_grade = 'D'; if (semester_average < 60 ) letter_grade = 'F';
switch-break 다중 선택 제어 switch 문의 문법 CaseClause DefaultCluase switch (ControllingExpression) { CaseClause-1 CaseClause-2 . CaseClause-n DefaultClause } /* end switch */ CaseClause case Constant-1; case Constant-2; case Constant-m; statement DefaultCluase default : Statement
switch를 이용한 다중 선택의 예 예제 9.11 : 예제 9.8의 semester_average를 switch 문의 조건식에서 바로 사용하지 않고 semester_average/10을 이용 9 이상이면 A, 8이상이면 B, 7 이상이면 C, 6 이상이면 D, 나머지는 F 학점을 각각 부여 switch (semester_average / 10) { case 10 : case 9 : letter_grade = 'A'; break; case 8 : letter_grade = 'B'; case 7 : letter_grade = 'C'; case 6 : letter_grade = 'D'; default : letter_grade = 'F'; } /* end switch */
선 검사 반복 구조 for 문의 문법 for (InitializationExpression; LoopControlExpression; UpdateExpression) LoopBody /* end for */ for 문의 의미 구조
for 문을 이용한 카운터 제어 루프 예제 9.13 int number, sum, counter; ············ for (counter = 1; counter <= number; counter = counter + 1) sum = sum + counter; /* end for */ 예제 9.14 sum = 0; for (counter = number; counter >= 1; counter = counter - 1) 예제 9.15 for (counter = 1; counter <= number; counter = counter + 2)
for 문과 while 문의 동질성 for 문 for (InitializationExpression; LoopControlExpression; UpdateExpression) LoopBody /* end for */ 이와 동등한 while 문 InitializationExpression while (LoopControlExpression) UpdateExpression; /* end while */ 예제 9.16 : Factorial 구하기 counter = 1; factorial = 1; while (counter <= number) { factorial = factorial * counter; counter = counter + 1; } /* end while */ for (counter = 1; counter <= number; counter = counter + 1) { } /* end for */
카운터 제어 루프와 sentinel 제어 루프 비교 카운터 제어 루프 (이제까지의 for 문에 해당) 1. 루프 제어 변수 선언 2. 루프 제어 변수에 초기값 할당 3. 루프 제어 변수가 마지막 값인지 루프 제어식 안에서 비교 4. 루프 제어 변수를 증감시킴 Sentinel 제어 루프 1. Sentinel 변수 선언하고 루프를 종료 시킬 값을 결정 2. Sentinel 변수에 값을 할당하기 위해 초기식 사용 3. Sentinel 변수를 사용하는 루프 제어식 작성 4. 루프가 종료되도록 Sentinel 변수를 변경시키는 증감식 포함
for 문을 이용한 sentinel 제어 루프 예제 9.17 : 문자 y나 n의 대문자나 소문자만이 answer의 값으로 합당하고 다른 문자에 대해서는 올바른 값을 입력하도록 하는 프로그램 char answer; printf("Do you want to continue? (y/n): "); for (scanf("%c", &answer); answer != 'y' && answer != 'Y' && answer != 'n' && answer != 'N'; scanf("%c", &answer)) printf("Please type y or n: ")"; /*end for */ 예제 9.18 : 잔고(balance)와 거래액(transaction) 입금, 거래액으로 0.0을 입력하면 계산 종료 #include <stdio.h> int main(void) { double balance, transaction; printf("Enter beginning account balance: "); scanf("%lf", &balance); printf("Enter transaction amount: "); for (scanf("%lf", &transaction); transaction != 0.0; scanf("%lf", &transaction)) { balance = balance + transaction; } /* end for */ printf("Ending account balance is: %8.2f", balance); return 0; } /* end function main */
오류 데이터 검사 및 continue 문 예제 9.19 : 시험 점수를 입력하고 반 평균 점수와 시험을 치른 학생의 수를 계산하고 출력하는 프로그램을 작성한다고 하자. 적절한 시험 점수는 1에서 100사이의 정수이다. 범위 밖의 값을 입력하면 프로그램은 올바른 값을 입력하도록 경고해야 하고, 반 평균을 계산하는 데에는 이 잘못된 값을 무시해야 하지만 프로그램의 수행은 계속되어야 한다. 프로그램은 시험 점수로 0을 입력할 때 종료가 되어야 한다. printf("Enter a test score. Enter 0 to stop: "); for (scanf("%d", &test_score); test_score != 0; scanf("%d", &test_score)) { if (test_score < 0 || test_score > 100) { printf("Incorrect test score! Enter a correct value: "); continue; } /* end if */ sum = sum + test_score; number_of_students = number_of_students + 1; } /* end for */ if (number_of_students != 0) class_average = (double) sum / number_of_students; else class_average = 0.0; /* end if */
후 검사 반복 구조 do-while 문의 문법 do LoopBody while ( LoopControlExpression ); /* end do - while */ do-while 문의 의미 구조
do-while 문을 이용한 카운터 제어 루프와 sentinel 제어 루프 예제 9.20 : 정수 1 부터 number 까지의 합 (비교 : 예제 9.13) int number, sum = 0, counter = 0; ············ do { sum = sum + counter; counter = counter + 1; } while (counter <= number); /* end do-while 예제 9.21 : sentinel 변수는 transaction이고 그 값은 0.0 (비교 : 예제 9.18) scanf("%lf", &balance); do { printf("Enter transaction amount: "); scanf("%lf", &transaction); balance = balance + transaction; } while (transaction != 0.0); /* end do-while */
중첩된 루프 루프의 몸체 안에 하나 이상의 루프를 가지는 구조로 외부 루프가 매번 반복할 때마다 내부 루프들이 전부 실행 예제 9.23 int control_var1, control_var2; for (control_var1 = 1; control_var1 <= 8; control_var1 +=2) for (control_var2 = control_var1; control_var2 <= 10; control_var2 += 3) printf("control_var1 = %d control_var2 = %d", control_var1, control_var2); /* end for */ 결과 control_var1 = 1 control_var2 = 1 control_var1 = 1 control_var2 = 4 control_var1 = 1 control_var2 = 7 control_var1 = 1 control_var2 = 10 control_var1 = 3 control_var2 = 3 control_var1 = 3 control_var2 = 6 control_var1 = 3 control_var2 = 9 control_var1 = 5 control_var2 = 5 control_var1 = 5 control_var2 = 8 control_var1 = 7 control_var2 = 7 control_var1 = 7 control_var2 = 10