icon안동민 개발노트

복합 연산을 수행하는 프로그램 구현


학습 목표

  1. 다양한 연산자를 적절히 조합하여 사용할 수 있다.
  2. 연산자 우선순위를 고려하여 올바른 결과를 도출할 수 있다.
  3. 비트 연산자, 관계 연산자, 논리 연산자 등을 실제 상황에 적용할 수 있다.
  4. 복잡한 수식을 C++ 코드로 구현할 수 있다.

실습 프로그램 : 다기능 계산기

 다음 기능을 가진 계산기 프로그램을 구현해봅시다.

  1. 기본 산술 연산 (덧셈, 뺄셈, 곱셈, 나눗셈, 나머지)
  2. 비트 연산 (AND, OR, XOR, 왼쪽 시프트, 오른쪽 시프트)
  3. 논리 연산 (AND, OR, NOT)
  4. 간단한 수학 함수 (절대값, 제곱, 세제곱)
  5. 2진수, 8진수, 16진수 변환

프로그램 구조

#include <iostream>
#include <cmath>
#include <bitset>
 
// 함수 선언
void printMenu();
int getChoice();
void performOperation(int choice);
 
// 연산 함수 선언
int add(int a, int b);
int subtract(int a, int b);
int multiply(int a, int b);
double divide(int a, int b);
int modulo(int a, int b);
int bitwiseAND(int a, int b);
int bitwiseOR(int a, int b);
int bitwiseXOR(int a, int b);
int leftShift(int a, int b);
int rightShift(int a, int b);
bool logicalAND(bool a, bool b);
bool logicalOR(bool a, bool b);
bool logicalNOT(bool a);
int absolute(int a);
int square(int a);
int cube(int a);
void convertBase(int n);
 
int main() {
    int choice;
    do {
        printMenu();
        choice = getChoice();
        performOperation(choice);
    } while (choice != 0);
 
    return 0;
}
 
// 함수 구현
void printMenu() {
    std::cout << "\n다기능 계산기 메뉴:\n";
    std::cout << "1. 덧셈\n2. 뺄셈\n3. 곱셈\n4. 나눗셈\n5. 나머지\n";
    std::cout << "6. 비트 AND\n7. 비트 OR\n8. 비트 XOR\n";
    std::cout << "9. 왼쪽 시프트\n10. 오른쪽 시프트\n";
    std::cout << "11. 논리 AND\n12. 논리 OR\n13. 논리 NOT\n";
    std::cout << "14. 절대값\n15. 제곱\n16. 세제곱\n";
    std::cout << "17. 진수 변환\n";
    std::cout << "0. 종료\n";
}
 
int getChoice() {
    int choice;
    std::cout << "선택: ";
    std::cin >> choice;
    return choice;
}
 
void performOperation(int choice) {
    int a, b;
    bool boolA, boolB;
 
    switch(choice) {
        case 1:
            std::cout << "두 정수 입력: ";
            std::cin >> a >> b;
            std::cout << "결과: " << add(a, b) << std::endl;
            break;
        case 2:
            std::cout << "두 정수 입력: ";
            std::cin >> a >> b;
            std::cout << "결과: " << subtract(a, b) << std::endl;
            break;
        case 3:
            std::cout << "두 정수 입력: ";
            std::cin >> a >> b;
            std::cout << "결과: " << multiply(a, b) << std::endl;
            break;
        case 4:
            std::cout << "두 정수 입력: ";
            std::cin >> a >> b;
            std::cout << "결과: " << divide(a, b) << std::endl;
            break;
        case 5:
            std::cout << "두 정수 입력: ";
            std::cin >> a >> b;
            std::cout << "결과: " << modulo(a, b) << std::endl;
            break;
        case 6:
            std::cout << "두 정수 입력: ";
            std::cin >> a >> b;
            std::cout << "결과: " << bitwiseAND(a, b) << std::endl;
            break;
        case 7:
            std::cout << "두 정수 입력: ";
            std::cin >> a >> b;
            std::cout << "결과: " << bitwiseOR(a, b) << std::endl;
            break;
        case 8:
            std::cout << "두 정수 입력: ";
            std::cin >> a >> b;
            std::cout << "결과: " << bitwiseXOR(a, b) << std::endl;
            break;
        case 9:
            std::cout << "정수와 시프트할 비트 수 입력: ";
            std::cin >> a >> b;
            std::cout << "결과: " << leftShift(a, b) << std::endl;
            break;
        case 10:
            std::cout << "정수와 시프트할 비트 수 입력: ";
            std::cin >> a >> b;
            std::cout << "결과: " << rightShift(a, b) << std::endl;
            break;
        case 11:
            std::cout << "두 불리언 값 입력 (0 또는 1): ";
            std::cin >> boolA >> boolB;
            std::cout << "결과: " << logicalAND(boolA, boolB) << std::endl;
            break;
        case 12:
            std::cout << "두 불리언 값 입력 (0 또는 1): ";
            std::cin >> boolA >> boolB;
            std::cout << "결과: " << logicalOR(boolA, boolB) << std::endl;
            break;
        case 13:
            std::cout << "불리언 값 입력 (0 또는 1): ";
            std::cin >> boolA;
            std::cout << "결과: " << logicalNOT(boolA) << std::endl;
            break;
        case 14:
            std::cout << "정수 입력: ";
            std::cin >> a;
            std::cout << "결과: " << absolute(a) << std::endl;
            break;
        case 15:
            std::cout << "정수 입력: ";
            std::cin >> a;
            std::cout << "결과: " << square(a) << std::endl;
            break;
        case 16:
            std::cout << "정수 입력: ";
            std::cin >> a;
            std::cout << "결과: " << cube(a) << std::endl;
            break;
        case 17:
            std::cout << "정수 입력: ";
            std::cin >> a;
            convertBase(a);
            break;
        case 0:
            std::cout << "프로그램을 종료합니다.\n";
            break;
        default:
            std::cout << "잘못된 선택입니다.\n";
    }
}
 
// 여기에 각 연산 함수들을 구현하세요.
// 예:
int add(int a, int b) { return a + b; }
int subtract(int a, int b) { return a - b; }
// ... 나머지 함수들 구현
 
void convertBase(int n) {
    std::cout << "2진수 : " << std::bitset<32>(n) << std::endl;
    std::cout << "8진수 : " << std::oct << n << std::endl;
    std::cout << "16진수 : " << std::hex << n << std::endl;
    std::cout << std::dec;  // 10진수 모드로 복귀
}

실습

  1. 위의 프로그램을 완성하세요. 모든 연산 함수들을 구현하고 테스트하세요.
  2. 프로그램에 다음 기능을 추가해보세요.
    • 거듭제곱 계산 a^b
    • 최대공약수 GCD 계산
    • 소수 판별
  3. 비트 연산의 결과를 2진수로 출력하는 기능을 추가하세요.
  4. 복합 대입 연산자 +=, -=, *=, /= 를 사용하여 누적 계산 기능을 구현하세요.

 참고자료