제어문
• 제어문
– 프로그램은 순차적으로 각 문장을 실행시키는 단순한 구조
– 복잡한 문제를 해결하기 위해서 제어문을 사용
– 제어문에는 조건에 따라 문장을 실행하게 하는 조건문과 특정 문장을 계속해서 반복시키는 반복문이 있다.
– 제어문의 사용은 프로그래밍에 있어서 가장 기본이 되는 중요한 부분
2
제어문
조건문
반복문
if(연봉 > 2500)취업;
else고시준비;
while(토플성적 < 80)영어공부;
조건문
조건문
• 조건문
– 문제를 해결할 때 어떤 조건에 따라서
두 개 또는 여러 개의 실행경로 가운데
하나를 선택하는 경우 사용
– 조건문을 사용함으로써 code 문장의
조건적인 실행이 가능해 짐.
• 조건문의 종류
4
문장 행동
if, else, else if 조건에 따라 실행을 할 것인지 안 할 것인지 정함.
continue, break 루프의 생략과 탈출
switch, case 선택적으로 실행.
날씨가좋은가?
테니스를 친다
YES
NO
if 문
• if 문
– if 라는 단어는 “만약에 어떠한 조건이 만족된다면”이라는 뜻을 지닌다.
– 주어진 조건이 만족하면 그에 해당하는 일을 하는 문장이다.
5
if (실행 조건){
실행하고자 하는 내용;}
조건이 만족하지 않을 경우 건너 뛴다.
조건이 만족 할 경우실행한다.
else 문
• else 문
– else문은 독립적으로 사용하는 것이 아니라 if문장과 더불어 하나의 문장을 구성하여 사용된다.
6
if (실행 조건){
실행하고자 하는 내용1;}else{
실행하고자 하는 내용2;}
조건이 만족하지 않을 경우 else 부분의 내용을 실행한다.
조건이 만족 할 경우 if 부분의 내용을 실행한다.
if else 예제
7
#include <stdio.h>
int main (void){
int n;scanf (“%d”, &n);if( n == 1 ){
printf(“1을 입력하였습니다.\n”);}else{
printf(“1이 아닌 숫자를 입력하였습니다.\n”);}return 0;
}
else if 문
• else if 문
– if 문과 같이 쓰이며 if 문장 후 else if는 몇 개이이든 올 수 있다.
– 맞는 조건을 찾으면 그 후의 조건은 건너 뛴다는 장점이 있다.
– if, else if, else 문장은 if, else 문장의 중첩된 형태로 표현 가능하다.
8
if (조건1){
실행하고자 하는 내용1;}else if (조건2){
실행하고자 하는 내용2;}else if (조건3){
실행하고자 하는 내용3;}else{
실행하고자 하는 내용4;}
조건 1이 만족하면 내용1 실행하고그 밑의 else 끝까지의 내용은 무시한다.
조건 1이 만족하지 않으면 조건 2 확인.조건 2 만족하면 내용2 실행하고
그 밑의 else 끝까지의 내용은 무시한다.
조건 1, 조건2이 만족하지 않으면 조건 3 확인.조건 3 만족하면 내용3 실행하고
그 밑의 else 끝까지의 내용은 무시한다.
조건 1, 조건2, 조건3이 만족하지 않으면내용 4 실행한다.
조건1, 조건2, 조건3 동시에 만족 시킨다고해도 내용1만 실행된다.
else if 문
• if, else if, else 문장과 if, else 문장 비교
– else if 문장은 if, else문장으로 바꿀 수 있다.
9
if (조건1){
실행하고자 하는 내용1;}else if (조건2){
실행하고자 하는 내용2;}else if (조건3){
실행하고자 하는 내용3;}else{
실행하고자 하는 내용4;}
if (조건1){
실행하고자 하는 내용1;}else {
if (조건2){
실행하고자 하는 내용2;}else{
if (조건3){
실행하고자 하는 내용3;}else{
실행하고자 하는 내용4;}
}}
switch 문
• switch 문
– 분기의 수가 많아지면 if else보다 switch문을 사용하는 것이 좋다.
– 하나의 인자를 받아서 실행할 영역을 결정짓는다.
– 실행할 영역은 case문으로 구분하고 영역 값은 반드시 정수이어야 한다.
– 마지막의 default문은 else문과 유사하다.
– 특성상 해당되는 영역을 실행한 다음 빠져 나오기 위해 break문을 사용해야 한다
10
switch (영역 구분 인자){
case 영역 값 :실행영역;break;
……default :
실행영역;}
switch 문
• switch 문의 구문
11
switch ( n ){
case 1 :실행영역1;break;
case 2 :실행영역2;break;
case 5 :실행영역3;break;
default :실행영역4;
}
case 1은 첫번째 경우라는 것이 아니라 n이 1인경우라는 뜻이다.
n 값이 1이면 실행영역1, 2이면실행영역2, 5이면 실행영역3이실행되고 그외의 값이면 실행영역4가 실행된다.
default가 없을 경우 n값이그외의 값일 경우 아무것도실행하지 않는다.
정수형 이어야 한다.
화면 출력 결과:n = 2 이다.
switch
• switch 문에서의 break 사용
– break: 반복 문이나 조건 문을 빠져나갈 때 사용한다.
12
n=2;switch (n){
case 1 :printf(“n = 1 이다. \n”);break;
case 2 :printf(“n = 2 이다. \n”);break;
case 5 :printf(“n = 5 이다. \n”);break;
default :printf(“n은 1,2,5가 아니다. \n”);
}
[단계1] n과 영역 값 1 비교
[단계2] n과 영역 값 2 비교
[단계3] n이 2이므로 실행
[단계4] break문의 의한 탈출
switch
• break문이 없는 경우
– break문이 없는 경우 조건이 맞는 영역을 실행 한 후에 그 다음 영역의 조건이 맞는지 확인하지 않고 나머지 실행 내용을 전부 실행 한다.
13
n=2switch (n){
case 1 :printf(“n = 1 이다. \n”);
case 2 :printf(“n = 2 이다. \n”);
case 5 :printf(“n = 5 이다. \n”);
default :printf(“n은 1,2,5가 아니다. \n”);
}
[단계1] n과 영역 값 1 비교
[단계2] n과 영역 값 2 비교
[단계3] n이 2이므로 실행
[단계4] 실행영역3 실행
[단계5] 실행영역4 실행
[단계6] 전부 실행 하였으므로 끝
일단 한번 조건이맞으면 그 이후에는 영역 값과 비교를 하지 않는다.
화면 출력 결과:n = 2 이다.n = 5 이다.n은 1,2,5가 아니다
반복문
반복문
• 반복문
– 특정한 영역을 특정한 조건이 만족하는 동안 반복 실행 하기 위한 문장
– 프로그래밍 중 동일한 처리과정을 여러 번 반복하여야 할 때 반복 문을 사용함으로써 코드를 간결하고 빠르게 작성 가능
– 예시) 10000명의 학생의 성적을 입력 받으시오.
15
…scanf(%d, studen1);scanf(%d, studen2);…
scanf(%d, studen9999);scanf(%d, studen10000);
…
10000번의반복
16
반복문
• 반복문의 종류
반복문의 종류 구문 특징
while
while(조건 검사){
while문 몸체;}
구문이 간단하다.조건 지정을 잘못하면 무한반복할 위험이 높다.
do while
do{
do while문 몸체;} while(조건 검사);
몸체 행동을 최소 한번은 실행한다.구문이 간단하다.
for
for (초기화;조건 검사;증감 연산){
for문 몸체;}
일정한 반복 횟수를 이용하는 반복문에 적합하다.
while 문
• while 문
– while 문의 기본원리는 특정 조건을 주고 그 조건이 만족될 때까지 계속해서 반복을 하는 것
• while 문의 구문
17
while (반복 조건){
반복 내용;}
“반복 조건”이 만족되는 동안“반복 내용”을 반복 실행함.
k = 0;while (k < 3){
printf(“ESSLab\n”);k++;
}
“k < 3”이 만족 되는 동안“printf()”와 “k++”을반복 실행함.
“반복 내용”이 한 문장인경우 중괄호는 생략 가능하다.
while 문
• 증감연산의 필요성
– 반복문의 조건이 무너질 수 있는 상황을 만들기 위해서 필요하다.
– 증감 연산이 없을 경우 반복내용을 무한히 반복하는 상황이 나오게 된다.
18
k = 0;while (k < 3){
printf(“EssLab\n”);k++;
} 증가 연산.
while 문의 이해 1
19
while (k < 3){
printf(“EssLab\n”);k++;
}
k = 0;
[단계2] 0 < 3 은 True. 반복조건이 만족 된다.
[단계3] 루프 내의 문장들을 실행. EssLab\n을화면에 출력. k값 1 증가. (현재 k값은 1)
[단계1] 변수 k를 0으로 초기화
[단계4] 루프 끝에서 다시 올라간다.
• while문 예제
while 문의 이해 2
20
while (k < 3){
printf(“EssLab\n”);k++;
}
[단계5] 1 < 3 은 True. 반복 조건이 만족됨.
[단계6] 루프 내의 문장들을 실행. EssLab\n을 화면에 출력. k값 1 증가. (현재 k값은 2)
[단계7] 루프 끝에서다시 올라간다.
while (k < 3){
printf(“EssLab\n”);k++;
}
[단계8] 2 < 3 은 True. 반복조건이 만족됨.
[단계9] 루프 내의 문장들을 실행. EssLab\n을 화면에 출력. k값 1 증가. (현재 k값은 3)
[단계10] 루프 끝에서 다시 올라간다.
while 문의 이해 3
21
while (k < 3){
printf(“EssLab\n”);k++;
}
return 0;
[단계12] while 문 탈출.
[단계11] 3 < 3 은 False. 반복조건을 만족하지 않음.
[단계13] main 함수 끝내기.
do ~ while 문
• do ~ while 문
– while과 기본 원리가 같다.
– while과는 다르게 반복 조건의 검사를 뒤에서 하기 때문에 do ~ while문은 반복내용을 반드시 한번은 실행하게 되어 있다.
• do ~ while 문의 구문
22
do{
반복내용;} while (반복조건);
“반복 조건”이 만족되는 동안“반복 내용”을 반복 실행함.
do{
printf(“Hello World!\n”);k++;
} while (k < 3);
“printf()”와 “k++”을 한번 실행 후“k < 3”이 만족 되는 동안
“printf()”와 “k++”을 반복 실행함.
일단 한번은 실행한 후.
do ~ while 문 과 while 문의 차이
• While 문과 do ~ while 문의 차이
23
k = 3;while (k < 3){
printf(“ESSLab\n”);k++;
}
k = 3;do{
printf(“ESSLab\n”);k++;
} while (k < 3);
[While 문 예제]에서는 while 안의 함수가 실행 되지 않는다.[do ~ while문 예제]에서는 do ~ while 안의 함수가 실행 된다.
for 문
• for 문
– 가장 많이 사용되는 반복문.
• for 문의 구문
– 초기화, 조건 검사, 증감 연산 3개의 문장을 기본적으로 포함하고 있다.
24
for (초기화 ; 조건검사 ; 증감 연산){
반복내용;}
for 문
• while문과 for문 비교
– while은 조건문은 포함하였지만 초기문은 while 문 전에 증감문은 while 문 반복내용에 포함하고 있다.
25
int k=0;while (k<3){
printf(“EssLab\n”);k++;
}
int k;for (k=0 ; k<3 ; k++){
printf(“EssLab\n”);}
증감 연산
조건 검사
초기화
• for 문 예제
for 문의 이해 1
26
#include <stdio.h>
int main(void){
int k;for (k=0 ; k<3 ; k++){
printf(“EssLab\n”);}return 0;
}
for 문의 이해 2
27
int k;[단계1] 변수 k를 선언.
for (k=0 ; k<3 ; k++){
printf(“EssLab\n”);}
[단계2] k의 값을 0으로 초기화.
[단계3] 조건 비교. (현재k 값은 0)
[단계5] 루프 끝에서 다시 올라감.
[단계4] 조건이 만족하므로 EssLab\n을화면에 출력.
[단계6] k의 값을 1증가.
for 문의 이해 3
28
for (k=0 ; k<3 ; k++){
printf(“EssLab\n”);}
[단계7] 조건 비교. (현재k 값은 1)
[단계9] 루프 끝에서 다시 올라감.
[단계8] 조건이 만족하므로 EssLab\n을화면에 출력.
[단계10] k의 값을 1증가.
for (k=0 ; k<3 ; k++){
printf(“EssLab\n”);}
[단계11] 조건 비교. (현재k 값은 2)
[단계13] 루프 끝에서 다시 올라감.
[단계12] 조건이 만족하므로 EssLab\n을화면에 출력.
[단계14] k의 값을 1증가.
for 문의 이해
29
return 0;[단계17] main 함수 끝내기.
for (k=0 ; k<3 ; k++){
printf(“EssLab\n”);}
[단계15] 조건 비교. (현재k 값은 3)
[단계16] 조건이만족하지 않으므로for문 빠져 나옴.
무한 루프
• 무한 루프
– 항상 반복 조건을 만족시켜서 반복문을 빠져 나오지 못하게 될 때 무한루프에 빠졌다고 한다.
– 프로그램을 구현 하다 보면 무한 루프가 필요한 경우도 생기지만 원치 않는 무한루프는 피해야 한다.
– 의도적인 무한 루프 이외에는 반복의 조건이 어느 시점에서 무너질 수 있도록 반복문을 적절히 구성해야 한다.
30
int k = 1;while (k < 10){
printf(“new\n”);}
while (1){
printf(“new\n”);}
while문 몸체에 k에 대한 증감연산이 없어서 반복 조건을 항상 만족하게 된다.
1은 True 즉 항상 참이므로 반복조건을 항상 만족하게 된다.
for( ; ; ){
printf(“new\n”);}
for문으로 의도적인 무한루프를 만들 때 초기화, 조건검사, 증감 연산 모두 빈칸으로 두기도 한다.
break 문
• break
– 반복문에서 조건과는 상관없이 반복문을 빠져 나갈 때 사용된다.
– 반복문이 여러 개 일 경우 종료되지 않은 가장 최근 반복문을 빠져나가게 된다.
31
int k =0;while (1){
printf(“EssLab\n”);if (k>9)
break;k++;
}k가 9 초과이면
반복문을 빠져나온다.
while (…){
…break;…for( … ; … ; … ){
…break;…
}…break;…
}
for문을 빠져나옴.
while문을 빠져나옴.
while문을 빠져나옴.
continue 문
• continue
– 반복문에서 돌던 루프의 남아있는 부분을 건너 뛸 때 사용된다.
32
int k =0;while ( k<3 ){
k++;if (k%2 == 0)
continue;printf(“%d\n”,k);
}
k가 짝수이면 다음루프로 건너 뛴다.아래의 printf 문은실행되지 않는다.
3333
버블정렬 (Bubble Sort)
• 인접한 2개의 레코드를 비교하여 순서대로 되어 있지않으면 서로 교환
• 이러한 비교-교환 과정을 리스트의 왼쪽 끝에서 오른쪽 끝까지 반복(스캔)
5 3 8 1 2 7
3 5 8 1 2 7
3 5 8 1 3 7
3 5 1 8 3 7
3 5 1 2 8 7
3 5 1 2 7 8
5와 3을 교환
교환 없음
8과 1을 교환
8과 2를 교환
8과 7을 교환
하나의 스캔 완료
5 3 8 1 2 7 초기 상태
3 5 1 2 7 8
3 1 2 5 7 8
1 2 3 5 7 8
1 2 3 5 7 8
1 2 3 5 7 8
1 2 3 5 7 8
스캔 1
스캔 2
스캔 3
스캔 4
스캔 5
정렬 완료
5 3 8 1 2 7 초기 상태
3434
버블정렬 알고리즘
#define SWAP(x, y, t) ( (t)=(x), (x)=(y), (y)=(t) )
void bubble_sort(int list[], int n)
{ int i, j, temp;
for( i = n-1; i > 0; i-- )
for( j = 0; j < i; j++ )
if( list[j] > list[j+1] )
SWAP(list[j], list[j+1], temp);
}
What to do for i
How to do for k → k+1