【课程设计】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…

Docker 部署 FastDFS 和 CentOS 7 源码部署 FastDFS

FastDFS 是一个分布式文件系统,可以用于存储和管理各种文件。在本文中,我们将介绍如何使用 Docker 和源码两种方式来部署 FastDFS。 使用 Docker 部署 FastDFS 拉取 FastDFS Docker 镜像:docker pull delron/fastdfs 启动 Tracker 容器:docker run -d --network=host --name t…

二、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;注册一个管理员帐号…

Clickhouse 时间函数操作总结 —— Clickhouse 基础篇(八)

文章目录 当前时间今天日期昨天日期当前时区时区转换计算年份计算季度计算月份计算该年中第几天计算该月中第几天计算该周中第几天计算小时计算分钟计算秒计算UNIX时间戳时间加法时间减法计算相差天数 当前时间 SELECT now()Query id: aa741313-218d-426f-8afc-d78c7d744d16┌…

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

随着信息技术的迅猛发展&#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…

DataSophon

愿景 致力于快速实现部署、管理、监控以及自动化运维大数据云原生平台&#xff0c;帮助您快速构建起稳定、高效、可弹性伸缩的大数据云原生平台。 快速部署 | DataSophon DDP部署包下载地址&#xff1a; 链接&#xff1a;百度网盘-链接不存在 提取码&#xff1a;hnn0

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数字…

雨露均沾访问量算法验证

文章目录 一、概述二、模拟测试三、运行结果四、源码传送 一、概述 在 CSDN博客自动阅读器-服务端推送技术SSE之简单应用 一文中&#xff0c;我们实现了服务端主动推送访问链接到浏览器端功能。 演示页面可点击链接http://124.71.129.204:8081 访问&#xff0c;我们想对访问量…

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

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

Vue 状态管理深入研究:Vuex 和 Pinia 的原理与实践对比

推荐一个AI网站&#xff0c;免费使用豆包AI模型&#xff0c;快去白嫖&#x1f449;海鲸AI &#x1f44b; 引言 在 Vue.js 应用程序中&#xff0c;状态管理是一个至关重要的方面。它有助于集中管理应用的状态&#xff0c;使组件之间的数据共享更加高效和可维护。Vuex 和 Pinia …

视频汇聚管理安防监控平台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 双击安装包 点击下一…