티스토리 뷰

Table of Contents


개요

if 문

관계 연산자와 논리 연산자

if 문제

else 문

else if 문

else 문제

추가 문제

switch case 문




1. 개요


 지금까지의 내용은 입출력 함수, 정수형 변수, 실수형 변수입니다. 그런데 이 것들만 가지고 프로그래밍을 하면 순차적으로 모든 구문을 실행하는 프로그램밖에 만들 수 없습니다. 만일 아래와 같은 프로그램을 만들고자 한다면, 이들만으로는 굉장히 어렵다는 걸 알 수 있습니다.




 이럴 때 사용할 수 있는 게 조건문입니다. 조건문은 주어진 조건에 따라 프로그램의 흐름을 바꾸는 구문입니다.


 이전까지 소개된 입출력 함수나 변수의 경우엔 기초적인 사용법을 알면 누구나 비슷하게 사용할 수 있는 내용이었습니다. 하지만 조건문부터는 프로그램의 흐름을 설계하는 것이기 때문에 기초적인 사용법 이외의 숙련도도 중요하게 됩니다. 조건문부터 시작하여, 자연스럽게 익히게 되는 프로그래밍 설계 능력은 C언어를 넘어서 전체적인 프로그래밍 실력에 큰 영향을 끼치기 때문입니다. 그러므로 이 글에서부터 소개되는 문제들은 꼭 직접 코드로 구현하여 정확히 '맞았습니다.'를 받고 넘어가시는 걸 추천합니다.




2. if 문


 조건문 중 가장 유명하고 대표적인 조건문은 if 문입니다. if 문의 기본 문법은 다음과 같습니다.


1
2
3
if(조건){
    실행;
}
cs


 조건에 들어가는 명제가 참이면 중괄호 내부의 내용이 실행되며, 조건에 들어가는 명제가 거짓이면 실행되지 않습니다. 개요에 있는 프로그램을 if 문을 가지고 표현하면 아래와 같이 됩니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
 
int main(void) {
    int a;
    scanf("%d",&a);
    if(a%2==0){
        printf("짝수");
    }
    if(a%2==1){
        printf("홀수");
    }
    return 0;
}
cs


 '변수 a에 저장된 값이 짝수다.' 라는 명제는 'a를 2로 나눈 나머지가 0과 같다.'라는 수식으로 바꿀 수 있습니다. a를 2로 나눈 나머지는 a%2로 구할 수 있습니다. 여기에 C언어에서 '같다.'를 의미하는 ==를 사용하면 a%2==0 으로 'a를 2로 나눈 나머지가 0과 같다.'라는 명제를 표현할 수 있습니다. 수학에서는 같다는 의미로 =가 쓰이지만 C언어에서 =는 변수에 값을 넣을 때 사용하는 연산자이기 때문에, '같다.'를 표현하기 위해 ==라는 새로운 연산자를 사용합니다.


 if(a%2==0)를 통해 (a를 2로 나눈 나머지가 0과 같은가?) 라는 물음을 던진 후,


 답이 YES 라면, 중괄호 안의 내용, printf("짝수"); 가 실행되고,


 답이 NO 라면, 중괄호 안의 내용, printf("짝수"); 은 실행되지 않고 스킵되는 것입니다.


 직접 프로그램을 코딩한 후, a에 짝수를 입력 시키면 이 명제가 참이므로 "짝수"가 출력 되고, 홀수를 입력 시키면 "짝수"가 출력 되지 않음을 알 수 있습니다. 홀수를 출력하는 부분도 같은 원리입니다.




3. 관계 연산자, 논리 연산자


 == 와 같이 두 변수를 비교하는 명제에 쓰이는 것들을 관계 연산자라고 합니다. if 문의 조건 부분에 쓰일 수 있는 C언어의 관계 연산자들은 다음과 같습니다.


 관계 연산자

예시 

명제

== 

a == b 

a와 b가 같다. 

 !=

a != b 

a와 b가 다르다. 

 >

a > b 

