项目一:Java 计算器实现

本文介绍如何使用Java Swing构建一个图形界面计算器,包括界面设计、按钮布局及符号处理,并通过双栈算符优先级法实现计算器功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

项目一: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、继续处理当前字符,直到遇到结束符为止。

·实现功能

·清空

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

落不心

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值