0

我已经编写了一个项目来计算不同的函数,如正弦、MCM 等,而不使用现有的包,如 java 中的数学现在我想从用户那里以字符串的形式获取一个表达式,然后打印出如下结果

import java.util.Scanner;

public class Phase2main {

public static void main(String[] args) {

    Scanner s = new Scanner(System.in);
    String expression   ;
    double result = 0 ;

    System.out.println(" Enter your desired expression from the available functions ");

    expression = s.nextLine();


    System.out.println("Result is : " + result);                
 }
}

那么它应该像这样运行:输入一个表达式:ADD(DIV(SIN(FACT(3)),CEIL(TAN(MUL(1.5,FIB(4))))),GCD(2,10)) 结果是: 1.94

如何让程序识别我的功能,如 CEIL 及其输入?我已经检查了许多类似的问题,但我发现的那些是相当复杂的库,我无法在没有识别函数及其输入的情况下理解或进行基本算术运算

那么我怎样才能为这个特定问题编写一个简单的评估器呢?

4

3 回答 3

1

可以使用 JavaScript 解释器吗?

首先创建引擎实例并初始化:

// Manager creates engines by mime/language names.
// It has own global scope for engiges created by it.
ScriptEngineManager manager = new ScriptEngineManager();
// Create JavaScript interpreter instance.
// (Nashorn is bundled JavaScript interpreter)
ScriptEngine scope = manager.getEngineByName("JavaScript");
// Define functions you need
String initialScript = "cos = Math.cos;" // ; or \n
    + "sin = Math.sin;"
    + "tg  = Math.tan;"
    + "PI  = Math.PI;"
// Any other function
    + "ctg = function (x) { return cos(x)/sin(x); };";
// ...

try {
    // Add these functions to scope
    scope.eval(initialScript);
} catch(ScriptException ex) {
    // Evaluating exceptions, syntax errors are thrown here
}

然后您可以多次评估“范围”中的表达式:

try {
    double d = (double)scope.eval("sin(PI/2) + cos(PI/2)");
    System.out.println("Calculated: " + d);
} catch(ScriptException e) {
    // ...
}

被警告:

  1. 有语言解释 - 用户可以传递任何脚本和......
  2. ...它会降低应用程序的性能。

例如,您还可以使用JythonJRuby作为解释器。

于 2014-12-05T15:45:00.830 回答
0

我不确定是否有任何简单的方法可以在不使用库的情况下识别和评估通用输入表达式。

如果您想开发自己的方法来评估数学表达式,请查看此页面,它应该会告诉您要走的路:http ://cogitolearning.co.uk/?p=565

如果您改变主意并想使用库,请查看此链接:评估以字符串形式给出的数学表达式

我在构建 java 编译器时已经这样做了,这样我就可以读取和评估任何表达式,但这并不简单......

于 2014-12-05T15:53:18.173 回答
0

您可以使用Java Scripting API,例如使用 JavaScript 或 BeanShell(类似 java)。

    ScriptEngineManager manager = new ScriptEngineManager();
    ScriptEngine engine = manager.getEngineByMimeType("text/javascript");
    try {
        engine.eval("print('Result: ' + java.lang.Math.sin(0.8))");
        double y = ((Number) engine.eval("java.lang.Math.sin(0.8)")).doubleValue();
    } catch (ScriptException ex) {
        Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex);
    }

JavaScript 可以使用导入。如您所见,调用 java 非常简单。

于 2014-12-05T15:43:06.940 回答