保存计算过程的计算器Java实现

一. 设计要求
参考Windows操作系统提供的计算器设计一个实用的计算器,要求除了具有普通的计算功能外,还具有保存计算过程的功能。
(1) 单击计算器上的数字按钮(0,1,2,3,4,5,6,7,8,9)可以设置参与计算的运算数。
(2) 单击计算器上的运算符按钮(+、-、*、/)可以选择运算的符号。
(3) 单击计算器上的函数按钮可以计算出相应的函数值。
(4) 单击计算器上的等号(=)按钮显示计算结果。
(5) 在一个文本框中显示当前的计算过程,在一个文本区中显示以往的计算过程。
(6) 单击“保存”按钮可以将文本区中显示的全部计算过程保存到文件:单击“复制”按钮可以将文本区中选中的文本复制到剪贴板;单击“清除”按钮可以清除文本区中的全部内容。
二. 改进要求
(1) 在保存计算过程到文件的同时也把当前时间保存到该文件中。
(2) 可以让用户选择计算器的精度,例如小数点最多保留两位等。
(3) 增加一个计算阶乘的功能,该功能用BigInteger类实现。
(4) 增加音效,用户单击按钮时程序能播放简短的声音,让用户通过声音知道自己单击了怎么样的按钮。
(5) 自定义新功能。
程序运行后的的图片:
在这里插入图片描述

//Computer类
//封装计算器的计算模型
import java.util.*;
public class Computer {
   public int jd = 2;
   public double result;    //计算所得结果
   public Stack<Character>  dataItem;  //参与运算的数据项
   public Stack<Double>  tempResult;   //用堆栈存放临时结果
   public Stack<Character>  operator;  //存放运算符号
   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);           //把临时结果m压入tempResult
       } 
       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;
          }
          
          if(jd==0){
        	   rTemp=Math.round(rTemp);
            }else if(jd==1){
            	rTemp=Double.parseDouble(String.format("%.1f",rTemp));
            }else if(jd==2){
            	rTemp=Double.parseDouble(String.format("%.2f",rTemp));
            }
          
          tempResult.push(rTemp);  //把新临时结果rTemp压入tempResult
          operator.push(p);        //新运算符压入operator
       }
   }
   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);     //对compter中的数据项进行数学计算
   }
   public double getResult() {    //得到计算结果
      double endItem = 0;
      if(dataItem.empty()){
         endItem = tempResult.peek();
      }
      else {
         endItem = computerDataItem();
      }
      if(operator.empty()) {
         result = endItem;
         return result;
      }
      char yuansuan =operator.peek(); //最后的运算符
      if(yuansuan == '+'){
          result = tempResult.peek()+endItem;
      }
      else if(yuansuan == '-') {
          result = tempResult.peek()-endItem;
      }
      else if(yuansuan == '*') {
          result = tempResult.peek()*endItem;
      }
      else if(yuansuan == '/') {
          result = tempResult.peek()/endItem;
      }
      
      
      
      return result;
   }
   public double getTempResult() {    //得到临时结果
      double r = 0;
      if(tempResult.empty()){
         r = computerDataItem();
      }
      else {
         r= tempResult.peek();
      }
      return r;
   }
   public double computerDataItem(){  //计算出数据项的double型结果
      if(dataItem.empty()){
         return tempResult.peek();
      }
      StringBuffer str = new StringBuffer();
      double doubleData = 0;
      for(int i=0;i<dataItem.size();i++) {
          str.append(dataItem.get(i));//获取堆栈中的数字(但不弹栈)
      }
      try{
         doubleData = Double.parseDouble(str.toString());
      }
      catch(NumberFormatException exp){
          doubleData = 0;
      }
      return doubleData;
  }
}

代码完整链接:
链接:https://pan.baidu.com/s/12oMtly1pq3EPobH5SqSnsg
提取码:0ory
网盘的这个代码是全的,创建一个项目自己起一个名,在src下把网盘中下载的ch2文件夹复制进去,目录结构见下图,在data文件夹下找到dl的java文件点击运行,先登录后跳转到计算器页面。登录后你可以拖动计算器调整到你觉得美观的大小,也可以自己设置。
在这里插入图片描述

  • 9
    点赞
  • 82
    收藏
    觉得还不错? 一键收藏
  • 16
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值