제 4 장 제어구조
-
Upload
austine-janus -
Category
Documents
-
view
102 -
download
0
description
Transcript of 제 4 장 제어구조
11Yes CYes C 제제 44 장 제어구조장 제어구조
제제 44 장 제어구조장 제어구조
4.1 4.1 제어문제어문 (control statements)(control statements) 의 개념의 개념4.2 4.2 택일문택일문 (alternative statements)(alternative statements)4.3 4.3 반복문반복문 (iterative statements)(iterative statements)4.4 4.4 분기문분기문 (branching statements)(branching statements)
22Yes CYes C 제제 44 장 제어구조장 제어구조
4.1 4.1 제어문의 개념제어문의 개념
컴퓨터 프로그램의 제어– 컴퓨터 프로그램은 적어도 하나 이상의 문장들 (statements) 의 유기적인
구성을 통해 목적하는 특정작업을 수행• 묵시적인 순차 제어
– 문장들의 실행흐름의 과정은 명시적인 제어 명령이 없을 경우 , 바로 다음 문장으로 제어권이 자동적으로 넘어감으로써 연이은 문장이 계속적으로 실행됨
프로그래밍 언어가 갖추어야 할 기본적인 제어구조의 형태• 문장들의 순차적인 실행• 어떤 조건이 만족될 때까지 연속적 문장의 수행 반복• 선택될 행동간에 선택을 위한 조건
제어문의 종류
제어문제어문
택일문택일문
분기문분기문
if 문, if- else 문, switch- case 문
goto 문, return 문, break 문, continue 문
반복문반복문 while 문, for 문, do- while 문
33Yes CYes C 제제 44 장 제어구조장 제어구조
4.1 4.1 제어문의 개념제어문의 개념 (( 계속계속 ))
C 언어에 규정된 모든 제어문의 제어권이 행사되는 논리적 단위는 단문 (single statement) 이다 .
– 즉 , 각 개별 제어문이 행사하는 제어권의 범위는 해당 제어문에 따라오는 목표 (target) 문에 국한됨
– 문장들의 시작과 끝을 중괄호 {} 로 묶어줌으로써 코드 블록 (code block) 을 만들 수 있으며 , 블록화된 문장들은 단문처럼 하나의 논리적 단위가 됨
C 언어에서는 두 개 이상의 문장들을 묶어서 블록 (block) 화할 수 있는 데 , 이것을 코드 블록 (code block) 또는 복문 (compound statement) 이라고 부른다 .
……if(minute >= 60) {
hour = hour + 1; minute = minute - 60;
}
44Yes CYes C 제제 44 장 제어구조장 제어구조
4.2 택일문 (alternative statements)
• 택일문 (alternative statements) 은 선택조건에 따라 여러 개의 대안 중에서 하나의 대안을 선택할 때 사용
– 택일문은 크게 if 문을 쓰는 구조와 switch 문을 쓰는 구조가 있으며 , 그 종류에는 if 문 , if-else 문 , switch-case 문 등이 있다 .
4.2.1 if 문
문법■statement1;
if(test_expression) statement2;
statement3;
statement(s)1
statement(s)2
statement(s)3
test_expressiontrue
if statement
false
55Yes CYes C 제제 44 장 제어구조장 제어구조
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; // 구문 오류 발생
66Yes CYes C 제제 44 장 제어구조장 제어구조
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.
77Yes CYes C 제제 44 장 제어구조장 제어구조
4.2 택일문 ( 계속 )
4.2.2 if-else 문 – if-else 문은 두 개의 명령문 또는 두 개의 코드 블록 중에서 어느 쪽을
수행할 것인가를 결정할 때 사용– 서로 배타적인 두 대안을 선택하는 프로그램에 적합
문법■statement1;
if(test_expression) statement2;else
statement3;
statement4;
statement(s)1
statement(s)3
test_expressiontrue
if- else statement
false
statement(s)4
statement(s)2
88Yes CYes C 제제 44 장 제어구조장 제어구조
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."); }
99Yes CYes C 제제 44 장 제어구조장 제어구조
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: 10input2: 20 실행결과ꁼ
MAX = 20
1010Yes CYes C 제제 44 장 제어구조장 제어구조
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;
elsestatement5;
statement6;
test_expression1true
else- if statement
false
statement(s)2
statement(s)1
test_expression2
false
statement(s)3
statement(s)5
test_expression3
false
statement(s)4
true
true
statement(s)6
test_expression1true
else- if statement
false
statement(s)2
statement(s)1
test_expression2
false
statement(s)3
statement(s)5
test_expression3
false
statement(s)4
true
true
statement(s)6
1111Yes CYes C 제제 44 장 제어구조장 제어구조
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
1212Yes CYes C 제제 44 장 제어구조장 제어구조
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
1313Yes CYes C 제제 44 장 제어구조장 제어구조
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;
}
test_expression1true
else- if statement
false
statement(s)2
statement(s)1
test_expression2
false
statement(s)3
statement(s)5
test_expression3
false
statement(s)4
true
true
statement(s)6
test_expression1true
else- if statement
false
statement(s)2
statement(s)1
test_expression2
false
statement(s)3
statement(s)5
test_expression3
false
statement(s)4
true
true
statement(s)6
1414Yes CYes C 제제 44 장 제어구조장 제어구조
4.2 택일문 ( 계속 )
예제 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=' '; }
• 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=' '; }
1515Yes CYes C 제제 44 장 제어구조장 제어구조
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
1616Yes CYes C 제제 44 장 제어구조장 제어구조
4.3 반복문
반복문– 반복문 (iterative statements) 은 명령문 집단을 반복 실행하기 위해 사용한
다 . 반복 구조에는 반복을 계속할 것인지를 검사하는 반복조건이 있어야 한다 .
– C 언어에서 제공하는 반복문에는 while 문 , for 문 , do-while 문이 있다 .
4.3.1 while 문 문법■
statement1;while(test_expression)
statement2;
statement3;
statement(s)1
statement(s)2
statement(s)3
test_expressiontrue
false
while loop
1717Yes CYes C 제제 44 장 제어구조장 제어구조
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;
1818Yes CYes C 제제 44 장 제어구조장 제어구조
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
1919Yes CYes C 제제 44 장 제어구조장 제어구조
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 + BA=10B=20 실행결과ꁼ
10+20=30
2020Yes CYes C 제제 44 장 제어구조장 제어구조
4.3 반복문 ( 계속 )
4.3.2 for 문• for 문은 반복횟수를 미리 알 수 있는 경우에 사용되는 while 문의 특수한
경우라고 할 수 있다 .
■ 문법statement1;for(init_expression; test_expression; update_expression) {statement2;}
statement3;init_expression
statement(s)2
statement(s)3
test_expression
true
false
statement(s)1
update_expression
for loop
2121Yes CYes C 제제 44 장 제어구조장 제어구조
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++;
2222Yes CYes C 제제 44 장 제어구조장 제어구조
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;
2323Yes CYes C 제제 44 장 제어구조장 제어구조
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;
2424Yes CYes C 제제 44 장 제어구조장 제어구조
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) 은 모두 같은 결과를 제공한다 .
2525Yes CYes C 제제 44 장 제어구조장 제어구조
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) 는 모두 같은 결과를 제공한다 .
2626Yes CYes C 제제 44 장 제어구조장 제어구조
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
2727Yes CYes C 제제 44 장 제어구조장 제어구조
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();}
2828Yes CYes C 제제 44 장 제어구조장 제어구조
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
2929Yes CYes C 제제 44 장 제어구조장 제어구조
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();}
3030Yes CYes C 제제 44 장 제어구조장 제어구조
4.3 반복문 ( 계속 )
예제 4.25 아스키코드 테이블 (ASCII code table) 출력 : 아스키코드값 32~ 1
27 사이에 일치하는 문자를 출력하는 프로그램을 작성하라 . ☑ 프로그램
#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)\ 로 출력 */ }}
3131Yes CYes C 제제 44 장 제어구조장 제어구조
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
3232Yes CYes C 제제 44 장 제어구조장 제어구조
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=4A=2 B=6 C=4 D=8A=2 B=9 C=6 D=2A=5 B=7 C=1 D=2
3333Yes CYes C 제제 44 장 제어구조장 제어구조
4.3 반복문 ( 계속 )
4.3.3 do-while 문• do-while 구조는 while 구조와 비슷하나 반복조건을 검사하는 위치가
다르다 .
■ 문법statement1;do{ statement2;}while(test_expression);
statement3;
statement(s)2
statement(s)3
test_expression
true
false
statement(s)1
do- while loop
3434Yes CYes C 제제 44 장 제어구조장 제어구조
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);
3535Yes CYes C 제제 44 장 제어구조장 제어구조
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
3636Yes CYes C 제제 44 장 제어구조장 제어구조
4.3 반복문 ( 계속 )
예제 4.35 무한 루프의 예
(1) while(1) { /* 다른 프로그램 문장들 */ }
(2) do { /* 다른 프로그램 문장들 */ }while(1);
(3) for( ; ; ) { /* 다른 프로그램 문장들 */ }
3737Yes CYes C 제제 44 장 제어구조장 제어구조
4.4 분기문
– 분기문 (branching statements) 은 제어의 흐름을 다른 곳으로 이동하는 문장으로서 break, continue, return 그리고 goto 가 있다 .
4.4.1 break 문• break 문은 반복문이나 switch-case 문에서 완전히 빠져 나오고자 할
때 사용– 예컨대 , 반복문에서 조건에 관계없이 즉시 반복과정으로부터 이탈하고자
할 경우에는 break 문을 사용할 수 있다 . – break 문이 실행되면 , 자신이 포함된 코드 블록으로부터 실행흐름을 벗어나게 한다 .
가령 , 블록 내에 블록이 내포된 중첩 블록 구조에서 break 문이 실행되면 모든 블록으로부터 단 한번에 빠져나오는 것이 아니라 자신이 포함된 하나의 블록만을 벗어하는 것이다 .
다시 말해서 , 반복문이 중첩되어 있으면 break 문은 해당 반복 블록만을 벗어남에 따라 중첩된 반복 블록을 완전히 벗어나지 못한다 .
• 예제 4.36for(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"); }}
3838Yes CYes C 제제 44 장 제어구조장 제어구조
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;}
3939Yes CYes C 제제 44 장 제어구조장 제어구조
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);}
4040Yes CYes C 제제 44 장 제어구조장 제어구조
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
4141Yes CYes C 제제 44 장 제어구조장 제어구조
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 문의 블록에 중첩된 블록 또는 함수가 되어서는 안 된다 .
4242Yes CYes C 제제 44 장 제어구조장 제어구조
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 는 오류 */
4343Yes CYes C 제제 44 장 제어구조장 제어구조
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"); }
4444Yes CYes C 제제 44 장 제어구조장 제어구조
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 문에 대응하는 레이블 문의 위치에 실행문을 필요로 하지 않을 경우 , 빈 명령문으로 작성할 수 있고 , 복합문의 경우도 빈 명령문으로 구성할 수 있다 .
4545Yes CYes C 제제 44 장 제어구조장 제어구조
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;}