본문 바로가기

Programming/C

[ProjectH4C] 코딩도장 Unit 17 ~ 19 Write-Up

if 구문

코드를 작성하다보면 경우에 따라 다른 결과를 출력해야 하는 상황이 생긴다. 이를 유연하게 처리해주는 방법이 if문을 사용하는 것이다. 기본형태는 다음과 같다.

if(조건1){

    내용1

}

조건식이 참일 경우에만 중괄호 안에 있는 내용이 실행된다. 조건식을 작성할 때, 예를 들어 x가 10일 때를 조건으로 작성하기 위해선 x=10이 아닌 x==10으로 작성해야 한다. 

= : 대입(할당) 연산자. 보통 수학에선 "같다"의 의미로 쓰이지만, C언어에서는 우변의 값을 좌변에 대입하는 대입연산자로써 사용된다.

==: 비교 연산자. 수학에서 쓰이는 "같다"와 같은 의미로 쓰인다.

 

만약 if(num==10)이 아닌 if(num=10)으로 작성한다면, num에 10이 저장된 후 if(num)이 된다. 이 때 num이 10이므로, 참이 되어서 항상 실행된다.

이러한 경우를 방지하기 위해 num==10이 아닌 10==num처럼 코드를 작성하는 방법이 있다. num==10, num=10은 둘 다 문제없이 작동하지만 만약 좌, 우를 바꾸어서 10==num, 10=num으로 작성한다면, 앞의 코드는 문제 없이 작동하지만, 오른쪽의 코드는 상수에 값을 저장할 수 없기에 에러가 발생하기 때문에 실수를 방지할 수 있다.

 

if문을 작성하고 뒤에 세미콜론(;)을 붙이면, 조건에 관계없이 중괄호 안의 내용이 실행되므로 주의해야 한다.

 

조건문에서 만약 내용이 한 줄이라면, 중괄호를 생략하여 작성해도 무방하다. 두 줄 이상이라면 생략이 불가능하다.

조건식의 비교대상이 정수가 아닌 실수, 문자형이여도 비교가능하다. 실수도 정수처럼 num1==0.1과 같은 형태로 비교해줄 수 있으며, 문자형은 ch=='A'와 같이 작은 따옴표를 이용하거나 아스키 코드값을 이용해서 ch==65처럼 비교하면 된다.

 

만약, 조건이 참일 경우 해당 내용을 실행하고, 거짓일 경우엔 다른 동작을 하고 싶다면, else를 이용하면 된다.

 

if(x==10){

    printf("10입니다.");

}

else {

    printf("10이 아닙니다.");

}

 

else는 위의 if문이 거짓일 경우 실행 된다. else는 위의 if문의 조건이 거짓일 경우 실행되기 때문에 따로 조건식을 적지 않는다. 그렇기에 단독으로 사용할 수는 없으며, 항상 if문 뒤에 사용해야 한다.

 

 

if ~ else 구문은 참일 경우, 거짓일 경우 두 가지 경우에 대해 처리할 때만 사용 가능하다. 만약에 x가 10일 경우, 20일 경우, 30일 경우, 40일 경우 등등 참, 거짓만으로 구분하기 힘든 상황이 생긴다면 if, else 만으로는 처리하기가 힘들다. 이런 상황을 위해 else if가 존재한다.

else if는 if와 else 사이에 들어간다. 형태는 다음과 같다.

 

if(조건1){

    내용1

}

else if(조건2){

    내용2

}

else{

    내용3

}

 

if가 거짓일 경우, else if로 넘어간다. 이때 else if가 참이면 내용2를 실행하고, 거짓일 경우 else로 넘어가서 내용3을 실행한다. else if는 몇개를 작성하든 상관없다. 

 

if 사용시 주의할 점

- else가 if, else if보다 앞에 있으면 안된다.

-if, else if에는 조건식이 들어가며 else에는 조건식이 없다.

 

 

 

 

 

#17.6 퀴즈

1번 문제

if문의 기본 형태에서 조건이 num1==10이고 그때의 내용은 "10입니다." 를 출력하는 것이므로 e가 답이다.

 

2번문제

문자형을 비교하는 것은 문자 그 자체를 비교하는 방법과 아스키 코드값을 이용해서 비교하는 방법이 있다. 문자를 비교할 땐 작은 따옴표(' ')를 사용해야 한다. 답은 a, c이다.

 

3번문제

기본형태는 d이지만, 내용이 한 줄일땐 중괄호를 생략해도 되기 때문에 b도 가능하다. 답은 b, d이다.

 

 

#17.7 연습문제: if 조건문 사용하기

#include <stdio.h>
int main()
{
    char c1 = 'k';

    if (c1 ________)
    {
        printf("k입니다.\n");
    }

    return 0;
}

실행 결과

k입니다.

해당 코드를 실행했을 때 if문 안에있는 "k입니다." 가 실행되어야 한다. 그러기 위해선 조건식이 참이 되어야 하기 때문에, c1과 무엇을 비교연산 해주어야 하는지에 대한 문제이다. c1이 'k'이므로, c1=='k' 혹은 아스키코드를 이용해서 c1==107로 식을 작성하면 참이 되어서 내용이 실행된다. 

 

#17.8 심사문제: 청소년 콘텐츠 관람 제한하기

입력을 받기전에 출력이 있으면 안된다 하였으니, 변수를 선언한 후에 바로 scanf를 이용해 나이를 입력받으면 된다.

입력한 나이가 18보다 작을 경우 출력해야 하기 때문에 if(age<18)이 참일 경우 "청소년 관람 불가"를 출력하면 된다.

 

#include <stdio.h>

int main(){
    int age;
    scanf("%d", &age);
    if(age<18)
        printf("청소년 관람 불가");
    
    return 0;
}

 

