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

news2024/11/24 13:40:19

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.coloradmin.cn/o/1373961.html

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

相关文章

Python - Bert-VITS2 语音推理服务部署

目录 一.引言 二.服务搭建 1.服务配置 2.服务代码 3.服务踩坑 三.服务使用 1.服务启动 2.服务调用 3.服务结果 四.总结 一.引言 上一篇文章我们介绍了如果使用 conda 搭建 Bert-VITS2 最新版本的环境并训练自定义语音&#xff0c;通过 1000 个 epoch 的训练&#xf…

pandas笔记:找出在一个dataframe但不在另一个中的index

1 问题描述 假设我们有两个dataframe&#xff08;这一段代码&#xff09;来自transbigdata 笔记&#xff1a;官方文档案例1&#xff08;出租车GPS数据处理&#xff09;-CSDN博客 data tbd.clean_outofshape(data, sz, col[Lng, Lat], accuracy500) data data2 tbd.clean_ta…

Python爬虫之Scrapy框架系列(24)——分布式爬虫scrapy_redis完整实战【XXTop250完整爬取】

目录&#xff1a; 1.使用分布式爬取XX电影信息&#xff08;1&#xff09;settings.py文件中的配置&#xff1a;&#xff08;2&#xff09;spider文件的更改&#xff1a;&#xff08;3&#xff09;items.py文件&#xff08;两个项目一致&#xff01;&#xff09;&#xff1a;&am…

回归预测 | Matlab基于CPO-BP基于冠豪猪算法优化BP神经网络的数据多输入单输出回归预测

