java 保存计算过程的计算器

设计任务与目标
参考Windows操作系统提供的计算器设计一个实用的计算器,要求除了具有普通的计算功能外,还具有保存计算过程的功能。
(1)单击计算器上的数字按钮(0、1、2、3、4、5、6、7、8、9)可以设置参与计算的运算数。
(2)单击计算器上的运算符按钮(+、一、*、可以选择运算符号。
(3)单击计算器上的函数按钮可以计算出相应的函数值。
(4)单击计算器上的等号(-)按钮显示计算结果。
(5)在一个文本框中显示当前的计算过程,在一个文本区中显示以往的计算过程。
(6)单击"保存"按钮可以将文本区中显示的全部计算过程保存到文件单击"复制。按钮可以将文本区中选中的文本复制到剪贴板单击。清除"按钮可以清除文本区中的全部内容。
方案设计与论证
数据模型:
根据系统设计要求在数据模型部分编写了以下类。
Computer类:封装计算器的计算模型。
PlayMusic类:调用javafx.scene.media包内AudioClip类实现音乐播放。
MathComputer接口:封装复杂的数学计算方法。
Sqrt类:实现MathComputer接口,其实例计算平方根。
Reciprocal类:实现MathComputer接口,其实例负责计算倒数。
poN类:实现MathComputer接口,其实例负责求负运算。
视图设计:
GUI程序为用户提供更好的用户界面,GUI部分设计的类如下。
CalculatorWindows类:其实例为Computer类的实力提供外观显示。
HandleEvent类:实现ActionListener接口的类,封装了需要处理ActionEvent事件的共用方法。
HandleDigt类:HandleEvent类的子类,其实例是一个监听器,负责处理用户单击数字按钮触发的ActionEvent事件。
HandleBack类:HandleEvent类的子类,其实例是一个监听器,负责处理用户单击退格按钮触发的ActionEvent事件。
HandleClear类:HandleEvent类的子类,其实例是一个监听器,负责处理用户单击清零按钮触发的ActionEvent事件。
HandleEquation类:HandleEvent类的子类,其实例是一个监听器,负责处理用户单击等号按钮触发的ActionEvent事件。
HandleFile类:HandleEvent类的子类,其实例是一个监听器,负责处理用户单击保存按钮触发的ActionEvent事件。
HandleOperator类:HandleEvent类的子类,其实例是一个监听器,负责处理用户单击运算符按钮触发的ActionEvent事件。
HandlePN类:HandleEvent类的子类,其实例是一个监听器,负责处理用户单击正负号按钮触发的ActionEvent事件。
HandleReciproal类:HandleEvent类的子类,其实例是一个监听器,负责处理用户单击求倒数按钮触发的ActionEvent事件。
HandleSqrt类:HandleEvent类的子类,其实例是一个监听器,负责处理用户单击求平方根按钮触发的ActionEvent事件。
HandleMusic类:HandleEvent类的子类,其实例是一个监听器,负责处理用户单击播放音乐按钮触发的ActionEvent事件。
HandleScale类:HandleEvent类的子类,其实例是一个监听器,负责处理用户单击切换精度按钮触发的ActionEvent事件。
在这里插入图片描述

//Computer.java
package com.calculator.data;
import java.math.BigDecimal;
import java.util.*;

public class Computer {
    public double result;
    public Stack<Character> dataItem;
    public Stack<Double> tempResult;
    public Stack<Character> operator;
    public int SCALE=10;

    public Computer() {
        init();
    }

    public void init() {
        dataItem = new Stack<Character>();
        tempResult = new Stack<Double>();
        dataItem.push('0');
        operator = new Stack<Character>();
    }

    public void setDataItem(char c) {
        if(c != '.')
            dataItem.push(c);
        else {
            if(!dataItem.contains('.'))
                dataItem.push(c);
        }
    }

    public void setOperator(char p){
        if(dataItem.empty()) {
            operator.clear();
            operator.push(p);
            return;
        }
        if(operator.empty()) {
            operator.push(p);
            double m = computerDataItem();
            dataItem.removeAllElements();
            tempResult.push(m);
        }else {
            double mData = computerDataItem();
            dataItem.removeAllElements();
            char yuansuan = operator.pop();
            double rTemp = tempResult.pop();
            if(yuansuan == '+')
                rTemp = rTemp + mData;
            else if(yuansuan == '-')
                rTemp = rTemp - mData;
            else if(yuansuan == '/')
                rTemp = rTemp / mData;
            else if(yuansuan == '*')
                rTemp = rTemp * mData;
            tempResult.push(rTemp);
            operator.push(p);
        }
    }

    public char getOperator() {
        if(operator.empty()) {
            return '\0';
        }
        return operator.peek();
    }

    public void backspace() {
        if(dataItem.size() >= 1) {
            dataItem.pop();
        }
    }

    public void initDataItemByMath(MathComputer computer) {
        computer.handle(this);
    }

    public double getResult() {
        double endItem = 0;
        if(dataItem.empty()) {
            if (!tempResult.empty()) {
                endItem = tempResult.peek();
            }
        }else {
            endItem = computerDataItem();
        }

        if(operator.empty()) {
            result = endItem;
            return result;
        }
        char yunsuan = operator.peek();
        if((yunsuan == '+')
  • 23
    点赞
  • 109
    收藏
    觉得还不错? 一键收藏
  • 14
    评论
以下是一个简易计算器增加历史记录功能的Java代码示例: ```java import javax.swing.*;import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; public class CalculatorWithHistory extends JFrame { private JTextField result_Jtf; private JButton CE; private JButton history; private JButton equal; private String str = ""; private String[] historyArr = new String[5]; private int countEqu = 0; public CalculatorWithHistory() { setTitle("Calculator"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setLayout(new BorderLayout()); result_Jtf = new JTextField(); result_Jtf.setEditable(false); add(result_Jtf, BorderLayout.NORTH); JPanel panel3 = new JPanel(); panel3.setLayout(new GridLayout(1, 2)); CE = new JButton("CE"); CE.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { str = ""; result_Jtf.setText(str); } }); history = new JButton("历史记录"); history.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { StringBuilder historyStr = new StringBuilder(); for (int i = 0; i < historyArr.length; i++) { if (historyArr[i] != null) { historyStr.append(historyArr[i]).append("\n"); } } JOptionPane.showMessageDialog(null, historyStr.toString(), "历史记录", JOptionPane.INFORMATION_MESSAGE); } }); panel3.add(CE); panel3.add(history); add(panel3, BorderLayout.SOUTH); JPanel panel1 = new JPanel(); panel1.setLayout(new GridLayout(4, 4)); String[] buttonLabels = {"7", "8", "9", "/", "4", "5", "6", "*", "1", "2", "3", "-", "0", ".", "=", "+"}; for (String label : buttonLabels) { JButton button = new JButton(label); button.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { String actionBut = e.getActionCommand(); str = str + actionBut; result_Jtf.setText(str); } }); panel1.add(button); } add(panel1, BorderLayout.CENTER); equal = new JButton("="); equal.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { str = calculate(str); result_Jtf.setText(str); countEqu = countEqu % 5; historyArr[countEqu] = str; countEqu++; str = ""; } }); add(equal, BorderLayout.EAST); pack(); setVisible(true); } private String calculate(String expression) { // 实现表达式求值的逻辑 // ... return result; } public static void main(String[] args) { new CalculatorWithHistory(); } } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值