2012-06-29 69 views
1

我有一個使用Java Swing的科學計算器項目。但是,我結束了錯誤的計算。例如:如果按鈕:科學計算器的算法和提示

1然後再+ 2 *,然後再3,答案是9,而不是7

你能不能給我一個提示,我必須使用哪些類?算法的正確答案如何?

謝謝

class Calculator{ 
    public static void main(String[] args){ 
     EventQueue.invokeLater(new Runnable(){ 
      public void run(){ 
       CalculatorFrame frame = new CalculatorFrame(); 
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
        frame.setVisible(true); 
       } 
      } 
     ); 
    } 
} 


class CalculatorFrame extends JFrame{ 
    public CalculatorFrame(){ 
    setTitle("Calculator"); 
    CalculatorPanel panel = new CalculatorPanel(); 
    add(panel); 
    pack(); 
    } 
} 


class CalculatorPanel extends JPanel{ 
    public CalculatorPanel(){ 
     setLayout(new BorderLayout()); 
     result = 0; 
     lastCommand = "="; 
     start = true; 
     // add the display 
     display = new JButton(""); 
     display.setEnabled(false); 
     add(display, BorderLayout.NORTH); 
     ActionListener insert = new InsertAction(); 
     ActionListener command = new CommandAction(); 
     // add the buttons in a x grid 
     panel = new JPanel(); 
     panel.setLayout(new GridLayout(4,4)); 
     addButton("7", insert); 
     addButton("8", insert); 
     addButton("9", insert); 
     addButton("/", command); 

     addButton("4", insert); 
     addButton("5", insert); 
     addButton("6", insert); 
     addButton("*", command); 

     addButton("1", insert); 
     addButton("2", insert); 
     addButton("3", insert); 
     addButton("-", command); 
     addButton("0", insert); 
     addButton(".", insert); 
     addButton("=", command); 
     addButton("+", command); 
     add(panel, BorderLayout.CENTER); 
    } 

    private void addButton(String label, ActionListener listener){ 
     JButton button = new JButton(label); 
     button.addActionListener(listener); 
     panel.add(button); 
    } 

    private class InsertAction implements ActionListener{ 
     public void actionPerformed(ActionEvent event){ 
      String input = event.getActionCommand(); 
      if (start){ 
       display.setText(""); 
       start = false; 
      } 
      display.setText(display.getText() + input); 
     } 
    } 


    private class CommandAction implements ActionListener{ 
     public void actionPerformed(ActionEvent event) { 
      String command = event.getActionCommand(); 

      if (start){ 
       if (command.equals("-")){ 
       display.setText(command); 
       start = false; 
       } 
       else lastCommand = command; 
      } 
      else{ 
       calculate(Double.parseDouble(display.getText())); 
       lastCommand = command; 
       start = true; 
      } 
     } 
    } 


    public void calculate(double x){ 
     if (lastCommand.equals("+")) result += x; 
     else if (lastCommand.equals("-")) result -= x; 
     else if (lastCommand.equals("*")) result *= x; 
     else if (lastCommand.equals("/")) result /= x; 
     else if (lastCommand.equals("=")) result = x; 
     display.setText("" + result); 
    } 

    private JButton display; 
    private JPanel panel; 
    private double result; 
    private String lastCommand; 
    private boolean start; 
} 
+2

後一些代碼。 –

+0

我認爲你需要給我們更多的工作。這完全沒有意義。 – JRSofty

+0

我的計算代碼使它錯誤的答案。在數學中,1 + 2 * 3的答案是7. – afni

回答

4

你也可以用一些數學任務創建String並在JavaScript引擎中使用它來計算它。更多信息here

// create a script engine manager 
ScriptEngineManager factory = new ScriptEngineManager(); 
// create a JavaScript engine 
ScriptEngine engine = factory.getEngineByName("JavaScript"); 

Double d=(Double)engine.eval("1 + 2 * 3"); 
System.out.println(d); 

輸出7.0

+0

謝謝。我嘗試使用ScriptEngineManager和ScriptEngine,並且我的計算運行良好。 – afni

1

我的這種方法將代表業務爲對象。 (類如Number,Add,Multiply,它們將操作數保存爲字段並且具有getValue()方法。)當用戶按下按鈕(除=之外)時,根據數學的優先規則建立這樣的對象的樹,當用戶按=時可以計算出整個表達式的結果。

或者,將表達式存儲爲字符串,然後一次性解析它。