计算数学表达式的程序(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.rhkb.cn/news/235606.html

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

相关文章

公共用例库计划--个人版(二)主体界面设计

1、任务概述 计划内容&#xff1a;完成公共用例库的开发实施工作&#xff0c;包括需求分析、系统设计、开发、测试、打包、运行维护等工作。 1.1、 已完成&#xff1a; 需求分析、数据库表的设计&#xff1a;公共用例库计划–个人版&#xff08;一&#xff09; 1.2、 本次待完…

2024新年烟花代码完整版

文章目录 前言烟花效果展示使用教程查看源码HTML代码CSS代码JavaScript 新年祝福 前言 在这个充满希望和激动的2024年&#xff0c;新的一年即将拉开帷幕&#xff0c;而数字科技的创新与发展也如火如荼。烟花绚丽多彩的绽放&#xff0c;一直以来都是新年庆典中不可或缺的元素。…

微信小程序 组件component ts用法

还在为 使用了ts 但是组件内显示this.setData/this.data.xxx ts报错 觉得难看吗&#xff1f; 还在为明明定义了applyInfo&#xff0c;明明应该有setData为何报错&#xff1f; 还在为不知道如何写类型而烦心吗&#xff1f; 不如转变思路将methods看成为一个对象 增加断言 as a…

实现多级缓存(Redis+Caffeine)

文章目录 多级缓存的概述多级缓存的优势 多级缓存的概述 在高性能的服务架构设计中&#xff0c;缓存是一个不可或缺的环节。在实际的项目中&#xff0c;我们通常会将一些热点数据存储到Redis或MemCache这类缓存中间件中&#xff0c;只有当缓存的访问没有命中时再查询数据库。在…

公网环境使用移动端设备+cpolar远程访问本地群晖nas上的影视资源

文章目录 1.使用环境要求&#xff1a;2.下载群晖videostation&#xff1a;3.公网访问本地群晖videostation中的电影&#xff1a;4.公网条件下使用电脑浏览器访问本地群晖video station5.公网条件下使用移动端&#xff08;搭载安卓&#xff0c;ios&#xff0c;ipados等系统的设备…

小家电应用解决方案以及选型指南

电磁炉是现代厨房中常见的一种小家电产品&#xff0c;它利用电磁感应加热原理&#xff0c;可以快速、高效地进行烹饪。在电磁炉的设计和制造过程中&#xff0c;功率开关芯片的选择对于产品的性能和成本有着重要的影响。 针对电磁炉的应用需求&#xff0c;推荐采用LED驱动芯片S…

蓝桥杯省赛无忧 STL 课件12 vector

01 vector的定义和特性 02 vector的常用函数 03 vector排序去重 示例&#xff1a; #include<bits/stdc.h> using namespace std; int main(){vector<int> vec {5,2,8,1,9};sort(vec.begin(),vec.end());for(const auto& num : vec){cout<<num<<&q…

Centos7升级openssl到openssl1.1.1

Centos7升级openssl到openssl1.1.1 1、先查看openssl版本&#xff1a;openssl version 2、Centos7升级openssl到openssl1.1.1 升级步骤 #1、更新所有现有的软件包列表并安装最新的软件包&#xff1a; $sudo yum update #2、接下来&#xff0c;我们需要从源代码编译和构建OpenS…

【原生部署】SpringBoot+Vue前后端分离项目

本次主要讲解SpringBootVue前后端完全分离项目在CentOS云服务器上的环境搭建与部署过程&#xff0c;我们主要讲解原生部署。 一.原生部署概念 原生部署是指将应用程序&#xff08;一般是指软件、应用或服务&#xff09;在底层的操作系统环境中直接运行和部署&#xff0c;而不…

微软Office 2019 批量授权版

软件介绍 微软办公软件套件Microsoft Office 2019 专业增强版2024年1月批量许可版更新推送&#xff01;Office2019正式版2018年10月份推出&#xff0c;主要为多人跨平台办公与团队协作打造。Office2019整合对过去三年在Office365里所有功能&#xff0c;包括对Word、Excel、Pow…

Docker的介绍及安装基本操作命令

前言 Docker 是一个开源的应用容器引擎&#xff0c;基于 Go 语言 并遵从 Apache2.0 协议开源。 Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中&#xff0c;然后发布到任何流行的 Linux 机器上&#xff0c;也可以实现虚拟化。 容器是完全使用沙箱…

基于Selenium+Python的web自动化测试框架

一、什么是Selenium&#xff1f; Selenium是一个基于浏览器的自动化测试工具&#xff0c;它提供了一种跨平台、跨浏览器的端到端的web自动化解决方案。Selenium主要包括三部分&#xff1a;Selenium IDE、Selenium WebDriver 和Selenium Grid。 Selenium IDE&#xff1a;Firefo…

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

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

Python实用小工具(4)——邮件轰炸机,给朋友搞点乐子(附源码+exe文件)

欢迎来到MatpyMaster&#xff01;今天我们将使用Python来批量发送邮件&#xff0c;让你的邮件推送变得更加高效。废话不多说&#xff0c;直接开搞&#xff01;使用声明&#xff1a; 请确保你的邮箱开启了SMTP服务&#xff0c;并获取了授权码。 选择合适的发送间隔&#xff0c;…

VBA中类的解读及应用第八讲:实现定时器功能的自定义类事件

《VBA中类的解读及应用》教程【10165646】是我推出的第五套教程&#xff0c;目前已经是第一版修订了。这套教程定位于最高级&#xff0c;是学完初级&#xff0c;中级后的教程。 类&#xff0c;是非常抽象的&#xff0c;更具研究的价值。随着我们学习、应用VBA的深入&#xff0…

【PaperReading】5. Open-Vocabulary SAM

Category Content 论文题目 Open-Vocabulary SAM: Segment and Recognize Twenty-thousand Classes Interactively 作者 Haobo Yuan1 Xiangtai Li1 Chong Zhou1 Yining Li2 Kai Chen2 Chen Change Loy1 1S-Lab, Nanyang Technological University 2Shanghai Artificial In…

找不到msvcr120.dll怎样修复,分享4种修复方法

msvcr120.dll是Microsoft Visual C 2012 Redistributable Package的一个关键组件&#xff0c;负责提供C运行时库。许多应用程序在运行时都需要依赖这个库文件。然而&#xff0c;在日常使用过程中&#xff0c;不少用户会遇到msvcr120.dll丢失的问题&#xff0c;导致程序无法正常…

Linux 文件(夹)权限查看

命令 : ls -al ls -al 是一个用于列出指定目录下所有文件和子目录的命令,包括隐藏文件和详细信息。其中,-a 选项表示显示所有文件,包括以 . 开头的隐藏文件,-l 选项表示以列表的形式显示文件的详细信息。 本例中:drwxrwxr-x 为权限细节。 权限细节(Permission detail…

制造业CRM是什么?都有哪些特色功能?

近些年&#xff0c;制造业和别的行业一样&#xff0c;经历过翻天覆地的转型。从以分销为基础到客户至上&#xff0c;所有行业都在确定商业模式的全局性变化。在这样的环境下&#xff0c;不管什么规模的设备制造企业都意识到将创新与技术融进业务流程的必要性。CRM管理系统是促进…

23种设计模式精讲,配套23道编程题目 ,支持 C++、Java、Python、Go

关于设计模式的学习&#xff0c;大家应该还是看书或者看博客&#xff0c;但却没有一个边学边练的学习环境。 学完了一种设计模式 是不是应该去练一练&#xff1f; 所以卡码网 针对 23种设计&#xff0c;推出了 23道编程题目&#xff0c;来帮助大家练习设计模式&#xff0c;地…