软件实习项目一 —— Java实现能进行四则运算的简易计算器
一、实验任务
(1)设计一个简易的计算器,使其实现对四则算数混合运算表达式求值。
(2)为调试好的简易计算器设计操作界面
二、实验准备
(1)具体编程语言:Java
(2)确定所用图形界面:Java Swing
(3)算法思想:中缀表达式转换为后缀表达式,进行单栈运算,推入算术表达式中的数,遇到算数操作符时进行运算,将其中间结果推入另一个栈中临时存储。将两次邻近的中间结果互相进行运算得出新的中间结果。以此重复循环,得出最终答案,输出在计算器的文本框里。
三、设计思路
(1)输入以及运算的实现
要实现完整计算式的输入并运算,就得用到计算后级表达式的算法,和将中缀表达式转换为后缀表达式的算法(后缀表达式队列(post Queue):用于存储逆波兰表达式,不用队列排序直接输出也可)
算法1:中缀表达式转后缀表达式
因为计算式要在计算器的文本编辑框中显示,所以计算式用字符串记录(定义为字符串)
规则:从左向右遍历中缀表达式
① 遇到数字字符,直接加入后缀表达式
② 遇到高优先级运算符,若栈为空直接入栈,若栈不为空,则将当前运算符与栈顶元素比较
比较1(栈顶元素也为高优先级运算符):栈顶元素出栈加入后缀表达式,当前运算符入栈.这样的操作使得栈中不会出现连续的高优先级运算符
比较2(栈顶元素为"(左括号):将当前元素入栈
比较3(栈顶元素为低优先级运算符):将当前元素入栈
③ 遇到“(”左括号,将左括号入栈
④ 遇到“)”右括号,将栈顶元素顺序出栈,直到栈顶元素为左括号,此时州去栈顶的左括号
⑤ 遇到低优先级运算符,若栈为空直接入栈,若栈不为空,则将当前运算符与栈顶元素比
比较1(栈顶元素也为低优先级运算符):栈顶元素出栈加入后缀表达式,当前运算符入栈。这样的操作使得栈中不会出现连续的低优先级运算符
比较2(栈顶元素为(左括号):将当前运算符入栈
比较3(栈顶元素为高优先级运算符):栈顶元素出栈加入后缀表达式,当前运算符入
算法2:计算后缀表达式
计算启缀表达式依然借助栈来实现
运算规则:遍历后缀表达式
① 遇到数字字符,直接入栈
② 遇到运算符,顺序出栈两个元素(数字),进行运算,将运算结果入栈
循环以上步骤最终栈中剩下的那个数字为最终答案
(2)用户在使用计算器进行算术表达式的输入时,计算器需要判断所输入的表达式是否符合运算规则,如遇到括号不完整、小数点重复等问题,计算器报错,提示用户输入正确的算术表达式,以帮助用户达到更好的使用体验
(3)计算器的基本功能设置完成后设计简易计算器的界面,以辅助用户完成基本的运算操作,得出结果
四、功能实现
计算器启动界面
package calculator;
public class StartMyCalculator {
public static void main(String[] args) {
// 启动计算器图形界面窗口
new MyCalculator();
}
}
计算机工作界面,并为按钮注册监听器
public class MyCalculator implements ActionListener {
// 定义主窗口并命名
private final JFrame jf = new JFrame("Simple Calculator");
// 定义文本框
private final JTextField jt = new JTextField("Click the button to enter the expression");
// 定义按钮
private JButton but_0, but_1, but_2, but_3, but_4, but_5, but_6, but_7, but_8, but_9,but_H,
but_add, but_sub, but_mul, but_div, but_lt, but_rt, but_org, but_equ, but_C, but_Del;
// 初始化表达式
private String input = "";
//建立一个数组,用于存放历史记录
String[] History = new String[10];
//记录按下查看历史记录按钮H的次数
int count_H = 0;
//记录按下等于号=的次数
int count_equ = 0;
MyCalculator() {
// 设置各按钮的信息
setButton();
// 设置文本框信息
setTextField();
//设置主窗口信息
setThis();
// 添加各组件
addBut();
}
// 设置按钮信息的方法
private void setButton() {
but_0 = new JButton("0");
but_0.setFont(new Font("Miriam Fixed", Font.BOLD, 18));
but_0.setMargin(new Insets(0, 0, 0, 0));
but_1 = new JButton("1");
but_1.setFont(new Font("Miriam Fixed", Font.BOLD, 18));
but_1.setMargin(new Insets(0, 0, 0, 0));
but_2 = new JButton("2");
but_2.setFont(new Font("Miriam Fixed", Font.BOLD, 18));
but_2.setMargin(new Insets(0, 0, 0, 0));
but_3 = new JButton("3");
but_3.setFont(new Font("Miriam Fixed", Font.BOLD, 18));
but_3.setMargin(new Insets(0, 0, 0, 0));
but_4 = new JButton("4");
but_4.setFont(new Font("Miriam Fixed", Font.BOLD, 18));
but_4.setMargin(new Insets(0, 0, 0, 0));
but_5 = new JButton("5");
but_5.setFont(new Font("Miriam Fixed", Font.BOLD, 18));
but_5.setMargin(new Insets(0, 0, 0, 0));
but_6 = new JButton("6");
but_6.setFont(new Font("Miriam Fixed", Font.BOLD, 18));
but_6.setMargin(new Insets(0, 0, 0, 0));
but_7 = new JButton("7");
but_7.setFont(new Font("Miriam Fixed", Font.BOLD, 18));
but_7.setMargin(new Insets(0, 0, 0, 0));
but_8 = new JButton("8");
but_8.setFont(new Font("Miriam Fixed", Font.BOLD, 18));
but_8.setMargin(new Insets(0, 0, 0, 0));
but_9 = new JButton("9");
but_9.setFont(new Font("Miriam Fixed", Font.BOLD, 18));
but_9.setMargin(new Insets(0, 0, 0, 0));
but_add = new JButton("+");
but_add.setFont(new Font("Miriam Fixed", Font.BOLD, 18));
but_add.setMargin(new Insets(0, 0, 0, 0));
but_sub = new JButton("-");
but_sub.setFont(new Font("Miriam Fixed", Font.BOLD, 18));
but_sub.setMargin(new Insets(0, 0, 0, 0));
but_mul = new JButton("*");
but_mul.setFont(new Font("Miriam Fixed", Font.BOLD, 18));
but_mul.setMargin(new Insets(0, 0, 0, 0));
but_div = new JButton("/");
but_div.setFont(new Font("Miriam Fixed", Font.BOLD, 18));
but_div.setMargin(new Insets(0, 0, 0, 0));
but_lt = new JButton("(");
but_lt.setFont(new Font("Miriam Fixed", Font.BOLD, 18));
but_lt.setMargin(new Insets(0, 0, 0, 0));
but_rt = new JButton(")");
but_rt.setFont(new Font("Miriam Fixed", Font.BOLD, 18));
but_rt.setMargin(new Insets(0, 0, 0, 0));
but_Del = new JButton("Del");
but_Del.setFont(new Font("Miriam Fixed", Font.BOLD, 18));
but_Del.setMargin(new Insets(0, 0, 0, 0));
but_C = new JButton("C");
but_C.setFont(new Font("Miriam Fixed", Font.BOLD, 18));
but_C.setMargin(new Insets(0, 0, 0, 0));
but_equ = new JButton("=");
but_equ.setFont(new Font("Miriam Fixed", Font.BOLD, 18));
but_equ.setMargin(new Insets(0, 0, 0, 0));
but_org = new JButton(".");
but_org.setFont(new Font("Miriam Fixed", Font.BOLD, 18));
but_org.setMargin(new Insets(0, 0, 0, 0));
but_H = new JButton("H");
but_H.setFont(new Font("Miriam Fixed",Font.BOLD,18));
but_H.setMargin(new Insets(0,0,0,0));
}
// 设置文本框信息方法
private void setTextField() {
jt.setEditable(false);
jt.setFont(new Font("Miriam Fixed", Font.PLAIN, 18));
}
// 定义主窗口的方法
private void setThis() {
// 窗口大小
jf.setSize(500, 335)