Java课设 保存计算过程的计算器(附完整源码)

前言

这是一个保存计算过程的计算器,calculator.java中实现计算原理,MyForm.java中实现面板。效果如图:
在这里插入图片描述

calculator.java

import java.util.Stack;

public class Calculator {

    public String cal(String str) {
        str = str.replaceAll("(?<![0-9)}\\]])(?=-[0-9({\\[])", "0") + "#";
        //初始化栈
        Stack<Double> operandStack = new Stack<>();
        Stack<Character> operatorStack = new Stack<>();

        //分析计算
        int strLen = str.length();
        String temp = "";
        for (int i = 0; i < strLen; i++) {
            char x = str.charAt(i);
            //若为数字,记入temp中;否则转double入栈
            if (x >= '0' && x <= '9' || x == '.') {
                temp += x;
            } else {
                if (!temp.isEmpty()) {
                    double a = Double.parseDouble(temp);
                    operandStack.push(a);
                    temp = "";
                }

                if (x == '#') {
                    break;
                } else if (x == '+' || x == '-') {
                    if (operatorStack.empty() || operatorStack.peek() == '(') {
                        operatorStack.push(x);
                    } else {
                        while (!operatorStack.empty() && operatorStack.peek() != '(') {
                            //出栈计算
                            pop2Cal(operandStack, operatorStack);
                        }
                        operatorStack.push(x);

                    }
                } else if (x == '*' || x == '/') {
                    if (operatorStack.empty() || operatorStack.peek() == '(' || operatorStack.peek() == '+' || operatorStack.peek() == '-') {
                        operatorStack.push(x);
                    } else {
                        while (!operatorStack.empty() && operatorStack.peek() != '(' && operatorStack.peek() != '+' && operatorStack.peek() != '-') {
                            //出栈计算
                            pop2Cal(operandStack, operatorStack);
                        }
                        operatorStack.push(x);
                    }
                } else {
                    if (x == '(') {
                        operatorStack.push(x);
                    } else if (x == ')') {
                        while (operatorStack.peek() != '(') {
                            //出栈计算
                            pop2Cal(operandStack, operatorStack);
                        }
                        operatorStack.pop();
                    }
                }
            }
        }
        while (!operatorStack.empty()) {
            //出栈计算
            pop2Cal(operandStack, operatorStack);
        }
        //返回结果
        return operandStack.pop().toString();
    }

    //出栈计算
    private static void pop2Cal(Stack<Double> opStack, Stack<Character> otStack) {
        double op = 0;
        double op2 = opStack.pop();
        double op1 = opStack.pop();
        char ot = otStack.pop();
        switch (ot) {
            case '+':
                op = op1 + op2;
                break;
            case '-':
                op = op1 - op2;
                break;
            case '*':
                op = op1 * op2;
                break;
            case '/':
                op = op1 / op2;
                break;
        }
        opStack.push(op);
    }

}

MyForm.java

import javax.sound.sampled.*;
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ComponentAdapter;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.net.URL;

public class MyForm {
    JPanel panel1;
    private JButton a7Button;
    private JButton a8Button;
    private JButton a9Button;
    private JButton mul;
    private JButton a5Button;
    private JButton a4Button;
    private JButton a6Button;
    private JButton sub;
    private JButton a3Button;
    private JButton a2Button;
    private JButton a1Button;
    private JButton add;
    private JButton sqrt;
    private JButton a0Button;
    private JButton point;
    private JButton cButton;
    private JButton div;
    private JButton equ;
    private JButton back;
    private JTextField textField1;
    private JButton saveButton;

    private Calculator calculator;

    private StringBuilder sb;
    private String str = "";
    private void saveCalculationToFile(String filePath) {
        try (BufferedWriter writer = new BufferedWriter(new FileWriter(filePath, true))) {
            String[] steps = sb.toString().split("[+\\-*/]");
            String[] operators = sb.toString().split("[0-9\\.]+");
            if (steps.length != operators.length) {
                throw new IllegalArgumentException("Invalid calculation format.");
            }

            StringBuilder calculation = new StringBuilder();
            calculation.append(steps[0]);
            for (int i = 1; i < steps.length; i++) {
                calculation.append(" ")
                        .append(operators[i])
                        .append(" ")
                        .append(steps[i]);
            }
            calculation.append(" = ").append(str).append("\n");

            writer.append(calculation.toString());
            writer.flush();
            JOptionPane.showMessageDialog(panel1, "Calculation saved successfully!");
        } catch (IOException ex) {
            ex.printStackTrace();
            JOptionPane.showMessageDialog(panel1, "Error occurred while saving calculation.", "Error", JOptionPane.ERROR_MESSAGE);
        } catch (IllegalArgumentException ex) {
            ex.printStackTrace();
            JOptionPane.showMessageDialog(panel1, "Invalid calculation format.", "Error", JOptionPane.ERROR_MESSAGE);
        }
    }