#18.6 퀴즈

 

if의 조건이 거짓일 경우, else문을 실행하게 되므로 답은 b.

 

if, else의 뒤에는 세미콜론(;)이 붙으면 안된다. 답은 e.

num1이 0이므로 if(0)이 된다. C언어에서 0은 거짓, 0이 아닌 모든 수는 참을 의미하므로, 조건식이 거짓이 되고 else를 실행하게 된다. 답은 거짓.

if문 뿐만 아니라 조건식이 들어가는 모든 부분에는 조건식이 한개가 아니라 두개 이상이 들어가도 된다. 두 개 이상 사용할 땐, 각각의 조건식을 논리연산을 통해 하나의 참, 거짓만 반환하도록 논리연산자를 적절히 사용해야 한다. 답은 c, e.

num1은 4이고 조건식은 num1%2==0이다. 4%2는 0이기 때문에 조건식은 참이 된다. 답은 a.

 

 

#18.7 연습문제: else 사용하기

#include <stdio.h>

int main(){
    unsigned long long num1 = _________;

    if (num1)
        printf("참\n");
    else
        printf("거짓\n");

    return 0;
}

출력 결과

거짓

 

거짓이 출력되려면, 조건식이 거짓이어야 한다. 조건식은 num1이고, 정수형 변수가 거짓인 경우는 0밖에 없으므로, 답은 0이다.

 

 

 

#18.8 연습문제: 합격 여부 판단하기

#include <stdio.h> 
int main() 
{
    int writtenTest = 78; 
    int toeic = 870; 
    
    if (writtenTest________toeic________)
        printf("합격\n"); 
    else 
        printf("불합격\n");
    return 0; 
}

 

필기점수(writtenTest) 80점 이상, 토익점수(toeic) 850점 이상일 경우 합격이 출력된다.

각각 writtenTest>=80, toeic>=850이 되어야 하고, 둘 다 만족해야 하므로 사이에 && 연산자를 써주면 된다.

답은 writtenTest>=80 && toeic>=850.

 

#18.9 심사문제: else 사용하기

문자를 입력받기 때문에 char형 변수를 선언해준다. 문자를 비교할 땐 ch=='a' 처럼 작은 따옴표를 이용한다.

 

#include <stdio.h>

int main(){
    char ch;
    scanf("%c", &ch);
    
    if(ch=='a')
        printf("a입니다.\n");
    else
        printf("a가 아닙니다. \n");
        
    return 0;
}

 

 

#18.10 심사문제: 합격 여부 판단하기

 

네 개의 과목의 점수를 입력받는다. 이 때, 네 개중 하나라도 0~100 범위가 벗어나는지 확인해야 한다.

더 좋은 방법이 생각나지 않아서 하나하나 확인해주기로 했다.

국어가 범위를 벗어났는지 확인하려면 kor>100 || kor<0 으로 확인해주면 된다. 각각에 대해 국어와 같이 비교를 해준 다음에, 각각을 ||연산자로 연결해주면, 하나라도 범위를 벗어난다면 참이 된다. else를 이용해서 값이 제대로 입력됐을 때의 코드를 작성해준다. 평균 값을 저장할 실수형 변수 avg를 선언 후에 평균값을 계산해서 저장한다. 그 후에 avg가 85 이상인 경우와 그렇지 않은 경우를 if문을 통해 나누어 준 후에, 각각 합격 불합격을 출력한다.

 

#include <stdio.h>

int main(){
    int kor, eng, mat, sci;
    float avg=0;
    
    scanf("%d %d %d %d", &kor, &eng, &mat, &sci);
    if(kor>100 || kor<0 || eng>100 || eng<0 ||
        mat>100 || mat<0 || sci>100 || sci<0){
            printf("잘못된 점수 \n");
        }
    else {
        avg = (float)(kor + eng + mat + sci) / 4;
        if(avg>=85)
            printf("합격 \n");
        else
            printf("불합격 \n");
    }
    return 0;
}

 

 

#19.3 퀴즈

else if는 여러 번 사용할 수 있으며, 조건식이 있어야 한다. 또 else if, else는 단독으로 사용할 수 없으며 순서는 항상 if ~ else if ~ else가 되어야 한다. 답은 b, c, e.

 

 

 

 

 

 

else if에는 조건식이 있어야 하는데 e는 조건식이 없다. else if보단 else를 사용하는게 바람직하다. 답은 e.

 

 

#19.4 연습문제: if, else if, else를 모두 사용하기

#include <stdio.h>

int main()
{
    char c1 = _______________;

    if (c1 == 'a')
        printf("a\n");
    else if (c1 == 'b')
        printf("b \n");
    else if (c1 == 'c')
        printf("c \n");
    else if (c1 == 'd')
        printf("d \n");
    else
        printf("x \n");

    return 0;
}

실행 결과

c

 

맨 처음의 if와 그 아래의 else if가 거짓이고 2번째 else if인 (c1=='c')가 참이여야 c가 출력된다. 답은 'c' 혹은 아스키코드로 99.

 

#19.5 심사문제: 교통카드 시스템 만들기

입력 예시

20

 

출력 예시

8800

 

 

 

잔액에서 age에 따른 금액만큼 뺀 코드를 작성해야 한다. 입력받은 age에 따라 다른 값을 빼주어야 하므로 if문을 작성해서 어린이인 경우, 청소년인 경우, 어른인 경우를 나누어서 각각 해당하는 금액만큼 빼주면 된다.

 

if(age>=7 && age<=12)if(age>=7 && age <=12){
    balance -= 450;
}
else if(age >=13 && age<=18){
    balance -= 720;
}
else if(age>=19){
    balance -= 1200;
}