【课程设计】Java 计算器实现(源码 + 详解)

🎈 作者:Linux猿

🎈 简介:CSDN博客专家🏆,华为云享专家🏆,Linux、C/C++、云计算、物联网、面试、刷题、算法尽管咨询我,关注我,有问题私聊!

🎈 关注专栏:C/C++/Java课程设计100例 优质好文持续更新中……🚀🚀🚀

🎈 欢迎小伙伴们点赞👍、收藏⭐、留言💬


目录

一、需求分析

二、设计思路

2.1 界面设计

2.2 表达式算法

三、代码实现


Java 计算器是非常适合刚学习 Java 用来练手的基础项目,即可以巩固 Java 基础,也可以学习表达式算法,本篇文章来讲解下基于 Java 的计算器实现。

在正式讲解之前,先来看下实现效果,如下所示。

图1 Java 计算器界面

一、需求分析

功能需求如下所示:

(1)实现算术加法、减法、乘法、除法的基本运算;

(2)支持括号‘(’ 和 ‘)’操作;

(3)支持删除操作;

(4)支持清除操作;

(5)支持小数操作;

(6)支持错误检查;

二、设计思路

功能设计主要包括两部分:界面设计和表达式算法,下面分别来介绍下。

2.1 界面设计

通过继承 JFrame 类实现界面的布局,主要分为两部分,一个是表达式输入框,另一个是表达式输入需要的按钮。

其中,表达式需要的按钮包括:"C", "(", ")", "/", "7", "8", "9", "*", "4", "5", "6", "-", "1", "2", "3", "+", "0", ".", "DEL", "="。

其中,C 按钮表示清空输入框,DEL 按钮表示删除输入框中的最后一个字符,= 按钮表示计算输入框中的表达式。

2.2 表达式算法

计算输入的表达式:使用两个栈分别存储表达式计算需要的数值和表达式计算操作符,同时,表达式计算操作符也根据优先级划分,通过操作符获取数值进行计算。

三、代码实现

基于 Java 的计算器代码实现如下所示。

import javax.swing.*;
import java.awt.*;
import java.util.HashMap;
import java.util.Stack;public class Calculator extends JFrame {private Stack<Double> expressionValue = new Stack<>(); // 值private Stack<String> expressionOperator = new Stack<>(); // 运算符private Calculator() {setTitle("基于 Java 的计算器");setSize(345, 500);setLocation(700, 300);Container c = getContentPane();c.setLayout(null);// 输入面板JTextArea jt = new JTextArea(100, 100);jt.setFont(new Font("Aria", Font.BOLD, 30));jt.setLineWrap(true);JScrollPane sp = new JScrollPane(jt);jt.setCaretPosition(jt.getDocument().getLength());sp.setBounds(0, 0, 330, 163);c.add(sp);JPanel p = new JPanel();p.setLayout(new GridLayout(5, 4, 0, 0));p.setBounds(0, 162, 340, 300);// 放置按钮int n = 20;String[] num = {"C", "(", ")", "/","7", "8", "9", "*","4", "5", "6", "-","1", "2", "3", "+","0", ".", "DEL", "="};JButton[] jb = new JButton[n];for(int i = 0; i < n; i++) {jb[i] = new JButton(num[i]);p.add(jb[i]);}c.add(p);for(int i = 1; i < 18; i++) {final int j = i;jb[i].addActionListener(e-> jt.append(num[j]));}// 监听 C 按键jb[0].addActionListener(e->{jt.setText("");expressionValue.clear();expressionOperator.clear();});// 监听 DEL 按键jb[18].addActionListener(e->{try {jt.setText(jt.getText().substring(0,jt.getText().length()-1));} catch (Exception ignored) {}});// 监听 = 按键jb[19].addActionListener(e->{try {System.out.println(jt.getText());double x = calculate(jt.getText() + "#");jt.setText("");  				// 清空输入框jt.append(String.valueOf(x)); 	// 显示计算结果} catch(Exception ex) { 			// 异常情况if(ex.getMessage() == null) {jt.setText("计算错误!");} else {jt.setText(ex.getMessage());}}});KeyStroke enter = KeyStroke.getKeyStroke("ENTER");jt.getInputMap().put(enter, "none");this.getRootPane().setDefaultButton(jb[19]);setVisible(true);setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);}// 执行 + - * / 计算private void calculate(){String b = expressionOperator.pop();double c = expressionValue.pop();double d = expressionValue.pop();double e;if (b.equals("+")) {e = d + c;expressionValue.push(e);} else if (b.equals("-")) {e = d - c;expressionValue.push(e);} else if (b.equals("*")) {e = d * c;expressionValue.push(e);} else if (b.equals("/")) {if(c == 0)throw new ArithmeticException("除 0 错误!");e = d / c;expressionValue.push(e);}}// 计算字符串的值private Double calculate(String text){HashMap<String, Integer> operator = new HashMap<>();operator.put("(",0);operator.put(")",0);operator.put("/",2);operator.put("*",2);operator.put("-",1);operator.put("+",1);operator.put("#",0);expressionOperator.push("#");int flag = 0;int n = text.length();for(int i = 0; i < n; i++) {String a = String.valueOf(text.charAt(i));if (!a.matches("[0-9.]")) {if(flag != i) {expressionValue.push(Double.parseDouble(text.substring(flag, i)));}flag = i + 1;while(!(a.equals("#") && expressionOperator.peek().equals("#"))) { // peek 返回栈顶元素,不删除if(operator.get(a) > operator.get(expressionOperator.peek()) || a.equals("(")) {expressionOperator.push(a); // 加入操作符break;} else {if(a.equals(")")) {while(!expressionOperator.peek().equals("("))calculate();expressionOperator.pop();break;}calculate();}}}}return expressionValue.pop();}public static void main(String[] args) {new Calculator();}
}

