目录
- C++实现简单四则运算计算器的方法
- 1. 基础if-else/switch实现
- 2. 使用函数封装
- 3. 使用函数指针或std::function
- 4. 面向对象实现
- 5. 支持表达式解析的实现
C++实现简单四则运算计算器的方法
在C++中实现一个支持加减乘除的四则运算计算器有多种方法,下面介绍几种常见的实现方式:
1. 基础if-else/switch实现
#include <iostream>
using namespace std;
int main() {
char op;
double num1, num2;
cout << "请输入运算符 (+, -, *, /): ";
cin >> op;
cout << "请输入两个数字: ";
cin >> num1 >> num2;
switch(op) {
case '+':
cout << num1 << " + " << num2 << " = " << num1 + num2;
break;
case '-':
cout << num1 << " - " << num2 << " = " << num1 - num2;
break;
case '*':
cout << num1 << " * " << num2 << " = " << num1 * num2;
break;
case '/':
if(num2 != 0)
cout << num1 << " / " << num2 << " = " << num1 / num2;
else
cout << "错误!除数不能为零";
break;
default:
cout << "错误!无效的运算符";
}
return 0;
}
2. 使用函数封装
#include <iostream>
using namespace std;
double add(double a, double b) { return a + b; }
double subtract(double a, double b) { return a - b; }
double multiply(double a, double b) { return a * b; }
double divide(double a, double b) {
if(b == 0) throw "除数不能为零";
return a / b;
}
int main() {
char op;
double num1, num2;
cout << "请输入运算符 (+, -, *, /): ";
cin >> op;
cout << "请输入两个数字: ";
cin >> num1 >> num2;
try {
switch(op) {
case '+': cout << add(num1, num2); break;
case '-': cout << subtract(num1, num2); break;
case '*': cout << multiply(num1, num2); break;
case '/': cout << divide(num1, num2); break;
default: cout << "无效运算符";
}
} catch (const char* msg) {
cout << "错误: " << msg;
}
return 0;
}
3. 使用函数指针或std::function
#include <iostream>
#include <functional>
#include <map>
using namespace std;
int main() {
map<char, function<double(double, double)>> operations = {
{'+', [](double a, double b) { return a + b; }},
{'-', [](double a, double b) { return a - b; }},
{'*', [](double a, double b) { return a * b; }},
{'/', [](double a, double b) {
if(b == 0) throw "除数不能为零";
return a / b;
}}
};
char op;
double num1, num2;
cout << "请输入运算符 (+, -, *, /): ";
cin >> op;
cout << "请输入两个数字: ";
cin >> num1 >> num2;
try {
if(operations.find(op) != operations.end()) {
cout << operations[op](num1, num2);
} else {
cout << "无效运算符";
}
} catch (const char* msg) {
cout << "错误: " << msg;
}
return 0;
}
4. 面向对象实现
#include <iostream>
#include <stdexcept>
using namespace std;
class Calculator {
public:
double calculate(char op, double a, double b) {
switch(op) {
case '+': return a + b;
case '-': return a - b;
case '*': return a * b;
case '/':
if(b == 0) throw invalid_argument("除数不能为零");
return a / b;
default: throw invalid_argument("无效运算符");
}
}
};
int main() {
Calculator calc;
char op;
double num1, num2;
cout << "请输入运算符 (+, -, *, /): ";
cin >> op;
cout << "请输入两个数字: ";
cin >> num1 >> num2;
try {
cout << calc.calculate(op, num1, num2);
} catch (const invalid_argument& e) {
cout << "错误: " << e.what();
}
return 0;
}
5. 支持表达式解析的实现
如果需要支持更复杂的表达式(如"3+5*2"),可以使用栈或递归下降解析:
#include <iostream>
#include <stack>
#include <cctype>
using namespace std;
int precedence(char op) {
if(op == '+' || op == '-') return 1;
if(op == '*' || op == '/') return 2;
return 0;
}
double applyOp(double a, double b, char op) {
switch(op) {
case '+': return a + b;
case '-': return a - b;
case '*': return a * b;
case '/':
if(b == 0) throw runtime_error("除数不能为零");
return a / b;
default: return 0;
}
}
double evaluate(string expr) {
stack<double> values;
stack<char> ops;
for(int i = 0; i < expr.length(); i++) {
if(expr[i] == ' ') continue;
if(expr[i] == '(') {
ops.push(expr[i]);
}
else if(isdigit(expr[i]) || expr[i] == '.') {
string numStr;
while(i < expr.length() && (isdigit(expr[i]) || expr[i] == '.')) {
numStr += expr[i++];
}
i--;
values.push(stod(numStr));
}
else if(expr[i] == ')') {
while(!ops.empty() && ops.top() != '(') {
double val2 = values.top(); values.pop();
double val1 = values.top(); values.pop();
char op = ops.top(); ops.pop();
values.push(applyOp(val1, val2, op));
}
if(!ops.empty()) ops.pop();
}
else {
while(!ops.empty() && precedence(ops.top()) >= precedence(expr[i])) {
double val2 = values.top(); values.pop();
double val1 = values.top(); values.pop();
char op = ops.top(); ops.pop();
values.push(applyOp(val1, val2, op));
}
ops.push(expr[i]);
}
}
while(!ops.empty()) {
double val2 = values.top(); values.pop();
double val1 = values.top(); values.pop();
char op = ops.top(); ops.pop();
values.push(applyOp(val1, val2, op));
}
return values.top();
}
int main() {
string expr;
cout << "请输入表达式: ";
getline(cin, expr);
try {
double result = evaluate(expr);
cout << "结果: " << result << endl;
} catch (const runtime_error& e) {
cout << "错误: " << e.what() << endl;
}
return 0;
}