    private JFileChooser fileChooser;
    private void playSound(URL soundURL) {
        try {
            AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(soundURL);
            Clip clip = AudioSystem.getClip();
            clip.open(audioInputStream);
            clip.start();
        } catch (UnsupportedAudioFileException | IOException | LineUnavailableException e) {
            e.printStackTrace();
        }
    }

    public MyForm() {
        sb = new StringBuilder();
        calculator = new Calculator();
        // 获取音效文件的URL
        URL soundURL = getClass().getResource("music.wav");
        saveButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {

                int result = fileChooser.showSaveDialog(panel1);
                if (result == JFileChooser.APPROVE_OPTION) {
                    String filePath = fileChooser.getSelectedFile().getAbsolutePath();
                    saveCalculationToFile(filePath);
                }

            }
        });

        fileChooser = new JFileChooser();

        a0Button.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                sb.append("0");
                textField1.setText(sb.toString());
                playSound(soundURL);
            }
        });
        a1Button.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                sb.append("1");
                textField1.setText(sb.toString());
                playSound(soundURL);

            }
        });
        a2Button.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                sb.append("2");
                textField1.setText(sb.toString());
                playSound(soundURL);

            }
        });
        a3Button.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                sb.append("3");
                textField1.setText(sb.toString());
                playSound(soundURL);

            }
        });
        a4Button.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                sb.append("4");
                textField1.setText(sb.toString());
                playSound(soundURL);

            }
        });
        a5Button.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                sb.append("5");
                textField1.setText(sb.toString());
                playSound(soundURL);

            }
        });
        a6Button.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                sb.append("6");
                textField1.setText(sb.toString());
                playSound(soundURL);

            }
        });
        a7Button.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                sb.append("7");
                textField1.setText(sb.toString());
                playSound(soundURL);

            }
        });
        a8Button.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                sb.append("8");
                textField1.setText(sb.toString());
                playSound(soundURL);

            }
        });
        a9Button.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                sb.append("9");
                textField1.setText(sb.toString());
                playSound(soundURL);

            }
        });
        point.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if (sb.length() == 0) sb.append("0.");
                else if (sb.charAt(sb.length() - 1) != '.') {
                    sb.append(".");
                }
                textField1.setText(sb.toString());
                playSound(soundURL);

            }
        });
        cButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                sb.delete(0, sb.length());
                textField1.setText(sb.toString());
                playSound(soundURL);

            }
        });
        back.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if (sb.length() > 0) {
                    sb.deleteCharAt(sb.length() - 1);
                    textField1.setText(sb.toString());
                }
                playSound(soundURL);

            }
        });
        add.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if (sb.length() == 0) sb.append("0");
                else if (sb.charAt(sb.length() - 1) >= '0' && sb.charAt(sb.length() - 1) <= '9') {
                    sb.append("+");
                }
                textField1.setText(sb.toString());
                playSound(soundURL);

            }
        });
        sub.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                sb.append("-");
                textField1.setText(sb.toString());
                playSound(soundURL);

            }
        });
        mul.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if (sb.length() == 0) sb.append("0");
                else if (sb.charAt(sb.length() - 1) >= '0' && sb.charAt(sb.length() - 1) <= '9') {
                    sb.append("*");
                }
                textField1.setText(sb.toString());
                playSound(soundURL);

            }
        });
        div.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if (sb.length() == 0) sb.append("0");
                else if (sb.charAt(sb.length() - 1) >= '0' && sb.charAt(sb.length() - 1) <= '9') {
                    sb.append("/");
                }
                textField1.setText(sb.toString());
                playSound(soundURL);

            }
        });
        panel1.addComponentListener(new ComponentAdapter() {
        });
        equ.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if (sb.length() == 0) sb.append("0");
                try {
                    str = sb.toString();
                    //sb.delete(0,sb.length());
                    str = calculator.cal(str);
                    sb.replace(0, sb.length(), str);
                    textField1.setText(str);
                } catch (Exception e1) {
                    e1.printStackTrace();
                    textField1.setText("Error!");
                    sb.delete(0, sb.length());
                }
                playSound(soundURL);

            }
        });

        sqrt.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if (sb.length() == 0) {
                    sb.append("0");
                }
                double num = Double.parseDouble(calculator.cal(sb.toString()));
                if (num >= 0) {
                    sb.delete(0, sb.length());
                    sb.append(Math.sqrt(num));
                    textField1.setText(sb.toString());
                } else {
                    textField1.setText("Error!");
                    sb.delete(0, sb.length());
                }
                playSound(soundURL);

            }
        });
    }
}

