设计一个从标准输入设备读入一个(数值计算)表达式,计算它的值后从标准输出设备输出;读入的可 以是一个赋值语句:左端是一个符号名,右端是表达式。 表达式中可以有四则运算符、括号、整数/实数值、已经赋值的符号名和预定义的符号常量的c++代码
时间: 2024-02-25 17:56:42 浏览: 90
以下是一个简单的 C++ 代码实现:
```c++
#include <iostream>
#include <string>
#include <unordered_map>
#include <stack>
#include <cmath>
using namespace std;
unordered_map<string, double> symbol_table = {
{"pi", 3.14159265358979323846},
{"e", 2.71828182845904523536}
};
double eval_expr(string expr);
double eval_factor(string factor) {
if (isdigit(factor[0])) {
return stod(factor);
} else if (factor[0] == '-') {
return -eval_factor(factor.substr(1));
} else if (factor[0] == '(' && factor.back() == ')') {
return eval_expr(factor.substr(1, factor.length() - 2));
} else {
return symbol_table[factor];
}
}
double eval_term(string term) {
size_t pos;
while ((pos = term.find('*')) != string::npos || (pos = term.find('/')) != string::npos) {
char op = term[pos];
double left = eval_factor(term.substr(0, pos));
double right = eval_factor(term.substr(pos + 1));
if (op == '*') {
term = to_string(left * right) + term.substr(pos + 1);
} else {
term = to_string(left / right) + term.substr(pos + 1);
}
}
return eval_factor(term);
}
double eval_expr(string expr) {
size_t pos;
while ((pos = expr.find('+')) != string::npos || (pos = expr.find('-')) != string::npos) {
char op = expr[pos];
double left = eval_term(expr.substr(0, pos));
double right = eval_term(expr.substr(pos + 1));
if (op == '+') {
expr = to_string(left + right) + expr.substr(pos + 1);
} else {
expr = to_string(left - right) + expr.substr(pos + 1);
}
}
return eval_term(expr);
}
int main() {
string input;
while (getline(cin, input)) {
size_t assign_pos = input.find('=');
if (assign_pos != string::npos) {
string symbol = input.substr(0, assign_pos);
double value = eval_expr(input.substr(assign_pos + 1));
symbol_table[symbol] = value;
} else {
double value = eval_expr(input);
cout << value << endl;
}
}
return 0;
}
```
该程序使用了一个字符串表达式求值的算法,通过逐步分解表达式为因子、项、表达式,从而计算出表达式的值。它使用了一个符号表来存储已经定义的符号常量和变量,通过逐步解析输入字符串中的符号名和常量/变量来进行计算。在输入中包含赋值语句时,程序会将计算结果存储到符号表中,以备后续使用。
阅读全文