// 导入Swing和AWT相关的类库 import javax.swing.; import java.awt.; import java.awt.event.*;

// 创建一个继承JFrame类的计算器窗口类 public class ScientificCalculator extends JFrame { // 定义计算器的各个组件 private JTextField display; private JButton btnClear, btnMC, btnMS, btnMR, btnMAdd, btnMSub, btnBackspace, btnSquareRoot, btnPower, btnLog, btnSin, btnCos, btnTan, btnFactorial, btnDecimal, btnZero, btnOne, btnTwo, btnThree, btnFour, btnFive, btnSix, btnSeven, btnEight, btnNine, btnAdd, btnSubtract, btnMultiply, btnDivide, btnEquals; private double memory = 0.0; // 存储器,初始值为0

// 构造函数,初始化计算器窗口
public ScientificCalculator() {
    // 设置窗口的标题
    setTitle("科学计算器");
    // 设置窗口的大小
    setSize(350, 450);
    // 设置窗口的布局为网格布局
    setLayout(new GridLayout(7, 4));
    // 设置窗口的默认关闭方式
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    // 创建计算器的各个组件
    display = new JTextField();
    btnClear = new JButton("C");
    btnMC = new JButton("MC");
    btnMS = new JButton("MS");
    btnMR = new JButton("MR");
    btnMAdd = new JButton("M+");
    btnMSub = new JButton("M-");
    btnBackspace = new JButton("←");
    btnSquareRoot = new JButton("√");
    btnPower = new JButton("x²");
    btnLog = new JButton("ln");
    btnSin = new JButton("sin");
    btnCos = new JButton("cos");
    btnTan = new JButton("tan");
    btnFactorial = new JButton("n!");
    btnDecimal = new JButton(".");
    btnZero = new JButton("0");
    btnOne = new JButton("1");
    btnTwo = new JButton("2");
    btnThree = new JButton("3");
    btnFour = new JButton("4");
    btnFive = new JButton("5");
    btnSix = new JButton("6");
    btnSeven = new JButton("7");
    btnEight = new JButton("8");
    btnNine = new JButton("9");
    btnAdd = new JButton("+");
    btnSubtract = new JButton("-");
    btnMultiply = new JButton("×");
    btnDivide = new JButton("÷");
    btnEquals = new JButton("=");

    // 将各个组件添加到窗口中
    add(display);
    add(btnClear);
    add(btnMC);
    add(btnMS);
    add(btnMR);
    add(btnMAdd);
    add(btnMSub);
    add(btnBackspace);
    add(btnSquareRoot);
    add(btnPower);
    add(btnLog);
    add(btnSin);
    add(btnCos);
    add(btnTan);
    add(btnFactorial);
    add(btnSeven);
    add(btnEight);
    add(btnNine);
    add(btnDivide);
    add(btnFour);
    add(btnFive);
    add(btnSix);
    add(btnMultiply);
    add(btnOne);
    add(btnTwo);
    add(btnThree);
    add(btnSubtract);
    add(btnDecimal);
    add(btnZero);
    add(btnEquals);
    add(btnAdd);

    // 为各个按钮添加事件监听器
    btnClear.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            display.setText("");
        }
    });
    btnMC.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            memory = 0.0;
        }
    });
    btnMS.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            memory = Double.parseDouble(display.getText());
        }
    });
    btnMR.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            display.setText(Double.toString(memory));
        }
    });
    btnMAdd.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            memory += Double.parseDouble(display.getText());
        }
    });
    btnMSub.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            memory -= Double.parseDouble(display.getText());
        }
    });
    btnBackspace.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            String s = display.getText();
            if (s.length() > 0) {
                s = s.substring(0, s.length() - 1);
                display.setText(s);
            }
        }
    });
    btnSquareRoot.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            double x = Double.parseDouble(display.getText());
            display.setText(Double.toString(Math.sqrt(x)));
        }
    });
    btnPower.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            double x = Double.parseDouble(display.getText());
            display.setText(Double.toString(x * x));
        }
    });
    btnLog.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            double x = Double.parseDouble(display.getText());
            display.setText(Double.toString(Math.log(x)));
        }
    });
    btnSin.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            double x = Double.parseDouble(display.getText());
            display.setText(Double.toString(Math.sin(x)));
        }
    });
    btnCos.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            double x = Double.parseDouble(display.getText());
            display.setText(Double.toString(Math.cos(x)));
        }
    });
    btnTan.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            double x = Double.parseDouble(display.getText());
            display.setText(Double.toString(Math.tan(x)));
        }
    });
    btnFactorial.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            int n = Integer.parseInt(display.getText());
            int result = 1;
            for (int i = 1; i <= n; i++) {
                result *= i;
            }
            display.setText(Integer.toString(result));
        }
    });
    btnDecimal.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            String s = display.getText();
            if (!s.contains(".")) {
                s += ".";
                display.setText(s);
            }
        }
    });
    btnZero.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            String s = display.getText();
            if (!s.equals("0")) {
                s += "0";
                display.setText(s);
            }
        }
    });
    btnOne.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            String s = display.getText();
            if (s.equals("0")) {
                s = "1";
            } else {
                s += "1";
            }
            display.setText(s);
        }
    });
    btnTwo.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            String s = display.getText();
            if (s.equals("0")) {
                s = "2";
            } else {
                s += "2";
            }
            display.setText(s);
        }
    });
    btnThree.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            String s = display.getText();
            if (s.equals("0")) {
                s = "3";
            } else {
                s += "3";
            }
            display.setText(s);
        }
    });
    btnFour.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            String s = display.getText();
            if (s.equals("0")) {
                s = "4";
            } else {
                s += "4";
            }
            display.setText(s);
        }
    });
    btnFive.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            String s = display.getText();
            if (s.equals("0")) {
                s = "5";
            } else {
                s += "5";
            }
            display.setText(s);
        }
    });
    btnSix.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            String s = display.getText();
            if (s.equals("0")) {
                s = "6";
            } else {
                s += "6";
            }
            display.setText(s);
        }
    });
    btnSeven.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            String s = display.getText();
            if (s.equals("0")) {
                s = "7";
            } else {
                s += "7";
            }
            display.setText(s);
        }
    });
    btnEight.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            String s = display.getText();
            if (s.equals("0")) {
                s = "8";
            } else {
                s += "8";
            }
            display.setText(s);
        }
    });
    btnNine.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            String s = display.getText();
            if (s.equals("0")) {
                s = "9";
            } else {
                s += "9";
            }
            display.setText(s);
        }
    });
    btnAdd.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            String s = display.getText();
            if (!s.endsWith("+") && !s.endsWith("-") && !s.endsWith("×") && !s.endsWith("÷") && !s.endsWith("(")) {
                s += "+";
                display.setText(s);
            }
        }
    });
    btnSubtract.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            String s = display.getText();
            if (!s.endsWith("+") && !s.endsWith("-") && !s.endsWith("×") && !s.endsWith("÷") && !s.endsWith("(")) {
                s += "-";
                display.setText(s);
            }
        }
    });
    btnMultiply.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            String s = display.getText();
            if (!s.endsWith("+") && !s.endsWith("-") && !s.endsWith("×") && !s.endsWith("÷") && !s.endsWith("(")) {
                s += "×";
                display.setText(s);
            }
        }
    });
    btnDivide.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            String s = display.getText();
            if (!s.endsWith("+") && !s.endsWith("-") && !s.endsWith("×") && !s.endsWith("÷") && !s.endsWith("(")) {
                s += "÷";
                display.setText(s);
            }
        }
    });
    btnEquals.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            String s = display.getText();
            if (s.endsWith("+") || s.endsWith("-") || s.endsWith("×") || s.endsWith("÷") || s.endsWith("(")) {
                return;
            }
            double result = evaluate(s);
            display.setText(Double.toString(result));
        }
    });

    // 显示窗口
    setVisible(true);
}

