计算数学表达式的程序(Java课程设计)

1. 课设团队介绍

团队名称

团队成

员介绍

任务分配

团队成员博客

XQ Warriors

徐维辉

负责计算器数据的算法操作,如平方数、加减乘除,显示历史计算记录

邱良厦(组长)

负责计算器的图形设计,把输入和结果显示在最上面的文本框

2. 参考代码及博客链接与工具

1)图形界面设计参考:Java Swing界面设计UI(全)_swing ui-CSDN博客

Java Swing界面设计UI(全)_swing ui-CSDN博客

2)使用的查询工具:Chatgpt和文心一言,询问相关操作的实现,查询方法具体使用等

3)文心一言链接:文心一言 (baidu.com) 

Chatgpt镜像:AIchatOS

3. 本项目的git地址

Issues · 则戈/Simple-Calculator - Gitee.com

4. 项目的git提交记录截图

1)邱良厦:

1.图片资源和代码资源分成两个部分

2.添加UI界面设计文件,完善图形界面设计,查看图形界面操作是否有误

3.添加UI程序的图片

2)徐维辉:

1.完成Calculator类,实现了常见的数学算法,完成了一元操作符和二元操作符的相关操作

2.完成历史计算记录记录算法

5. 前期调查相关

想看看是否能通过按钮实现数学表达式的运算,实现图形化界面,制作一个简单计算器。

看bilibili视频:java计算器程序_哔哩哔哩_bilibili

6.项目功能架构图、主要功能流程图

项目功能架构图

主要功能流程图

7. 面向对象设计包图、类图

1.包图:UI包、sumpleculator包、

2.类图:Calulator类、Main类、UI类、HistoryDialog类

8.项目运行截图或屏幕录制

1)运行程序,打开简单计算器的界面

2)操作视频

简单计算机的运算操作

9.项目关键代码分模块描述

1. class UI:创建了窗口、各个面板、文本框,字体对象,添加了各个按钮。

public class UI implements ActionListener {

   
   private  JFrame frame;

   private  JPanel panel;
   private  JPanel panelSub1;//子面板
   private  JPanel panelSub2;
   ...
   private  JTextArea text;//文本框
   // JButton 数组,存储数字按钮
   private  JButton button[], butAdd, butMinus, butMultiply, butDivide,
           butEqual, butCancel, butSquareRoot, butSquare, butOneDividedBy,
           butCos, butSin, butTan, butXPowerOfY, butLog, butRate, butabs, butBinary, butln;
    private  Font font;
    private  Font textFont;
   ...
}

2. init():设计窗口的的布局,为各个按钮添加字体,给各个子面板流水体布局,把按钮添加到各个子面板,最后把子面板添加到面板,窗口最后在采用面板来实现界面

public void init() {
      frame.setSize(450, 450);
      frame.setLocationRelativeTo(null);
      frame.setResizable(false);
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      for (int i = 0; i < 10; i++) {
         button[i].setFont(font);
      }
      butAdd.setFont(font);
      butMinus.setFont(font);
      butMultiply.setFont(font);
     ...
      panelSub2.add(button[1]);
      panelSub2.add(button[2]);
      panelSub2.add(button[3]);
      //在数字和运算符之间空出一点距离
      panelSub2.add(Box.createHorizontalStrut(15));
      panelSub2.add(butAdd);
      panelSub2.add(butMinus);
      ...
      for (int i = 0; i < 10; i++) {//添加监听器
         button[i].addActionListener(this);
      }
      butAdd.addActionListener(this);
      butMinus.addActionListener(this);
      butMultiply.addActionListener(this);
      butDivide.addActionListener(this);
     ...
      panel.add(panelSub2);
      frame.add(panel);//添加面板
      frame.setVisible(true);
}

3.  actionPerformed():点击按钮进行操作时,根据不同的事件源(e.getSource())执行不同的功能,如果是数字按钮,将对应的值添加到文本框中,并返回,如果是符合按钮,就会进行对应符号的运算

public void actionPerformed(ActionEvent e) {
      Object source = e.getSource();
      Double checkNum = null;

      for (int i = 0; i < 10; i++) {//数字按钮
         if (source == button[i]) {
            text.replaceSelection(buttonValue[i]);
            return;
         }
      }
      if (source == butAdd) {
            //把数字读出来进行相加
            write(calc.binCalculate(Calculator.binaryOperatorModes.add, reader()));
            text.replaceSelection(butAdd.getText());
         }

         // 处理减法操作
         if (source == butMinus) {
            write(calc.binCalculate(Calculator.binaryOperatorModes.minus, reader()));
            text.replaceSelection(butMinus.getText());
         }
        ...
}

