保存计算过程的计算器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
    评论
### 回答1: 这个计算器需要能够保存计算过程,可以考虑使用栈来实现。每当用户输入一个数字或者运算符时,就将其压入栈中。当用户点击等号时,从栈中依次弹出数字和运算符,进行计算,并将计算结果压入栈中。最终,栈中只剩下一个元素,即计算结果。用户可以通过查看栈中的元素来查看计算过程。 ### 回答2: Java是当前最流行的面向对象编程语言之一,可以应用于多种领域。其中,计算器计算机科学的基础应用,它可以实现多种计算操作,如加、减、乘、除等,并且也可以实现保存计算过程的功能。因此,设计一个保存计算过程计算器是一个很好的Java课程设计项目。 这个计算器应该有一个界面,可以用Swing、JavaFX等图形用户界面工具包实现。它应该有一些基本的控件,如用于显示计算结果的标签,数字按钮,运算符按钮等等。每当用户按下按钮时,计算器应该将按键内容添加到当前表达式中,并在标签中显示当前表达式的值。为了实现保存计算过程的功能,可以再增加一个文本框,用于显示历史计算过程。 为了实现保存计算过程的功能,我们需要将每个计算过程都存储在一个数据结构中,如栈或链表。每当用户按下“=”按钮,计算器会对当前表达式进行计算,并将结果存储在数据结构中。同时,它也将当前表达式和计算结果添加到历史计算过程中。当用户按下“历史记录”按钮时,可以从数据结构中检索历史记录,并将其显示在历史计算过程文本框中。 除了基本的加、减、乘、除等运算外,我们还可以增加一些高级运算功能,如开方、指数函数、三角函数等,这些功能可以通过使用Java标准库或各种常用的数学库来实现。 总体而言,设计一个保存计算过程计算器是一个很好的Java课程设计项目。它可以帮助学生加深他们对Java编程语言和面向对象编程的理解,以及提高他们的算法和数据结构技能。同时,它也是一个有用的工具,可以帮助人们进行各种计算操作,并且可以保存历史计算记录以便于查看。 ### 回答3: Java课程设计保存计算过程计算器,是一种可以保存计算过程计算器。相比传统的计算器,它能够将每次的计算过程记录下来,方便用户随时查看。 这款计算器的设计思路是,每当用户按下运算符号时,就将前一次的运算结果保存下来,同时记录下运算符号和当前的操作数。这样,当用户需要查看历史计算过程时,只需要简单地遍历这个保存历史的队列即可。 这个计算器的另一个特点是,支持多级撤销。用户可以撤销到历史记录中的任意一条记录。当用户撤销到某一条记录时,系统会将当前的结果设置为这条记录的结果,同时弹出其后的所有记录。这样,用户可以在不破坏原有计算过程的情况下,方便地修改当前计算过程。 此外,这个计算器还支持自定义函数和变量。用户可以通过输入函数名和表达式来定义自己的函数,然后在计算过程中调用。同样,用户还可以定义自己的变量,方便在计算过程保存自己的数据。这些自定义函数和变量也会被保存在历史记录中,方便用户回顾和修改。 综上所述,这款Java课程设计保存计算过程计算器,不仅具备传统计算器的基本功能,还能记录和保存用户的历史计算过程、支持多级撤销以及自定义函数和变量,提供了更方便、实用的计算工具。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值