a가 b보다 크다. 

 >=

a >= b 

a가 b보다 크거나 같다. 

 <

a < b 

a가 b보다 작다. 

 <=

a<=b 

a가 b보다 작거나 같다. 


 이를 이용해 아래의 문제 1, 2를 풀어봅시다.


 문제 1) 두 정수를 입력받아, 두 수가 같다면 '같다', 다르다면 '다르다'를 출력하시오.



 문제 2) 철수의 영어 점수를 나타내는 정수를 입력 받아, 50 이상이라면 '합격', 미만이라면 '불합격'을 출력하시오.



 if 문을 쓰다 보면 두 개의 명제를 동시에 사용해야 할 때가 존재합니다. 예를 들어, 정수형 변수 a 가 짝수이고 10보다 큰 경우에만 실행시키고 싶은 경우를 생각해 보겠습니다. a가 짝수인건 ( a%2==0 ) , a가 10보다 큰 건 ( a > 10) 으로 명제를 만들 수 있는데, 지금까지 설명 드린 내옹으로는  '두 가지를 모두 만족하는 경우'를 표현할 수 없습니다.


 이를 해결하는 방법에는 크게 두 가지가 있습니다.


 1. if 문 두 개를 중첩해서 쓰기


 아래처럼 if 를 중첩해서 사용하는 방법입니다. 두 if 문을 모두 통과하지 않으면, print 가 실행되지 않습니다.


1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
 
int main(void){
    int a;
    scanf("%d",&a);
    if(a%2==0){
        if(a>10){
                printf("a는 10보다 큰 짝수이다.");
        }
    }
    return 0;
}
cs


 2. 논리 연산자 사용하기


 하나의 if로 처리하고 싶다면, 두 개의 명제를 '그리고'라는 의미로 묶어줄 것이 필요합니다. (정수형 변수 a 가 짝수이다. 그리고 a는 10보다 크다.) 이 때는 C언어에서 '그리고'를 뜻하는 논리 연산자 &&을 사용할 수 있습니다. 아래가 그 예시입니다.


1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
 
int main(void){
    int a;
    scanf("%d",&a);
    if((a%2==0&& (a>10)){
        printf("a는 10보다 큰 짝수이다.");
    }
    return 0;
}
cs


 &&를 포함한, C언어에서 쓰이는 논리 연산자들은 아래와 같습니다.


 논리 연산자

예시 

설명 

 &&

 (a==1) && (b==2)

둘 다 참일 경우에만 참 (AND) 

 ||

 (a==1) || (b==2)

둘 중 하나 이상이 참일 경우 참 (OR)

 !

 !(a>3)

참은 거짓, 거짓은 참으로 변경 (NOT)


 이를 이용해 아래의 문제 3을 풀어봅시다.


 문제 3) 두 정수를 입력 받아, 두 수 중 하나라도 70이상이라면 '합격', 그렇지 않다면 '불합격'을 출력하시오.

(다시 말하면 '불합격' 은 두 수가 모두 70 미만인 경우이다.)



C언어에 정수형 변수로 int가 있듯이, 실수형 변수로는 float 와 double이 있다.


이 두 변수형은 int와 달리 소수 표현이 가능하다. 아래와 같이 선언할 수 있다.



출처: http://weeklyps.com/entry/C언어-5-변수-2-실수형-변수 [weekly ps]


C언어에 정수형 변수로 int가 있듯이, 실수형 변수로는 float 와 double이 있다.


이 두 변수형은 int와 달리 소수 표현이 가능하다. 아래와 같이 선언할 수 있다.



출처: http://weeklyps.com/entry/C언어-5-변수-2-실수형-변수 [weekly ps]


C언어에 정수형 변수로 int가 있듯이, 실수형 변수로는 float 와 double이 있다.


이 두 변수형은 int와 달리 소수 표현이 가능하다. 아래와 같이 선언할 수 있다.



출처: http://weeklyps.com/entry/C언어-5-변수-2-실수형-변수 [weekly ps]


