项目一:Java 计算器实现
实现步骤:
1.利用Java swing 制作计算器界面
·界面大小(长度,宽度,位置-----可随意设置)
·输入框,按钮布局(大小,位置-----可随意设置)
·添加符号(粗细,颜色-----可随意设置)
2.利用双栈算符优先级法(或者用二叉树来求解后缀表达式的值)
·监听事件
·处理符号
·实现功能
·清空完成
1.利用Java swing 制作计算器界面
//步骤一最终应该得到的结果
·界面大小(长度,宽度,位置-----可随意设置)
import javax.swing.*;
import java.awt.*;
public class Calculator extends JFrame {
public Calculator() throws HeadlessException {
this.init();
this.addNorthComponent();
this.addCenterCompponent();
}
public void init() {
this.setTitle("计算器"); //设置界面名称“计算器”
this.setSize(340, 400); //设置计算器界面大小
this.setLayout(new BorderLayout());
this.setResizable(false); //让计算器界面无法被拉伸
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
Calculator carculator = new Calculator();
carculator.setVisible(true);
}
}
·输入框,按钮布局(大小,位置-----可随意设置)
//上方图形按钮设置
private JPanel jp_north = new JPanel();
// JPanel 是 Java图形用户界面(GUI)工具包swing中的面板容器类,包含在javax.swing 包中,可以进行嵌套,功能是对窗体中具有相同逻辑功能的组件进行组合。
private JTextField input_text = new JTextField(); //创建一个输入框
private JButton c_Btn = new JButton("AC"); //创建清空的“AC”的按钮。
//中间图形按钮设置
private JPanel jp_center = new JPanel();
//设置计算器上面输入框和清空键
public void addNorthComponent() {
this.input_text.setPreferredSize(new Dimension(230, 40));//设置大小
jp_north.add(input_text); //加入输入框
this.c_Btn.setForeground(Color.RED); //设制“AC”为红色
jp_north.add(c_Btn); //加入清空键
this.add(jp_north, BorderLayout.NORTH);
}
public void addCenterCompponent() {
String btn_next = "C()/789*456-123+%0.="; //设置按钮的符号
this.jp_center.setLayout(new GridLayout(5, 4));//设置中间按钮的行列
for (int i = 0; i < 20; i++) {
String temp = btn_next.substring(i, i + 1); //将每个字符分别放在不同的按钮
JButton btn = new JButton();
btn.setText(temp);
jp_center.add(btn);
}
this.add(jp_center, BorderLayout.CENTER);
}
·添加符号(粗细,颜色-----可随意设置)
两种方法:一种利用if和逻辑表达式||,一种利用matches
String regex = "[\\+\\-\\*\\/\\%\\(\\)\\.\\=C]";
for (int i = 0; i < 20; i++) {
String temp = btn_next.substring(i, i + 1); //将每个字符分别放在不同的按钮
JButton btn = new JButton();
btn.setText(temp);
if(temp.matches(regex)){
btn.setFont(new Font("粗体", Font.BOLD, 20));//运算符加粗变大
btn.setForeground(Color.RED); //运算符变成红色
}
// if(temp.equals("+") ||
// temp.equals("-") ||
// temp.equals("*") ||
// temp.equals("/") ||
// temp.equals("C") ||
// temp.equals("(") ||
// temp.equals(")") ||
// temp.equals("=") ||
// temp.equals("%") ||
// temp.equals(".")){
// btn.setFont(new Font("粗体", Font.BOLD, 20));//运算符加粗变大
// btn.setForeground(Color.RED); //运算符变成红色
// }
jp_center.add(btn);
}
2.利用双栈算符优先级法(或者用二叉树来求解后缀表达式的值)
·监听事件
ActionListener用于接收操作事件的侦听器接口
JOptionPane.showMessageDialog(null,"这个值表示弹出对话框左上角的信息,比如"消息"等",
"这个参数表示你要显示出的信息,比如"你输错密码"等 (如下图所示)
public class Calculator extends JFrame implements ActionListener {
// btn.setForeground(Color.RED); //运算符变成红色
// }
btn.addActionListener(this);
jp_center.add(btn);
}
@Override
public void actionPerformed(ActionEvent e) {
String clickStr = e.getActionCommand();
if(".0123456789".indexOf(clickStr) != -1){
this.input_text.setText(input_text.getText() + clickStr);
//让数字和小数点可以输进输入框并且不覆盖还可以顺序表示
this.input_text.setHorizontalAlignment(JTextField.RIGHT);
//让数字出现在输入框的右侧
//JOptionPane.showMessageDialog(this, clickStr);
//让运算符可以不弹出显示框
}
}
·处理符号
这里就大有深究了,前言所述,有两种方法。容我给大家来个小普及:
中缀表达式 A+(B-C/D)*E
后缀表达式 ABCD/-E*+
例子:Exp= a*b +(c-d/e)*f PostExp=ab*cde/-f*+
我的算法思想无论是双栈还是二叉树都是和后缀表达式挂钩的,当然你也可以从中得到前缀或者其他算法的思路 (我所能知道的最合适新手的算法思想如下)
从左向右依次读取算术表达式的元素X,分以下情况进行不同的处理:
(1)如果X是操作数,直接入队
(2)如果X是运算符,再分以下情况:
a)如果栈为空,直接入栈。 b)如果X==”(“,直接入栈。 c)如果X==”)“,则将栈里的元素逐个出栈,并入队到后缀表达式队列中,直到第一个配对的”(”出栈。(注:“(”和“)”都不 入队) d)如果是其他操作符(+ - * /),则和栈顶元素进行比较优先级。 如果栈顶元素的优先级大于等于X,则出栈并把栈中弹出的元素入队,直到栈顶元素的优先级小于X或者栈为空。弹出完这些元素后,才将遇到的操作符压入到栈中。
(3)最后将栈中剩余的操作符全部入队。
求值的处理过程是自左至右扫描表达式的每一个字符:
1、当扫描到的是运算数,则将其压入栈OPND,
2、当扫描到的是运算符时: 如这个运算符比OP栈顶运算符的优先级高,则入栈; 如这个运算符比OP栈顶运算符优先级低,则从OPND栈中弹出两个运算符,从栈OP中弹出栈顶运算符进行运算,并将运算结果压入栈OPND。
3、继续处理当前字符,直到遇到结束符为止。
·实现功能
·清空