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

Linux猿 2024-06-19 08:35:03 阅读 56

🎈 作者:Linux猿

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

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

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


目录

一、需求分析

二、设计思路

2.1 界面设计

2.2 表达式算法

三、代码实现


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

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

re>

图1 Java 计算器界面
re>

一、需求分析

功能需求如下所示:

(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例 』获取!🎉🎉🎉


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




声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。