图形界面科学计算器 功能:用户界面模拟真实计算器(具体可参考手机计算器APP),显示0~9按键、+、-、*、/运算符和小数点、=、(),按下对应按键,算式区域(可用Label组件)显示用户输入的内容,

这篇博客介绍了一个基于Java Swing的图形界面科学计算器的实现。计算器模拟真实计算器的界面,包括0~9数字键、+、-、*、/运算符、小数点、等号和括号。用户输入的算式会显示在Label组件中,按等号键后计算结果显示。文章提到了使用栈的数据结构来处理四则运算,还提供了简单的示例代码和解决常见问题的提示。
摘要由CSDN通过智能技术生成

图形界面科学计算器
功能:用户界面模拟真实计算器(具体可参考手机计算器APP),显示0~9按键、+、-、*、/运算符和小数点、=、(),按下对应按键,算式区域(可用Label组件)显示用户输入的内容,按等号,计算结果并显示。
要求:
1.采用图形用户界面
2.正常输入算式,计算出正确的结果
编程提示:

  1. 编写计算器类,该类中有计算方法(calculate(String str)),该方法的参数为输入的四则混合运算的字符串,功能是将字符串表达式计算出结果(具体算法,需要数据结构课程中,“栈”部分的示例程序,注意数据类型需要转化为浮点型。需要创建运算符和运算数栈,然后根据扫描的字符串决定进、出栈操作),网络上可查到示例程序。
    2.创建图形用户界面,布局可选择GridLayer或Box布局管理器,添加按键均为JButton组件。
  2. 在所有创建的按键(JButton对象)上增加事件侦听,对鼠标事件响应。对所有按键均可增加同一类事件监听器类实例,根据按键显示不同(用getText()方法获取),除等号外,均直接将按键文本加入到用于输出结果的Label组件中(在自定义的事件监听器类中,可设置一个Label成员变量,在实例化对象时,从事件触发处把Label组件赋值给该变量,可实现在监听响应中操作该组件的文本内容)
    扩展:
    (1)模拟计算器的外观,提供显示历史记录,用来显示输入的表达式等

这是一个比较复杂的项目,需要结合图形界面和计算逻辑。下面是一个简单的示例代码,基于Java Swing实现了一个图形界面科学计算器:

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class CalculatorGUI extends JFrame {
   
    private JLabel resultLabel;
    private StringBuilder expression;
    public CalculatorGUI() {
   
        setTitle("Calculator");
        setSize(300, 400);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setLayout(new BorderLayout());
        expression = new StringBuilder();
        resultLabel = new JLabel("0");
        resultLabel.setHorizontalAlignment(JLabel.RIGHT);
        resultLabel.setFont(new Font("Arial", Font.BOLD, 24));
        JPanel buttonPanel = new JPanel(new GridLayout(5, 4));
        String[] buttonLabels = {
   
                "7", "8", "9", "/",
                "4", "5", "6", "*",
                "1", "2", "3", "-",
                "0", ".", "=", "+",
                "(", ")", "C", "DEL"
        };
        for (String label : buttonLabels) {
   
            JButton button = new JButton(label);
            button.addActionListener(new ButtonClickListener());
            buttonPanel.add(button);
        }
        add(resultLabel, BorderLayout.NORTH);
        add(buttonPanel, BorderLayout.CENTER);
    }
    private class ButtonClickListener implements ActionListener {
   
        @Override
        public void actionPerformed(ActionEvent e) {
   
            String buttonText = ((JButton) e.getSource()).getText();
            switch (buttonText) {
   
                case "=":
                    calculateResult();
                    break;
                case "C":
                    clearExpression();
                    break;
                case "DEL":
                    deleteLastCharacter();
                    break;
                default:
                    appendToExpression(buttonText);
                    break;
            }
        }
        private void calculateResult() {
   
            try {
   
                double result = calculate(expression.toString());
                resultLabel.setText(Double.toString(result));
            } catch (Exception ex) {
   
                resultLabel.setText("Error");
            }
        }
        private double calculate(String expression) {
   
            // 这里使用你提到的栈的算法来计算表达式的结果
            // 可以使用现有的算法或自行实现
            // 返回计算结果
            return 0.0;
        }
        private void clearExpression() {
   
            expression.setLength(0);
            resultLabel.setText("0");
        }
        private void deleteLastCharacter() {
   
            if (expression.length() > 0) {
   
                expression.deleteCharAt(expression.length() - 1);
                resultLabel.setText(expression.toString());
            }
        }
        private void appendToExpression(String text) {
   
            expression.append(text);
            resultLabel.setText(expression.toString());
        }
    }
    public static void main(String[] args) {
   
        SwingUtilities.invokeLater(() -> {
   
            CalculatorGUI calculatorGUI = new CalculatorGUI();
            calculatorGUI.setVisible(true);
        });
    }
}

这个示例实现了一个简单的科学计算器,具备基本的加减乘除和括号功能,并且能够把输入的表达式计算出结果并显示在界面上。你可以根据自己的需求进行扩展,添加历史记录等功能。请注意,这只是一个简单的示例,实际开发中还需要考虑更多的细节和异常处理。
要实现加减乘除的功能,你可以在calculate方法中使用栈来计算表达式的结果。下面是一个完善了加减乘除功能的示例代码:

import java.util.Stack;
public class Calculator {
   
    public static double calculate(String expression) {
   
        // 移除表达式中的空格
        expression = expression.replaceAll("\\s+", "");
        // 创建运算数栈和运算符栈
        Stack<Double> operandStack = new Stack<>();
        Stack<Character> operatorStack = new Stack<>();
        for (int i = 0; i < expression.length(); i++) {
   
            char ch = expression.charAt(i);
            // 如果是数字,解析整个数字并入栈
            if (Character.isDigit(ch) || ch == '.') {
   
                StringBuilder operand = new StringBuilder();
                while (i < expression.length() && (Character.isDigit(expression.charAt(i)) || expression.charAt(i) == '.')) {
   
                    operand.append(expression.charAt(i));
                    i++;
                }
                i--;
                operandStack.push(Double.parseDouble(operand.toString()));
            }
            // 如果是运算符
            else if (isOperator(ch)) {
   
                // 如果运算符栈不为空且栈顶运算符优先级大于等于当前运算符,则先进行计算
                while (!operatorStack.isEmpty() && hasPrecedence(operatorStack.peek(), ch)) {
   
                    double operand2 = operandStack.pop();
                    double operand1 = operandStack.pop();
                    char operator = operatorStack.pop();
                    double result = performOperation(operator, operand1, operand2);
                    operandStack.push(result);
                }
                // 将当前运算符入栈
                operatorStack.push(ch);
            }
            // 如果是左括号,直接入栈
            else if (ch == 
  • 19
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值