본문 바로가기
카테고리 없음

학점출력 예제를 C와 파이썬의 삼항연산자와 case문으로 각각 구현해보면?

by 일코 2022. 1. 21.
학생의 전체 평균점수에 대한 학점을 출력하는 프로그램을 작성하자. 학생의 성적이 90점 이상이면 A, 80점 이상이면 B, 70점 이상이면 C, 50점 이상이면 D 그리고 그 미만이면 F다! (후략)

- 열혈C프로그래밍 p.189, 문제 08-1[if~else문의 활용] 문제 3

if-else문을 연습할 때 열에 아홉 번은 튀어나오는 학점 예제라서 식상한 느낌이 들지만,

switch-case문이나 삼항연산자 중첩의 장점이 더욱 크게 와닿는 가장 좋은 예제라고 생각한다.

 

C의 if-else문으로는

#include "stdio.h"

int main(void) {
    int score_num;
    char score;

    printf("학점을 입력하세요: ");
    scanf("%d", &score_num);
    if (score_num >= 90) {
        score = 'A';
    } else {
        if (score_num >= 80) {
            score = 'B';
        } else {
            if (score_num >= 70) {
                score = 'C';
            } else {
                if (score_num >= 50) {
                    score = 'D';
                } else {
                    score = 'F';
                }
            }
        }
    }
    printf("%c", score);
}

이렇게 코드가 길어진다. 중괄호가 많아서 읽기도 쉽지 않다. 그런데..

 

C의 삼항연산자를 사용하면,

#include "stdio.h"

int main(void) {
    int score_num;
    char score;

    printf("학점을 입력하세요: ");
    scanf("%d", &score_num);

    score = score_num >= 90 ? 'A' :
            score_num >= 80 ? 'B' :
            score_num >= 70 ? 'C' :
            score_num >= 50 ? 'D' :
            'F';
    printf("%c", score);
}

위처럼 굉장히 깔끔하게 정리가 된다. 읽기도 굉장히 쉽다.

굳이 switch-case를 소개해야 하나 싶지만..

 

C의 switch-case문을 사용해보면,

#include "stdio.h"

int main(void) {
    int score_num;
    char score;

    printf("학점을 입력하세요: ");
    scanf("%d", &score_num);

    switch (score_num / 10) {
        case 10:
        case 9: printf("A"); break;
        case 8: printf("B"); break;
        case 7: printf("C"); break;
        case 6:
        case 5: printf("D"); break;
        default: printf("F");
    }
}

반짝이는 아이디어를 사용한(참고한 포스팅) 멋진 코드이다.

 

그렇다면 파이썬은 어떨까?

파이썬에는 삼항연산자 및 중첩 문법은 파이썬 2에서부터 존재해 왔지만,

switch문의 도입은 파이썬 운영위에서 계속해서 반대해 오다가,

작년 출시된 3.10부터는 구조적 패턴 매칭(Structural Pattern Matching)을 도입하게 되었다.

이는 switch-case문과 매우 유사한 문법으로

단순한 스위치 형태 뿐만 아니라 더욱 광범위하게 활용할 수 있는 문법이기도 하다.

먼저 삼항연산자 중첩으로 if-else문을 작성해보면,

 

파이썬의 삼항연산자 중첩

score_num = int(input("학점을 입력하세요: "))

print("A" if score_num >= 90 else \
      "B" if score_num >= 80 else \
      "C" if score_num >= 70 else \
      "D" if score_num >= 50 else \
      "F")

C의 삼항연산자와 비슷한 모양이기는 하다.

 

이번에는 파이썬의 패턴매칭(match-case)문을 작성해보자.

(단, 파이썬 3.10 이상에서 실행해야 함)

 

파이썬의 "구조적 패턴매칭(Structural Pattern Matching)"

score_num = int(input("학점을 입력하세요: "))

match score_num // 10:
    case 10 | 9: print("A")
    case 8:      print("B")
    case 7:      print("C")
    case 6 | 5:  print("D")
    case _:      print("F")

와~ 이 문법도 굉장히 깔끔하지 않은가?

파이썬의 구조적패턴매칭(Structural Pattern Matching) 문법에 대한 PEP 문서를 찾아보려면,
EP622, PEP634, PEP635, PEP636 등을 참고하면 된다.
대표적으로 PEP636을 열어보면 구조적패턴매칭의 튜토리얼을 소개하고 있다.
링크는 아래.

 

 

PEP 636 -- Structural Pattern Matching: Tutorial

The official home of the Python Programming Language

www.python.org

 

 

댓글