200 likes | 387 Views
강의 내용 ( 여섯 번째 ) . 오늘 강의 내용 (4 월 26 일 ) 중간 고사 문제 풀이 반복문 (for, do-while) 계속 Break, continue, return 문 예습 (5 월 3 일 ) 5 장 디버깅과 추적 6 장 배열의 표현과 선언 , 1 차원 배열 숙제 없음. 4.3 반복문 ( 계속 ). 4.3.2 for 문 for 문은 반복횟수를 미리 알 수 있는 경우에 사용되는 while 문의 특수한 경우라고 할 수 있다 . ■ 문법 statement1;
E N D
강의 내용(여섯 번째) • 오늘 강의 내용 (4월 26일) • 중간 고사 문제 풀이 • 반복문 (for, do-while) 계속 • Break, continue, return문 • 예습 (5월 3일) • 5장 디버깅과 추적 • 6장 배열의 표현과 선언, 1차원 배열 • 숙제 • 없음
4.3 반복문(계속) 4.3.2 for 문 • for 문은 반복횟수를 미리 알 수 있는 경우에 사용되는 while 문의 특수한 경우라고 할 수 있다. ■ 문법 statement1; for(init_expression; test_expression; update_expression) { statement2; } statement3;
4.3 반복문(계속) 4.3.2 for 문(계속) • if 문의 초기식(init_expression)과 반복 조건식(test_expression)은 콤마 연산자(,)에 의하여 여러 명령문을 복합문 형식으로 작성할 수도 있고, 세 가지 식을 모두 생략할 수도 있다. • 그러나 세미콜론(;)은 생략할 수 없다. for( ; ; ) //틀린 문장이 아님 • 반복 조건식(test_expression)과 갱신식(update_expression) 부분에 복수의 실행문을 콤마 연산자로 구분하여 포함시킬 수 있다. for (i=1, sum=0; i<100; sum+=i, i++) ; • 반복 조건식(test_expression)과 갱신식(update_expression) 부분은 생략될 수 있으나, 생략된 부분의 세미콜론(;)은 남아 있어야 한다. 이 경우, 그 역할은 while 문과 동일해진다. • 조건식 만으로 구성된 for 문 int i=1; for( ; i<100; ) i++; • 동일한 조건식의 while 문 int i=1; while(i<100) i++;
4.3 반복문(계속) • for 문에서 반복 조건식(test_expression)까지 생략하면, for 블록의 명령문 statement2는 무한히 실행된다. 이때 반복문에서 벗어나려면, goto 문이나 break 문을 사용해야 한다. for( ; ; ) { i++; if (i > 10) goto out; /* break 문을 사용하여 블록에서 이탈할 수도 있다.*/ } • for 루프는 while 루프의 특별한 경우 • 그 이유는 for 루프는 반복 횟수를 미리 알 수 있는 경우의 반복구조라고 했는데, while 루프에 반복 횟수를 정해주는 명령문을 첨가해주면 for 루프와 같은 효과를 얻을 수 있다. ■ 문법 statement1; init_expression; while(test_expression) { statement2; update_expression; } statement3;
4.3 반복문(계속) • 예제 4.14 • for 문의 사용 예 (1) 옳은 예 for (i=1, factorial=1; i<=n; ++i) factorial *= i; for (j=2; k%j==0; ++j) { printf("\n%d is a divisor of %d", j, k); sum += k; } (2) 틀린 예 for (i=0, i<n, i+=3) /* 세미콜론이 필요함 */ sum += i;
4.3 반복문(계속) • 예제 4.15 • 1부터 10까지의 합 계산(1) (1) 방법 1 int i, sum; sum=0; for (i=1; i<=10; ++i) sum += i; (2) 방법 2 int i, sum; i=1; sum=0; for(; i<=10; ++i) sum += i; (3) 방법 3 int i, sum; i=1; sum=0; for(; i<=10; ) sum += i++; ※(1), (2), (3)은 모두 같은 결과를 제공한다.
4.3 반복문(계속) • 예제 4.16 • 1부터 10까지의 합 계산(2) (1) 방법 1 int i, sum; for (sum=0, i=1; i<=10; sum+=i, ++i) ; /* 공문 */ printf("\n%d', sum); (2) 방법 2 int i, sum; for (sum=0, i=1; i<=10; ++i) sum += i; printf("\n%d", sum); ※(1), (2)는 모두 같은 결과를 제공한다.
4.3 반복문(계속) • 예제 4.17 • 1+2+3+4+5+6+7+8+9+10을 계산하는 프로그램 ☑ 프로그램 #include <stdio.h> #include <conio.h> void main() { int i, sum=0; for(i=1; i<=10; i++) { sum = sum+i; // sum += i와 같은 식 } // for문의 목표문이 한 문장일 경우는 {}를 생략해도 됨. printf("sum = %d \n", sum); getch(); } ꁼ 실행결과 sum = 55
4.3 반복문(계속) • 예제 4.19 • 1~100까지의 수들 중에서 홀수들의 합을 구하는 프로그램 ☑ 프로그램 #include <stdio.h> #include <conio.h> void main() { int i, sum=0; for(i=1; i<=100; i=i+2) sum += i; printf("sum = %d \n", sum); } ꁼ 실행결과 sum = 2500
4.3 반복문(계속) • 예제 4.20 ꁼ 실행결과 Input1: 10 Input2: 1 sum = 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 = 55 ☑ 프로그램 #include <stdio.h> #include <conio.h> void main() { int a, b, i, sum=0, max, min; printf(" Input1: "); scanf("%d", &a); printf("\n Input2: "); scanf("%d", &b); if(a>=b) { max = a; min = b; } else { max = b; min = a; } for(i=min; i<=max; i++) sum += i; printf("sum = "); for(i=min; i<max; i++) printf("%d + ",i); printf("%d = %d", i, sum); getch(); }
4.3 반복문(계속) • 예제 4.25 • 아스키코드 테이블(ASCII code table) 출력: 아스키코드값 32~127 사이에 일치하는 문자를 출력하는 프로그램을 작성하라. ☑ 프로그램 #include <stdio.h> #include <conio.h> void main() { int i; printf("/* ASCII 코드 값 */ \n"); for(i=32; i<128; i++) { if(i%8 ==0) /* i가 8의 배수인 경우 한 줄 띄운다 */ printf("\n"); /* %는 모튤연산자로서 8로 나눈 \ 나머지 */ printf("%4d %c", i, i);/* i를 10진수(%4d)와 문자(%c)\ 로 출력 */ } }
4.3 반복문(계속) • 예제4.26 • 입력된 문자의 아스키코드를 출력하는 프로그램을 작성하라.(단, Ctrl+Z 키를 누르면 루프를 빠져나올 것.) ☑ 프로그램 #include <stdio.h> #include <conio.h> void main(void) { char ch; int inv; while(ch!=EOF) { printf("\n\n\n\n\t\tAlphabet To ASCII : "); ch = getchar(); inv = (int)ch; getchar(); printf("\n\n\n\t\t\t%c = %d\n", ch, inv); } } ꁾ 입력 Alphabet To ASCII : A ꁼ 실행결과 A = 65
4.3 반복문(계속) • 예제 4.32 • 다음 식을 만족하는 A, B, C, D를 구하라. A B C + C A C --------- B D D ☑ 프로그램 #include <stdio.h> main(void) { int a, b, c, d, sum; for(a=1; a<10; a++) for(b=1; b<10; b++) for(c=0; c<10; c++) for (d=0; d<10; d++) { sum = (100*a+10*b+c) + (100*c+10*a+c); if (sum == 100*b+10*d+d) printf("A=%d B=%d C=%d D=%d\n", a, b, c, d); } } ꁼ 실행결과 A=1 B=3 C=2 D=4 A=2 B=6 C=4 D=8 A=2 B=9 C=6 D=2 A=5 B=7 C=1 D=2
4.3 반복문(계속) 4.3.3 do-while 문 • do-while 구조는 while 구조와 비슷하나 반복조건을 검사하는 위치가 다르다. ■ 문법 statement1; do { statement2; }while(test_expression); statement3;
4.3 반복문(계속) • 예제4.33 • do-while 문의 예(1) do{ sum += i; scanf("%d", &i); i--; }while(i > 0); • do-while 문의 예(2) int x; do{ x++; y=x*100; }while(x<100);
4.3 반복문(계속) • 예제4.34 • 이 5000을 초과하는 가장 작은 와 그때의 합을 구하는 프로그램을 do-while 문을 이용하여 작성하라. ☑ 프로그램 #include <stdio.h> void main(void) { int i=0, sum=0; do { i++; sum += i*i; }while(sum<=5000); printf("i=%d sum=%d\n", i, sum); } ꁼ 실행결과 i=14 sum=1015
4.3 반복문(계속) • 예제 4.35 • 무한 루프의 예 (1) while(1) { /* 다른 프로그램 문장들 */ } (2) do { /* 다른 프로그램 문장들 */ }while(1); (3) for( ; ; ) { /* 다른 프로그램 문장들 */ }
4.4 분기문 • 분기문(branching statements)은 제어의 흐름을 다른 곳으로 이동하는 문장으로서 break, continue, return 그리고 goto가 있다. 4.4.1 break 문 • break 문은 반복문이나 switch-case 문에서 완전히 빠져 나오고자 할 때 사용 • 예컨대, 반복문에서 조건에 관계없이 즉시 반복과정으로부터 이탈하고자 할 경우에는 break 문을 사용할 수 있다. • break 문이 실행되면, 자신이 포함된 코드 블록으로부터 실행흐름을 벗어나게 한다. • 가령, 블록 내에 블록이 내포된 중첩 블록 구조에서 break 문이 실행되면 모든 블록으로부터 단 한번에 빠져나오는 것이 아니라 자신이 포함된 하나의 블록만을 벗어하는 것이다. • 다시 말해서, 반복문이 중첩되어 있으면 break 문은 해당 반복 블록만을 벗어남에 따라 중첩된 반복 블록을 완전히 벗어나지 못한다. • 예제 4.36 for(i=0; i<10; i++) /* for 블록-1 */ { for(j=0; j<10; j++) /* for 블록-2 */ { if (k=0) { break; /* break 문은 for 블록-2의 실행을 중단하고 */ ........ /* 외부 for 블록-1로 제어를 옮긴다. */ } printf("%d",sum"); } }
4.4 분기문(계속) • 예제 4.37 /*else-if 문을 사용한 경우 */ if(ch == 'A') statement1; else if( ch == 'B') statement2; else statement3; /* switch-case 문을 사용한 경우 */ switch(ch) { case 'A': statement1; break; case 'B': statement2; break; default: statement3; }
4.4 분기문(계속) 4.4.4 return 문 • return 문은 반환식의 유무에 따라 다음과 같은 2가지 종류로 구분 ■ 문법 (1) return; (2) return(반환식); • return 문은 피호출 함수로부터 호출 함수에 제어를 넘겨주고, 동시에 호출문에 값을 반환하기 위해서 사용된다. • 이때 반환식이 없으면 0을 반환한다. 그러나 만약 반환식이 있으면 식의 자료형은 함수의 반환형과 일치해야 한다. int ifactorial(int n) { int i; int s=1; for(i=1; i<=n; i++) s=s*i; return s; }