我正在尝试制作一个可以锻炼输入金额的计算器。
示例:
我尝试过这样的事情......
import java.util.*;
public class Calc {
String sum;
public static void main(String[]args){
Scanner sum = new Scanner(System.in);
System.out.println("Please enter a sum: ");
double newsum = Integer.parseInt(sum);
sum.close();
System.out.println(newsum);
}
}
答案 0 :(得分:3)
将所有内容都放入字符串表达式后,您可以使用内置的javascript引擎来评估表达式。
import java.util.Scanner;
import javax.script.ScriptEngineManager;
import javax.script.ScriptEngine;
public class Example {
public static void main(String[] args) throws Exception {
System.out.println("Please enter an expression: ");
String toEval = new Scanner(System.in).next();
ScriptEngineManager mgr = new ScriptEngineManager();
ScriptEngine jsEngine = mgr.getEngineByName("JavaScript");
System.out.println(jsEngine.eval(toEval));
}
}
答案 1 :(得分:1)
答案 2 :(得分:0)
我不知道你是多么先进,但是如果你想要做到有趣,学习和研究最佳解决方案,也许值得考虑设计模式:即这种设计模式:http://sourcemaking.com/design_patterns/interpreter 至少是为了好玩
答案 3 :(得分:0)
请查看this一篇包含不同表达评估提示的好文章。它还包含对 Jexel 的引用,这在数学表达式中已经足够了,这是一个简短的例子:
JexlEngine jexl = new JexlEngine();
Expression func = jexl.createExpression("x1*x2-x3");
MapContext mc = new MapContext();
mc.set("x1", 5);
mc.set("x2", 3);
mc.set("x3", 2);
System.out.println(func.evaluate(mc));
答案 4 :(得分:0)
这不会与括号一起使用,我还没有测试过,但这样的解决方案可能会起作用
for(int i = 0; i < equation.length; i++) {
char c = equation.charAt(i);
if(c == '*' || c == '/') { // Operators with highest precedence
double op1 = getNumBeforeIndex(i);
double op2 = getNumAfterIndex(i, equation);
double answer;
switch(c) { // Perform sum
case '*':
answer = op1 * op2;
break;
case '/':
answer = op1 / op2;
break;
}
equation = replaceSumWithAnswer(i, equation, answer);
}
}
然后用+和 - 做同样的事。
对于'getNumBeforeIndex'和'getNumAfterIndex',您需要循环离开给定的索引,直到找到非数字字符。你还必须记住允许小数点和负数。
'replaceSumWithAnswer'方法必须获取第一个操作数开始的索引,然后获取第二个操作数的最后一个索引,然后用答案替换子字符串。
希望这可能会指出你正确的方向。
答案 5 :(得分:0)
嗯,这是一个简单的问题,但答案有点复杂。如果不对表达式的语法进行任何假设,则无法解析此类表达式。是中缀/后缀/前缀。它是否使用括号?是加法转换吗?乘法左或右关联? *和+符号的实际含义是什么?
构建计算器时需要做出许多决定,因此Java编程语言没有任何开箱即用的评估支持。如果您希望操作符合其标准含义,请使用某些库。如果您希望有一些非标准行为,那么编写自己的语法。如果您将使用括号,则需要 pull-push automaton 来实现它,可能与 LL1语法结合使用。
但是,当你提出这样的问题时,我想你根本不熟悉Java和编程。我不建议你尝试一下,你需要一些自动机和语法理论的基础知识。
当我自学Java时,我也遇到了这个问题,我通过输入程序作为windows计算器解决了这个问题。该程序包含一个聚合当前结果的寄存器,并且在每次操作之后,程序向用户查询下一个结果(您也可以使用非常简单的解析器执行此操作 - 但请记住,计算器将无法识别运算符的优先级。)