main.java

import javax.swing.*;

public class Main {
    public static void main(String[] args) {
        JFrame frame = new JFrame("计算器");
        frame.setContentPane(new MyForm().panel1);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
}

  • 10
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 10
    评论
### 回答1: 这个计算器需要能够保存计算过程,可以考虑使用栈来实现。每当用户输入一个数字或者运算符时,就将其压入栈中。当用户点击等号时,从栈中依次弹出数字和运算符,进行计算,并将计算结果压入栈中。最终,栈中只剩下一个元素,即计算结果。用户可以通过查看栈中的元素来查看计算过程。 ### 回答2: Java是当前最流行的面向对象编程语言之一,可以应用于多种领域。其中,计算器计算机科学的基础应用,它可以实现多种计算操作,如加、减、乘、除等,并且也可以实现保存计算过程功能。因此,设计一个保存计算过程计算器是一个很好的Java课程设计项目。 这个计算器应该有一个界面,可以用Swing、JavaFX等图形用户界面工具包实现。它应该有一些基本的控件,如用于显示计算结果的标签,数字按钮,运算符按钮等等。每当用户按下按钮时,计算器应该将按键内容添加到当前表达式中,并在标签中显示当前表达式的值。为了实现保存计算过程功能,可以再增加一个文本框,用于显示历史计算过程。 为了实现保存计算过程功能,我们需要将每个计算过程都存储在一个数据结构中,如栈或链表。每当用户按下“=”按钮,计算器会对当前表达式进行计算,并将结果存储在数据结构中。同时,它也将当前表达式和计算结果添加到历史计算过程中。当用户按下“历史记录”按钮时,可以从数据结构中检索历史记录,并将其显示在历史计算过程文本框中。 除了基本的加、减、乘、除等运算外,我们还可以增加一些高级运算功能,如开方、指数函数、三角函数等,这些功能可以通过使用Java标准库或各种常用的数学库来实现。 总体而言,设计一个保存计算过程计算器是一个很好的Java课程设计项目。它可以帮助学生加深他们对Java编程语言和面向对象编程的理解,以及提高他们的算法数据结构技能。同时,它也是一个有用的工具,可以帮助人们进行各种计算操作,并且可以保存历史计算记录以便于查看。 ### 回答3: Java课程设计保存计算过程计算器,是一种可以保存计算过程计算器。相比传统的计算器,它能够将每次的计算过程记录下来,方便用户随时查看。 这款计算器的设计思路是,每当用户按下运算符号时,就将前一次的运算结果保存下来,同时记录下运算符号和当前的操作数。这样,当用户需要查看历史计算过程时,只需要简单地遍历这个保存历史的队列即可。 这个计算器的另一个特点是,支持多级撤销。用户可以撤销到历史记录中的任意一条记录。当用户撤销到某一条记录时,系统会将当前的结果设置为这条记录的结果,同时弹出其后的所有记录。这样,用户可以在不破坏原有计算过程的情况下,方便地修改当前计算过程。 此外,这个计算器还支持自定义函数和变量。用户可以通过输入函数名和表达式来定义自己的函数,然后在计算过程中调用。同样,用户还可以定义自己的变量,方便在计算过程保存自己的数据。这些自定义函数和变量也会被保存在历史记录中,方便用户回顾和修改。 综上所述,这款Java课程设计保存计算过程计算器,不仅具备传统计算器的基本功能,还能记录和保存用户的历史计算过程、支持多级撤销以及自定义函数和变量,提供了更方便、实用的计算工具。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

一个努力学习编程的人

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

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

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

打赏作者

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

抵扣说明:

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

余额充值