Chapter 6 Repetition
반복문 특정 상태(condition)를 만족하는 동안 같은 명령을 반복하여 수행 Loop control expression: 반복이 끝나는 상태를 검사하는 식 Loop control variable: 특별히 loop expression이 특정 변수에 의존할 때, 그 변수
Figure 6-1
Figure 6-2
Figure 6-3
Figure 6-4
초기화 및 변경 초기화 : 루프를 시작하기 전에 준비를 함 루프갱신(updating) 명시적 암묵적 일반적으로 제어변수(control variable)의 값을 줌 루프갱신(updating) 루프를 제어하는 값을 바꿈 이에 따라 제어조건이 참에서 거짓으로 바뀌면 루프를 빠져나옴
Figure 6-5
Figure 6-6
Figure 6-7
계수기 제어 루프 반복되어야 하는 횟수를 알 때 사용 계수기의 값을 증가시키거나 감소시켜서 원하는 횟수만큼 반복했으면 중지시킴 계수기를 저장하는 값을 제어변수(control variable)이라 함
Figure 6-8
C에서의 루프 Algol68의 개념과 유사 조건검사: while문, do-while문 계수기: for문 … 그러나 for문도 조건검사에 사용할 수도 있다. 그러나 되도록 계수기를 이용한 검사에 씀이 바람직
Figure 6-9
Figure 6-10
While문 수행 전 검사 루프 문장 끝에 ‘;’이 나타나지 않는다. while(1) { … } 있어도 오류가 나오지는 않는다… 이유는? while(1) { … } 무한 루프 while(100), while(‘a’) while(num>0) …
Figure 6-11
예제I if (num > 100) num = 100; lineCount = 0; while (num > 0) { if (lineCount < 10) lineCount++; else printf("\n"); lineCount = 1; } /* else */ printf("%4d", num--); } /* while */ return 0;
예제 II int x; int sum = 0; /* Statements */ printf("Enter your numbers: <EOF> to stop.\n"); while (scanf("%d", &x) != EOF) sum += x; printf ("\nThe total is: %d\n", sum); return 0; } /* main */
For루프 세 개의 수식 사용 ‘;’은 불필요 제한 조건이 만족하면 계속 수행 초기화 제한조건 수식변경 ‘;’은 불필요 제한 조건이 만족하면 계속 수행 초기화, 제한조건. 수식변경 부분을 생략할 수도 있음 제한조건이 거짓이 되면 수행을 끝냄 루프의 몸체 부분에서도 while문처럼 제한조건을 변경시킬 수는 있으나 바람직하지 못함 for(;제한조건;) while(제한조건) : 동일함 for(;;) 무한 수행
Figure 6-12
Figure 6-13
예제 I printf ("\nPlease enter the limit: "); scanf ("%d", &limit); for (i = 1; i <= limit; i++) printf("\t%d\n", i); return 0;
예제 II int main (void) { /* Local Definitions */ int i; int j; /* Statements */ for (i = 1; i <= 3; i++) printf("Row %d: ", i); for (j = 1; j<= 5; j++) printf("%3d", j); printf("\n"); } /* for i */ return 0; } /* main */
Figure 6-14
do … while 루프 수행 후 검사 한 번은 수행 do … while 문의 몸체는 하나의 문장으로 이루어짐 여러 개 문장을 쓰려면 복합문으로 만들어야 함 ‘;’을 꼭 써야 함.
예제 I loopCount = 5; printf("while loop : "); while (loopCount > 0) printf ("%3d", loopCount--); printf("\n\n"); /* 동일한 작업을 하는 두 문장 */ printf("do...while loop: "); do while (loopCount > 0); printf("\n"); return 0; } /* main */
예제 II int main (void) { /* Local Definitions */ int x; int sum = 0; int testEOF; /* Statements */ printf("Enter your numbers: <EOF> to stop.\n"); do testEOF = scanf("%d", &x); if (testEOF != EOF) sum += x; } while (testEOF != EOF); printf ("\nTotal: %d\n", sum); return 0; } /* main */
Figure 6-15
Figure 6-16
제어문의 선택 풀려는 문제에 가장 적합한 것을 선택한다. 그렇게 하면 프로그램이 자연스러워 진다.
쉼표 식 둘 이상의 식이 쉼표로 분리된 식 주로 for문의 초기화에 사용 가장 낮은 우선순위 좌 우선이며, 마지막 값은 오른쪽 값이 됨 for(sum=0, i=1; i<=20; i++) a=(b*=2, c*=2, b+c); /*이렇게 쓰는 것이 꼭 좋지는 않음.
Figure 6-17
복리계산 for (futureVal = presVal, looper = 1; looper <= years; { futureVal = futureVal * (1 + rate/100.0); printf("%3d%11.2lf\n", looper, futureVal); } /* for */
숫자 역으로 출력 printf("Enter a number and I'll print it backward: "); scanf ("%d", &num); while (num > 0) { digit = num % 10; printf("%d", digit); num = num / 10; } /* while */ printf("\nHave a good day.\n"); return 0;
Figure 6-18
2진수를 10진수로 간단히 구형 가능 10진수를 2진수로 …. 어렵지 않음 정수를 읽어서 2진수로 바꾸는 프로그램 작성 :실험
Figure 6-19
루프와 관련된 다른 명령문 break : 루프에서 빠져나옴 continue: 루프 수행을 계속하지만 남은 연산은 하지 않음 주로 제한조건이 for, while, do-while, case문의 중간에 만족하였을 때 사용 되도록 사용을 자제해야 함. continue: 루프 수행을 계속하지만 남은 연산은 하지 않음 while이나 do-while문은 검사식으로 제어가 이동 for문은 변경식으로 제어가 이동 되도록 사용을 자제해야 함 return과 goto
Figure 6-20
Figure 6-21
Figure 6-22
Figure 6-23
Figure 6-24
Figure 6-25
되부름(recursion) 함수가 자신을 다시 부름 특정문제의 정의로부터 바로 프로그램을 할 수 있음 실제 속도가 떨어지므로 개념적으로만 사용, 예외로 일부 문제는 되부름을 사용할 수밖에 없음 특별한 문제가 아니면 반복적 정의로 처리 가능 Factorial, fibonacci number 반복적으로 처리 가능 Tower of Hanoi 반복적으로 처리할 수 없음
Figure 6-26
Figure 6-27
Figure 6-28
Figure 6-29
Figure 6-30
Figure 6-31.a
Figure 6-31.b
Calls: Output: Towers (3, A, C, B) Towers (2, A, B, C) Figure 6-32 Calls: Output: Towers (3, A, C, B) Towers (2, A, B, C) Towers (1, A, C, B) Step 1: Move from A to C Step 2: Move from A to B Towers (1, C, B, A) Step 3: Move from C to B Step 4: Move from A to C Towers (2, B, C, A) Towers (1, B, A, C) Step 5: Move from B to A Step 6: Move from B to C Step 7: Move from A to C
Figure 6-33
Figure 6-34
프로그램 효율성 O(log n) O(n) O(n log n) O(n2) 2학년 2학기에 배움
실습 및 예습 실습 예습 10진수를 2진수로 바꾸는 문제 38번, 51번, 58번 9-15번 풀기, 17, 20, 정수를 바꾸는 문제 실수를 바꾸되 2진수 소수점 10자리까지만 구함 38번, 51번, 58번 예습 9-15번 풀기, 17, 20,