首页 > 基础资料 博客日记
【课程设计】Java 计算器实现(源码 + 详解)
2024-06-21 18:00:07基础资料围观397次
🎈 作者:Linux猿
🎈 简介:CSDN博客专家🏆,华为云享专家🏆,Linux、C/C++、云计算、物联网、面试、刷题、算法尽管咨询我,关注我,有问题私聊!
🎈 关注专栏:C/C++/Java课程设计100例 优质好文持续更新中……🚀🚀🚀
🎈 欢迎小伙伴们点赞👍、收藏⭐、留言💬
目录
「Java 计算器」是非常适合刚学习 Java 用来练手的基础项目,即可以巩固 Java 基础,也可以学习表达式算法,本篇文章来讲解下基于 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例 』获取!🎉🎉🎉
🎈 感觉有帮助记得「一键三连」支持下哦!有问题可在评论区留言💬,感谢大家的一路支持!🤞猿哥将持续输出「优质文章」回馈大家!🤞🌹🌹🌹🌹🌹🌹🤞
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:jacktools123@163.com进行投诉反馈,一经查实,立即删除!
标签: