Download presentation
Presentation is loading. Please wait.
1
제4장 제어구조 문봉근
2
제4장 제어구조 4.1 제어문의 개념 4.2 택일문 4.3 반복문 4.4 분기문
3
4.1 제어문의 개념 컴퓨터 프로그램의 제어 프로그래밍 언어가 갖추어야 할 기본적인 제어구조의 형태 제어문의 종류
컴퓨터 프로그램은 적어도 하나 이상의 문장들(statements)의 유기적인 구성을 통해 목적하는 특정작업을 수행 묵시적인 순차 제어 문장들의 실행흐름의 과정은 명시적인 제어 명령이 없을 경우, 바로 다음 문장으로 제어권이 자동적으로 넘어감으로써 연이은 문장이 계속적으로 실행됨 프로그래밍 언어가 갖추어야 할 기본적인 제어구조의 형태 문장들의 순차적인 실행 어떤 조건이 만족될 때까지 연속적 문장의 수행 반복 선택될 행동간에 선택을 위한 조건 제어문의 종류
4
4.1 제어문의 개념(계속) C 언어에 규정된 모든 제어문의 제어권이 행사되는 논리적 단위는 단문(single statement)이다. 즉, 각 개별 제어문이 행사하는 제어권의 범위는 해당 제어문에 따라오는 목표(target)문에 국한됨 문장들의 시작과 끝을 중괄호 {}로 묶어줌으로써 코드 블록(code block)을 만들 수 있으며, 블록화된 문장들은 단문처럼 하나의 논리적 단위가 됨 C 언어에서는 두 개 이상의 문장들을 묶어서 블록(block)화할 수 있는 데, 이것을 코드 블록(code block) 또는 복문(compound statement)이라고 부른다. …… if(minute >= 60) { hour = hour + 1; minute = minute - 60; }
5
4.2 택일문 택일문(alternative statements)은 선택조건에 따라 여러 개의 대안 중에서 하나의 대안을 선택할 때 사용 택일문은 크게 if 문을 쓰는 구조와 switch 문을 쓰는 구조가 있으며, 그 종류에는 if 문, if-else 문, switch-case 문 등이 있다. 4.2.1 if 문 ■ 문법 statement1; if(test_expression) statement2; statement3;
6
4.2 택일문(계속) if문의 사용 예 (1) 옳은 예1 (2) 옳은 예2 (3) 옳은 예3 (4) 틀린 예1
if (grade >= 90) printf("\n congratulations!"); printf("\n your grade is %d", grade); (2) 옳은 예2 if (x != 0.0) y /= x; (3) 옳은 예3 if (c == ' ') { ++ blank_no; printf("\n another blank found"); } (4) 틀린 예1 if b == a /* 괄호가 빠졌음 */ area = a*a; (5) 틀린 예2 if (c != d) c += 'A' - 'a' /* ;이 빠졌으므로 문장이 아님 */ (6) 틀린 예3 if(i != j) i=1; j=2; }; else i+=j; //구문 오류 발생
7
4.2 택일문(계속) 예제 4.2 시간 합산 프로그램 예제 4.3 정수의 홀수 및 짝수 식별 ☑ 프로그램
#include <stdio.h> void main() { int hour, minute; hour = 2 + 3; minute = ; if(minute >= 60) hour = hour + 1; minute = minute - 60; } printf("%d:%d\n", hour, minute); ꁼ 실행결과 6:45 예제 4.3 정수의 홀수 및 짝수 식별 ☑ 프로그램 #include <stdio.h> void main() { int a; printf("Input a integer number: "); scanf("%d", &a); if(a%2 == 0) printf("%d is even.\n", a); if(a%2 == 1) printf("%d is odd.\n", a); } ꁾ 입력 Input a integer number: 2 ꁼ 실행결과 2 is even.
8
4.2 택일문(계속) 4.2.2 if-else 문 ■ 문법 statement1; if(test_expression)
서로 배타적인 두 대안을 선택하는 프로그램에 적합 ■ 문법 statement1; if(test_expression) statement2; else statement3; statement4;
9
4.2 택일문(계속) if-else 문의 예 (1) 사용예1 (2) 사용예2 (3) 사용예3 if (a > b)
x = a - b; else x = b - a; (2) 사용예2 if (c == 'e') ++e_cnt; ++other_cnt (3) 사용예3 if ('a' <= c && c <= 'z') { ++lower_cnt; /* 소문자 누계 */ printf("\n another lower case letter is found."); } ++other_cnt; printf("\n non-lower case letter is found.");
10
4.2 택일문(계속) 예제 4.5 두 수 중에서 큰 수를 출력하기 ☑ 프로그램 #include <stdio.h>
void main() { int a, b, max; printf("input1: "); scanf("%d", &a); printf("input2: "); scanf("%d", &b); if(a >= b) max = a; else max = b; printf("MAX = %d\n", max); } ꁾ 입력 input1: 10 input2: 20 ꁼ 실행결과 MAX = 20
11
4.2 택일문(계속) 4.2.3 다중 if 문(else-if 문) ■ 문법
다중 if 문은 if 문이 다른 if나 else의 목표문이 될 때, 생성되는 것 복수의 if 또는 if-else 구조의 조합 형태로 복잡한 구조를 갖지만 다중 선택 기능을 갖는 하나의 단문을 구성한다. 이 경우 흔히 생성될 수 있는 else-if 구조는 대안이 세 개 이상의 다중 선택인 경우에 자주 사용되는 구조이다. ■ 문법 statement1; if(test_expression1) statement2; else if(test_expression2) statement3; else if( test_expression3) statement4; else statement5; statement6;
12
4.2 택일문(계속) 예제 4.6 각 점수에 대한 학점 평가하기 ☑ 프로그램 #include <stdio.h>
void main() { int jum; printf("input score: "); scanf("%d", &jum); if(jum>=90) printf("%d A \n", jum); else if(jum >= 80) printf("%d B \n", jum); else if(jum >= 70) printf("%d C \n", jum); else if(jum >= 60) printf("%d D \n", jum); else printf("%d F \n", jum); } ꁾ 입력 input score: 95 ꁼ 실행결과 95 A
13
4.2 택일문(계속) 예제 4.7 정수, 연산자, 정수를 연속으로 입력받아 이를 수행하는 프로그램을 if 문을 이용하여 작성하라. (단, 연산자로는 +, -, *, /를 제공한다.) ☑ 프로그램 #include <stdio.h> int main(void) { char op; int a, b; printf("Enter an expression : "); scanf("%d%c%d", &a, &op, &b); if(op=='+') printf("%d+%d=%d\n", a, b, a+b); else if(op=='-') printf("%d-%d=%d\n", a, b, a-b); else if(op=='*') printf("%d*%d=%d\n", a, b, a*b); else if(op=='/') printf("%d/%d=%d\n", a, b, a/b); else printf("No such operator %c\n", op); } ꁾ 입력 Enter an expression : 5+10 ꁼ 실행결과 5+10=15
14
4.2 택일문(계속) 4.2.4 switch-case 문 ■ 문법
다중 선택을 프로그램하기 위해 else-if 구조 대신에 switch-case 구조를 사용할 수 있다. ■ 문법 switch(integer_expression) { case label1 : statement1; case label2 : statement2; case label3 : statement3; default : statementN; }
15
4.2 택일문(계속) 예제 4.8 switch-case 문의 예 (break 문을 사용하지 않은 예) int x, y;
char z; ……… switch(x+y) { case 100: z='A'; break; case 200: z='B'; case 300: z='C'; default: z=' '; } 예제 4.8 switch-case 문의 예 (break 문을 사용하지 않은 예) int x, y; char z; ……… switch (x+y) { case 100: z='A'; case 200: z='B'; case 300: z='C'; default: z=' '; }
16
4.2 택일문(계속) 예제 4.9 예제 4.7을 if 문 대신 switch-case 문을 이용하여 작성하라. ☑ 프로그램
#include <stdio.h> main(void) { char op; int a, b; printf("Enter an expression : "); scanf("%d%c%d", &a, &op, &b); switch(op) { case '+': printf("%d+%d=%d\n", a, b, a+b); break; case '-': printf("%d-%d=%d\n", a, b, a-b); case '*': printf("%d*%d=%d\n", a, b, a*b); case '/': printf("%d/%d=%d\n", a, b, a/b); default: printf("No such operator %c\n", op); } ☑ 입력 Enter an expression : 5+10 ☑ 실행결과 5+10=15
17
4.3 반복문 4.3.1 while 문 ■ 문법 반복문 statement1; while(test_expression)
반복문(iterative statements)은 명령문 집단을 반복 실행하기 위해 사용한다. 반복 구조에는 반복을 계속할 것인지를 검사하는 반복조건이 있어야 한다. C 언어에서 제공하는 반복문에는 while 문, for 문, do-while 문이 있다. 4.3.1 while 문 ■ 문법 statement1; while(test_expression) statement2; statement3;
18
4.3 반복문(계속) 예제 4.10 while 문의 사용 예 (1) 옳은 예1 (2) 옳은 예2 (3) 틀린 예1
while (i++ < n) factorial *= i; (2) 옳은 예2 while ((c=getchar( )) ! = EOF) { if ('a'<= c && c <= 'z') ++lower_case_letter_cnt; ++total_cnt; } (3) 틀린 예1 while (++i < 1000) do { /* do가 포함되어서는 안 됨 */ j=2*i+3; printf("\n%d", j); (4) 틀린 예2 while i++ < n factorial *= i;
19
4.3 반복문(계속) 예제 4.11 1부터 계속 더하여 그 합이 100미만일 때까지 반복 계산하는 프로그램을 작성하라.
☑ 프로그램 #include <stdio.h> void main() { int i=0, sum=0; while(sum < 100) sum += i; i++; } sum -= --i; printf("i = %d sum = %d\n", i, sum); ☑ 실행결과 i = 14 sum = 91
20
4.3 반복문(계속) 예제 4.12 프로그램 #include <stdio.h>
예제 프로그램 #include <stdio.h> #include <conio.h> void main() { char c, d; int a, b; printf("\n연산을 하시겠습니까?(y or n)\n"); while((d=getche())!='n') printf("\n<<어떤 연산을 원하세요? EX) + - * />>\n"); printf("연산자 선택:"); scanf("%c", &c); while(c!='+' && c!='-' && c!= '*' && c!='/') printf("연산자를 잘못 입력하였습니다.\ 다시 입력하세요\n"); printf("연산자 재선택:"); c=getchar(); } printf("\n값을 입력하세요 연산 예:A %c B\n", c); printf("A="); scanf ("%d", &a); printf("B="); scanf("%d", &b); while(c=='/' && b==0) { printf("0으로 나누었습니다 다시 입력하세요!\n"); printf("\n B값을 0이 아닌 값으로 다시 \ 입력하세요!\n"); printf("B="); scanf("%d", &b); } switch(c) case '+': printf("%d+%d=%d\n",a,b,a+b); break; case '-': printf("%d-%d=%d\n",a,b,a-b); case '*': printf("%d*%d=%d\n",a,b,a*b); break; case '/': printf("%d/%d=%f\n",a,b,(float)a/(float)b); printf("연산을 계속 하시겠습니까?(y or n)\n"); d=getchar(); getch(); ꁾ 입력 연산을 하시겠습니까?(y or n) y <<어떤 연산을 원하세요? EX) + - * />> 연산자 선택:+ 값을 입력하세요 연산 예:A + B A=10 B=20 ꁼ 실행결과 10+20=30
21
4.3 반복문(계속) 예제 4.13 if(a>=b) // 처음 입력 수가 클 경우
#include <stdio.h> void main(void) { int ch, a, b, i, sum=0; while(1) /* 항상 참이다(무한 loop) */ { printf("\n\t**********************************\n"); printf("\t1. 두 수 사이의 합을 구하기\n"); printf("\t2. 종료!\n"); printf("\t**********************************\n"); printf("\t당신이 원하는 작업의 번호는? "); scanf("%d", &ch); if(ch==1) printf("\n\n\t 이제 두 수를 입력하시오.\n"); printf("\t 1번째 정수는 : "); scanf("%d", &a); printf("\t 2번째 정수는 : "); scanf("%d", &b); if(a>=b) // 처음 입력 수가 클 경우 { sum = 0; for(i=b; i<=a; i++) { sum+=i; } } if(b>a) // 두 번째 수가 클 경우 for(i=a; i<=b; i++) printf("\n\t 입력한 두 수 사이의 합은 %d입니다.", sum); getch(); if(ch==2) // 종료 printf("\t"); break; continue; }
22
4.3 반복문(계속) 4.3.2 for 문 for 문은 반복횟수를 미리 알 수 있는 경우에 사용되는 while 문의 특수한 경우라고 할 수 있다. ■ 문법 statement1; for(init_expression; test_expression; update_expression) { statement2; } statement3;
23
4.3 반복문(계속) 4.3.2 for 문(계속) 조건식 만으로 구성된 for 문 동일한 조건식의 while 문
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 문 while(i<100)
24
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;
25
4.3 반복문(계속) 예제 4.14 for 문의 사용 예 (1) 옳은 예 (2) 틀린 예
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;
26
4.3 반복문(계속) 예제 4.15 1부터 10까지의 합 계산(1) (1) 방법 1 (2) 방법 2 (3) 방법 3
int i, sum; sum=0; for (i=1; i<=10; ++i) sum += i; (2) 방법 2 i=1; for(; i<=10; ++i) (3) 방법 3 for(; i<=10; ) sum += i++; ※(1), (2), (3)은 모두 같은 결과를 제공한다.
27
4.3 반복문(계속) 예제 4.16 1부터 10까지의 합 계산(2) (1) 방법 1 (2) 방법 2
int i, sum; for (sum=0, i=1; i<=10; sum+=i, ++i) ; /* 공문 */ printf("\n%d', sum); (2) 방법 2 for (sum=0, i=1; i<=10; ++i) sum += i; printf("\n%d", sum); ※(1), (2)는 모두 같은 결과를 제공한다.
28
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
29
4.3 반복문(계속) 예제 4.18 ꁼ 실행결과 ☑ 프로그램 #include <stdio.h> #include <conio.h> void main(void) { int i, j, k, l; k=0; l=1; printf("\n\t"); for(i=2; i<=100; i++) for(j=2; j<=i; j++) if ( !(i%j) ) k++; if ( k==1 ) printf("%6d", i); l++; } if ( l%8==0 ) /* 한 라인에 8개씩 출력 */ printf("\n"); l=1; k=0; getch();
30
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
31
4.3 반복문(계속) 예제 4.20 ꁼ 실행결과 Input1: 10 Input2: 1
sum = = 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();
32
4.3 반복문(계속) 예제 4.21 구구단을 한 줄로 출력하되 단 아래와 같이~ #include <stdio.h>
#include <conio.h> void main(void) { int i, j; for(i=1; i<10; i++) { printf("\n\t\t%3d 단\n", i); for(j=1; j<10; j++) printf("\t\t%d * %d = %d\n", i, j, i*j); getch(); } }
33
4.3 반복문(계속) 예제 4.22 다음과 같은 결과를 출력하는 구구단 프로그램~ #include <stdio.h>
#include <conio.h> void main() { int i, j; printf(" /* 구구단 프로그램 */ \n"); for(i=1; i<10; i++) for(j=1; j<10; j++) printf("%d * %d = %d\n", i, j, i*j); getch(); }
34
4.3 반복문(계속) 예제 4.23 구구단을 세 줄로 출력하는 프로그램을 작성하라.
#include <stdio.h> #include <conio.h> void main(void) { int i, j; for(i=1; i<10; i=i+3) for(j=1; j<10; j++) { printf("\t%2d * %2d = %2d\t", i, j, i*j); printf("\t%2d * %2d = %2d\t", i+1, j, (i+1)*j); printf("\t%2d * %2d = %2d\n", i+2, j, (i+2)*j); } getch(); printf("\n"); }
35
4.3 반복문(계속) 예제 4.24 구구단을 세 줄로 출력하되~ #include <stdio.h>
#include <conio.h> void main() { int i, j; for(i=1; i<10; i=i+3) { printf("\t%5dDAN\t\t%5dDAN\t\t%5dDAN\n", i, i+1, i+2); for(j=1; j<10; j++) { printf("\t%2d * %2d = %2d\t", i, j, i*j); printf("\t%2d * %2d = %2d\t", i+1,j,(i+1)*j); printf("\t%2d * %2d = %2d\n", i+2, j, (i+2)*j); } } getch(); printf("\n"); }
36
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)\ 로 출력 */ }
37
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
38
4.3 반복문(계속) 예제 4.27 다음과 같은 실행결과를~ #include <stdio.h>
#include <conio.h> void main() { int i, j; for(j=0; j<=25; j++) { for(i=65; i<=65+j; i++) printf("%c", i); printf("\n"); } }
39
4.3 반복문(계속) 예제 4.28 다음과 같은 실행결과를~ #include <stdio.h>
#include <conio.h> void main() { int i, j; for(i=65 ; i<=90 ; i++) { printf("\n"); for(j=65; j<=i ; j++) printf("%c",j); } for(i=90 ; i>=65 ; i--) { printf("\n"); for(j=65; j<=i; j++) getch (); }
40
4.3 반복문(계속) 예제 4.29 다음과 같은 실행결과~ #include <stdio.h>
#include <conio.h> void main() { int i,j,l,m,k; k=49; for(i=65; i<=90; i++){ for(j=65; j<=i; j++) printf("%c",j); for(m=k; m>=0; m--) printf(" "); k=k-2; for(l=i; l>=65; l--) printf("%c", l); printf("\n"); } k=1; for(i=89; i>=65; i--){ for(j=65; j<=i; j++) printf("%c", j); for(m=0; m<=k; m++) printf(" "); k=k+2; for(l=i; l>=65; l--) printf("%c", l); printf("\n"); } getch(); }
41
4.3 반복문(계속) 예제 4. 30 다음과 같은~ #include <stdio.h>
#include <conio.h> void main() { int i, j, l, m=25; for(i=65; i<=90; i++) { for(l=m; l>=0; l--) printf(" "); for(j=65; j<=i; j++) printf("%c", j); printf("\n"); m--; } getch(); }
42
4.3 반복문(계속) 예제 4. 31 다음과 같은~ #include <stdio.h>
#include <conio.h> void main() { int i, j; float m, k; k=26; for(i=65; i<=90; i++) { for(m=k; m>=0; m--) printf(" "); k=k-1; for(j=65; j<=i; j++) printf("%c ", j); printf("\n"); } getch(); }
43
4.3 반복문(계속) 예제 4.32 다음 식을 만족하는 A, B, C, D를 구하라. ☑ 프로그램
+ 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
44
4.3 반복문(계속) 4.3.3 do-while 문 do-while 구조는 while 구조와 비슷하나 반복조건을 검사하는 위치가 다르다. ■ 문법 statement1; do { statement2; }while(test_expression); statement3;
45
4.3 반복문(계속) 예제 4.33 do-while 문의 예(1) do-while 문의 예(2) do{ sum += i;
scanf("%d", &i); i--; }while(i > 0); do-while 문의 예(2) int x; x++; y=x*100; }while(x<100);
46
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=25 sum=5525
47
4.3 반복문(계속) 예제 4.35 무한 루프의 예 (1) (2) (3) while(1) { /* 다른 프로그램 문장들 */
} (2) do }while(1); (3) for( ; ; )
48
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");
49
4.4 분기문(계속) 예제 4.37 /*else-if 문을 사용한 경우 */ if(ch == 'A') statement1;
else if( ch == 'B') statement2; else statement3; /* switch-case 문을 사용한 경우 */ switch(ch) { case 'A': break; case 'B': default: }
50
4.4 분기문(계속) 4.4.2 continue 문 continue 문은 반복블록을 실행하는 도중에 만나면, 후속 명령문을 실행하지 않고, 반복문의 다음 과정으로 순서를 넘긴다. continue 문은 switch-case 문에서는 사용되지 않고 반복구조에서만 국한되어 사용되며, switch-case 구조처럼 반복구조에서 완전히 빠져 나오는 것이 아니라 현재 반복중인 것만 중단하고 다음 반복 순서로 계속하기 위해 사용된다. 통상, continue 문은 C 언어 문법상에는 제공되고 있지만 if 문으로 대치할 수 있기 때문에 가능하면 사용하지 말 것을 권장하고 있다. 예제 4.38 for(i=0; i<10; i++) /* for 블록-1 */ { for (j=0; j<10; j++) /* for 블록-2 */ if (k=10) continue; /*continue 문은 ix=ix+j+i을 실행하지 않고,*/ ix=ix+j+i; /* for 블록-2로 실행순서를 옮긴다.*/ } printf("%d", ix);
51
4.4 분기문(계속) 예제 4.39 /* 알파벳 출력 프로그램 */ ☑ 입력 #include <stdio.h>
예제 /* 알파벳 출력 프로그램 */ #include <stdio.h> #include <conio.h> main() { int i, ch, j, k; // ch:선택. i,j,k: 카운터 while(1) // 무한루프, break를 만나면 빠져나옴 // 출력시 화면 지우기 printf("\n\t****알파벳 출력 프로그램****\n");//출력형식 printf("\t1. 알파벳 출력하기\n"); printf("\t2. 마치기!!\n"); printf("\t******************************\n"); printf("\t당신이 원하는 작업 번호는? "); scanf("%d",&ch); // 사용자가 원하는 번호를 입력받음 if(ch==1) for(i=65; i<=90; i++) // 정수 65 부터 90까지가 아스키코드로 A~Z까지임 { printf("\t"); for(j=i; j<=90; j++) printf("%2c", j); for(k=65; k<i; k++) printf("%2c", k); printf("\n"); } getch(); if(ch==2) { break; continue; } return 0; ☑ 입력 *****알파벳 출력 프로그램***** 1. 알파벳 출력하기 2. 마치기!! ****************************** 당신이 원하는 작업 번호는? 1
52
4.4 분기문(계속) 4.4.3 goto 문 goto 문은 빈번한 사용을 권하지 않는 제어문이며, goto 문을 사용하지 않고도 프로그램을 할 수 있다. goto 문은 지시된 레이블(label)이 있는 곳으로 무조건 분기시킨다. 이때, goto 문은 그에 대응하는 레이블 이름(label_name)을 반드시 갖고 있어야 한다. ■ 문법 goto label_name; label_name: statement; 레이블 문은(label_name: statement;)은 goto 문의 전방 또는 후방에 작성될 수 있으나, goto 문과 그에 대응하는 레이블 문은 같은 함수 몸체 내부에 위치해야 한다는 제약이 있다. 레이블 문(label_name: statement;)의 위치는 독립된 블록이나 goto 문의 블록에 중첩된 블록 또는 함수가 되어서는 안 된다.
53
4.4 분기문(계속) 예제 4.40 #include <stdio.h> #include <conio.h>
if(ch == 2) { for(j=1; j<10; j=j+3) { printf("\n\n"); for(i=1; i<10; i++) printf("\t%d * %d = %2d %d * %d = \ %2d %d * %d = %2d\n", j, i, j*i, j+1, i, (j+1)*i, j+2, i, (j+2)*i); getch(); } getch(); } if(ch == 3) printf("\t %d 단 %d 단 \ %d 단\n\n", j, j+1, j+2); printf("\t%d * %d = %2d %d * %d =\ if(ch == 4) break; continue; } return 0; } 예제 4.40 #include <stdio.h> #include <conio.h> void main() { int i, j, ch; while(1) { printf("\n\n\t***** 구구단 프로그램 *****\n\n"); printf("\t 1. 구구단 출력 1 \n"); printf("\t 2. 구구단 출력 2 \n"); printf("\t 3. 구구단 출력 3 \n"); printf("\t 4. 마치기!!!\n"); printf("\t******************************\n\n"); printf("\t 당신이 원하는 작업 번호를 누르세요 : "); scanf("%d",&ch); // 작업 번호 선택 if(ch == 1) { for(j=1; j<10; j++) { printf("\t %d 단\n\n", j); for(i=1;i<10;i++) printf("\t%d * %d = %2d\n", j, i, i*j); printf("\n"); getch(); } getch(); }
54
4.4 분기문(계속) 예제 4.41 goto 문의 사용 예 (1) 옳은 예1 (2) 틀린 예1 { int i=0;
char c; mark: c=getchar(i); i=i+1; if(i<=10) goto mark; } (2) 틀린 예1 int i=1; if (i<10) mark: i++; printf("%d", i); goto mark; /* 블록 내부로의 goto는 오류 */
55
4.4 분기문(계속) goto 문은 아래에 어떠한 경우이든 간에 다른 제어문으로 바꿀 수 있다.
goto 문은 프로그램의 작성을 용이하게 해주는 순기능이 있지만, 가능하면 goto 문의 사용을 억제할 것을 권장하고 있다. 그 이유는, goto 문이 프로그램의 여러 부분에서 사용된 경우 어느 부분에 있는 goto 문 때문에 레이블 문이 있는 부분으로 분기한 것인지를 파악할 수 없고, goto 문이 가리키는 레이블 문이 있는 부분을 확인해야 비로소 그 goto 문이 어떤 역할을 할 것인지를 알 수 있는 등의 역기능이 있기 때문이다. 이는 곧 프로그램의 전체적인 개관을 흐리게 하는 요인이 되기 때문에 알고리즘의 자연적인 표현을 방해하고, 프로그램의 정확도와 검증을 모호하게 할 뿐만 아니라 프로그램 이해를 난해하게 한다. goto 문에 의한 반복문 1)jump1 : i++; if (i<10) goto jump1; else printf("termination!\n"); 2)jump1 : if (i<10) { i++; } do-while 문 또는 while 문에 의한 반복문 1)do{ i++; }while (i<10); printf("termination!\n"); 2)while (i<10) { }
56
4.4 분기문(계속) goto 문이 유용하다고 할 수 있는 한 경우
다음과 같이 중첩된 반복 구조로부터 단 한번에 탈출하기 위한 경우일 뿐이다. for( ...) { .... if( troublesome) goto error /* 오류가 발생했음을 확인 */ } ..... error : message of error /* 오류 발생된 경우 실제로 실행할 문장 */ null 명령문: 세미콜론(;)만으로 구성되는 명령문으로서 실행문이 없는 빈(null) 명령문 while 문, for 문 및 do-while 문과 같은 반복문에서 실행문을 요구하지 않고, 다만 시간의 지연을 필요로 하는 경우에 빈 명령문을 작성할 수 있다. for(i=0; i<32000; i++) ; goto 문에 대응하는 레이블 문의 위치에 실행문을 필요로 하지 않을 경우, 빈 명령문으로 작성할 수 있고, 복합문의 경우도 빈 명령문으로 구성할 수 있다.
57
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; }
Similar presentations