java计算器

该代码创建了一个基于JavaSwing的简单计算器应用,包括数字按钮、运算符按钮以及清零、退格功能。用户输入的表达式会通过事件处理器处理,计算结果会在文本框中显示。程序使用栈数据结构解析和计算数学表达式。
摘要由CSDN通过智能技术生成
package csdn20220613;

import javax.swing.*;
import java.util.Stack;

public class CalTest extends JFrame {

    public static void main(String[] args) throws Exception {
        new CalTest();

        System.out.println(CalTest.cal("3 * 4 - 2 / 3"));
    }

    public CalTest() {
        super("计算器");
        JPanel jPanel = new JPanel();

        JTextField jTextField = new JTextField();
        jTextField.setColumns(20);
        JButton clear = new JButton("清零");
        clear.addActionListener(e -> jTextField.setText(""));
        JButton backspace = new JButton("退格");
        backspace.addActionListener(e -> {
            String text = jTextField.getText();
            if (text.length() == 0) {
                return;
            }
            jTextField.setText(text.substring(0,text.length() - 1));
        });
        JButton bfh = new JButton("%");
        bfh.addActionListener(e -> jTextField.setText(jTextField.getText() + "%"));
        JButton pfg = new JButton("平方根");
        pfg.addActionListener(e -> {
            String text = jTextField.getText();
            if (!text.matches("^[0-9]+$")) {
                JOptionPane.showMessageDialog(null,"输入框中只能输入纯数字");
                jTextField.setText("");
                return;
            }
            jTextField.setText(Math.sqrt(Double.parseDouble(text)) + "");
        });
        JButton number1 = new JButton("  1  ");
        number1.addActionListener(e -> jTextField.setText(jTextField.getText() + "1 "));
        JButton number2 = new JButton("  2  ");
        number2.addActionListener(e -> jTextField.setText(jTextField.getText() + "2 "));
        JButton number3 = new JButton("  3  ");
        number3.addActionListener(e -> jTextField.setText(jTextField.getText() + "3 "));
        JButton add = new JButton("  +  ");
        add.addActionListener(e -> jTextField.setText(jTextField.getText() + "+ "));
        JButton number4 = new JButton("  4  ");
        number4.addActionListener(e -> jTextField.setText(jTextField.getText() + "4 "));
        JButton number5 = new JButton("  5  ");
        number5.addActionListener(e -> jTextField.setText(jTextField.getText() + "5 "));
        JButton number6 = new JButton("  6  ");
        number6.addActionListener(e -> jTextField.setText(jTextField.getText() + "6 "));
        JButton sub = new JButton("  -  ");
        sub.addActionListener(e -> jTextField.setText(jTextField.getText() + "- "));
        JButton number7 = new JButton("  7  ");
        number7.addActionListener(e -> jTextField.setText(jTextField.getText() + "7 "));
        JButton number8 = new JButton("  8  ");
        number8.addActionListener(e -> jTextField.setText(jTextField.getText() + "8 "));
        JButton number9= new JButton("  9  ");
        number9.addActionListener(e -> jTextField.setText(jTextField.getText() + "9 "));
        JButton mul = new JButton("  *  ");
        mul.addActionListener(e -> jTextField.setText(jTextField.getText() + "* "));
        JButton number0 = new JButton("  0  ");
        number0.addActionListener(e -> jTextField.setText(jTextField.getText() + "0 "));
        JButton point = new JButton("  .  ");
        point.addActionListener(e -> jTextField.setText(jTextField.getText() + ". "));
        JButton eq = new JButton("  =  ");
        eq.addActionListener(e -> {
            try {
                jTextField.setText(CalTest.calculate(jTextField.getText()));
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        });
        JButton div = new JButton("  /  ");
        div.addActionListener(e -> jTextField.setText(jTextField.getText() + "/ "));

        jPanel.add(jTextField);
        jPanel.add(clear);
        jPanel.add(backspace);
        jPanel.add(bfh);
        jPanel.add(pfg);
        jPanel.add(number1);
        jPanel.add(number2);
        jPanel.add(number3);
        jPanel.add(add);
        jPanel.add(number4);
        jPanel.add(number5);
        jPanel.add(number6);
        jPanel.add(sub);
        jPanel.add(number7);
        jPanel.add(number8);
        jPanel.add(number9);
        jPanel.add(mul);
        jPanel.add(number0);
        jPanel.add(point);
        jPanel.add(eq);
        jPanel.add(div);
        setSize(290,300);
        setVisible(true);
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        setLocationRelativeTo(null);
        add(jPanel);
    }
    private static String calculate(String input) throws Exception {
        String[] comput = input.split(" ");
        Stack<Double> stack = new Stack<>();
        Double m = Double.parseDouble(comput[0]);
        //第一个操作数入栈
        stack.push(m);

        for(int i = 1; i < comput.length; i++) {
            if(i%2==1) {
                if(comput[i].equals("+")) {
                    stack.push(Double.parseDouble(comput[i+1]));
                }

                if(comput[i].equals("-")) {
                    stack.push(-Double.parseDouble(comput[i+1]));
                }
                //将前一个数出栈做乘法再入栈
                if(comput[i].equals("*")) {
                    //取栈顶元素
                    Double d = stack.peek();
                    stack.pop();
                    stack.push(d*Double.parseDouble(comput[i+1]));
                }
                //将前一个数出栈做乘法再入栈
                if(comput[i].equals("/")) {
                    double help = Double.parseDouble(comput[i+1]);
                    if(help == 0) {
                        //不会继续执行该函数
                        throw new Exception("Infinity");
                    }

                    double d = stack.peek();
                    stack.pop();
                    stack.push(d/help);
                }
            }
        }

        double d = 0d;
        //求和
        while(!stack.isEmpty()) {
            d += stack.peek();
            stack.pop();
        }

        String result = String.valueOf(d);
        return result;
    }

    public static Integer cal(String input) {
        Stack<Integer> calc = new Stack<>();
        for(int i = 0; i < input.length(); i++){
            char c = input.charAt(i);
            int x = 0;
            int y = 0;
            int r = 0;
            if(Character.isDigit(c)){
                int t = Character.getNumericValue(c);
                calc.push(t);
            }
            else if(c == '+'){
                x = calc.pop();
                y = calc.pop();
                r = x+y;
                calc.push(r);
            }
            else if(c == '-'){
                x = calc.pop();
                y = calc.pop();
                r = x-y;
                calc.push(r);
            }
            else if(c == '*'){
                x = calc.pop();
                y = calc.pop();
                r = x*y;
                calc.push(r);
            }
            else if(c == '/'){
                x = calc.pop();
                y = calc.pop();
                r = x/y;
                calc.push(r);
            }
        }
        return calc.pop();
    }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小飞LOVE霞

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值