C언어에 정수형 변수로 int가 있듯이, 실수형 변수로는 float 와 double이 있다.


이 두 변수형은 int와 달리 소수 표현이 가능하다. 아래와 같이 선언할 수 있다.



출처: http://weeklyps.com/entry/C언어-5-변수-2-실수형-변수 [weekly ps]


C언어에 정수형 변수로 int가 있듯이, 실수형 변수로는 float 와 double이 있다.


이 두 변수형은 int와 달리 소수 표현이 가능하다. 아래와 같이 선언할 수 있다.



출처: http://weeklyps.com/entry/C언어-5-변수-2-실수형-변수 [weekly ps]





4. if 문제


[BOJ 9498] 시험 성적


풀이 모음




5. else 문


 if 문을 사용했을 경우, 그 뒤에 else 문을 사용할 수 있습니다. 형식은 아래와 같습니다.


1
2
3
4
5
6
if(조건){ 
    실행1; // 조건이 참일 경우 실행1이 실행
}
else{
    실행2; // 조건이 거짓일 경우 실행2가 실행
}
cs


 이처럼 if 문 안의 조건이 거짓일 경우 else 문의 중괄호 안에 있는 내용이 실행됩니다.


 이를 활용해 개요에 있는 홀수 짝수 문제(정수를 하나 입력받아 짝수이면 "짝수", 홀수이면 "홀수"를 출력하시오.)를 풀어 봅시다.





6. else if 문


 if 문을 사용했을 경우, 그 뒤에 else if 문을 사용할 수 있습니다. 형식은 아래와 같습니다.


1
2
3
4
5
6
7
8
9
10
11
12
if(조건1){ 
    실행1; // 조건1이 참일 경우 실행1 실행
}
else if(조건2){
    실행2; // 조건1이 거짓이고, 조건2가 참일 경우 실행2 실행
}
else if(조건3){
    실행3; // 조건1,2가 거짓이고, 조건3이 참일 경우 실행3 실행
}
else{
    실행4; // 조건1,2,3이 거짓일 때 실행4 실행
}
cs


 먼저 if 문의 조건1을 보고, 참이면 실행1을 실행하고 끝입니다. 그련 경우 조건2, 조건3가 참인지 거짓인지는 상관없이 그 뒤는 실행되지 않습니다. 만일 조건1이 거짓이면 그 다음 else if(조건2)로 넘어가지요. 조건2가 참이라면 이번엔 조건3에 상관없이 실행2가 실행되고 끝입니다. 만일 조건2가 거짓이라면 다음 else if(조건3)으로 넘어갑니다. 이런 식으로 진행하여 결국 모든 조건이 거짓일 경우 else 안에 있는 실행4가 실행되는 식입니다.


 else if 의 갯수는 2개보다 많이 사용하는 것도 가능합니다.


 이를 활용해 정수 하나를 입력받아,

 200 초과이면 'a는 200보다 크다.',

 100 초과이고 200이하이면 'a는 200보다 크진 않지만 100보단 크다.',

 100 이하라면 'a는 100보다 크지 않다.'  를 출력하는 프로그램을 만들어 봅시다.



 else if 문과 else 문은 아래의 문제와 추가 문제를 통해 더 익힐 수 있습니다.




7. else 문제


C언어에 정수형 변수로 int가 있듯이, 실수형 변수로는 float 와 double이 있다.


이 두 변수형은 int와 달리 소수 표현이 가능하다. 아래와 같이 선언할 수 있다.



출처: http://weeklyps.com/entry/C언어-5-변수-2-실수형-변수 [weekly ps]


[BOJ 9498] 시험 성적

(else if, else 를 이용)


풀이 모음




8. 팁


1. if문은 실행해야 할 명령이 1줄인 경우에 한해, 중괄호를 생략할 수 있습니다. 또한 이는  else if, else 도 마찬가지입니다. 따라서 아래와 같은 프로그램도 정상적으로 작동함을 알 수 있습니다.


1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
 
