제 4 장 제어구조

45
1 Yes C Yes C 제4 제제제제 제제제제 4 4 제 제제제제 제 제제제제 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)

Upload: austine-janus

Post on 03-Jan-2016

101 views

Category:

Documents


0 download

DESCRIPTION

제 4 장 제어구조. 4.1 제어문 (control statements) 의 개념 4.2 택일문 (alternative statements) 4.3 반복문 (iterative statements) 4.4 분기문 (branching statements). 4.1 제어문의 개념. 컴퓨터 프로그램의 제어 컴퓨터 프로그램은 적어도 하나 이상의 문장들 (statements) 의 유기적인 구성을 통해 목적하는 특정작업을 수행 묵시적인 순차 제어 - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 제 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)

Page 2: 제 4 장 제어구조

22Yes CYes C 제제 44 장 제어구조장 제어구조

4.1 4.1 제어문의 개념제어문의 개념

컴퓨터 프로그램의 제어– 컴퓨터 프로그램은 적어도 하나 이상의 문장들 (statements) 의 유기적인

구성을 통해 목적하는 특정작업을 수행• 묵시적인 순차 제어

– 문장들의 실행흐름의 과정은 명시적인 제어 명령이 없을 경우 , 바로 다음 문장으로 제어권이 자동적으로 넘어감으로써 연이은 문장이 계속적으로 실행됨

프로그래밍 언어가 갖추어야 할 기본적인 제어구조의 형태• 문장들의 순차적인 실행• 어떤 조건이 만족될 때까지 연속적 문장의 수행 반복• 선택될 행동간에 선택을 위한 조건

제어문의 종류

제어문제어문

택일문택일문

분기문분기문

if 문, if- else 문, switch- case 문

goto 문, return 문, break 문, continue 문

반복문반복문 while 문, for 문, do- while 문

Page 3: 제 4 장 제어구조

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;

}

Page 4: 제 4 장 제어구조

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

Page 5: 제 4 장 제어구조

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; // 구문 오류 발생

Page 6: 제 4 장 제어구조

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.

Page 7: 제 4 장 제어구조

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

Page 8: 제 4 장 제어구조

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."); }

Page 9: 제 4 장 제어구조

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

Page 10: 제 4 장 제어구조

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

Page 11: 제 4 장 제어구조

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

Page 12: 제 4 장 제어구조

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

Page 13: 제 4 장 제어구조

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

Page 14: 제 4 장 제어구조

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=' '; }

Page 15: 제 4 장 제어구조

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

Page 16: 제 4 장 제어구조

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

Page 17: 제 4 장 제어구조

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;

Page 18: 제 4 장 제어구조

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

Page 19: 제 4 장 제어구조

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

Page 20: 제 4 장 제어구조

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

Page 21: 제 4 장 제어구조

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++;

Page 22: 제 4 장 제어구조

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;

Page 23: 제 4 장 제어구조

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;

Page 24: 제 4 장 제어구조

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) 은 모두 같은 결과를 제공한다 .

Page 25: 제 4 장 제어구조

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) 는 모두 같은 결과를 제공한다 .

Page 26: 제 4 장 제어구조

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

Page 27: 제 4 장 제어구조

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();}

Page 28: 제 4 장 제어구조

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

Page 29: 제 4 장 제어구조

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();}

Page 30: 제 4 장 제어구조

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)\ 로 출력 */ }}

Page 31: 제 4 장 제어구조

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

Page 32: 제 4 장 제어구조

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

Page 33: 제 4 장 제어구조

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

Page 34: 제 4 장 제어구조

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);

Page 35: 제 4 장 제어구조

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

Page 36: 제 4 장 제어구조

3636Yes CYes C 제제 44 장 제어구조장 제어구조

4.3 반복문 ( 계속 )

예제 4.35 무한 루프의 예

(1) while(1) { /* 다른 프로그램 문장들 */ }

(2) do { /* 다른 프로그램 문장들 */ }while(1);

(3) for( ; ; ) { /* 다른 프로그램 문장들 */ }

Page 37: 제 4 장 제어구조

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"); }}

Page 38: 제 4 장 제어구조

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;}

Page 39: 제 4 장 제어구조

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);}

Page 40: 제 4 장 제어구조

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

Page 41: 제 4 장 제어구조

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 문의 블록에 중첩된 블록 또는 함수가 되어서는 안 된다 .

Page 42: 제 4 장 제어구조

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 는 오류 */

Page 43: 제 4 장 제어구조

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"); }

Page 44: 제 4 장 제어구조

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 문에 대응하는 레이블 문의 위치에 실행문을 필요로 하지 않을 경우 , 빈 명령문으로 작성할 수 있고 , 복합문의 경우도 빈 명령문으로 구성할 수 있다 .

Page 45: 제 4 장 제어구조

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;}