4.Calculator类的基本属性和构造函数:主要包含Calculator类的基本属性和构造函数,包括操作数num1、num2,记录运算结果的result,记录当前运算符号的mode,以及记录一元运算和二元运算会用到的list

public enum binaryOperatorModes {
        normal, add, minus, multiply, divide , xPowerOfY
    }

    //一元运算
    public enum unaryOperatorModes {
        square, squareRoot, oneDivided, cos, sin, tan, log, rate, abs, ln,
    }


    private Double num1, num2;
    private Double result;
    //默认状态normal
    private binaryOperatorModes mode = binaryOperatorModes.normal;
    private List<String> unaryHistory = new ArrayList<>();
    private List<String> binaryHistory = new ArrayList<>();

5 二元运算模块:包含了二元运算相关的方法。binCalculateImpl方法用于执行实际的二元运算,binCalculate方法是对外的接口,处理用户输入的二元运算。calculateEqual方法用于处理等号操作。将运算结果返回到num1,用于下次运算。保存到result,用于记录的显示

//二元运算的具体实现
    private Double binCalculateImpl() {
        if (mode == binaryOperatorModes.normal) {
            return num2;
        }
        if (mode == binaryOperatorModes.add) {
            if (num2 != 0) {
                result = num1 + num2;
                return num1 + num2;
            }
            return num1;
        }
        if (mode == binaryOperatorModes.minus) {
            result = num1 - num2;
            return num1 - num2;
        }
        if (mode == binaryOperatorModes.multiply) {
            result = num1 * num2;
            return num1 * num2;
        }
        if (mode == binaryOperatorModes.divide) {
            result = num1 / num2;
            return num1 / num2;
        }
        if (mode == binaryOperatorModes.xPowerOfY) {
            result = Math.pow(num1, num2);
            return Math.pow(num1, num2);
        }
        throw new Error("没有该运算");
    }

    // 二元运算的对外接口
    public Double binCalculate(binaryOperatorModes newMode, Double num) {
        if (mode == binaryOperatorModes.normal) {
            num2 = 0.0;
            num1 = num;
            mode = newMode;
            return NaN;
        } else {
            Double temp = num1;
            num2 = num;
            num1 = binCalculateImpl();
            mode = newMode;
            String opr = null;

            binaryHistory.add("操作数: " + temp + " " + getOperatorSymbol(mode) + " " + num2 + " 结果 " + result);
            return num1;
        }

    }

6.一元运算模块、重置运算器模块:重置计算器,将num1、num2置零,状态mode置为normal
实现简单的一元运算,并且将运算记录保存

 // 重置计算器状态的方法
    public Double reset() {
        num2 = 0.0;
        num1 = 0.0;
        mode = binaryOperatorModes.normal;
        //无效字符
        return NaN;
    }


    // 执行单元操作的方法
    public Double unaryCalculate(unaryOperatorModes newMode, Double num) {
        if (newMode == unaryOperatorModes.square) {
            result = num * num;
        }
        if (newMode == unaryOperatorModes.squareRoot) {
            result = Math.sqrt(num);
        }
        if (newMode == unaryOperatorModes.oneDivided) {
            result =  1 / num;
        }
        if (newMode == unaryOperatorModes.cos) {
            result = Math.cos(Math.toRadians(num));
        }
        if (newMode == unaryOperatorModes.sin) {
            result = Math.sin(Math.toRadians(num));
        }
        if (newMode == unaryOperatorModes.tan) {
            if (num == 0 || num % 180 == 0) {
                result =  0.0;
            }
            if (num % 90 == 0 && num % 180 != 0) {
                result = NaN;
            }
            result = Math.tan(Math.toRadians(num));
        }
        if (newMode == unaryOperatorModes.log) {
            result = Math.log10(num);
        }
        if (newMode == unaryOperatorModes.ln) {
            result = Math.log(num);
        }
        if (newMode == unaryOperatorModes.rate) {
            result = num / 100;
        }
        if (newMode == unaryOperatorModes.abs){
            result = Math.abs(num);
        }
        unaryHistory.add("表达式: " + getOperatorSymbol(newMode) + "(" + num + ") = " + result);
        return result;
    }

