2014-12-05 42 views
0

我寫了一個計算像正弦不同功能的項目,MCM等不使用現有的包像Java中 數學,現在我想在一個字符串,然後打印的形式從用戶的表達出來的結果
像:包含在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和他們的輸入? 我已經檢查了很多類似的問題,但我發現的那些庫太複雜了,無法理解,或者做了基本的算術運算而沒有識別函數和它們的輸入

所以我怎麼寫一個簡單的評估器這個具體問題?

+0

你可以做到這一點通過使用[ OGNL](http://commons.apache.org/proper/commons-ognl/)。它很容易使用。你可以創建一個上下文並用它表達它。 – bhdrkn 2014-12-05 15:32:56

+0

這是一個令人難以置信的廣泛問題。如果你想要識別函數 - 使用任何解析器(或自己寫 - 這裏有很多指南)。如果你在評估時需要幫助 - 那麼這個問題類似於「幫我寫我自己的Wolfram Alpha!「 – Ordous 2014-12-05 15:35:12

+0

除非你找到一個符合你需要的語法的庫,否則你的問題沒有簡單的解決方法。你必須藉助javacc,antlr或eclipse Xtext等解析器生成器編寫你自己的解析器。 – nomoa 2014-12-05 15:35:58

回答

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作爲解釋器。

+0

什麼是範圍? 當我使用它時,我得到一個未定義類型的編譯錯誤 – Vicarious 2014-12-05 18:27:10

+0

再次感謝我的解決方案仍然不能完成的事情是,我想從用戶那裏獲得表達式作爲字符串,然後將結果打印出來 我也是不使用數學軟件包。我正在使用我爲sin cos和其他人寫的函數 我還應該在這裏更改什麼? http://paste.ubuntu.com/9387085/ – Vicarious 2014-12-05 20:45:10

+0

您可以定義完全自己的函數和常量,如上所示。 Em,什麼是COS.calcuCOS等等,以及它定義的位置? – cybersoft 2014-12-05 21:12:50

0

您可以使用Java Scripting API, and for instance use JavaScript, or BeanShell (java like).

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非常簡單。

+0

非常感謝你! – Vicarious 2014-12-05 15:49:27

0

我不知道是否有任何簡單的方法來識別和評估通用inputed表達式,而不使用庫。

如果你想開發自己的方法來評估的數學表達式藉此頁一看,它應該告訴你要走的路:http://cogitolearning.co.uk/?p=565

如果你改變了主意,想用的庫,檢查此鏈接:Evaluating a math expression given in string form

我這樣做時,我建了一個Java編譯器,這樣我可以閱讀和評價任何表情,但它不是簡單的...