【问题标题】:Algorithm and Hint for Scientific Calculator [closed]科学计算器的算法和提示[关闭]
【发布时间】:2012-06-29 11:12:29
【问题描述】:

我有一个使用 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;
}

【问题讨论】:

  • 我认为你需要为我们提供更多的工作。这根本没有意义。
  • 我的计算代码给出了错误的答案。在数学中,1+2*3 的答案是 7。
  • 如果这是家庭作业,您应该这样标记您的问题。 (我假设它是因为你说这是一个项目。)
  • 阅读“运算符优先级解析”。

标签: java swing calculator


【解决方案1】:

您还可以使用一些数学任务创建字符串,并在 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

【讨论】:

  • 谢谢。我尝试使用 ScriptEngineManager 和 ScriptEngine 并且我的计算效果很好。
【解决方案2】:

我的方法是将操作表示为对象。 (像NumberAddMultiply 这样的类将操作数作为字段保存并具有getValue() 方法。)当用户按下按钮时(= 除外),您会构建这些对象的树根据数学的优先规则,当用户按下=时,可以计算出整个表达式的结果。

或者,将表达式存储为字符串,最后一次性解析。

【讨论】:

    猜你喜欢
    • 2013-01-29
    • 1970-01-01
    • 1970-01-01
    • 2010-09-18
    • 1970-01-01
    • 2011-07-06
    • 1970-01-01
    • 1970-01-01
    • 2013-08-22
    相关资源
    最近更新 更多