7.获取操作符符号模块:将当前的mode转化为其对应的符号字符串,用于写入计算的历史记录中

  public static String getOperatorSymbol(binaryOperatorModes mode) {
        return switch (mode) {
            case add -> "+";
            case minus -> "-";
            case multiply -> "*";
            case divide -> "/";
            case xPowerOfY -> "^";
            default -> "";
        };
    }

    public static String getOperatorSymbol(unaryOperatorModes mode) {
        return switch (mode) {
            case square -> "^";
            case squareRoot -> "sqrt()";
            case oneDivided -> "1/x";
            case cos -> "cos";
            case sin -> "sin";
            case tan -> "tan";
            case log -> "log()";
            case rate -> "rate()";
            case abs -> "abs()";
            case ln -> "ln()";
            default -> "";
        };
    }

10.项目代码扫描结果及改正。

结果:

1.变量命名错误:

将butXPowerOfY改为butXpowerOfY

2.包名命名错误

改为Ui

11. 项目总结(包括不足与展望、想要进一步完成的任务)

1. 不足:

界面布局使用了多个 JPanel 进行组合,没有使用更灵活的布局管理器,如BorderLayout或 GridBagLayout,部分代码重复,没有优化界面布局和颜色。计算器中没有实现小数点功能,不能直接添加小数,操作历史记录没有完全实现,有时候不能记录符号。

2. 展望:

增加支持复数计算、矩阵计算和小数点运算等,可以继续优化界面,使用更灵活的布局管理器,如BorderLayout,优化颜色布局等

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode-搜索插入位置(35)

题目描述&#xff1a; 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 思路&#xff1a; 给定数组查找指定元素值的…

VUE element-ui实现表格动态展示、动态删减列、动态排序、动态搜索条件配置

1、实现效果 1.1、文件目录 1.2、说明 1、本组件支持列表的表头自定义配置&#xff0c;checkbox实现 2、本组件支持列表列排序&#xff0c;vuedraggable是拖拽插件&#xff0c;上图中字段管理里的拖拽效果 &#xff0c;需要的话请自行npm install 3、本组件支持查询条件动态…

解决docker run报错:Error response from daemon: No command specified.

将docker镜像export/import之后&#xff0c;对新的镜像执行docker run时报错&#xff1a; docker: Error response from daemon: No command specified. 解决方法&#xff1a; 方案1&#xff1a; 查看容器的command&#xff1a; docker ps --no-trunc 在docker run命令上增加…

怎么做拼团链接_生鲜果蔬商家都在用的小程序拼团系统

拼团链接&#xff1a;重塑营销新格局 在当今这个信息爆炸的时代&#xff0c;消费者面对海量信息&#xff0c;选择变得尤为重要。如何在众多品牌中脱颖而出&#xff0c;让消费者愿意主动为你驻足&#xff1f;答案就是——拼团链接。 拼团&#xff0c;是一种社交电商的创新形式。…

阿里云和AWS之间的应用程序防火墙比较及选择建议!

对于大多数开发人员来说&#xff0c;托管在云中的 Web 应用程序或 REST API 是一种常见方案。但是&#xff0c;并非每个应用程序都具有相同的安全级别。将 Web 应用程序防火墙 &#xff08;WAF&#xff09; 添加到 Web 应用程序是提高安全性的有用方法。 在本文中&#xff0c;…

基于JavaWeb+BS架构+SpringBoot+Vue智能菜谱推荐系统的设计和实现

基于JavaWebBS架构SpringBootVue智能菜谱推荐系统的设计和实现 文末获取源码Lun文目录前言主要技术系统设计功能截图订阅经典源码专栏Java项目精品实战案例《500套》 源码获取 文末获取源码 Lun文目录 目 录 目 录 III 第一章 概述 1 1.1 研究背景 1 1.2研究目的及意义 1 1.3…

K-【学习Diffusers 四】 读取模型参数 bin格式、safetensors格式

该操作多用于推理 safetensors格式的参数读取方法 1 拿到pipeline中的unet的办法 unet pipeline.pipe.unet 2 safetensors格式文件的参数读取方法 state_dict safetensors.torch.load_file(args.model_id, device"cpu") unet.load_state_dict(state_dict) # 读入…

解决原生微信小程序获取关联公众号的code(不是wx.login的code)来获取公众号的openId

解决步骤 以下是使用 web-view 并配配合微信公众号提供的 网页授权 来实现 1、在小程序中做一个web-view页面&#xff0c;页面中只需要写微信 网页授权的链接就行了&#xff0c;注意appid请自行替换&#xff08;公众号的&#xff09;。 onLoad() {this.setData({src: https://o…

