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 &
  • 23
    点赞
  • 109
    收藏
    觉得还不错? 一键收藏
  • 14
    评论
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值