杰瑞科技汇

Java科学计算器代码如何实现核心功能?

Java 科学计算器代码

以下是一个完整的Java科学计算器实现,包含基本运算和科学功能:

Java科学计算器代码如何实现核心功能?-图1
(图片来源网络,侵删)
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.HashMap;
import java.util.Map;
public class ScientificCalculator extends JFrame {
    private JTextField display;
    private String input = "";
    private boolean newInput = true;
    private Map<String, Double> memory = new HashMap<>();
    public ScientificCalculator() {
        setTitle("科学计算器");
        setSize(400, 600);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationRelativeTo(null);
        // 显示面板
        JPanel displayPanel = new JPanel();
        display = new JTextField();
        display.setFont(new Font("Arial", Font.PLAIN, 24));
        display.setHorizontalAlignment(JTextField.RIGHT);
        display.setEditable(false);
        displayPanel.add(display);
        add(displayPanel, BorderLayout.NORTH);
        // 按钮面板
        JPanel buttonPanel = new JPanel();
        buttonPanel.setLayout(new GridLayout(7, 5, 5, 5));
        // 按钮文本
        String[] buttonLabels = {
                "MC", "MR", "MS", "M+", "M-",
                "sin", "cos", "tan", "log", "ln",
                "x²", "√", "x^y", "e^x", "n!",
                "(", ")", "π", "e", "C",
                "7", "8", "9", "/", "DEL",
                "4", "5", "6", "*", "%",
                "1", "2", "3", "-", "1/x",
                "0", ".", "±", "+", "="
        };
        // 创建按钮并添加监听器
        for (String label : buttonLabels) {
            JButton button = new JButton(label);
            button.setFont(new Font("Arial", Font.PLAIN, 16));
            button.addActionListener(new ButtonClickListener());
            buttonPanel.add(button);
        }
        add(buttonPanel, BorderLayout.CENTER);
    }
    private class ButtonClickListener implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent e) {
            String command = e.getActionCommand();
            try {
                switch (command) {
                    case "C":
                        input = "";
                        display.setText("");
                        newInput = true;
                        break;
                    case "DEL":
                        if (input.length() > 0) {
                            input = input.substring(0, input.length() - 1);
                            display.setText(input);
                        }
                        break;
                    case "=":
                        if (!input.isEmpty()) {
                            String result = evaluateExpression(input);
                            display.setText(result);
                            input = result;
                            newInput = true;
                        }
                        break;
                    case "sin":
                        if (!input.isEmpty()) {
                            double value = Math.sin(Math.toRadians(Double.parseDouble(input)));
                            input = String.valueOf(value);
                            display.setText(input);
                        }
                        break;
                    case "cos":
                        if (!input.isEmpty()) {
                            double value = Math.cos(Math.toRadians(Double.parseDouble(input)));
                            input = String.valueOf(value);
                            display.setText(input);
                        }
                        break;
                    case "tan":
                        if (!input.isEmpty()) {
                            double value = Math.tan(Math.toRadians(Double.parseDouble(input)));
                            input = String.valueOf(value);
                            display.setText(input);
                        }
                        break;
                    case "log":
                        if (!input.isEmpty()) {
                            double value = Math.log10(Double.parseDouble(input));
                            input = String.valueOf(value);
                            display.setText(input);
                        }
                        break;
                    case "ln":
                        if (!input.isEmpty()) {
                            double value = Math.log(Double.parseDouble(input));
                            input = String.valueOf(value);
                            display.setText(input);
                        }
                        break;
                    case "x²":
                        if (!input.isEmpty()) {
                            double value = Math.pow(Double.parseDouble(input), 2);
                            input = String.valueOf(value);
                            display.setText(input);
                        }
                        break;
                    case "√":
                        if (!input.isEmpty()) {
                            double value = Math.sqrt(Double.parseDouble(input));
                            input = String.valueOf(value);
                            display.setText(input);
                        }
                        break;
                    case "x^y":
                        input += "^";
                        display.setText(input);
                        break;
                    case "e^x":
                        if (!input.isEmpty()) {
                            double value = Math.exp(Double.parseDouble(input));
                            input = String.valueOf(value);
                            display.setText(input);
                        }
                        break;
                    case "n!":
                        if (!input.isEmpty()) {
                            int n = Integer.parseInt(input);
                            double factorial = 1;
                            for (int i = 1; i <= n; i++) {
                                factorial *= i;
                            }
                            input = String.valueOf(factorial);
                            display.setText(input);
                        }
                        break;
                    case "π":
                        input += String.valueOf(Math.PI);
                        display.setText(input);
                        break;
                    case "e":
                        input += String.valueOf(Math.E);
                        display.setText(input);
                        break;
                    case "±":
                        if (!input.isEmpty()) {
                            if (input.startsWith("-")) {
                                input = input.substring(1);
                            } else {
                                input = "-" + input;
                            }
                            display.setText(input);
                        }
                        break;
                    case "1/x":
                        if (!input.isEmpty()) {
                            double value = 1 / Double.parseDouble(input);
                            input = String.valueOf(value);
                            display.setText(input);
                        }
                        break;
                    case "MC":
                        memory.clear();
                        break;
                    case "MR":
                        if (!memory.isEmpty()) {
                            input = String.valueOf(memory.values().iterator().next());
                            display.setText(input);
                        }
                        break;
                    case "MS":
                        if (!input.isEmpty()) {
                            memory.put("M", Double.parseDouble(input));
                        }
                        break;
                    case "M+":
                        if (!input.isEmpty() && !memory.isEmpty()) {
                            double currentValue = memory.values().iterator().next();
                            memory.put("M", currentValue + Double.parseDouble(input));
                        }
                        break;
                    case "M-":
                        if (!input.isEmpty() && !memory.isEmpty()) {
                            double currentValue = memory.values().iterator().next();
                            memory.put("M", currentValue - Double.parseDouble(input));
                        }
                        break;
                    default:
                        if (newInput) {
                            input = command;
                            newInput = false;
                        } else {
                            input += command;
                        }
                        display.setText(input);
                        break;
                }
            } catch (NumberFormatException ex) {
                display.setText("错误");
                input = "";
                newInput = true;
            } catch (Exception ex) {
                display.setText("错误");
                input = "";
                newInput = true;
            }
        }
    }
    private String evaluateExpression(String expression) {
        try {
            // 处理特殊字符
            expression = expression.replace("π", String.valueOf(Math.PI));
            expression = expression.replace("e", String.valueOf(Math.E));
            // 处理幂运算
            expression = expression.replace("^", "**");
            // 使用ScriptEngine计算表达式
            javax.script.ScriptEngine engine = new javax.script.ScriptEngineManager().getEngineByName("js");
            Object result = engine.eval(expression);
            return String.valueOf(result);
        } catch (Exception e) {
            return "错误";
        }
    }
    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            ScientificCalculator calculator = new ScientificCalculator();
            calculator.setVisible(true);
        });
    }
}

功能说明

这个科学计算器包含以下功能:

  1. 基本运算:加(+)、减(-)、乘(*)、除(/)、百分号(%)
  2. 科学函数
    • 三角函数:sin, cos, tan
    • 对数函数:log, ln
    • 幂运算:x², x^y, e^x
    • 其他:√, n!, 1/x
  3. 常数:π, e
  4. 内存功能:MC, MR, MS, M+, M-
  5. 其他功能
    • 清除(C)
    • 删除(DEL)
    • 正负号(±)
    • 括号()

使用说明

  1. 将代码复制到Java开发环境中
  2. 编译并运行程序
  3. 使用鼠标点击按钮进行计算

注意事项

  1. 这个计算器使用了JavaScript引擎来解析数学表达式,因此需要JDK 6或更高版本
  2. 对于复杂的表达式,计算结果可能会有精度误差
  3. 错误处理比较简单,实际应用中可能需要更完善的错误处理机制

如果需要更高级的功能或更好的性能,可以考虑使用专门的数学表达式解析库如exp4j或Java的Math库来实现计算功能。

Java科学计算器代码如何实现核心功能?-图2
(图片来源网络,侵删)
分享:
扫描分享到社交APP
上一篇
下一篇