// 计算表达式的值
private double evaluate(String s) {
    // 将表达式转换成后缀表达式
    String postfix = infixToPostfix(s);
    // 使用栈来计算后缀表达式的值
    Stack<Double> stack = new Stack<Double>();
    for (int i = 0; i < postfix.length(); i++) {
        char c = postfix.charAt(i);
        if (isDigit(c)) {
            // 如果是数字,将其转换成double类型并压入栈中
            int j = i;
            while (j < postfix.length() && (isDigit(postfix.charAt(j)) || postfix.charAt(j) == '.')) {
                j++;
            }
            String numStr = postfix.substring(i, j);
            double num = Double.parseDouble(numStr);
            stack.push(num);
            i = j - 1;
        } else {
            // 如果是运算符,弹出栈顶的两个元素进行运算,并将结果压入栈中
            double b = stack.pop();
            double a = stack.pop();
            double result = 0.0;
            if (c == '+') {
                result = a + b;
            } else if (c == '-') {
                result = a - b;
            } else if (c == '×') {
                result = a * b;
            } else if (c == '÷') {
                result = a / b;
            } else if (c == '^') {
                result = Math.pow(a, b);
            }
            stack.push(result);
        }
    }
    // 栈中最后剩下的元素即为表达式的值
    return stack.pop();
}

// 将中缀表达式转换成后缀表达式
private String infixToPostfix(String s) {
    // 定义一个StringBuilder对象,用于存储后缀表达式
    StringBuilder sb = new StringBuilder();
    // 定义一个栈,用于存储运算符
    Stack<Character> stack = new Stack<Character>();
    // 遍历中缀表达式的每个字符
    for (int i = 0; i < s.length(); i++) {
        char c = s.charAt(i);
        if (isDigit(c)) {
            // 如果是数字,直接添加到后缀表达式中
            sb.append(c);
        } else if (c == '(') {
            // 如果是左括号,将其压入栈中
            stack.push(c);
        } else if (c == ')') {
            // 如果是右括号,将栈中的元素弹出并添加到后缀表达式中,直到遇到左括号
            while (!stack.isEmpty() && stack.peek() != '(') {
                sb.append(stack.pop());
            }
            stack.pop(); // 弹出左括号
        } else {
            // 如果是运算符,比较其与栈顶运算符的优先级,如果栈顶运算符优先级高或相等,则弹出栈顶运算符并添加到后缀表达式中
            while (!stack.isEmpty() && compare(stack.peek(), c) >= 0) {
                sb.append(stack.pop());
            }
            // 将当前运算符压入栈中
            stack.push(c);
        }
    }
    // 将栈中剩余的运算符弹出并添加到后缀表达式中
    while (!stack.isEmpty()) {
        sb.append(stack.pop());
    }
    // 返回后缀表达式
    return sb.toString();
}

// 判断一个字符是否为数字
private boolean isDigit(char c) {
    return c >= '0' && c <= '9';
}

// 比较两个运算符的优先级,a优先级高返回1,b优先级高返回-1,相等返回0
private int compare(char a, char b) {
    if ((a == '+' || a == '-') && (b == '×' || b == '÷' || b == '^')) {
        return -1;
    } else if ((a == '×' || a == '÷') && b == '^') {
        return -1;
    } else if (a == '^' && (b == '+' || b == '-' || b == '×' || b == '÷')) {
        return 1;
    } else {
        return 0;
    }
}

// 主函数,创建一个计算器窗口对象
public static void main(String[] args) {
    new ScientificCalculator();
}

原文地址: https://www.cveoy.top/t/topic/hu3h 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录