计算器的基本功能,加减乘除,(任意数的运算都支持)。 程序易于维护,开发两个版本,第二个版本将不能修改第一个版本的类,主程序修改有效代码不超过3行,加入开根号等操作。 输入:运算表达式 100+20*50 输出:答案1100用c++
时间: 2024-02-13 18:06:34 浏览: 44
好的,我来为您解答。首先,我们可以使用栈来实现计算器的基本功能。具体实现过程如下:
1. 定义一个栈来存储数字和运算符。
2. 从左到右遍历表达式中的每个字符,遇到数字则压入栈中,遇到运算符则弹出栈顶的两个数字进行运算,并将结果压入栈中。
3. 遍历完表达式后,栈中剩下的数字即为计算结果。
下面是基本功能的代码实现:
```c++
#include <iostream>
#include <stack>
#include <string>
using namespace std;
int calculate(string s) {
stack<int> nums;
stack<char> ops;
int num = 0;
char op = '+';
for (int i = 0; i < s.size(); i++) {
if (isdigit(s[i])) {
num = num * 10 + (s[i] - '0');
}
if (!isdigit(s[i]) && s[i] != ' ' || i == s.size() - 1) {
if (op == '+') {
nums.push(num);
}
else if (op == '-') {
nums.push(-num);
}
else if (op == '*') {
int tmp = nums.top() * num;
nums.pop();
nums.push(tmp);
}
else if (op == '/') {
int tmp = nums.top() / num;
nums.pop();
nums.push(tmp);
}
num = 0;
op = s[i];
}
}
int res = 0;
while (!nums.empty()) {
res += nums.top();
nums.pop();
}
return res;
}
int main() {
string s = "100+20*50";
cout << calculate(s) << endl;
return 0;
}
```
接下来是第二个版本的代码实现,实现了开根号操作:
```c++
#include <iostream>
#include <stack>
#include <string>
#include <cmath>
using namespace std;
class Calculator {
public:
Calculator() {}
virtual ~Calculator() {}
virtual int calculate(string s) = 0;
};
class BasicCalculator : public Calculator {
public:
BasicCalculator() {}
virtual ~BasicCalculator() {}
virtual int calculate(string s) {
stack<int> nums;
stack<char> ops;
int num = 0;
char op = '+';
for (int i = 0; i < s.size(); i++) {
if (isdigit(s[i])) {
num = num * 10 + (s[i] - '0');
}
if (!isdigit(s[i]) && s[i] != ' ' || i == s.size() - 1) {
if (op == '+') {
nums.push(num);
}
else if (op == '-') {
nums.push(-num);
}
else if (op == '*') {
int tmp = nums.top() * num;
nums.pop();
nums.push(tmp);
}
else if (op == '/') {
int tmp = nums.top() / num;
nums.pop();
nums.push(tmp);
}
num = 0;
op = s[i];
}
}
int res = 0;
while (!nums.empty()) {
res += nums.top();
nums.pop();
}
return res;
}
};
class AdvancedCalculator : public Calculator {
public:
AdvancedCalculator(Calculator* c) {
basicCalculator = c;
}
virtual ~AdvancedCalculator() {}
virtual int calculate(string s) {
int res = basicCalculator->calculate(s);
for (int i = 0; i < s.size(); i++) {
if (s[i] == 's') {
if (s[i + 1] == 'q') {
res = sqrt(res);
}
}
}
return res;
}
private:
Calculator* basicCalculator;
};
int main() {
Calculator* basicCalculator = new BasicCalculator();
Calculator* advancedCalculator = new AdvancedCalculator(basicCalculator);
string s = "100+20*50";
cout << advancedCalculator->calculate(s) << endl;
s = "sqrt(100+20*50)";
cout << advancedCalculator->calculate(s) << endl;
delete advancedCalculator;
delete basicCalculator;
return 0;
}
```
在第二个版本的代码中,我们定义了一个抽象类 Calculator,其中包含一个纯虚函数 calculate,表示计算器的计算功能。接着,我们定义了一个 BasicCalculator 类来实现计算器的基本功能,它继承自 Calculator 类,实现了 calculate 函数。然后,我们定义了一个 AdvancedCalculator 类来实现开根号等高级运算,它也继承自 Calculator 类,但是它同时拥有一个指向 BasicCalculator 对象的指针,用来调用基本计算器的计算函数。在 calculate 函数中,我们先调用基本计算器的计算函数得到结果,然后再遍历一遍表达式,如果遇到开根号运算,就调用 sqrt 函数进行计算。最后返回计算结果即可。
希望我的回答能够帮到您!