icon안동민 개발노트

간단한 계산기 프로그램 작성


프로그램 개요

 이번 실습에서는 기본적인 사칙연산을 수행하는 간단한 계산기 프로그램을 작성해보겠습니다. 이 프로그램을 통해 지금까지 학습한 C++의 기본 개념들을 실제로 적용해볼 수 있습니다.

 프로그램의 주요 기능은 다음과 같습니다.

  • 두 개의 숫자 입력 받기
  • 연산자 입력 받기 +, -, *, /
  • 선택된 연산 수행
  • 결과 출력
  • 사용자 선택에 따라 프로그램 반복 실행

프로그램 설계

 프로그램을 구현하기 전에 먼저 전체적인 구조를 설계해보겠습니다.

  1. 사용자 입력
  • 두 개의 숫자 (부동소수점 사용)
  • 연산자 (문자)
  1. 연산 수행
  • switch 문을 사용하여 연산자에 따른 적절한 연산 수행
  • 나눗셈의 경우 0으로 나누는 상황 처리
  1. 결과 출력
  • 계산 결과를 화면에 출력
  1. 프로그램 반복
  • 사용자가 원할 경우 새로운 계산 수행

코드 구현

 이제 설계를 바탕으로 실제 C++ 코드를 작성해보겠습니다.

#include <iostream>
#include <limits>
 
int main() {
    char continueCalculation;
    do {
        double num1, num2, result;
        char operation;
 
        // 첫 번째 숫자 입력
        std::cout << "첫 번째 숫자를 입력하세요: ";
        while(!(std::cin >> num1)) {
            std::cout << "올바른 숫자를 입력해주세요: ";
            std::cin.clear();
            std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
        }
 
        // 두 번째 숫자 입력
        std::cout << "두 번째 숫자를 입력하세요: ";
        while(!(std::cin >> num2)) {
            std::cout << "올바른 숫자를 입력해주세요: ";
            std::cin.clear();
            std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
        }
 
        // 연산자 입력
        std::cout << "연산자를 입력하세요 (+, -, *, /): ";
        std::cin >> operation;
 
        // 연산 수행
        switch(operation) {
            case '+':
                result = num1 + num2;
                break;
            case '-':
                result = num1 - num2;
                break;
            case '*':
                result = num1 * num2;
                break;
            case '/':
                if(num2 != 0) {
                    result = num1 / num2;
                } else {
                    std::cout << "오류: 0으로 나눌 수 없습니다." << std::endl;
                    continue;
                }
                break;
            default:
                std::cout << "오류: 잘못된 연산자입니다." << std::endl;
                continue;
        }
 
        // 결과 출력
        std::cout << "결과: " << result << std::endl;
 
        // 계속 여부 확인
        std::cout << "계속하시겠습니까? (y/n): ";
        std::cin >> continueCalculation;
    } while(continueCalculation == 'y' || continueCalculation == 'Y');
 
    return 0;
}

주요 개념 설명

  1. #include <iostream>
  • 입출력 기능을 사용하기 위한 헤더 파일입니다.
  1. #include <limits>
  • 숫자 타입의 한계값을 다루기 위한 헤더 파일입니다. 입력 버퍼를 지우는 데 사용됩니다.
  1. double 타입 사용
  • 부동소수점 연산을 위해 double 타입을 사용했습니다.
  1. do-while 루프
  • 최소한 한 번은 실행되는 루프로, 사용자가 계속할지 여부를 묻는 데 사용됩니다.
  1. switch
  • 연산자에 따라 다른 연산을 수행하기 위해 사용됩니다.
  1. 예외 처리
  • 0으로 나누는 경우와 잘못된 연산자 입력에 대한 처리를 포함했습니다.
  1. 입력 유효성 검사
  • while 루프를 사용하여 올바른 숫자 입력을 보장합니다.

프로그램 실행 및 테스트

 프로그램을 컴파일하고 실행한 후, 다음과 같은 테스트 케이스로 프로그램을 검증해보세요.

  1. 기본 연산 : 10 + 5, 20 - 7, 6 * 8, 15 / 3
  2. 소수점 연산 : 3.14 * 2, 10 / 3
  3. 예외 상황 : 5 / 0 (0으로 나누기)
  4. 잘못된 입력 : 문자 입력, 잘못된 연산자 입력

코드 개선 방안

 이 기본 버전의 계산기는 잘 작동하지만, 다음과 같은 방법으로 개선할 수 있습니다.

  1. 함수 분리
    • 연산 로직을 별도의 함수로 분리하여 코드의 가독성과 재사용성을 높입니다.
  2. 예외 처리 개선
    • try-catch 문을 사용하여 더 체계적인 예외 처리를 구현합니다.
  3. 사용자 정의 함수 추가
    • 제곱, 제곱근, 로그 등의 고급 연산을 추가합니다.
  4. 메모리 기능
    • 이전 계산 결과를 저장하고 다음 계산에 사용할 수 있는 기능을 추가합니다.

연습 문제

  1. 현재 프로그램에 제곱 연산^을 추가해보세요.
  2. 계산 기록을 저장하고 출력하는 기능을 구현해보세요.
  3. 연산 함수를 별도의 함수로 분리하여 프로그램을 리팩토링해보세요.
  4. 사용자가 입력한 수식을 문자열로 받아 계산하는 기능을 구현해보세요. 예 : "3 + 4 * 2"
  5. 프로그램에 메모리 기능을 추가해보세요. M+, M-, MR, MC


참고 자료