计算数学表达式的程序(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;//默认状态normalprivate 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.hqwc.cn/news/337807.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一文解决新手所有python环境变量报错问题

问题描述: cmd控制台输入python或pip后会出现下面情况 首先确保安装程序时勾选了安装pip pip的所在目录&#xff0c;可以打开该目录查看是否存在 如果还有问题&#xff0c;确保环境变量配置了python的路径 具体操作步骤 此处的用户环境变量是只针对当前系统用户有效&a…

渐进增强与优雅降级:提升用户体验的双重策略

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

CHS_01.2.1.1+2.1.3+进程的概念、组成、特征

CHS_01.2.1.12.1.3进程的概念、组成、特征 进程进程的概念 进程的组成——PCB进程的组成——PCB进程的组成——程序段、数据段知识滚雪球&#xff1a;程序是如何运行的&#xff1f;进程的组成进程的特征 知识回顾与重要考点 从这个小节开始 我们会正式进入第二章处理机管理相关…

Mysql是怎样运行的--下

文章目录 Mysql是怎样运行的--下查询优化explainoptimizer_trace InnoDB的Buffer Pool&#xff08;缓冲池&#xff09;Buffer Pool的存储结构空闲页存储--free链表脏页&#xff08;修改后的数据&#xff09;存储--flush链表 使用Buffer PoolLRU链表的管理 事务ACID事务的状态事…

C语言基础语法跟练 day2

题源&#xff1a;牛客网 16、BoBo写了一个十六进制整数ABCDEF&#xff0c;他问KiKi对应的十进制整数是多少。 #include <stdio.h>int main() { //创建变量char arr[] "ABCDEF";int i;int sum0,c; //依次转换十六进制为十进制for(i0; arr[i]!\0; i){char b …

python学习函数------廖雪峰的官方网站

文章目录 4.函数4.1调用函数abs(一个参数)函数&#xff1a;求绝对值的函数&#xff0c;只有一个参数。max(多个参数)函数&#xff1a;可以接收任意多个参数&#xff0c;并返回最大的那个数据类型转换hex()函数&#xff1a;把一个整数转换成十六进制表示的字符串 4.2定义函数4.3…

QT第三天

完善对话框&#xff0c;点击登录对话框&#xff0c;如果账号和密码匹配&#xff0c;则弹出信息对话框&#xff0c;给出提示”登录成功“&#xff0c;提供一个Ok按钮&#xff0c;用户点击Ok后&#xff0c;关闭登录界面&#xff0c;跳转到其他界面如果账号和密码不匹配&#xff0…

Ubuntu 实时查看显存调用命令 free 及命令详解与原理说明(全)

Ubuntu 实时查看显存调用命令 free 及详解 文章目录 Ubuntu 实时查看显存调用命令 free 及详解1 free 作用1.1 语法&#xff1a;1.2 单独显示例子1.3 组合显示例子 2 输出介绍3 原理解释3.1 buff / cache&#xff08;即 buffer / cache&#xff09;3.1.1 buffer 缓冲区3.1.2 ca…

Linux入门攻坚——12、Linux网络属性配置相关知识2

CentOS 7网络属性配置&#xff1a; 传统命名机制&#xff1a;以太网eth[0,1,2,...]&#xff0c;wlan[0,1,2...] 可预测功能的命名机制&#xff1a; udev支持多种不同的命名方案&#xff1a; Firmware &#xff0c;拓扑结构 在对待设备文件这块&#xff0c;Linux改…

不知道题目是啥

本题是学校的集训里的题&#xff0c;所有不知道题目名字是啥&#xff0c;直接看题目就好 解题思路&#xff1a;因为字符串只含有小写字母&#xff0c;所以可以创建两个数组分别来存s和t的每个字母出现次数&#xff0c;然后遍历数组&#xff0c;如果s字符串中的某个字母比t的小&…

TurboDesign安装包及安装教程

下载链接&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1I_jMid-z186GgvyH3ZExGQ 提取码&#xff1a;z936 1.解压下载好的压缩包。 2.进入解压后的文件夹并点击进入“ADT TURBODesign Suite 6.4.0”。 3.点击“安装包”进入文件夹。 4.找到“setup.exe”并右键点…

Java中异常处理-详解

异常&#xff08;Exception&#xff09; JVM 默认处理方案 把异常的名称&#xff0c;异常的原因&#xff0c;及异常出错的位置等信息输出在控制台程序停止执行 异常类型 编译时异常必须显示处理&#xff0c;否则程序会发生错误&#xff0c;无法通过编译运行时异常无需显示处理…