[ 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 문의 일반 형식은 다음과 같다.
[ 그림 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
문은 가장 가까이 있는 하나의 반복 루프만을 벗어나게 한다. 일반 형식은 다음과 같
다.
다음 프로그램의 실행 결과를 나타내시오
▶ 프로그램
# 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 문을 내포하고 있는 반복문의 조건식으로 제어
가 이동하여 다음 반복을 계속 수행한다. 일반 형식은 다음과 같다.
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
|