[ C 언어 스터디 ]


자료출처 : 핵심 길잡이 C 프로그래밍 언어
도서출판 : 성안당

 

6. 제어문

프로그래밍 언어에서 제어문은 실행 순서를 변경시키거나 또는 조건에
따라 실행해야 할 명령문을 제어하는 데 사용하는 명령문이다. 일반적으로 프로그램
은 위에서부터 아래로 순차적으로 실행되지만 , 어떤 조건에 대해서만 실행하는 경우 ,
일정한 부분을 반복하여 실행하는 경우 , 실행 순서를 강제로 이동시켜 실행하는 경우가
있다. 구조적 프로그램밍 기법은 순차 ( sequence ) , 선택 ( selection ) , 반복 ( iteration ) 과
같이 세 가지 논리 구조로 구성된다.
C 언어에서 제어문은 if 문, switch ~ case 문, for 문, while 문, do ~ while 문, break 문,
continue 문, goto 문 등이 있다.

제어문 종류 선택 제어 반복 제어 무조건 분기

제어문

단순 if 문
if ~ else 문
다중 선택 if ~ else 문
중첩된 if ~ else 문
switch ~ case 문

for 문
while 문
do ~ while 문

 

goto 문

기타 제어문

break 문
continue 문

return 문

 

★ 선택 제어문 ★

< if 문 >

1. 단순 if 문

if 문은 선택 제어문 중에서 기본이 되는 명령문으로 명령 흐름의 조건에 따라 선택한다.
단순 if 문의 일반 형식은 다음과 같다.

형 식
if ( 조건식 ) 명령문 1 ;

[ 그림 6 - 1 ] 단순 if 문

위의 형식은 조건식이 참 ( true ) 이면 명령문 1을 실행하고, 거짓 ( false ) 이면 if 문 다음
의 명령문으로 제어가 이동하게 된다. 여기서 명령문 1은 하나 또는 여러 개의 명령문
들로 이루어질 수 있으며, 여러 개의 명령문일 경우에는 반드시 블록 ( { } ) 으로 묶어서
처리해야 한다.

if ( a > b )
max = a ;

와 같이 하나의 문장일 경우에는 블록으로 표시하지 않아도 되며, 반면에

if ( a > b )
{

temp = a ;
a = b ;
b= temp ;

}

인 경우에 있어서는 여러 개의 명령문이 있는 복합문이므로 블록으로 묶어 주어야
한다.

어떤 수를 입력받아 그 수가 짝수인지 훌수인지를 판별하는 프로그램을 단수 if 문을 사용 하여 작성하시오

▶ 프로그램

# include  < stdio.h >

void main ( void )
{

int  a ;
printf ( " 어떤 수를 입력하시오 : " ) ;
scanf ( " %d " , &a ) ;
if ( a % 2 ) printf ( " %d 는 홀수입니다. \n " , a ) ;
if ( ! ( a % 2 ) ) printf ( " %d는 짝수 입니다. \n " , a ) ;

}

▶ 실행 결과
어떤 수를 입력하시오 : 5    Enter Button Push
5 는 홀수입니다 .

C 언어에서는 조건식의 값이 1 이면 참, 0 이면 거짓으로 간주한다. 따라서  a % 2 에서
나머지가 1 이면 참, 0 이면 거짓이 된다.

다음 프로그램의 실행 결과를 나타내시오

▶ 프로그램

# include  < stdio.h >

void main ( void )
{

int  x = 10 , y = 20 ;
if ( x > y ) printf ( " %d is greater than %d \n " , x , y ) ;
if ( x < y ) printf ( " %d is less than %d \n " , x , y ) ;
if ( x == y ) printf ( " %d is equal to %d \n " , x , y ) ;

}

▶ 실행 결과
10 is less than 20

 

2. if ~ else 문

단순 if 문과는 달리 조건식이 참이냐 거짓이냐에 따라 실행할 명령문을 구분하여 실
행하는 조건문으로 일반 형식은 다음과 같다.

형 식

if ( 조건식 )
  명령문 1 ;
else
  명령문 2 ;

[ 그림 6 -2 ] if ~ else 문

