我正在尝试编写一个程序来评估用户输入的表达式。我知道我需要有单独的方法,所以它先评估乘法和除法,然后再加上加法和减法。这是我到目前为止所得到的。当我尝试涉及乘法或除法的任何事情时,例如6 * 6,它只会打印第一个字符,在这个例子中它只是'6'。有什么想法吗?
import java.util.Scanner;
class Expressions {
String e;
void setExpressions(String exp) {
e = exp;
}
String evaluate() {
String n = "";
for (int i = 0; i < e.length(); i++)
if (e.charAt(i) == '*' || e.charAt(i) == '/') {
n += e.charAt(i);
}
else if (e.charAt(i) == '+' || e.charAt(i) == '/') {
evaluateMD();
n = "";
}
else
n += e.charAt(i);
return n;
}
int evaluateMD () {
int r = 1;
int n = 0;
char op = '*';
for (int i = 0; i < evaluate().length(); i++)
if (evaluate().charAt(i) == '*' || evaluate().charAt(i) == '/') {
if (op == '*')
r *= n;
else
r /= n;
n = 0;
op = evaluate().charAt(i);
}
else if (evaluate().charAt(i) == '*' || evaluate().charAt(i) == '/')
n = 0;
else //digits
n = n*10 + (evaluate().charAt(i)-'0');
if (op == '+') //last operation
r *= n;
else
r /= n;
return r;
}
int evaluateAS() {
//e has +, - only, multiple digit numbers
int r = 0;
int n = 0;
char op = '+';
for (int i = 0; i < e.length(); i++)
if (e.charAt(i) == '+' || e.charAt(i) == '-') {
if (op == '+')
r += n;
else
r -= n;
n = 0;
op = e.charAt(i);
}
else if (e.charAt(i) == '*' || e.charAt(i) == '/')
n = 0;
else //digits
n = n*10 + (e.charAt(i)-'0');
if (op == '+') //last operation
r += n;
else
r -= n;
return r;
}
}
public class hw10 {
public static void main(String[] args) {
Scanner in = new Scanner (System.in);
Expressions myE = new Expressions();
System.out.print("Enter E:");//E for expression
String e = in.next();
myE.setExpressions(e);
//int r = myE.evaluate1();
int r = myE.evaluateAS();
System.out.println(e+" = "+r);
}
}
答案 0 :(得分:1)
更改行
if (op == '+') //last operation
在evaluateMD方法中
if (op == '*') //last operation
,将方法的返回类型更改为double并使r和n加倍会为evaluateMD生成更好的结果,但实际上,如果不是完全放弃,则整个过程需要进行大修。
我认为如果您的评估方法只返回计算的答案,那会更好。
它最多只需要存储2个值:(如果您有AS操作,如果下一个操作符是MD,则存储它,因为MD需要首先进行评估,但是一旦MD操作(可能涉及多个操作员或同一操作员的多个实例,即4 * 5 * 6或4/3 * 2),然后您可以立即执行“等待”AS。对于MD操作,您只需存储每次都是最新的更新,因为你几乎已经在你的evaluateMD方法中工作了(我认为这与我放在顶部的修改有关。如果它没有随意问我,因为我做了一些其他更改) 。
这是对您尝试的方法的改进,但正如我所说,可能有更好的方法在其他答案中仍然提到。
答案 1 :(得分:1)
如果我需要编写算术表达式解析器,我会使用非常简单的方法:从用户获取输入,将其转换为reverse polish notation(看看名为 Shunting-yard算法),并评估它 Robert Lafore在他的&#34; Java中的数据结构和算法&#34;对两种算法都有相当简单的解释 - 从中缀到RPN的转换以及使用源代码评估用RPN编写的表达式,因此您可以看到它是如何实现的。阅读之后,将两种算法合二为一很容易 - 请看一下one of my questions这个主题。