복합 연산을 수행하는 프로그램 구현
학습 목표
- 다양한 연산자를 적절히 조합하여 사용할 수 있다.
- 연산자 우선순위를 고려하여 올바른 결과를 도출할 수 있다.
- 비트 연산자, 관계 연산자, 논리 연산자 등을 실제 상황에 적용할 수 있다.
- 복잡한 수식을 C++ 코드로 구현할 수 있다.
실습 프로그램 : 다기능 계산기
다음 기능을 가진 계산기 프로그램을 구현해봅시다.
- 기본 산술 연산 (덧셈, 뺄셈, 곱셈, 나눗셈, 나머지)
- 비트 연산 (AND, OR, XOR, 왼쪽 시프트, 오른쪽 시프트)
- 논리 연산 (AND, OR, NOT)
- 간단한 수학 함수 (절대값, 제곱, 세제곱)
- 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진수 모드로 복귀
}
실습
- 위의 프로그램을 완성하세요. 모든 연산 함수들을 구현하고 테스트하세요.
- 프로그램에 다음 기능을 추가해보세요.
- 거듭제곱 계산
a^b
- 최대공약수
GCD
계산 - 소수 판별
- 거듭제곱 계산
- 비트 연산의 결과를 2진수로 출력하는 기능을 추가하세요.
- 복합 대입 연산자
+=
,-=
,*=
,/=
를 사용하여 누적 계산 기능을 구현하세요.
참고자료
- C++ 연산자 우선순위 표 : C++ Operator Precedence
- 비트 연산 기법 : Bit Twiddling Hacks
- C++ 표준 라이브러리의 수학 함수 : <cmath<
- 대형 정수 라이브러리 : GMP (GNU Multiple Precision Arithmetic Library)