위의 형식은 조건식의 값이 참이면 명령문 1 , 거짓이면 명령문 2 를 실행하고 if ~ else
문 다음의 명령문으로 제어가 이동한다.

두 개의 정수 a , b를 입력받아 큰 수는 변수 max에 작은 수는 변수 min에 기억시켜 출력하는 프로그램을 if ~ else 문을 이용하여 작성하시오.

▶ 프로그램

# include  < stdio.h >

void main ( void )
{

int  a , b , max , min ;
printf ( " 두 수 a , b를 입력하시오 : " ) ;
scanf ( " %d  %d " , &a , &b ) ;

if ( a > b )
{

max = a ;
min = b ;


}
else
{

max = b ;
min = a ;   

}

printf ( " max = %d , min = %d \n " , max , min ) ;

}

▶ 실행 결과
두 수 a , b를 입력하시오 : 100   200    Enter Button Push
max = 200 , min = 100

 

3. 다중 선택 if ~ else 문

다중 선택 if ~ else 문은 if ~ else 문이 확장된 형태이다. 다중 선택 if ~ else 문 안에 있는
문장은 단순 if 문으로 조건식을 차례로 비교한다. 일반 형식은 다음과 같다.

형 식

if ( 조건식 1 )
  명령문 1 ;
else if ( 조건식 2 )
  명령문 2 ;
else
  명령문n ;

[ 그림 6 - 3 ] 다중 선택 if ~ else 문

다중 선택 if ~ else 문은 조건식 1이 참이면 명령문 1을 실행한 후 if 제어문을 벗어나
고 , 그렇지 않으면 조건식 2을 검사하여 참이면 명령문 2를 실행한다. 즉 , 다중 선택 if ~
else 문 안에 있는 단순 if 문의 조건식들을 차례로 비교하여 실행이 이루어진다.

점수 ( score ) 를 입력받아 다음과 같이 학점 ( grade ) 을 부여하는 프로그램을 작성하시오

점수 학점

90 ~ 100

A

80 ~ 89

B

70 ~ 79

C

60 ~ 69

D

0 ~ 59

F

▶ 프로그램

# include  < stdio.h >

void main ( void )
{

int  score ;
char  grade ;

printf ( " SCORE => " ) ;
scanf ( " %d " , &score ) ;

if ( score >= 90 ) grade = 'A' ;
else if ( score >= 80 ) grade = 'B' ;
else if ( score >= 70 ) grade = 'C' ;
else if ( score >= 60 ) grade = 'D' ;
else  grade =  'F' ;

}

▶ 실행 결과
SCORE => 87    Enter Button Push
score = 87 ===> grade = B

 

키보드로 하나의 문자를 입력받아 대소문자를 변환하는 프로그램을 작성하시오

▶ 프로그램

# include  < stdio.h >

void main ( void )
{

char  c ;
int  ch ;

scanf ( " %c " , &c ) ;

if ( c >= 'a' && c <= 'z' )
{

ch = c - 32 ;
printf ( " %c 의 대문자는 %c 입니다. \n " , c , ch ) ;

}

else if ( c >= 'A' && c <= 'Z' )
{

ch = c + 32 ;
printf ( " %c 의 소문자는 %c 입니다. \n " , c , ch ) ;

}

else
printf ( " %c 는 영문자가 아닙니다. \n " ) ;

}

▶ 실행 결과
A     Enter Button Push
A 의 소문자는 a 입니다.
z     Enter Button Push
z 의 대문자는 Z 입니다.
%   Enter Button Push
% 는 영문자가 아닙니다.

 

4. 중첩된 if ~ else 문

중첩된 if ~ else 문은 if 문 안에 또 다른 if 문을 넣어 복합적으로 비교 판단하는 형태로
서 다중 선택 if ~ else 문과는 조금 차이가 있다. 일반 형식은 다음과 같다.

형 식

if ( 조건식 1 )

if ( 조건식 2 )
  명령문 1 ;
else
  명령문 2 ;

else
  명령문 3 ;

[ 그림 6 - 4 ] 중첩된 if ~ else 문

다음 프로그램의 실행 결과를 나타내시오

▶ 프로그램

# include  < stdio.h >

