2012-12-24 88 views
0

我正在試着製作一個計算器,它可以鍛鍊輸入的總和。簡單的沒有GUI的Java計算器

例子:

我想這樣的事情...

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

    } 

} 
+3

到目前爲止您嘗試了什麼?發佈一些代碼,以便我們可以知道你錯在哪裏。 –

+0

而不是自己做,爲什麼不嘗試已經存在的東西?舉例來說,已煮飯的人有這樣一個計算器的例子。 – fge

+0

*「有什麼想法我可以做到這一點?」*不知道從哪裏開始?瀏覽[這些提示](http://www.patriciashanahan.com/beginner.html)。 –

回答

1

你可以使用ANTLR爲。你可以找到樣本計算器here

編輯

如果使用ANTLR,你將能夠在未來添加更多的功能很容易例如括號的用法,一些計算方法(例如round,sin,cos)。

+3

我不認爲ANTLR適合有人努力寫一個計算器。 –

+0

計算器最大的挑戰是*優先級高於+,即1 + 2 * 3就像1+(2 * 3)。關於這樣的事情:1 + 2 * 3-5 * 5或添加功率符號(^)等。另一方面,我不知道你的計算器的所有要求。我會親自花一些時間調查ANTLR。它提供了一套非常好的教程,所以它會對您在同一時間掌握Java非常有利。 – Tom

+0

我們不知道他在執行優先級。 ANTRL是一個很好的工具。我只是不會建議初學者將其添加到組合中。 –

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)); 
    } 
} 
+0

與此唯一的問題是,它可能做得太多,但幾乎爲零編碼,很好。 –

+0

這真是太好了,謝謝,我會稍微玩一下,試一下! – hunterge

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)); 
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」的方法將獲得索引的第一個操作的開始,然後第二個操作數的最後一個索引,然後替換的答案的子字符串。

希望這可能會指出你在正確的方向。

0

好吧,這個問題很簡單,但答案有點複雜。沒有任何關於表達式的語法的假設,您無法像這樣解析表達式。它是中綴/後綴/前綴。它使用括號嗎?除了commutatiove?乘法左或右聯合? *和+符號的實際含義是什麼?

有幾十個的決策,同時構建計算器來進行,因此,Java編程語言沒有任何開箱評測支持。如果你希望有他們的標準含義的操作,那麼使用一些庫。如果你希望有一些非標準的行爲,那麼編寫你自己的語法。如果您將使用括號,則需要推拉式自動機來實現它,可能與LL1語法一起使用。

但是,當你問這樣的問題時,我想你是Java和編程的新手。我不會建議你嘗試一下,你需要一些自動機和語法理論的基礎知識。

當我學習自己的Java時,我也遇到了這個問題,我已經通過輸入程序作爲Windows計算器來解決它。該程序包含一個註冊表,其中彙總了當前結果,每次操作後程序都會查詢下一個用戶(也可以使用非常簡單的解析器執行此操作 - 但請記住,計算器不會識別操作員的優先級)。