2016-02-12 63 views
-1

我需要製作一個java程序,用於評估輸入文件中的表達式並將結果返回到輸出文件中。它需要考慮運算符優先級,一元運算符和二元運算符,括號匹配,並且只能依賴遞歸(沒有堆棧或隊列)。如何用遞歸創建Java算術計算器

我一直在想這個整夜,它讓我感到沮喪。我並沒有要求爲我編寫完整的java程序。我只需要一些指導。我開始寫一些僞代碼,但我不認爲它是好的:

輸入:從中讀取每個表達式的文本文件。 輸出:重複每個表達式以及打印結果的文本文件。

Algorithm SecondCalc() 
{ 
    input = 「expressions.txt」; 
    output = 「out.txt」; 
    if (input.currentLine has something) 
    { 
     line = input.currentLine; 
     output.write(line); 
     line = line.replace(「-space-」, 「」); 
     evaluate(line); 
     //...to be continued 
    } 
} 

Algorithm evaluate(line) 
{ 
    for(i = 0 to line.length) 
    { 
    if(i == 「(」 or 「)」) exit loop; 
    if(i == 「!」) exit loop; 
    if(i == 「^」) exit loop; 
    if(i == 「*」 or 「/」) exit loop; 
    if(i == 「+」 or 「-」) exit loop; 
    if(i == 「>」 or 「>=」 or 「<」 or 「<=」) exit loop; 
    if(i == 「==」 or 「!=」) exit loop; 
    if(i == 「$」) exit loop; 
} 

temp1 = line from index 0 to i; 
temp2 = line from index i + 1 to line.length; 
if(i == 「!」) then evaulate(temp1!); 
//...to be continued 
} 

任何提示將不勝感激。謝謝。

回答

0

好,我注意到的第一件事情是,你說要運算符優先級,但在你的evaluate您基本上從事先到先得,它把他們都具有相同的優先級忽略運算符優先級。如果你的目標確實是模擬運算符優先級(我假設輸入看起來像java的表達式),那麼我建議你在處理其他運算符前先正確處理某些運算符,或者正確地重新排列輸入以匹配其他類型波蘭標記。

對於這兩種情況,我都會做一個類似的過程:而不是if語句在for循環中的if語句之後,就像你現在所做的那樣,嘗試for循環之後的for循環,其中每個for循環查找特定的操作符, 」。

for(i = 0 to line.length) 
{ 
    if(i == 「(」 or 「)」) doSomething; 
} 
for(i = 0 to line.length) 
{ 
    if(i == 「!」) doSomething; 
} 
for(i = 0 to line.length) 
{ 
    if(i == 「^」) doSomething; 
} 
for(i = 0 to line.length) 
{ 
    if(i == 「*」 or 「/」) doSomething; 
} 
for(i = 0 to line.length) 
{ 
    if(i == 「+」 or 「-」) doSomething; 
} 
for(i = 0 to line.length) 
{ 
    if(i == 「>」 or 「>=」 or 「<」 or 「<=」) doSomething; 
} 
for(i = 0 to line.length) 
{ 
    if(i == 「==」 or 「!=」)doSomething; 
} 
for(i = 0 to line.length) 
{ 
    if(i == 「$」)doSomething; 
} 

}

有很大的改善,但希望這點你在正確的方向。

0

我建議閱讀波蘭語法。這是存儲數學函數的好方法。例如+ cos a b - > cos(a)+ b,而cos + a b - > cos(a + b)。沒有歧義。此外,右側的條款優先於左側的條款。

很久以前我寫了一個符號邏輯操縱器,讀取字符串肯定很難。以下是我建議的流程:

  1. 查找任何括號外的二元運算符。從最高級別的操作開始並減少工作量。
  2. 當您找到二元運算符時,遞歸調用參數的stringtofunction到二元運算符的任一側。您正在查看的二元運算符與括號外的任何其他二元運算符之間或二元運算符與字符串末尾之間的任何值都計爲1個對象。
  3. 從第二部分的返回進入類似於運算符return1 return2的波蘭表示法。
  4. 當字符串的最外側是括號時,將它們剝離。
  5. 如果您沒有發現任何頂級二元運算符搜索一元運算符。遞歸調用一元運算符的參數並將其作爲運算符返回存儲;