조건문
앞서 공부한 프로그램은 전부 위에서부터 아래로 순차적으로 실행되었다. 그러나 조건문/제어문 등을 이용하면 프로그램 실행 순서에 변화를 가져올 수 있다.
다음과 같이 성적의 기준이 있다고 가정한다.
성적 (100점 만점) |
등급 |
90 ~ 100 |
A |
80 ~ 89 |
B |
70 ~ 79 |
C |
60 ~ 69 |
D |
0 ~ 59 |
F |
성적에 따라 등급이 달라지는 것을 알 수 있는데 이와 같이 특정 조건에 따라 처리되는 내용이 달라지는 경우에 조건문을 사용한다.
조건문이란, 조건에 따라 둘 또는 그 이상의 실행 경로 중에서 하나를 선택할 수 있는 수단을 제공하는 방식인데, C 언어의 조건문은 식의 참(True)/거짓(False)에 따라
선택하는 if 조건문과 식의 값에 따라 여러 경로 중에서 하나를 택하는 switch 조건문이 존재한다.
단순 if문
조건에 따라 임의의 문장이 실행되거나 실행되지 말아야 하는 경우가 존재한다. 예를 들면 "경력이 10 년 이상이면 월급에 50만원을 더 준다" 와 같은 경우가 있는데,
이런 경우 if문을 사용하면 된다.
if 문의 사용 형식은 다음과 같은데, 식이 참이면 문장을 실행하고 거짓이면 실행하지 않는다.
위의 조건과 구조를 이해하고 코딩 한 프로그램은 다음과 같다.
02 행 : BONUS를 50으로 정의
11 행 : 경력(workyrs)이 10년 이상이면
12 행 : 월급에 50만원 추가
이전에 배운 논리 연산자를 조건문과 같이 사용할 수 있다. "입력받은 문자가 소문자이면 대문자로 변환하고 출력하고 대문자를 입력받으면 그대로 출력" 이라는
조건이 있을 경우 다음과 같이 코딩 할 수 있다.
10 행 : 입력받은 문자가 a 이상, z 이하이면 소문자로 판단
11 행 : 소문자를 대문자로 변환하는 식
마지막으로 살펴볼 예제는 조건이 참일 때 실행해야 되는 문장이 여러개인 경우이다. 위의 프로그램들을 보면 실행되야 하는 문장이 1개이다. 이런 경우에는
굳이 중괄호 '{}'로 둘러 싸지 않아도 된다. 즉, 다음과 같이 코딩해도 무관하다는 소리이다.
if (ch>='a' && ch<='z')
ch = ch - 'a' + 'A';
그러나 실행해야 되는 문장이 2개 이상인 경우, 반드시 중괄호로 둘러 싸주어야 하기 때문에 실행해야 하는 문장이 1개여도 중괄호로 둘러 싸는 버릇을 두는 것이 좋다.
다음 프로그램은 2개의 숫자를 입력받아 큰 수,작은 수를 판별하여 출력하는 프로그램이다.
10 ~ 13 행 : (-50과 100이 입력되었다고 가정)
max에 저장된 수(-50)가 min(100) 보다 작은 경우 우선 tmp라는 변수에 max 값을 저장한다. //현재 값 => max : -50, min:100, tmp:-50
max 변수에 min에 저장된 값을 대입한다. //현재 값 => max:100, min:100, tmp:-50
min 변수에 이전에 tmp 변수에 대입한 값을 대입한다. //현재 값 =>max:100, min:-50, tmp:-50
if-else문
조건에 따라 실행되어야 하는 문장이 달라야 하는 경우가 있다. 이전에 사용했던 예를 살짝 바꾸어 다음과 같이 가정하자.
" 경력이 10년 이상이면 보너스 50만원을 지급하고, 그렇지 않은 경우에는 30만원을 지급한다." 라는 조건이 있을 때 if-else 문을 사용하면 된다.
if-else문의 형식은 다음과 같은데, 식의 참/거짓에 따라 실행되는 문장이 달라진다. 참이면 문장1을 실행하고 거짓이면 문장2를 실행한다.
물론 참/거짓에 따라 실행되야 하는 문장이 2개 이상이면 중괄호 '{}'를 이용해야 한다.
우선 이전에 살펴볼 큰수/작은수 판단 프로그램을 if-else를 이용한 프로그램을 보도록 하자.
식 'a>b' 가 참이면 11,12 행을 실행하고, 거짓이면 16,17 행을 실행한다.
마지막으로 if-else 문 사용시 주의해야 할 부분이 있는데 우선 다음의 코드를 보도록 하자.
if (n > 0) // 첫 번째 if
if (a > b) // 두 번째 if
x = a;
else
x = b;
위와 같은 모호성을 현수 else (dangline else)문제라고 하는데, C 언어에서 'else'는 연결된 'else'가 없는 가장 가까운 'if'문과 결합하는 규칙이 있다.
즉, 위의 코드에서 else는 두 번째 if와 결합되는 것이다. 이런 문제를 해결하기 위해 다음과 같이 들여쓰기를 사용하는 것이 좋다.
if (n > 0)
if (a > b)
x = a;
else
x = b;
만약 else문을 첫 번째 if와 결합하고 싶다면 다음과 같이 중괄호로 묶으면 된다.
if (n > 0) {
if (a > b)
x = a;
}
else
x = b;
마지막으로 이전 조건(경력에 따라 보너스가 50/30이 나뉘는 조건)을 코딩하면 다음과 같다.
else if 문
else 우측에 또 다른 if 문을 사용할 수 있는데 형식은 다음과 같다. 식1이 참이면 문장1, 식1이 거짓이고 식2가 참이면 문장2, 식1/식2가 모두 거짓이면 문장 3을 수행한다.
아래의 프로그램은 숫자를 입력받아 양수,음수,0 인지 판단하는 아주 간단한 프로그램이다.
else if를 좀더 활용하기 위해서 다음과 같은 조건을 가정한다.
"지하철을 이용하는데 출발역으로부터 도착역까지의 거리가 12km 이하인 경우 요금은 800원이며, 12km ~ 42km인 경우 6km마다 100원씩 추가하며,
42km 이상은 12km마다 100원씩 추가한다."
이를 계산하면, 10km는 800원, 19km는 900원, 그리고 55km는 1400원이다.
조건 연산자
if-else 문을 간단히 나타내는 연산자가 있는데 바로 조건 연산자이다. 다른 말로 '삼항 연산자' 라고도 불리는 이 연산자의 사용 형식은 다음과 같다.
식1이 참이면 식2가 값이 되고, 식1이 거짓이면 식3이 값이 된다.
이를 이용하여 정수 2개를 입력받아 두 수의 차를 알아내는 프로그램을 코딩하면 다음과 같다.
10 행 : 식 'a>b'가 참이면 a-b가 실행되고, 거짓이면 b-a가 실행된다.
switch 문
선택해야 할 경로가 많은 경우에는 else-if 문보다 편하게 사용할 수 있는 구조가 switch~case 문이다. switch 문은 조건(case)에 따라 여러 경로 중 하나를 선택할 때
사용하는데 사용 형식은 다음과 같다.
switch ~ case 문을 이용하면 간단한 사칙연산 프로그램을 코딩 할 수 있다.