450 likes | 788 Views
제 4 장 제어구조. 4.1 제어문 (control statements) 의 개념 4.2 택일문 (alternative statements) 4.3 반복문 (iterative statements) 4.4 분기문 (branching statements). 4.1 제어문의 개념. 컴퓨터 프로그램의 제어 컴퓨터 프로그램은 적어도 하나 이상의 문장들 (statements) 의 유기적인 구성을 통해 목적하는 특정작업을 수행 묵시적인 순차 제어
E N D
제4장 제어구조 4.1 제어문(control statements)의 개념 4.2 택일문(alternative statements) 4.3 반복문(iterative statements) 4.4 분기문(branching statements)
4.1 제어문의 개념 • 컴퓨터 프로그램의 제어 • 컴퓨터 프로그램은 적어도 하나 이상의 문장들(statements)의 유기적인 구성을 통해 목적하는 특정작업을 수행 • 묵시적인 순차 제어 • 문장들의 실행흐름의 과정은 명시적인 제어 명령이 없을 경우, 바로 다음 문장으로 제어권이 자동적으로 넘어감으로써 연이은 문장이 계속적으로 실행됨 • 프로그래밍 언어가 갖추어야 할 기본적인 제어구조의 형태 • 문장들의 순차적인 실행 • 어떤 조건이 만족될 때까지 연속적 문장의 수행 반복 • 선택될 행동간에 선택을 위한 조건 • 제어문의 종류
4.1 제어문의 개념(계속) • C 언어에 규정된 모든 제어문의 제어권이 행사되는 논리적 단위는 단문(single statement)이다. • 즉, 각 개별 제어문이 행사하는 제어권의 범위는 해당 제어문에 따라오는 목표(target)문에 국한됨 • 문장들의 시작과 끝을 중괄호 {}로 묶어줌으로써 코드 블록(code block)을 만들 수 있으며, 블록화된 문장들은 단문처럼 하나의 논리적 단위가 됨 • C 언어에서는 두 개 이상의 문장들을 묶어서 블록(block)화할 수 있는 데, 이것을 코드 블록(code block) 또는 복문(compound statement)이라고 부른다. …… if(minute >= 60) { hour = hour + 1; minute = minute - 60; }
4.2 택일문(alternative statements) • 택일문(alternative statements)은 선택조건에 따라 여러 개의 대안 중에서 하나의 대안을 선택할 때 사용 • 택일문은 크게 if 문을 쓰는 구조와 switch 문을 쓰는 구조가 있으며, 그 종류에는 if 문, if-else 문, switch-case 문 등이 있다. 4.2.1 if 문 ■ 문법 statement1; if(test_expression) statement2; statement3;
4.2 택일문(계속) • if문의 사용 예 (1) 옳은 예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; //구문 오류 발생
4.2 택일문(계속) • 예제 4.2 • 시간 합산 프로그램 ☑ 프로그램 #include <stdio.h> void main() { int hour, minute; hour = 2 + 3; minute = 50 + 55; 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.
4.2 택일문(계속) 4.2.2 if-else 문 • if-else 문은 두 개의 명령문 또는 두 개의 코드 블록 중에서 어느 쪽을 수행할 것인가를 결정할 때 사용 • 서로 배타적인 두 대안을 선택하는 프로그램에 적합 ■ 문법 statement1; if(test_expression) statement2; else statement3; statement4;
4.2 택일문(계속) • if-else 문의 예 (1) 사용예1 if (a > b) x = a - b; else x = b - a; (2) 사용예2 if (c == 'e') ++e_cnt; else ++other_cnt (3) 사용예3 if ('a' <= c && c <= 'z') { ++lower_cnt; /* 소문자 누계 */ printf("\n another lower case letter is found."); } else { ++other_cnt; printf("\n non-lower case letter is found."); }
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
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;
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
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
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; }
4.2 택일문(계속) • switch-case 문의 예 • (break 문을 사용한 예) • int x, y; • char z; • ……… • switch(x+y) • { • case 100: • z='A'; • break; • case 200: • z='B'; • break; • case 300: • z='C'; • break; • 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=' '; }
4.2 택일문(계속) • 예제 4.8 • 예제 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); break; case '*': printf("%d*%d=%d\n", a, b, a*b); break; case '/': printf("%d/%d=%d\n", a, b, a/b); break; default: printf("No such operator %c\n", op); } } ☑입력 Enter an expression : 5+10 ☑실행결과 5+10=15
4.3 반복문 • 반복문 • 반복문(iterative statements)은 명령문 집단을 반복 실행하기 위해 사용한다. 반복 구조에는 반복을 계속할 것인지를 검사하는 반복조건이 있어야 한다. • C 언어에서 제공하는 반복문에는 while 문, for 문, do-while 문이 있다. 4.3.1 while 문 ■ 문법 statement1; while(test_expression) statement2; statement3;
4.3 반복문(계속) • 예제 4.10 • while 문의 사용 예 (1) 옳은 예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;
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
4.3 반복문(계속) 예제 4.12예제 ☑ 프로그램 #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(); scanf("%c", &c); } 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); • break; • case '*': • printf("%d*%d=%d\n",a,b,a*b); • break; case '/': • printf("%d/%d=%f\n",a,b,(float)a/(float)b); • break; • } • printf("연산을 계속 하시겠습니까?(y or n)\n"); • d=getchar(); • } • getch(); • } • ꁾ 입력 • 연산을 하시겠습니까?(y or n) • y • <<어떤 연산을 원하세요? EX) + - * />> • 연산자 선택:+ • 값을 입력하세요 연산 예:A + B • A=10 • B=20 • ꁼ 실행결과 • 10+20=30
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.18 ꁼ 실행결과 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 ☑ 프로그램 #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; printf("\n\t"); } k=0; } getch(); }
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.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); }
4.4 분기문(계속) • 예제 4.39 ☑ 프로그램 /* 알파벳 출력 프로그램 */ #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까지가 { 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; } getch(); return 0; } ☑입력 *****알파벳 출력 프로그램***** 1. 알파벳 출력하기 2. 마치기!! ****************************** 당신이 원하는 작업 번호는? 1
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 문의 블록에 중첩된 블록 또는 함수가 되어서는 안 된다.
4.4 분기문(계속) • 예제 4.41 • goto 문의 사용 예 (1) 옳은 예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는 오류 */
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++; goto jump1; } else printf("termination!\n"); • do-while 문 또는 while 문에 의한 반복문 • 1)do{ • i++; • }while (i<10); • printf("termination!\n"); • 2)while (i<10) • { • i++; • printf("termination!\n"); • }
4.4 분기문(계속) • goto 문이 유용하다고 할 수 있는 한 경우 • 다음과 같이 중첩된 반복 구조로부터 단 한번에 탈출하기 위한 경우일 뿐이다. for( ...) for( ...) { .... if( troublesome) goto error /* 오류가 발생했음을 확인 */ } ..... error : message of error /* 오류 발생된 경우 실제로 실행할 문장 */ • null 명령문: 세미콜론(;)만으로 구성되는 명령문으로서 실행문이 없는 빈(null) 명령문 • while 문, for 문 및 do-while 문과 같은 반복문에서 실행문을 요구하지 않고, 다만 시간의 지연을 필요로 하는 경우에 빈 명령문을 작성할 수 있다. for(i=0; i<32000; i++) ; • goto 문에 대응하는 레이블 문의 위치에 실행문을 필요로 하지 않을 경우, 빈 명령문으로 작성할 수 있고, 복합문의 경우도 빈 명령문으로 구성할 수 있다.
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; }