🍓🍓🍓 更多课程设计/大作业请点击『 C/C++/Java课程设计100例 』获取!🎉🎉🎉


🎈 感觉有帮助记得「一键三连支持下哦!有问题可在评论区留言💬,感谢大家的一路支持!🤞猿哥将持续输出「优质文章回馈大家!🤞🌹🌹🌹🌹🌹🌹🤞


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

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

相关文章

RPA机器人流程自动化如何优化人力资源工作流程

人力资源部门在支持员工和改善整体工作环节方面扮演着至关重要的角色&#xff0c;但是在人资管理的日常工作中&#xff0c;充斥着大量基于规则的重复性任务&#xff0c;例如简历筛选、面试安排、员工数据管理、培训管理、绩效管理等&#xff0c;这些任务通常需要工作人员花费大…

【C++】从零开始map与set的封装

送给大家一句话&#xff1a; 今日的事情&#xff0c;尽心、尽意、尽力去做了&#xff0c;无论成绩如何&#xff0c;都应该高高兴兴地上床恬睡。 – 三毛 《亲爱的三毛》 &#x1f303;&#x1f303;&#x1f303;&#x1f303;&#x1f303;&#x1f303;&#x1f303;&#x…

逻辑分析仪的调试使用

调试软件下载&#xff1a;点击跳转 一、接线 逻辑分析仪 设备 GND --- GND CHX&#xff08;数据通道&#xff09; --- 通信引脚 二、数据采集 图中两个可以选择数字大小的地方分别表示 采样深度 &#xff08;10M Samples&a…

【linux】如何优雅的使用vim编辑器

基本指令 【linux】详解linux基本指令-CSDN博客 【linux】详解linux基本指令-CSDN博客 vim的基本概念 vim有很多模式&#xff0c;小编只介绍三种就能让大家玩转vim了&#xff0c; 分别是&#xff1a; 正常/普通/命令模式 插入模式 末行/底行模式 命令模式 控制屏幕光标的…

obsidian Excalidraw 更换字体 最新版 手写字体

背景 Excalidraw 是 obsidian 中最厉害的插件之一&#xff0c;长期霸占插件排行榜第一。以其强悍的性能和灵活的可塑性受到大家的喜爱&#xff0c;可默认的字体对中文并不友好&#xff0c;网上大多数教程要不是过时了&#xff0c;要不是错的&#xff0c;还有就是太复杂&#x…

二、OpenWebUI 使用(.Net8+SemanticKernel+Ollama)

OpenWebUI的github上安装部署已经很详细&#xff0c;直接照着敲命令即可 GitHub&#xff1a;https://github.com/open-webui/open-webui 一、使用配置 1、访问&#xff1a;http://Ip:3000&#xff0c;打开如下OpenWebUI界面。 2、先点击“注册”&#xff0c;注册一个管理员帐号…

信息化赋能:干部监督工作的创新与实践

随着信息技术的迅猛发展&#xff0c;信息化手段在干部监督工作中的应用越来越广泛&#xff0c;为提升监督工作的效率和精准度提供了有力支持。以下是如何利用信息化手段扎实推进干部监督工作的几点建议&#xff1a; 一、搭建信息化平台&#xff0c;实现数据统一管理 要扎实推…

springboot带颜色的日志输出

话不多说直接贴全部代码在作解释 <?xml version"1.0" encoding"utf-8"?> <configuration><property name"pattern" value"%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg %n"/><propert…

Xinstall地推效果大揭秘:洞察用户需求,创新营销策略不再是难题

