[C언어] 8. 제어문(조건문, 분기문, 반복문)
이번에는 C언어의 제어문(조건문, 분기문, 반복문)에 대해 알아보자.
제어문(Control Statement)
제어문이란
1) 제어문이란? 순차적인 실행뿐만 아니라 선택과 반복 등 순차적인 실행을 변경하여 프로그램의 실행순서를 제어하는 문장
2) 제어문의 종류
- 조건문(조건선택) : 두 개 또는 여러 개 중의 하나를 선택하는 구조
- 반복문(반복) : 반복 몸체인 여러문장을 반복하는 구조
- 분기분(분기처리) : 정해진 장소로 이동하는 구조
조건문
조건문이란?
- 두 개 또는 여러 개 중에서 한 개를 선택하도록 지원하는 구문
if
if else
if else if
switch
nested if
if문
1) if문 구조
if(cond) //cond : 조건식
{
stmt;
}
next;
cond 조건식
- 반드시 괄호 필요
cond != 0(거짓)
이면stmt
실행
stmt
cond
가 만족되면 실행되는 문장- 여러문장이면 블록으로 구성, 들여쓰기 필수, 세미콜론으로 종료
2) if문 예시
//표준입력으로 받은 온도가 30도 이상이면 "폭염주의보를 발령합니다" 출력
//온도와 상관없이 항상 현재 온도 출력
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void)
{
double temp;
printf("현재 온도를 입력하세요\n");
scanf("%lf", &temp);
if(temp >= 30.0)
prtintf("폭엽주의보를 발령합니다.\n");
printf("%현재온도는 lf 입니다.\n", temp);
return 0;
}
if else문
1) if else문 구조
if(cond)
stmt1;
else
stmt2;
nest;
조건 cond
를 만족하면stmt1
수행, 만족하지 않으면stmt2
수행cond 조건식
: 괄호 필수stmt
: 실행문장이 여러줄이면{...}
2) if else문 예시
//표준입력으로 받은 정수가 짝수인지 홀수인지를 판별하는 프로그램
#define _CRT_SECURE_NO_WARNINGS
#inclue <stdio.h>
int main(void)
{
int n;
printf("정수를 입력하세요.");
scanf("%d", &n);
//if else문 이용
if(n % 2) //n % 2 != 0(홀수이면)
printf("홀수\n");
else
printf("짝수\n");
//조건연산자 이용
(n % 2) ? printf("홀수\n"); : printf("짝수\n");
return 0;
}
if else if문
1) if else if문 구조
if(cond1)
stmt1;
else if(cond2)
stmt2;
else if(cond3)
stmt3;
else
stmt4;
nest;
- 순서대로 조건을 충족하는지 확인하여, 조건을 충족하는 하나의 문장만 실행
2) if else if문 예시
//평균 평점에 따른 적정 구문 출력
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
double gpa;
printf("평균평점 입력");
scanf("%lf", &gpa);
if(gpa >= 4.3)
printf("최우등\n");
else if(gpa >= 3.8)
printf("우등\n");
else if(gpa >= 3.0)
printf("우수\n");
else
prinft("3.0 미만");
return 0;
}
중첩된 if
1) 중첩된 if문 이란
- 중첩된 if문 : if문 내부에 if문이 존재하는 것
if(type == 1)
{ //없어도 오류는 없지만, 소스 가독성을 위해 삽입
if(point >= 70)
printf("1종면허 합격\n");
else
printf("1종면허 불합격\n");
}
else if(type == 2)
{
if(point >= 60)
printf("2종면허 합격\n");
else
printf("2종면허 불합격\n");
}
switch문
1) switch문 구조
switch(exp){
case value1 :
stmt1;
break;
case value2 :
stmt2;
break;
case value3 :
stmt3;
break;
default :
stmt4;
break; //생략가능
}
exp
결과 중case
의 값과 일치하는 항목의 문장stmti
를 실행한 후break
를 만나 종료exp
: 결과값은 반드시 문자나 정수value
: 상수식(constant expression), 중복X, 변수Xdefalut
: 선택적이므로 사용하지 않을 수 있음, 어디에든 위치 가능break
: switch문 바로 종료, break문을 만날 때 까지 실행
2) switch문 예시
swtich(op) //int op
{
case 1 :
printf("1번");
case 2 :
printf("2번");
case 3 :
printf("3번");
default :
printf("복권 당첨돼서 놀고 먹고 싶다");
}
//오류발생
switch(month)
{
case 4 : case 5 :
printf("봄");
break;
case 6, 7 : //오류
printf("여름");
break;
}
//연산식의 활용과 default의 위치
#define _CRT_SECURE_NO_WARNINGS
#inclue <stdio.h>
int main()
{
int score;
printf("점수를 입력하세요 : ");
scanf("%d", &score);
switch(score/10)
{
default: //생략가능, 위치제한 없음
printf("F");
break; //마지막에서만 생략가능
case 10: case 9:
printf("A");
break;
case 8:
printf("B";
break;
}
return 0;
}
반복문
반복문이란?
1) 반복문이란
- 정해진 횟수나 조건을 만족하면 일정 영역의 문장을 여러 번 실행
while
do while
for
2) 반복문 개요
- 반복(repetition) : 순환 = 루프, 같거나 비슷한 일을 여러 번 수행하는 작업
- 반복몸체(repetition body) : 반복조건을 만족하면 일정하게 반복되는 블록
while문
1) while문 구조
while(cond)
{
반복몸체(loop body, stmt);
};
- 반복조건인 cond를 평가하여 0이 아니면(참이면) 반복몸체인 stmt 실행, cond가 거짓일 때까지 반복
cond
: 반복조건, cond가0(거짓)
이 될 때까지 반복stmt
: 반복몸체, 필요(여러줄)하면 블록으로 구성 가능
2) while문 예시
int count = 0;
while(count <= 3) //제어변수 : 반복횟수를 제어하는 변수
{
printf("제발 복권 당첨되게 해주세요\n");
count++; //count++가 없으면 무한반복(indefinite loop), Ctrl+C로 종료 가능
}
//표준입력으로 받은 실수가 0이 아니면 계속 더하는 while문
double number = 1;
while(number != 0.0)
{
printf("실수입력");
scanf("%lf", &number);
sum += number;
}
do while문
1) do while문 구조
- 반복몸체 수행 후에 반복 조건을 검사
- 반복 횟수가 정해지지 않고 입력 받은 자료 값에 따라 반복 수행의 여부를 결정하는 구분에 유용
- 센티널 값(sentinel value) 검사에 유용
stmt
: 가장 먼저 실행, 반복몸체가 여러 문장이거나 필요하면 블록으로 구성cond
: 반복조건, stmt실행 후 cond를 평가하여 0(거짓)이 될 때까지 stmt 실행
센티널 값 : 반복의 종료를 알리는 특정한 자료 값
do
{
반복몸체(loop body, stmt);
}
while(cond); //세미콜론 필수
2) do while문 예시
int input;
do
{
printf("| 0. 종료 | 1. 아메리카노 | 2. 카페라떼 | 3. 카푸치노 |\n");
printf("주문할 커피 또는 종료(0) 입력");
scanf("%d", &input);
}
while(input != 0) //while(input)
for문
1) for문의 구조
init
: 초기화(initialization), 단 한번만 수행cond
: 반복조건(condition), cond가 0이면 반복 종료inc
: 증감(increment), 반복을 결정하는 제어 변수의 증감 수행, stmt 실행후 inc 실행stmt
: 반복몸체가 여러 문장이거나 필요하면 블록으로 구성
for(init; cond; inc)
{
반복몸체(loop body, stmt);
}
//세미콜론으로 구분되는 항목은 모두 생략 가능, 세미콜론은 필수
//무한반복
for(;;)
{
stmt;
}
2) for문 예시
for(int i = 0; i <= MAX; i++) //i처럼 반복의 횟수를 제어하는 변수를 제어변수
printf("반복 %d", i + 1);
double celsius = 12.46;
for(int i = 0; i <= MAX; i++, celsius += 10)
printf("반복 %d", i + 1);
분기문
분기문이란
break
: 작업을 수행하는 도중 조건에 따라 반복이나 선택을 빠져나감continue
: 일정 구문을 수행하지 않고 다음 반복을 실행goto
: 지정된 위치로 이동return
: 작업 수행을 마치고 이전 위치로 돌아가는 구문
break문
1) break문
- 언제 : 반복 내부에서 반복을 종료하기 위해, switch문의 종료
//for문
for(;;)
{
...
break; //1. break를 만나면
... // break 다음코드는 실행하지 않음
}
next; //2. for문을 종료하고 다음 코드 실행
//while문
while(...)
{
...
break; //1. break를 만나면
... // break 다음 코드는 실행하지 않음
}
next; //2. while문을 종료하고 다음 코드 실행
//do while
do
{
...
break; //1. break를 만나면
... // break 다음 코드는 실행하지 않음
}
while(...);
next; //2. do while문을 종료하고 다음 코드 싷행
- 반복이 중첩된 경우 break를 포함하는 가장 근접한 내부 반복을 종료
while(...)
{
...
for(;;)
{
...
break; //1. break를 만나면
... // 가장 근접한 내부 반복을 종료
}
next; //2. for문을 종료하고 다음 코드 실행
}
next;
2) continue문
- continue문이 위치한 이후 반복몸체의 나머지 부분을 실행하지 않고 다음 반복을 계속 유지하는 문장
- while문과 do while문 : continue를 만나면 조건 검사로 이동하여 실행
- for문 : 증감부분으로 이동
- 중첩된 반복에서 continue는 자신이 속한 가장 근접한 반복에서 다음 반복을 실행
while(cond1)
{
...
continue; //cond1로 이동
for(init; cond2; inc)
{
continue; //cond2로 이동
...
}
}
3) goto문
- lable이 위치한 다음 문장으로 실행순서를 이동하는 문장
- lable은
콜론(:)
을 이용하여 지정
int main(void)
{
int count = 1;
loop:
printf("%3d", count);
if(++count <= 10)
goto loop;
printf("종료");
return 0;
}