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

news2024/11/17 1:40:58

目录

      • 前言
      • calculator.java
      • MyForm.java
      • main.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);
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1063457.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python 打包可执行文件-pyinstaller详解

python 打包可执行文件-pyinstaller详解 引言一、参数详解二、优化代码三、体积压缩 引言 pyinstaller是一个将python程序打包成独立可执行文件&#xff08;exe&#xff0c;app等&#xff09;的工具&#xff0c;它具有跨平台兼容性&#xff0c;可以在windows&#xff0c;mac和…

苹果系统_安装matplotlib__pygame,以pycharm导入模块

为了更便捷、连贯的进行python编程学习&#xff0c;尽量在开始安装python软件时&#xff0c;将编辑器、模块一并安装好&#xff0c;这样能避免以后版本冲突的问题。小白在开始安装pycharm、pip、matplotlib往往会遇到一些问题&#xff0c;文中列示其中部分bug&#xff0c;供大家…

一文了解硬盘AFR年化故障率评估方式和预测方案

目前常用评价硬盘&#xff08;或者其他硬件产品&#xff09;有一个关键的指标就是年化故障率&#xff08;AFR&#xff09;。年化故障率&#xff08;AFR&#xff09;是一种衡量产品可靠性的指标&#xff0c;表示在一年内产品发生故障的概率。 除了年化故障率&#xff08;AFR&…

一文搞懂Java线程中断协商机制,如何优雅中断一个正在运行的线程?

文章目录 一、中断机制概述1、中断API2、什么是中断机制3、如何理解中断机制4、三大中断方法源码详解&#xff08;1&#xff09;interrupt()&#xff08;2&#xff09;interrupted()&#xff08;3&#xff09;isInterrupted()&#xff08;4&#xff09;注意&#xff01;不同jdk…

Electron笔记

基础环境搭建 官网:https://www.electronjs.org/zh/ 这一套笔记根据这套视频而写的 创建项目 方式一: 官网点击GitHub往下拉找到快速入门就能看到下面这几个命令了 git clone https://github.com/electron/electron-quick-start //克隆项目 cd electron-quick-start //…

阿里云服务器e系列是共享型?什么意思?

阿里云服务器经济型e实例是共享型云服务器&#xff0c;共享型实例采用非绑定CPU调度模式。每个vCPU会被随机分配到任何空闲CPU超线程上&#xff0c;不同实例vCPU会争抢物理CPU资源&#xff0c;并导致高负载时计算性能波动不稳定&#xff0c;有可用性SLA保证&#xff0c;但无性能…

【网络安全 --- 工具安装】VMware 16.0 详细安装过程(提供资源)

一&#xff0c;VMware下载地址&#xff1a; 百度网盘链接链接&#xff1a;百度网盘 请输入提取码百度网盘为您提供文件的网络备份、同步和分享服务。空间大、速度快、安全稳固&#xff0c;支持教育网加速&#xff0c;支持手机端。注册使用百度网盘即可享受免费存储空间https:/…

【开发篇】十六、SpringBoot整合JavaMail实现发邮件

文章目录 0、相关协议1、SpringBoot整合JavaMail2、发送简单邮件3、发送复杂邮件 0、相关协议 SMTP&#xff08;Simple Mail Transfer Protocol&#xff09;&#xff1a;简单邮件传输协议&#xff0c;用于发送电子邮件的传输协议POP3&#xff08;Post Office Protocol - Versi…

IPv6协议报文头

IPv6协议概述 IPv6&#xff08;Internet Protocol Version 6&#xff09;是网络层协议的第二代标准协议&#xff0c;也被成为IPng&#xff08;IP Next Generation&#xff09;。它是Internet工程任务组IETF&#xff08;Internet Engineering Task Force&#xff09;设计的一套…

ros2移植Apollo和autoware规控算法可跑工程

工程详细介绍请看&#xff1a; 自动驾驶路径规划控制ros移植Apollo和autoware规控算法可跑工程&#xff08;适合入门学习&#xff0c;科研和实战&#xff09; ros2的工程版本说明 之所以增加ros2版本&#xff0c;是因为想增加代码的工程应用性&#xff0c;其实对于科研来说并…