回归预测 | Matlab基于CPO-BP基于冠豪猪算法优化BP神经网络的数据多输入单输出回归预测 目录 回归预测 | Matlab基于CPO-BP基于冠豪猪算法优化BP神经网络的数据多输入单输出回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.CPO-BP回归基于冠豪猪优化算法[24年新…

产品使用说明书也能进行SEO?要怎么制作才能使其易于搜索?

产品使用说明书也能进行SEO&#xff1f;是的&#xff0c;你没有听错&#xff0c;不过是在线化的产品使用说明书。产品使用说明书能通过特定的策略和技巧进行搜索引擎优化&#xff08;SEO&#xff09;。这不只是为了让产品信息更易被找到&#xff0c;更是为了提升品牌知名度和用…

【Linux】应用与驱动交互及应用间数据交换

一、应用程序与 Linux 驱动交互主要通过以下几种方式&#xff1a; 1. 系统调用接口&#xff08;System Calls&#xff09;: 应用程序可以通过系统调用&#xff0c;如 open(), read(), write(), ioctl(), 等来与设备驱动进行交互。这些调用最终会通过内核转发到相应的驱动函数…

【分布式微服务专题】从单体到分布式(四、SpringCloud整合Sentinel)

目录 前言阅读对象阅读导航前置知识一、什么是服务雪崩1.1 基本介绍1.2 解决方案 二、什么是Sentinel2.1 基本介绍2.2 设计目的2.3 基本概念 三、Sentinel 功能和设计理念3.1 流量控制3.2 熔断降级3.3 系统负载保护 四、Sentinel 是如何工作的 笔记正文一、简单整合Sentinel1.1…

uniapp日期加减切换,点击切换

先上完成后的页面&#xff1a;当前年年份不显示&#xff0c;不然完整显示。 可以切换和自定义选择。 html:样式和图片自定义。 <view class"image-text_30"><image click"delMonth" :src"require(/static/home/zuo.png)" class"…

最新消息:OpenAI GPT Store 正式上线,GPTs 应用商店来了!

原文链接 https://openaigptguide.com/gpt-store-and-chatgpt-team/ OpenAI推出的两款新产品和服务&#xff1a;GPT Store和ChatGPT Team&#xff0c;提供了许多全新的解决方案和功能&#xff0c;旨在帮助用户更轻松地使用和构建GPT工具&#xff0c;同时也增加了公司的收入来源…

VINS-MONO拓展2----更快地makeHessian矩阵(p_thread, OpenMP, CUDA, tbb)

1. 目标 完成大作业T2 作业提示&#xff1a; 多线程方法主要包括以下几种(参考博客)&#xff1a; MPI(多主机多线程开发),OpenMP(为单主机多线程开发而设计)SSE(主要增强CPU浮点运算的能力)CUDAStream processing, 之前已经了解过std::thread和pthread&#xff0c;拓展1…

Unity中URP下实现能量罩(交接处高亮)

文章目录 前言一、交接处高亮 原理1、 我们先用一个球作为能量罩、一个Cube 和 一个 椭球 作为与能量罩交接的物体2、 这是我们目前场景的深度图3、使能量罩为 半透明渲染队列 且 关闭深度写入 不渲染深度图 二、交接处高亮 实现1、得到深度图2、在片元着色器中&#xff0c;对深…

【Qt之Quick模块】8. Quick基础、布局管理、布局管理器

1. 前言 Qt Quick编程&#xff0c;提供了多种布局方式。 如&#xff0c;静态布局&#xff0c;可以使用组件的x、y属性进行设置&#xff0c;或者进行绑定。 还可以使用锚anchors进行布局。 此外&#xff0c;还可以使用定位器以及定位管理器为多组件进行布局。 但使用布局管理器…

OpenCV-20卷积操作

一、什么是图像卷积 图像卷积就是卷积在图像上按照滑动遍历像素时不断的相乘求和的过程。 绿色为图片&#xff0c; 黄色为卷积核&#xff0c; 粉色为最终得到的卷积特征。 二、步长 步长就是卷积核在图像上移动的步幅&#xff0c;每次移动一个方格则步幅为1。且一般为1。 若…

【hyperledger-fabric】搭建多机网络二进制安装部署Orderer节点

简介 根据b站教学视频去学习搭建多机网络二进制安装部署Orderer节点时遇到了一些问题&#xff0c;在这里对这些小问题进行处理。 问题描述以及解决方案 问题描述&#xff1a;日志报错信息Failed pulling the last config block: retry attempts exhausted channelfabric-cha…

计算机组成原理之计算机硬件发展和计算机系统的组成

学习的最大理由是想摆脱平庸&#xff0c;早一天就多一份人生的精彩&#xff1b;迟一天就多一天平庸的困扰。各位小伙伴&#xff0c;如果您&#xff1a; 想系统/深入学习某技术知识点… 一个人摸索学习很难坚持&#xff0c;想组团高效学习… 想写博客但无从下手&#xff0c;急需…

1.11寒假集训

A: 解题思路&#xff1a; 这题看示例不难发现&#xff0c;答案就是a * b的每一项的和&#xff0c;例如111 111就是111*&#xff08;1 1 1&#xff09; 333,知道后此题就迎刃而解了 下面是c代码&#xff1a; #include<iostream> using namespace std; int main() {in…

Cesium 实战 - 模型亮度调整,自定义着色器(CustomShader)完美解决模型太暗的问题

Cesium 实战 - 自定义视频标签展示视频 模型变暗问题以往通过光线解决问题模型变暗原理解决问题完整代码在线示例在 Cesium 项目中,添加模型是比较基础的功能,Cesium 支持 glTF(GBL) 格式。 在实际应用中,经常会遇到模型特别暗的情况,对比而言,其他三维环境添加是正常的…

Vs2019安装教程

1、下载链接&#xff1a;Visual Studio 较旧的下载 - 2019、2017、2015 和以前的版本 (microsoft.com)https://visualstudio.microsoft.com/zh-hans/vs/older-downloads/2、下载 而后跟进安装&#xff1a;&#xff08;虽然这是2022的&#xff0c;但是和2022和2019基本差不多&am…

【C++】C++11中的常见语法(上)

C11 一、C11简介二、统一的列表初始化1.&#xff5b;&#xff5d;初始化2. std::initializer_list 三、声明1. auto2. decltype3. nullptr 四、右值引用和移动语义1. 左值引用和右值引用2. 左值引用与右值引用比较3. 右值引用使用场景和意义4. 右值引用引用左值及其一些更深入的…

Java基于云计算的云HIS源码 云部署模式,可支持多家医院共同使用

Java基于云计算技术的B/S架构医院信息管理系统(简称云HIS)&#xff0c;采用前后端分离架构&#xff0c;前端由Angular、JavaScript开发&#xff1b;后端使用Java语言开发。功能包括门诊、住院、收费、电子病历、药品药房、药库、财务、统计等模块&#xff0c;支持医保接口。系统…