2014-12-13 55 views
-2

我編寫了計算器的代碼,但不考慮操作的優先級。我需要改變什麼?該程序不需要支持()。 當您運行它時,您應該輸入一個數字,然後輸入一個符號並繼續讀取數字和符號,直到用戶輸入爲=尊重操作優先級的簡單計算器

public static void main(String[] args) { 
Scanner sc = new Scanner(System.in); 
int a,c ; 
char sgn; 

c = sc.nextInt(); 

do{  
    sgn = sc.next().charAt(0); 
    if (sgn=='=') break; 

    a = sc.nextInt(); 
switch (sgn) { 
     case '+' : c += a; break;  
     case '-' : c -= a; break; 
     case '*' : c *= a; break; 
     case '/' : c /= a; break; 
     } 
    }while(sgn!='='); 
    System.out.println(c); 
} 
} 
+1

有很多方法可以做到這一點。一個簡單的方法是將您的中綴表達式轉換爲後綴,然後使用堆棧來計算結果。 – 2014-12-13 11:49:37

+0

您需要......實現運算符優先級的邏輯,這對於SO來說是一個太廣泛的問題。提示:由於諸如「4 + 3 * 2」這樣的事情,你不能在沒有存儲輸入的情況下對標準中綴表達式進行分析,然後再進行分析。 – 2014-12-13 11:49:48

+0

@ AlexisC.question改變了,我希望現在很容易理解我想問什麼 – Andrew 2016-12-03 18:20:25

回答

0

好吧,我自己解決

int prod = sc.nextInt(); 
int sum = 0; 
char ops; 

do { 
    ops = sc.next().charAt(0); 
    switch (ops) { 
    case '*': 
     prod *= sc.nextInt(); 
     break; 
    case '/': 
     prod /= sc.nextInt(); 
     break; 
    case '+': 
     sum += prod; 
     prod = sc.nextInt(); 
     break; 
    case '-': 
     sum += prod; 
     prod = -sc.nextInt(); 
     break; 
    } 
} while (ops != '='); 

System.out.println(sum + prod); 
1

如果你希望能夠尊重操作的優先級,你必須等待用戶完成輸入完整的公式,然後纔開始計算。 你可以自己嘗試。如果你看着寫某個等式的人,在完成完整的等式(或計算)之前,你不能開始計算。

例如,我開始寫作2 + 2 ...

現在,你可以說: 「嗯,這是4」

但後來我繼續寫2 + 2 * 3

現在,如果你計算了「2 + 2 = 4」,現在你看到了「* 3」,那麼你就不能分辨出它是1 + 3 * 3還是3 + 1 * 3或0 + 4 * 3,或者甚至(-96)+104 * 3

此外,您錯過了方括號的實現,這很重要,用戶會期望您擁有它。

完成之後,我建議您嘗試使用Binary Trees,因爲我發現它更直觀。如何做到這一點hint

+0

我只是在創建一個簡單的程序 – Andrew 2016-05-26 20:08:44