在互联网流量红利逐渐衰退的今天&#xff0c;企业如何快速搭建起满足用户需求的运营体系&#xff0c;成为了亟待解决的问题。特别是在地推领域&#xff0c;如何在多变的互联网环境下&#xff0c;迅速、有效地触达用户&#xff0c;扩大目标用户基数和流量池&#xff0c;成为了企…

一文了解ai问答机器人:特点、应用、影响

很多人都听过ai问答机器人这个词&#xff0c;也许对于大部分人来说&#xff0c;对它的印象就是智能&#xff01;这是不可置疑的。你在生活中肯定也接触了不少的ai问答机器人。但是关于ai问答机器人&#xff0c;你是否了解它的特点、应用领域和对人类未来的影响呢&#xff1f;Lo…

棱镜七彩荣获2024数字中国创新大赛两大奖项!

5月24日&#xff0c;供应链成熟度与开源技术主题活动暨数字中国创新大赛信创赛道全国总决赛颁奖仪式在福建福州成功举办。棱镜七彩“FOSSEye产品”&#xff0c;凭借在国产化支持、供应链成熟度、核心技术、功能体系、以及作品前景等多个维度的优异表现&#xff0c;荣获2024数字…

Pytorch深度学习实践笔记8(b站刘二大人)

&#x1f3ac;个人简介&#xff1a;一个全栈工程师的升级之路&#xff01; &#x1f4cb;个人专栏&#xff1a;pytorch深度学习 &#x1f380;CSDN主页 发狂的小花 &#x1f304;人生秘诀&#xff1a;学习的本质就是极致重复! 《PyTorch深度学习实践》完结合集_哔哩哔哩_bilibi…

视频汇聚管理安防监控平台EasyCVR程序报错“create jwtSecret del server class:0xf98b6040”的原因排查与解决

国标GB28181协议EasyCVR安防视频监控平台可以提供实时远程视频监控、视频录像、录像回放与存储、告警、语音对讲、云台控制、平台级联、磁盘阵列存储、视频集中存储、云存储等丰富的视频能力&#xff0c;平台支持7*24小时实时高清视频监控&#xff0c;能同时播放多路监控视频流…

java调用科大讯飞在线语音合成API --内附完整项目

科大讯飞语音开放平台基础环境搭建 1.用户注册 注册科大讯飞开放平台账号 2.注册好后先创建一个自己的应用 创建完成后进入应用可以看到我们开发需要的三个参数&#xff1a;APPID&#xff0c;APISecret&#xff0c;APIKey 3.因为平台提供的SDK中只支持了简单的中英两种语言语音…

Redis 可视化工具 RedisInsight 的保姆级安装以及使用(最新)

Redis 可视化工具 RedisInsight 的保姆级安装以及使用 一、下载 RedisInsight二、安装 RedisInsight三、使用 RedisInsight四、新建 Redis 连接 一、下载 RedisInsight 官网 https://redis.io/insight/填写基本信息之后点击 DOWNLOAD 二、安装 RedisInsight 双击安装包 点击下一…

cad角度如何精确到0.1

可以通过更改角度精度的方式把角度的标注精确到小数点后几位&#xff0c;具体方法如下&#xff1a; 1、打开一个CAD文档&#xff0c;在文档中画一个角&#xff0c;如下图&#xff1a; 文章源自设计学徒自学网-https://www.sx1c.com/47920.html 2、给此角进行角度的标注&#…

Java锁的策略

White graces&#xff1a;个人主页 &#x1f649;专栏推荐:Java入门知识&#x1f649; &#x1f649; 内容推荐:<多线程案例(线程池)>&#x1f649; &#x1f439;今日诗词:"你我推心置腹, 岂能相负"&#x1f439; 目录 锁的策略 乐观锁和悲观锁 轻量级锁…

[数据集][目标检测]森林火灾检测数据集VOC+YOLO格式362张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;362 标注数量(xml文件个数)&#xff1a;362 标注数量(txt文件个数)&#xff1a;362 标注类别…

四川音盛佳云电子商务有限公司铸就抖音电商新高度

在数字经济的浪潮中&#xff0c;抖音电商以其独特的魅力迅速崛起&#xff0c;成为新时代消费潮流的引领者。四川音盛佳云电子商务有限公司&#xff0c;作为抖音电商领域的佼佼者&#xff0c;凭借专业的团队和创新的理念&#xff0c;致力于为广大消费者提供优质、便捷的购物体验…

和可被k整除的子数组 ---- 前缀和

题目链接 题目: 分析: 补充知识 1. 同余定理: (a-b) % p 0即a-b能被p整除, > a % p b % p 2. c, java中 [负数 % 正数] 的结果是负数, 想要得到正确结果 > (a%pp)%p这道题和<和为k的子数组>类似, 利用前缀和的思想, 计算以i结尾的所有子数组, 前缀和为sum[i] …