每日一题之老式计算器
老式的计算机只能按照固定次序进行运算,华安大学就有这样一台老式计算机,计算模式为A @ B #C,@和#为输入的运算符(可能是+、-或*,运算符优先级与C++一致),现给出A,B,C的数值以及@和#对应的运算符,请你编写程序,验证老式计算机的运行结果。
输入说明:
第一行是一个整数N(|N|≤10000),表示有N组计算数据需要处理,接下来N行,每行是相应的数据,包括三个整数和两个运算符,分别对应A、@、B、#和C。
输出说明:
对每行输入的数据,输出计算结果。
输入样例:
3
1+2*3
3*2-1
5+7-9
输出样例:
7
5
3
#include <iostream>
#include <sstream>
#include <string>
using namespace std;int main() {int N;cin >> N; // 读取计算数据组数string expression;getline(cin, expression); // 读取剩余的换行符while (N--) {getline(cin, expression); // 读取每行表达式stringstream ss(expression);int A, B, C;char op1, op2;// 解析A, 运算符@, B, 运算符#, Css >> A >> op1 >> B >> op2 >> C;// 先根据运算符优先级处理乘法和除法if (op1 == '*'){if(op2=='*'){printf("%d",A*B*C);}else if(op2=='+'){printf("%d",A*B+C);}else if(op2=='-'){printf("%d",A*B-C);}}else if(op1=='-'){if(op2=='*'){printf("%d",A-B*C);}else if(op2=='+'){printf("%d",A-B+C);}else if(op2=='-'){printf("%d",A-B-C);} }else if(op1=='+'){if(op2=='*'){printf("%d",A+B*C);}else if(op2=='+'){printf("%d",A+B+C);}else if(op2=='-'){printf("%d",A+B-C);}}}return 0;
}
优化后的代码
#include <iostream>
#include <sstream>
#include <string>
using namespace std;// 单个运算符的计算函数
int calculate(int left, char op, int right) {switch (op) {case '+': return left + right;case '-': return left - right;case '*': return left * right;default: return 0;}
}int main() {int N;cin >> N;cin.ignore(); // 忽略换行符while (N--) {string expression;getline(cin, expression);stringstream ss(expression);int A, B, C;char op1, op2;// 解析 A, 运算符 op1, B, 运算符 op2, Css >> A >> op1 >> B >> op2 >> C;int result;if (op2 == '*') {// 先计算 A @ B,因为 @ 为 '*'int temp = calculate(B, op2, C);result = calculate(A, op1, temp);} else {// 若都不是 '*', 从左到右依次计算result = calculate(calculate(A, op1, B), op2, C);}// 输出结果cout << result << endl;}return 0;
}