没有GUI的简单Java计算器

时间:2012-12-24 14:53:43

标签: java command-line-interface calculator

我正在尝试制作一个可以锻炼输入金额的计算器。

示例:

我尝试过这样的事情......

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);

     }

}

6 个答案:

答案 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)

您可以使用ANTLR。您可以找到示例计算器here

修改

如果您使用ANTLR,您将来可以添加更多功能非常轻松,例如使用括号,一些计算方法(例如round,sin,cos)。

答案 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计算器解决了这个问题。该程序包含一个聚合当前结果的寄存器,并且在每次操作之后,程序向用户查询下一个结果(您也可以使用非常简单的解析器执行此操作 - 但请记住,计算器将无法识别运算符的优先级。)