【发布时间】:2017-10-12 00:30:30
【问题描述】:
我编写了一个程序,您可以在其中提供一个字符串作为输入。这个字符串应该是一个正常的术语,例如"5 + 3 / 2" 并且所有数字和运算符都必须通过空格分隔。您可以输入的术语应该与您想要的一样长,例如“1 * 2 * 5 - 1 * 4 + 1 + 5 + 3 + 3 + 3”也应该可以工作。 +、-、* 和 / 是唯一允许使用的运算符。
我已经有了一个工作代码。但它忽略了 * 和 / 在 + 和 - 之前的事实。但它完美地完成了其他所有事情。 这个想法是它创建了两个数组,一个将运算符保存在一个字符数组中(称为字符运算符[]),另一个数组将整数保存在一个浮点数组中(称为浮点值[])。那么我有这个计算方法:
void calc(float values[], char operators[]) {
float res_final;
float res_array[10];
int counter = (sizeof(values) / sizeof(*values));
for (int i = 0; i < getBorder(values); i++) {
if (i == 0) {
res_array[i] = switchFunction(values[i], values[i + 1], operators[i]);
}
res_final = switchFunction(res_array[i], values[i + 2], operators[i + 1]);
res_array[i+1] = res_final;
if (i == getBorder(values)) {
break;
}
}
std::cout << "evaluation of expression is: " << res_final << std::endl;
}
float switchFunction(float val_1, float val_2, char op) {
switch (op) {
case '+': return val_1 + val_2;
break;
case '-': return val_1 - val_2;
break;
case '*': return val_1 * val_2;
break;
case '/': return val_1 / val_2;
break;
}
return 0;
}
好吧,代码不是很漂亮,但我想不出更有用的东西。我有很多想法,但在运营商方面都失败了。我想在“+”中定义正常的+,其余的也一样,但这不起作用。
因此,如果您对如何在行前包含点有任何建议,或者您对我的方法有完全不同的方法,我会很高兴听到:)
【问题讨论】:
-
您有什么具体问题吗?如果不是 - 您的问题与 SO 无关。你在找code review吗?
-
sizeof(values) / sizeof(*values)在函数内部不起作用。并且要计算一个中缀表达式,您需要转换为reverse Polish notation -
但它忽略了 * 和 / 在 + 和 - 之前的事实。但它完美地完成了其他所有事情。 -- 愚人金。要真正让它正常工作,你基本上必须放弃你所做的一切,并正确实现递归下降解析器,或某种类型的类来获取该表达式并将其转换为反向波兰符号。不要试图将代码硬塞进你当前的实现中来让它工作——你最终会得到你无法维护、理解或在必要时扩展的代码(例如,如果你想添加括号)。