“桌面计算器”从标准输入设备读入一个(数值计算)表达式,计算它的值后从标准输出设备输出;读入的也可以是一个赋值语句:左端是一个符号名,右端是表达式。 表达式中可以有四则运算符、括号、整数/实数值、已经赋值的符号名和预定义的符号常量( pi 和 e ),也可以只有单个的整数/实数值。 发现输入内容与文法不符或将导致非法计算时,则从标准输出设备输出出错提示,并计算出错次数。,N 写一个这样的c++程序
时间: 2024-02-27 17:54:26 浏览: 70
好的,我可以帮你实现这个程序。首先,我们需要使用 C++ 中的表达式求值库,例如 math.h 或者 boost 库。接下来,我们可以使用标准输入输出流来读取和输出数据,具体实现如下:
```c++
#include <iostream>
#include <string>
#include <cmath>
using namespace std;
int main() {
int errorCount = 0; // 错误计数器
string input;
while (getline(cin, input)) { // 读取输入
// 处理表达式或赋值语句
// ...
// 输出结果或错误提示
// ...
}
cout << "错误次数:" << errorCount << endl;
return 0;
}
```
接下来,我们可以编写一个函数来处理输入的表达式或赋值语句,并返回计算结果或错误提示,具体实现如下:
```c++
double evaluate(string input) {
// 处理表达式或赋值语句
// ...
// 计算表达式的值
// ...
// 如果出现错误,则返回 NAN
return NAN;
}
```
在处理表达式或赋值语句时,我们可以使用正则表达式或者递归下降法来进行语法分析,具体实现可以参考以下代码:
```c++
double factor(string input, int& pos) {
double result = NAN;
if (input[pos] == '(') {
pos++;
result = expression(input, pos);
if (input[pos] == ')') {
pos++;
} else {
cerr << "缺少右括号!" << endl;
}
} else if (isdigit(input[pos])) {
// 处理数字
// ...
} else if (isalpha(input[pos])) {
// 处理符号名或常量
// ...
} else {
cerr << "无效的表达式!" << endl;
}
return result;
}
double term(string input, int& pos) {
double result = factor(input, pos);
while (pos < input.length()) {
if (input[pos] == '*') {
pos++;
result *= factor(input, pos);
} else if (input[pos] == '/') {
pos++;
double divisor = factor(input, pos);
if (divisor != 0) {
result /= divisor;
} else {
cerr << "除数不能为零!" << endl;
}
} else {
break;
}
}
return result;
}
double expression(string input, int& pos) {
double result = term(input, pos);
while (pos < input.length()) {
if (input[pos] == '+') {
pos++;
result += term(input, pos);
} else if (input[pos] == '-') {
pos++;
result -= term(input, pos);
} else {
break;
}
}
return result;
}
double evaluate(string input) {
int pos = 0;
double result = expression(input, pos);
if (pos < input.length()) {
cerr << "无效的表达式!" << endl;
result = NAN;
}
return result;
}
```
最后,我们可以在主函数中调用 evaluate 函数来处理输入,并输出结果或错误提示,具体实现如下:
```c++
int main() {
int errorCount = 0;
string input;
while (getline(cin, input)) {
double result = evaluate(input);
if (!isnan(result)) {
cout << result << endl;
} else {
errorCount++;
}
}
cout << "错误次数:" << errorCount << endl;
return 0;
}
```
这样,我们就完成了一个简单的桌面计算器程序。完整代码如下:
阅读全文