2014-12-24 89 views
1

我已經使用EvalEx(https://github.com/uklimaschewski/EvalEx)並對其進行了修改,使其沒有像數學軟件包那樣的計算器。 所以現在它可以從用戶獲得字符串形式的輸入並打印出結果。評估在Java中包含變量的字符串形式的表達式

這樣的:

Enter an Expression: ADD(DIV(SIN(FACT(3)),CEIL(TAN(MUL(1.5,FIB(4))))),GCD(2,10)) 
The Result is: 1.94  

現在用戶將進入包含變量而不是常量

ADD(DIV(SIN(FACT(X1)),CEIL(TAN(MUL(1.5,FIB(X2))))),GCD(Y,10))  

和整體的代碼應該像下面運行時表達式:

Enter an Expression: ADD(DIV(SIN(FACT(X1)),CEIL(TAN(MUL(1.5,FIB(X2))))),GCD(Y,10))  
Enter Variables: X1,X2,Y  
Enter values for X1, X2 and Y by this order(separate the values by space): 3 4 2  
The Result is: 1.94   

請注意,用戶首先輸入表達式,然後告訴機器什麼是t他變量(如在「輸入變量:x1,x2,y」) 也我不得不使用客觀編程概念我可以更改EvalEx中的現有代碼以使程序識別變量嗎?

回答

1

您可以設置一個Map<String, Double>變量名值相關聯,就像這樣:

Map<String, Double> values = new HashMap<String, Double>(); 
values.put("X", 13.5); 
values.put("Y", -3); 

然後你就可以通過相應的值替換所有表達式中的變量,就像這樣:

for (Map.Entry<String, Double> entry : values.entrySet()) 
    expression = expression.replace(entry.getKey(), entry.getValue().toString()); 

然後,您可以將您已寫入的方法應用到expression

這種方法很簡單,但不是很健壯。例如,如果你的一個變量名稱是"C",你會搞砸功能"CEIL"。出於這個原因,你可以堅持所有的變量都以"_"或類似的東西開頭。

+0

謝謝你的回答 但你能告訴我另一種方式,而無需使用map和hashmap嗎? 如果我可以通過更改EvalEx中的eval方法來做到這一點會好得多,因爲我應該避免使用包 實際上我正在尋找方法來使代碼在沒有任何準備好的軟件包(如地圖,數學等)的情況下工作(除必需類似java.lang的當然) – Vicarious

+0

你不必使用'HashMap'。你可以使用一對數組來代替(一個'String []'用於變量名,一個'double []'用於相應的值)。但是我不知道你對「Map」有什麼反應 - 它在java.util中,所以它幾乎沒有異國情調!如果您希望我們幫助您修改「EvalEx」的代碼,您將不得不在該問題中包含該方法的代碼。 –

+0

我沒有任何反對地圖 我剛開始學習java,所以我認爲這是一個包,我不應該使用 和這個鏈接到代碼,這基本上是它應該看起來像 https: //www.dropbox.com/sh/0zeqdc6sn5ouvcm/AAAdjl9XCf6TQrNqyu5wUCJTa?dl=0 – Vicarious

相關問題