实验要求
请按照四则运算加、减、乘、除、幂(^)和括号的优先关系和惯例,编写计算器程序。要求:
(1)从键盘输入一个完整的表达式,以回车作为表达式输入结束的标志。
(2)输入表达式中的数值均为大于等于零的整数。中间的计算过程如果出现小数也只取整。
例如,输入:4+2*5= 输出:14
输入:(4+2)*(2-10)= 输出:-48
1.需求分析
该程序的设计任务是创建一个简单的计算器,能够处理基本的四则运算(加减乘除)以及幂运算(^)。此外,该程序还需要能够处理括号,并且在计算过程中只取整数部分。
2. 概要设计
(1)抽象数据类型的定义
① stack<int>:用于存储操作数的栈
② stack<char>:用于存储运算符的栈
(2)主程序的流程
① main() 函数接收用户输入的表达式,并调用 evaluateExpression() 函数来计算表达式的结果。
② evaluateExpression() 函数对表达式进行解析和计算,并使用两个栈分别存储操作数和运算符,最终得出结果。
(3)程序模块之间的调用关系
main() 调用 evaluateExpression() 函数。
3. 详细设计
evaluateExpression() 函数算法
① 创建两个栈,分别用于存储操作数和运算符。
② 遍历表达式的每个字符:
若是空格,跳过。
若是数字,则解析出完整的数字并压入操作数栈。
若是左括号,则将其压入运算符栈。
若是右括号,则依次计算直到遇到左括号,处理括号内的表达式。
若是运算符,根据优先级进行计算,将结果压入操作数栈。
③ 处理剩余的运算符和操作数直到运算符栈为空。
④ 返回最终的计算结果。
4. 调试分析
在调试过程中,可能会遇到以下问题:
(1)表达式的输入格式问题:程序可能无法正确解析输入的表达式,导致计算错误。解决方法是确保输入的表达式符合程序要求的格式,包括空格的处理和操作数的正确解析。
(2)运算符优先级问题:可能存在运算符优先级处理错误导致计算错误的情况。需要检查优先级判断和运算的逻辑。
5. 测试结果
测试输入1:4+2*5= 输出结果1:14
测试输入2:(4+2)*(2-10)= 输出结果2:-48
![](https://i-blog.csdnimg.cn/direct/b14abc38f72d42ac97f52ef8eb4e8be7.png)
![](https://i-blog.csdnimg.cn/direct/dbe76da7bb984a2a8400635e4074a7e8.png)
6.完整代码
#include <iostream>
#include <stack>
#include <cctype> // for isdigit()
#include <cmath> // for pow()
using namespace std;
int precedence(char op) {
if (op == '^')
return 3;
else if (op == '*' || op == '/')
return 2;
else if (op == '+' || op == '-')
return 1;
else
return -1;
}
int applyOperation(int a, int b, char op) {
switch (op) {
case '+':
return a + b;
case '-':
return a - b;
case '*':
return a * b;
case '/':
return a / b;
case '^':
return pow(a, b);
default:
return 0;
}
}
int evaluateExpression(const string& expression) {
stack<int> values;
stack<char> operators;
for (size_t i = 0; i < expression.length(); ++i) {
if (expression[i] == ' ') {
continue;
} else if (isdigit(expression[i])) {
int num = 0;
while (i < expression.length() && isdigit(expression[i])) {
num = num * 10 + (expression[i] - '0');
++i;
}
values.push(num);
--i;
} else if (expression[i] == '(') {
operators.push(expression[i]);
} else if (expression[i] == ')') {
while (!operators.empty() && operators.top() != '(') {
int b = values.top();
values.pop();
int a = values.top();
values.pop();
char op = operators.top();
operators.pop();
values.push(applyOperation(a, b, op));
}
if (!operators.empty()) {
operators.pop(); // Pop '('
}
} else {
while (!operators.empty() && precedence(operators.top()) >= precedence(expression[i])) {
int b = values.top();
values.pop();
int a = values.top();
values.pop();
char op = operators.top();
operators.pop();
values.push(applyOperation(a, b, op));
}
operators.push(expression[i]);
}
}
while (!operators.empty()) {
int b = values.top();
values.pop();
int a = values.top();
values.pop();
char op = operators.top();
operators.pop();
values.push(applyOperation(a, b, op));
}
return values.top();
}
int main() {
string expression;
cout << "请输入表达式(以=结束): ";
getline(cin, expression, '=');
int result = evaluateExpression(expression);
cout << "输出结果: " << result << endl;
return 0;
}
***本实验报告属原创,各位可以免费取用,严禁商用