计算机专业毕业设计项目推荐11-博客项目(Go+Vue+Mysql)

博客项目&#xff08;GoVueMysql&#xff09; **介绍****系统总体开发情况-功能模块****各部分模块实现** 介绍 本系列(后期可能博主会统一为专栏)博文献给即将毕业的计算机专业同学们,因为博主自身本科和硕士也是科班出生,所以也比较了解计算机专业的毕业设计流程以及模式&am…

正点原子嵌入式linux驱动开发——U-boot启动流程详解

在上一篇笔记中详细分析了uboot的顶层Makefile&#xff0c;理清了uboot的编译流程。本章来详细的分析一下uboot的启动流程&#xff0c;理清uboot是如何启动的。通过对uboot启动流程的梳理&#xff0c;可以掌握一些外设是在哪里被初始化的&#xff0c;这样当需要修改这些外设驱动…

14885-2010 固定资产分类与代码 思维导图

声明 本文是学习GB-T 14885-2010 固定资产分类与代码…pdf而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本标准规定了固定资产的分类、代码及计量单位。 本标准适用于固定资产管理、清查、登记、统计等工作。 2 术语和定义 下列术语和定义…

由[哈希/散列]模拟实现[unordered_map/unordered_set] (手撕迭代器)

文章目录 1.迭代器分析2.细节处理3.完整代码3.1HashTable.h3.2unordered_set.h3.3unordered_map.h3.4Test.cpp 1.迭代器分析 2.细节处理 以下两篇文章均为笔者的呕心沥血想要搞懂本篇文章的uu请自行查阅 哈希/散列的细节实现 哈希/散列–哈希表[思想到结构][修订版] 手撕迭代器…

硬件知识:U盘相关知识介绍,值得收藏

目录 什么是U盘&#xff1f; U盘根据结构有哪几种&#xff1f; 根据U盘的存储介质、外形、功能分类有哪几种&#xff1f; 什么是U盘&#xff1f; U盘&#xff0c;全称为USB闪存盘&#xff0c;是一种以闪存芯片作为数据存储介质的移动存储设备。U盘的历史可以追溯到1998年&am…

vue3 中使用 echarts 图表——准备篇

我们常常在项目中使用图表来表示数据&#xff0c;而目前最常用的图标就是echarts&#xff0c;接下来我们就开始学习在vue中使用echarts图标。 一、准备一个vue项目&#xff08;一般通过vite来构建&#xff0c;而不是vue-cli&#xff09; 1.找到打开vite官网 2. 运行创建命令 …

MySQL进阶-存储引擎

目录 1.MySQL体系结构 体系结构图 各层的作用 2.存储引擎简介 2.1查看当前表的存储引擎 2.2 查询mysql支持的存储引擎 2.3 InnoDB简介 2.4 MyISAM简介 2.5 Memory简介 3.存储引擎的选择 1.MySQL体系结构 mysql体系结构主要有四层结构&#xff0c;从上到下依次是&#…

Spring Cloud zuul扩展能力设计和心得

前言 实际上Spring Cloud已经废弃zuul了&#xff0c;改用gateway&#xff0c;但是webflux的技术并没在实际项目大规模普及&#xff0c;还有很多servlet NIO的应用&#xff0c;所以zuul还是很有必要改造的&#xff0c;实测zuul调优&#xff08;调节转发的连接池&#xff09;跟g…

【算法挨揍日记】day11——852. 山脉数组的峰顶索引、162. 寻找峰值

852. 山脉数组的峰顶索引 852. 山脉数组的峰顶索引 题目描述&#xff1a; 符合下列属性的数组 arr 称为 山脉数组 &#xff1a; arr.length > 3存在 i&#xff08;0 < i < arr.length - 1&#xff09;使得&#xff1a; arr[0] < arr[1] < ... arr[i-1] < …

数据结构:二叉树(超详解析)

目录​​​​​​​ 1.树概念及结构 1.1树的概念 1.2树的相关概念 1.3树的表示 1.3.1孩子兄弟表示法&#xff1a; 1.3.2双亲表示法&#xff1a;只存储双亲的下标或指针 两节点不在同一树上&#xff1a; 2.二叉树概念及结构 2.1.概念 2.2.特殊的二叉树&#xff1a; 2…