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

🎈 作者:Linux猿

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

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

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


目录

一、需求分析

二、设计思路

2.1 界面设计

2.2 表达式算法

三、代码实现


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

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

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


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


  • 32
    点赞
  • 246
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Linux猿

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

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

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

打赏作者

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

抵扣说明:

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

余额充值