첫번째 프로젝트 : 계산기 만들기 (기초적인 계산기 구현)

1주차 C언어 구현 프로젝트를 시작합니다.
이번에는 C언어에서 가장 간단한 사칙연산 계산기를 만들어보겠습니다.
우리가 기본적으로 case문을 배울 때 기본적으로 사칙 연산 계산기를 배운 기억이 납니다.
다만 여기서 끝내는 건 너무 아쉬워서 기초적인 계산기를 만들어본 후 추가 기능들을 만들어보는 형태로 진행하겠습니다.

문제 제기 - 반복 가능한 사칙 연산 계산기 만들기

계산기를 실행하였을 때 사칙연산 부호입력을 받습니다. 이때 X를 누르면 바로 프로그램을 종료시킵니다.
원하는 숫자 두 개를 입력하여 원하는 결과를 나오게 합니다. 이 과정을 다시 반복시킵니다.

연속으로 반복되는 계산기이므로 while문을 사용합니다.
switch문으로 쓰는 방식도 있고, if문으로 쓰는 방법이 있습니다.
다만 코딩하면서 느낀 점은 switch문에서 사용하는 방법과 if문에서 사용하는 방법이 다르다는 것입니다.
이 차이점을 서로 구별해보면서 진행하겠습니다.

if문에서 구현

#include<stdio.h>

void main()
{
    float num1, num2;
    char op;
    float result = 0;
    printf("사칙연산 계산기를 실행합니다 \n");
    while (1) {
        printf("\n첫 번째 수 : ");
        scanf_s("%f", &num1);
        printf("두 번째 수 : ");
        scanf_s("%f", &num2);
        getchar();
        printf("연산자 입력하기 + - * / exit = X : ");
        scanf_s("%c", &op);
        if (op == '+') {
            result = num1 + num2;
            printf("%f + %f = %f\n", num1, num2, result);
        }
        else if (op == '-') {
            result = num1 - num2;
            printf("%f - %f = %f\n", num1, num2, result);
        }
        else if (op == '/') {
            if (num1 == 0) {
                printf("0을 나눌 수는 없습니다.");
            }
            else {
                result = num1 / num2;
                printf("%f / %f = %f\n", num1, num2, result);
            }
        }
        else if (op == '*') {
            result = num1 * num2;
            printf("%f * %f = %f\n", num1, num2, result);
        }
        else if (op == 'X' || 'x') {
            printf("프로그램을 종료합니다");
            break;
        }
        else
            printf("다시 시도하세요\n");
    }
}

필요한 숫자와 연산자를 입력받게 하고 저장되어 있지 않은 연산자는 else문을 통해 다시하는 것을 요구하고 반복시킵니다.
그리고 종료하기 위할 때는 break문을 통해 해당 while반복문을 탈출시켜 프로그램을 종료시킵니다.

보점과 문제점

해당 코드는 숫자를 입력시키고 연산자를 마지막에 받습니다.
여기서 문제는 종료를 먼저하고 싶은데 숫자를 입력하고 종료해야된다는 불편함이 있습니다.
이에 case문에서는 사칙연산을 먼저 입력시키고 바로 종료할 수 있게 만들어보겠습니다.

switch문에서 구현

#include<stdio.h>

void main()
{
    float num1, num2;
    char op;
    float result = 0;
    printf("사칙연산 계산기를 실행합니다 \n");
    while (1) {
        printf("\n연산자 입력하기 + - * / 종료하고 싶으면 X를 누르시오 : ");
        scanf_s("%c", &op);
            switch (op) {
            case '+':
                printf("첫 번째 수 : ");
                scanf_s("%f", &num1);
                printf("두 번째 수 : ");
                scanf_s("%f", &num2);
                getchar();
                result = num1 + num2;
                printf("%f %c %f = %f\n", num1, op, num2, result);
                break;
            case '-':
                printf("첫 번째 수 : ");
                scanf_s("%f", &num1);
                printf("두 번째 수 : ");
                scanf_s("%f", &num2);
                getchar();
                result = num1 - num2;
                printf("%f %c %f = %f\n", num1, op, num2, result);
                break;
            case '/':
                printf("첫 번째 수 : ");
                scanf_s("%f", &num1);
                printf("두 번째 수 : ");
                scanf_s("%f", &num2);
                getchar();
                if (num2 == 0)
                {
                    printf("0으로 나눌 수 없습니다.\n");
                }
                else
                {
                    result = num1 / num2;
                    printf("%f / %f = %f\n", num1, num2, result);
                }
                break;
            case '*':
                printf("첫 번째 수 : ");
                scanf_s("%f", &num1);
                printf("두 번째 수 : ");
                scanf_s("%f", &num2);
                getchar();
                result = num1 * num2;
                printf("\n%f %c %f = %f\n", num1, op, num2, result);
                break;
            case 'X':
                printf("프로그램을 종료합니다\n");
                return 1;
            case 'x':
                printf("프로그램을 종료합니다\n");
                return 1;
            default:
                printf("다시 시도하세요\n");
                getchar();
                break;
            
            }
        }
    }

switch문은 case를 이용합니다. 다만 여기서 break문을 이용하면 case에서 빠져나가는 형태입니다.
따라서 반복문에서 탈출하는 것이 아니기 때문에 break문으로만 반복문을 탈출할 수 없습니다.
이에 고민하다가 찾은 방법으로 return 1;이 있습니다.

일반적으로 return 0;을 통해 코드를 정상적이게 흘러가게 만드는데 1을 넣으면 프로그램의 작동을 중지시킵니다.
이 방법을 이용하여 반복문을 탈출할 수 있습니다.

정리

swtich문과 if문을 둘 다 이용하여 제일 기초적인 계산기를 하나씩 구현해보았습니다.
이제 이 코드를 활용하여 기능들을 추가하며 만들어보겠습니다.

while문 탈출 차이점

  • if문은 break문을 이용하여 반복문 탈출할 수 있다.
  • switch문은 break문을 이용하면 case를 탈출하고 다시 반복하므로 return 1;을 넣어 반복문을 탈출한다.

Comments