int main(void){
    int a;
    scanf("%d",&a);
    if(a%2==0)
        printf("짝수");
    else
        printf("홀수");
    return 0;
}
cs


2. C언어에서는 명제의 참/거짓을 1 bit로 처리하며, 세부적으로는 참 = 1, 거짓 = 0 으로 처리합니다. 이 때문에 if(1) 은 항상 참이 되고 if(0)은 항상 거짓이 됩니다. 아래의 프로그램을 돌려 보면 그 사실을 확인할 수 있습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//code by RiKang, weeklyps.com
#include <stdio.h>
 
int main(void) {
    if(1){
        printf("1은 참\n");
    }
    else{
        printf("1은 거짓\n");
    }
    if(0){
        printf("0은 참\n");
    }
    else{
        printf("0은 거짓\n");
    }
    return 0;
}
cs


 이를 활용해 홀수/짝수 판별을 더 간편하게 할 수 있습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
//code by RiKang, weeklyps.com
#include <stdio.h>
 
int main(void){
    int a;
    scanf("%d",&a);
    if(a%2){
        printf("홀수");
    }
    else{
        printf("짝수");
    }
    return 0;
}
cs


 조금 더 실험을 해보면, if(0) 은 거짓이고 if(0이 아닌 정수)는 모두 참으로 처리되는 것도 확인해 볼 수 있습니다. (0이 아닌 것은 참으로 보기 때문입니다.)




9. 추가 문제


 (0) [BOJ 10817] 세 수


 (1) [BOJ 11943] 파일 옮기기


풀이 모음




10. switch case 문


 if로 대체가 가능하기 때문에 자주 사용되지는 않지만, 다른 조건문으로 switch case 문도 존재합니다. 조건문은 대부분 if문으로 처리하므로 이런 게 있다는 것 정도만 알고 넘어가도 상관은 없습니다. (예전 버전의 컴파일러들은 if문보다 switch case문으로 처리했을 때 실행속도가 더 빨라지는 경우들이 존재합니다.)


 기본 구조는 다음과 같습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
//code by RiKang, weeklyps.com
switch(정수형 변수){
    case 값1:
        실행1;
        break;
    case 값2:
        실행2;
        break;
    ...
    default:
        실행_마지막;
        break;
}
cs


 switch 옆에 들어간 정수형 변수가 어떤 값이냐에 따라 해당 case 의 실행문이 실행됩니다. 해당 case가 없다면, default 의 실행문이 실행됩니다. 이해를 위해 아래의 예제를 보시면 if - else if - else 콤보를 switch case 로 구현하는 걸 확인하실 수 있습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//code by RiKang, weeklyps.com
#include <stdio.h>
 
int main(void) {
    int a;
    //퀴즈 점수를 입력해 주세요. (1~4)
    scanf("%d",&a);
    if(a==1)
        printf("재시험");
    else if(a==2)
        printf("통과");
    else if(a==3)
        printf("가산점");
    else
        printf("장학금");
    return 0;
}
cs


 switch case 를 사용하면 다음과 같이 바꿀 수 있습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
//code by RiKang, weeklyps.com
#include <stdio.h>
 
int main(void) {
    int a;
    //퀴즈 점수를 입력해 주세요. (1~4)
    scanf("%d",&a);
    switch(a){
        case 1:
            printf("재시험");
            break;
        case 2:
            printf("통과");
            break;
        case 3:
            printf("가산점");
            break;
        default:
            printf("장학금");
            break;
        
    }
    return 0;
}
 
cs


 여기에 쓰인 break; 문은 switch 문의 중괄호를 끝내버리는 구문으로서, 만일 이 break;를 모두 지우고 a에 1을 넣어보면 "재시험통과가산점장학금" 이런 식으로 case 1 아래의 모든 구문이 실행되는 걸 확인하실 수 있습니다.


 사실 해당 케이스로 들어간 이후부터는 break;를 만나거나 "}"를 만날때 까지 모든 구문이 실행되는 것입니다.