《Training language models to follow instructions》论文解读--训练语言模型遵循人类反馈的指令

目录 1摘要 2介绍 方法及实验细节 3.1高层次方法论 3.2数据集 3.3任务 3.4人体数据收集 3.5模型 3.6评价 4 结果 4.1 API分布结果 4.2公共NLP数据集的结果 4.3定性结果 问题 1.什么是rm分数 更多资料 1摘要 使语言模型更大并不能使它们更好地遵循用户的意图。例…

分享7款前端CSS动画特效源码(附在线演示)

精选7款前端CSS动画特效源码 下面我会给出特效样式图或演示效果图 但你也可以点击在线预览查看源码的最终展示效果及下载源码资源 CSS飞行的荷包蛋 CSS荷包蛋动画 荷包蛋会向右前方加速飞行 期间还能看到周围的气流匆匆飞过 以下图片只是简单的模型没有具体的动画效果最终动画…

使用mamba替换conda和anaconda配置环境安装软件

使用mamba替换miniconda和anaconda&#xff0c;原因是速度更快&#xff0c;无论是创建新环境还是激活环境 conda、mamba、anaconda都是蟒蛇的意思… 下载mambaforge wget https://github.com/conda-forge/miniforge/releases/latest/download/Mambaforge-Linux-x86_64.sh ba…

基于SSM的汽车客运订票系统

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…

Redis常用连接工具

RedisInsight 官网地址&#xff1a; RedisInsight | The Best Redis GUI Redis Desktop Manager 官网地址&#xff1a; RedisInsight | The Best Redis GUI 样式&#xff1a; QuickRedis 官网地址&#xff1a; QuickOfficial - QuickRedis 样式&#xff1a; AnotherRed…

Python语言基础

目录 任务驱动式学习 任务一&#xff1a;输出问候语 一、Python程序的两种编程模式 二、Python程序的执行方式——解释执行 三、基本输入输出函数 任务二&#xff1a;计算圆的周长和面积 一、语句块缩进 二、变量与对象 三、数据类型及转换 四、数字类型及运算 五、…

conda安装和配置以及处理OSError: [WinError 123]异常

conda安装和配置 由于更换电脑&#xff0c;浅浅记录下conda安装和配置。以及处理这次安装的 OSError: [WinError 123] 异常。 conda的作用 下载之前&#xff0c;先了解下为什么需要使用conda&#xff0c;它是一个开源的Anaconda是专注于数据分析的Python发行版本&#xff0c;…

操作系统导论-课后作业-ch5

关于man的使用 man 系统参考手册 man n name 在系统手册第n章查看name1. 代码&#xff1a; #include <stdio.h> #include <sys/types.h> #include <unistd.h> #include <sys/wait.h>int main() {int x 100;int rc fork();if (rc -1) {fprintf…

如何一眼分辨哪个U盘的接口更快?

前言 从第一篇图文&#xff0c;小伙伴们已经知道使用U盘的时候如何选择合适的USB接口了。 有Type-C的插Type-C&#xff0c;蓝/黄/红/绿的USB接口次之。 那么&#xff0c;如何看自己的U盘读写快慢&#xff1f; 都2023年了&#xff0c;估计很多小伙伴还在使用USB2.0的U盘&…

2023启示录 | 商业航天这一年

图片&#xff5c;SpaceX ©⾃象限原创 作者丨罗辑 编辑丨程心 整个2023年&#xff0c;在全球热度上能够和ChatGPT一争高下的&#xff0c;可能只有SpaceX的两次星舰发射。 就像2023年菜市场卖鱼的大爷都能聊两句大模型一样&#xff0c;即使从来不关心航天的人也会知道星舰…

Win10子系统Ubuntu实战(二)

在 Windows 10 中安装 Ubuntu 子系统&#xff08;Windows Subsystem for Linux&#xff0c;简称 WSL&#xff09;有几个主要的用途和好处&#xff1a;Linux 环境的支持、跨平台开发、命令行工具、测试和验证、教育用途。总体而言&#xff0c;WSL 提供了一种将 Windows 和 Linux…

k8s的存储卷---数据卷

前言 容器磁盘上的文件的生命周期是短暂的&#xff0c;这就使得在容器中运行重要应用时会出现一些问题。首先&#xff0c;当容器崩溃时&#xff0c;kubelet 会重启它&#xff0c;但是容器中的文件将丢失——容器以干净的状态&#xff08;镜像最初的状态&#xff09;重新启动。其…
最新文章