void main ( void )
{

int  number ;
scanf ( " %d " , &number ) ;

if ( number >= 50 )

if ( number <= 100 )

printf ( "number 는 50에서 100 사이의 값입니다. \n " ) ;

else

printf ( " number 는 100 보다 큰 값입니다. \n " ) ;

else

printf ( " number 는 50 보다 작은 값입니다. \n " ) ;

}

▶ 실행 결과
67      Enter Button Push
number는 50에서 100 사이의 값입니다.

 

< switch ~ case 문 >

주어진 조건식의 값에 따라 여러 개의 명령문 중에서 어느 특정한 명령문만을 실행
하고자 할 때  switch ~ case 문을 사용한다. 일반 형식은 다음과 같다.

형 식

switch ( 정수식 또는 정수형 변수 )
{

case 상수값 1 :  명령문1 ;  break ;
case 상수값 2 :  명령문2 ;  break ;
case 상수값 n :  명령문n ;  break ;
default :  명령문 n + 1 ;

}

괄호 안의 정수식이나 정수형 변수를 평가하여 그 결과가 case 다음의 값들과 일치
하는 것이 있으면 해당하는 case 에 있는 명령문들을 수행하고 break 문을 만나면
switch ~ case 문을 벗어난다. 일치하는 case 문이 없을 경우에는 default 문의 명령문을
실행하며 , default 문이 없을 경우에는 switch ~ case 문을 벗어난다.

다음 프로그램의 실행 결과를 나타내시오

▶ 프로그램

# include  < stdio.h >

void main ( void )
{

char  c ;
c = getchar ( ) ;

switch ( c )
{

case  'a'   : printf ( " one  \n " ) ;
case  'b'   : printf ( " two  \n " ) ;
case  'c'   : printf ( " three  \n " ) ;
default    : printf ( " Nothing \n " ) ;

}

}

▶ 실행 결과
b         Enter Button Push
two
three
nothing

 

위 예제 switch ~ case 문을 이용하여 프로그램을 작성하시오

# include  < stdio.h >

void main ( void )
{

int   score ;
char  grade ;

printf ( " SCORE => " ) ;
scanf ( " %d " , &score ) ;

switch ( score / 10 )
{

case 10 :
case 9 :  grade = 'A' ;  break ;
case 8 :  grade = 'B' ;  break ;
case 7 :  grade = 'C' ;  break ;
case 6 :  grade = 'D' ;  break ;
default :  grade = 'F' ; 

}

}

▶ 실행 결과
SCORE => 75      Enter Button Push
score = 75 ===> grade = c

 

 

★ 반복 제어문 ★

반복 제어문은 주어진 조건식의 값을 만족하는 동안 일정한 범위 내의 명령문들을
반복적으로 실행하는 명령문으로 for 문 while 문 do ~ while 문이 있다.

< 1. for 문 >

 for 문은 프로그램에서 반복 처리를 해야 할 때 가장 많이 사용되는 명령문으로 그
일반 형식과 순서도는 다음과 같다.

형 식

for ( 초기값 ;  조건식 ;  증감값 )
{

반복할 명령문

 }

[ 그림 6 - 7 ] for 문

조건식을 평가하여 참이면 반복할 명령문들을 실행하고 거짓이면 for 문을 벗어난다.
이때 증감값은 한 번씩 반복할 때마다 변화되는 값을 의미한다. 그리고 초기값과 증감
값은 1개 이상의 식으로 표현이 가능하며 이때 콤마 연산자 ( , ) 사용하여 구분한다.
예를 들어

for ( i = 0 ;  i < b ;  ++i )

        1          2         3 

1은 초기값으로 for 루프로 들어가기 전에 이 식의 값이 최초로 한 번 실행한다.

2는 조건식으로 식의 값이 참 ( true ) 이면 계속하여  for 루프 내의 명령문을 반복하여 수
행한다.

3은 증감값으로 푸프를 한 번씩 돌 때마나 i 의 값이 1씩 증가한다.
for 문은 형식에서 초기값 , 조건식 , 증감값 및 반복할 명령문들은 생략이 가능하지만
세미콜론 ( ; ) 은 생략할 수 없다 . 예를 들어
for ( ; ; ) ;
는 아무것도 실행하지 않으며
for ( ; ; ) printf ( " A \n " ) ;
는 하나의 문자만을 끓임없이 출력한다. 다음의 예는 증감값이 생략된 경우를 나타낸
것이다. 이때에는 반복할 명령문들 중 반드시 증감값이 존재해야 한다.

for ( i = 1 ;  i < 10 ; )
{

printf ( " i = %d \n " , i ) ;
i = i + 1 ;   /* 증감값 */

}

위의 문장은 다음과 같이 나타낼 수도 있다.

for ( i =1 ;  i < 10 ;  i++ )

printf ( " i = %d \n " , i ) ;

다음 프로그램의 실행 결과를 나타내시오

▶ 프로그램

# include  < stdio.h >

void main ( void )
{

int  count , sum ;
sum = 0 ;

for ( count = 1 ;  count <= 100 ;  count ++ )

sum += count ;

printf ( " 1 + 2 + 3 +......................+100 = %d \n " ,sum ) ;

}

▶ 실행 결과
1 + 2 + 3 +......................+100 = 5050

 

원하는 단수를 입력하여 구구단을 출력하는 프로그램을 작성하시오

▶ 프로그램

# include  < stdio.h >

void main ( void )
{

int  dan , count ;
scanf ( " %d " , &dan ) ;

for ( count = 1 ;  count <= 9 ;  count ++ )

printf ( " %d  *  %d = %d \n " , dan , count , dan * count ) ;

}

▶ 실행 결과

5 * 1 = 5      5 * 2 = 10     5 * 3 = 15     5 * 4 = 20     5 * 5 = 25     5 * 6 = 30     5 * 7 = 35     5 * 8 = 40     5 * 9 = 45 

 

위와는 별도로 for 문 내에 또 다른 for 문이 나오는 경우를 다중 for 문이라 한다. 다중
for 문의 일반 형식은 다음과 같다 .

형 식

for ( 초기값 ;  조건식 ;  증감값 )   /*  외부 ( outer ) for 문 */
{

for ( 초기값 ;  조건식 ;  증감값 )  /*  내부 ( inner ) for 문 */
{

반복할 명령문들 ;

}

}

외부 ( outer ) for 문이 한 번 수행될 때마다 내부 ( inner ) for 문은 지정된 반복 횟수만
큼 수행되는데 내부 for 문은 몇 개라도 중첩이 가능하다.

다음 프로그램의 실행 결과를 나타내시오

▶ 프로그램

# include  < stdio.h >

void main ( void )
{

int  i , j ;

for ( i =1 ;  i <= 3 ;  i++ )
{

printf ( " i = %d \n " , i ) ;

for ( j = 1 ;  j < = 4 ;  j ++ )

printf ( " \t  j = %d \n " ,j ) ;

}

}

▶ 실행 결과

i = 1                  j = 1              j = 2              j = 3              j = 4            i =  2                 j = 1              j = 2              j = 3              j = 4        i  =  3              j = 1              j = 2              j = 3              j = 4

 

< 2. while 문>

while 문은 조건식을 평가하여 조건이 참인 경우에만 반복 실행하고 , 조건이 거짓이면
while 문 다음 명령문을 실행한다. while 문은 조건이 거짓일 경우 반복할 명령문들을
한 번도 실행하지 않는다. 일반 형식은 다음과 같다.

형 식

while ( 조건식 )
{

명령문 1 ;
명령문 2 ;
명령문 n ;

}

 

[ 그림 6 - 8 ] while 문

이 때 반복할 명령문들이 하나 이상인 경우에는 반드시 블록 ( { } ) 으로 묶어 주어야 한
다.

while 문을 이용하여 1에서 100까지 정수의 합을 구하는 프로그램을 작성하시오

▶ # include  < stdio.h >

void main ( void )
{

int  i = 1 , sum = 0 ;

while ( i < 100 )
{

sum += i ;
i++ ;

}

printf ( " 1 + 2 + 3 +........... + 100 = %d \n " , sum ) ;

}

▶ 실행 결과
1 + 2 + 3 +........... + 100 = 5050

※ while 문과 for 문의 차이
while 문과 for 문의 가장 큰 차이는 for 문은 초기값 , 조건식 , 증감값에 의해 반복 수행
을 처리하는 반면에 , while 문은 조건식만 존재하는 명령문이라는 것이다. for 문을
while 문으로 변경하는 방법은 다음과 같다.

[ 표 6 - 1 ] for 문과 while 문의 비교

for 문 while 문

for ( 초기값 ; 조건식 ; 증감값 )
{

}

초기값 ;
while ( 조건식 )
{

명령문 ;
증감값 ;

}

< 3. do ~ while 문 >

while 문이나 for 문에서는 조건식의 참 , 거짓 여부를 먼저 평가한 다음에 참인 경우에
반복문을 실행하였으나 , do ~ while 문은 루프 ( loop ) 안의 명령문들을 무조건 한 번 실
행한 후 조건식이 참인 경우에 한해 반복문을 실행한다. 일반 형식은 다음과 같다.

형 식

do
{

명령문 1 ;
명령문 2 ;
명령문 n ;

} while ( 조건식 )

[ 그림 6 - 9 ] do ~ while 문

do ~ while 문을 이용하여 1에서 100까지 정수의 합을 구하는 프로그램을 작성하시오

▶ 프로그램

# include  < stdio.h >

void main ( void )
{

int  i = 1 ,  sum = 0 ;

do
{

sum += i ;
i++ ;

} while ( i <= 100 ) ;

printf ( " 1 + 2 + 3 +........ + 100 = %d \n " , sum ) ;

}

▶ 실행 결과
1 + 2 + 3 +........ + 100 = 5050

 

★ 기타 제어문 ★

< 1. break 문 >

break 문은  while 문 ,  do ~ while 문 switch ~ case 문  for 문 등의 반복문 내부에서 반복
문 외부로 제어를 이동시켜 다음 명령문을 실행하도록 만드는 명령문이다. 이때 break
문은 가장 가까이 있는 하나의 반복 루프만을 벗어나게 한다. 일반 형식은 다음과 같
다.

형 식
break ;

 

다음 프로그램의 실행 결과를 나타내시오

▶ 프로그램

# include  < stdio.h >

void main ( void )
{

int  n ;

for ( n = 1 ; n <= 10 ; n++ )
{

if ( n >= 5 ) break ;
else  printf ( " %d \n " , n ) ;

}

}

▶ 실행 결과
1
2
3
4

 

< 2. continue 문 >

continue 문은 for 문 , while 문,   do ~ while 문에서 처리를 일시적으로 생략하고자
하는 경우에 사용하는 명령문이다. continue 문을 만나면 continue 문 이후 반복문의 끝
부분까지의 명령문은 생략되고 continue 문을 내포하고 있는 반복문의 조건식으로 제어
가 이동하여 다음 반복을 계속 수행한다. 일반 형식은 다음과 같다.

형 식
continue ;

 

1에서 10까지 정수 중 7을 제외한 나머지 수들을 출력하는 프로그램을 작성하시오

▶ 프로그램

# include  < stdio.h >

void main ( void )
{

int  i ;

for ( i = 1 ;  i <= 10 ;  i++ )
{

if ( i == 7 )  continue ;
printf ( " %d " , i ) ;

}

printf ( " \n " ) ;

}

▶ 실행 결과
1 2 3 4 5 6 8 9 10

 

< 3. goto 문 >

 goto문은 다른 언어와 마찬가지로 지정된 레이블 ( lable ) 로 무조건 분기하는 명령문
이다. 그러나 프로그램에 goto 문을 많이 사용하는 경우에는 프로그램이 복잡해질 수 있
다. 따라서 구조적 프로그래밍에서는 될 수 있는 한 goto문을 사용하지 않는 것이 프로
그램의 이해 및 수정이 용이하다.

형 식

goto  레이블명 ;

레이블명 :

   명령문 ;

 

다음 프로그램의 실행 결과를 나타내시오

▶ 프로그램

# include  < stdio.h >

void main ( void )
{

int  n = 0 ,  sum = 0 ;

begin :

n++ ;
sum += n ;

if ( n == 100 )

printf ( " 1 + 2 + 3 + ............ + 100 = %d \n " , sum ) ;

else

goto  begin ;

}

▶ 실행 결과
1 + 2 + 3 + .............. + 100 = 5050