java实训报告

《Java实训》设计报告

计算器

计算器

一、项目需求

编写一个实现计算器应用程序

(1)单击“计算器”上的数字按钮(0~9)可以设置参与计算的运算数。

(2)单击“计算器”上的运算符按钮(+、-、*、/)可以选择运算符号

(3)单击“计算器”上的“=”按钮显示计算结果。

(4)单击“计算器”上的“sqrt” 按钮对一个数进行开根号。

(5)单击“计算器”上的“1/x” 按钮对一个数进行求倒。

(6)加减乘除运算也可以是正负数、小数。

(7)单击“计算器”上的“Backspace” 按钮如果输错了数还能退格。

(8)单击“计算器”上的“CE” 按钮清除当前显示的数,不影响已经输入的数。

(9)单击“计算器”上的“ C” 按钮清除当前的计算,开始新的计算。

(10)单击“计算器”上的“MC”按钮是清除储存数据。

(11)单击“计算器”上的“MR”按钮是读取储存的数据。

(12)单击“计算器”上的“MS”按钮是将计算器所显示的数存入存储器中,存储器中原有的数据被冲走。

(13)单击“计算器”上的“M+”是将显示的数据加到存储器中,与已存入的数据相加。

二、总体设计

在设计计算器时,可以编写1个Java源文件:calculator.java。计算器除了上述1个Java源文件所给出的类外,还需要Java系统提供的一些重要类。

下面是Java源文件的总体设计。

calculator类负责创建计算器的主窗口,计算器从该类开始执行。calculator类有以下几种类型的对象,分别是:Panel、TextField、Button对象。

三、详细设计

1、calculator类

(1)效果图

图2  calculator创建的窗口效果图

(2)数据和方法

Calculator类是java.awt.event包中WindowAdapter的一个子类,并实现了ActionListener接口。

1)成员变量

Button是创建的“数字按钮”对象,改对象创建了个个数字按钮。Button中的“数字按钮”含有的数字依次为0~9。每个“数字按钮”都注册有ActionEvent事件监听器。

TextField是创建的数字输入的文本框,用来输入和计算数显示结果用的。

Panel 是最简单的容器类。应用程序可以将其他组件放在面板提供的空间内,这些组件包括其他面板面板的默认布局管理器是 FlowLayout 布局管理器。

2)方法

public static void main(String args[])方法是计算器程序运行的入口方法。

public Calculator()  是构造方法,负责完成窗口的初始化。

public void windowClosing(WindowEvent e):当继承WindowAdapter类时,通过该方法实现窗体上的关闭按钮。

public void display():实现图形窗口的显示。

public void actionPerformed(ActionEvent e):当ActionListener接口被实现时,必须要实现的事件方法。

(3)代码

import java.awt.*;

import java.awt.event.*;

public class Calculation extends WindowAdapter implements ActionListener

{

 double dResult=0;

 double dNowInput=0;

 double dMemory;

 int  n=0; //记载小数位数

 int  nOperation=1; // 记录运算符类型

 int  nBitsNum=0;  //记录总共输入的位数

 boolean alreadyHaveDot=false; //已经有小数点?

 boolean keyAvailable=true;

 boolean alreadyClickedEqueal=false; //是否按下过"="?

 boolean isTempNowInput=false; //是否在计算出结果后直接按运算符将结果赋给了当前输入值?

 Frame f;

 Panel p1,p2,p3,p4,p5,p6;

 TextField tf1,tf2;

 Button b1,b2,b3,b4,b5,b6,b7,b8,b9,b0;

 Button bDiv,bSqrt,bMulti,bMinus,bPercent,bPlus,bReciprocal,bEqual,bDot,bNegative;

 Button bBackspace,bCE,bC,bMR,bMS,bMC,bM;

 

 public void display()

 {

  f=new Frame("计算器");

  f.setSize(280,213);

  f.setLocation(200,200);

  f.setBackground(Color.LIGHT_GRAY);

  f.setResizable(false);

 

  f.setLayout(new BorderLayout(3,3));

 

  p1=new Panel(new GridLayout(1,3,5,5));  //用于存放backspace,ce,c三键

  p2=new Panel(new GridLayout(4,5,5,5)); //用于存放数字区及附近共20键, 此处间隙设置可能不合理,以后调整

  p3=new Panel(new GridLayout(5,1,5,5)); //用于存放MC,MR,MS,M+键及显示M状态文本框,此处间隙设置可能不合理,以后调整

  p4=new Panel(new FlowLayout()); //用于存放p1,p2

  p5=new Panel(new FlowLayout());

  p6=new Panel(new FlowLayout());

  p4.add(p1);

  p4.add(p2);

 

  tf1=new TextField(35);      //存放显示区

  tf1.setText("0.");

  tf1.setEditable(false);

  p5.add(tf1);

  f.add(p5,BorderLayout.NORTH);

  f.add(p4,BorderLayout.CENTER);

  f.add(p3,BorderLayout.WEST);

 

  b1=new Button("1");

  b2=new Button("2");

  b3=new Button("3");

  b4=new Button("4");

  b5=new Button("5");

  b6=new Button("6");

  b7=new Button("7");

  b8=new Button("8");

  b9=new Button("9");

  b0=new Button("0");

 

  b1.addActionListener(this);

  b2.addActionListener(this);

  b3.addActionListener(this);

  b4.addActionListener(this);

  b5.addActionListener(this);

  b6.addActionListener(this);

  b7.addActionListener(this);

  b8.addActionListener(this);

  b9.addActionListener(this);

  b0.addActionListener(this);

 

  bDiv=new Button("/");

  bSqrt=new Button("sqrt");

  bMulti=new Button("*");

  bMinus=new Button("-");

  bPercent=new Button("%");

  bPlus=new Button("+");

  bReciprocal=new Button("1/x");

  bEqual=new Button("=");

  bDot=new Button(".");

  bNegative=new Button("+/-");

 

  bDiv.addActionListener(this);

  bSqrt.addActionListener(this);

  bMulti.addActionListener(this);

  bMinus.addActionListener(this);

  bPercent.addActionListener(this);

  bPlus.addActionListener(this);

  bReciprocal.addActionListener(this);

  bEqual.addActionListener(this);

  bDot.addActionListener(this);

  bNegative.addActionListener(this);

 

  p2.add(b7);

  p2.add(b8);

  p2.add(b9);

  p2.add(bDiv);

  p2.add(bSqrt);

  p2.add(b4);

  p2.add(b5);

  p2.add(b6);

  p2.add(bMulti);

  p2.add(bPercent);

  p2.add(b1);

  p2.add(b2);

  p2.add(b3);

  p2.add(bMinus);

  p2.add(bReciprocal);

  p2.add(b0);

  p2.add(bNegative);

  p2.add(bDot);

  p2.add(bPlus);

  p2.add(bEqual);

 

  bBackspace=new Button("Backspace");

  bCE=new Button("CE");

  bC=new Button("C");

 

  bBackspace.addActionListener(this);

  bCE.addActionListener(this);

  bC.addActionListener(this);

 

  p1.add(bBackspace);

  p1.add(bCE);

  p1.add(bC);

 

  tf2=new TextField(2);

  tf2.setEnabled(false);

  tf2.setBackground(Color.LIGHT_GRAY);

  bMC=new Button("MC");

  bMR=new Button("MR");

  bMS=new Button("MS");

  bM=new Button("M+");

 

  bMC.addActionListener(this);

  bMR.addActionListener(this);

  bMS.addActionListener(this);

  bM.addActionListener(this);

 

  p6.add(tf2);

  p3.add(p6);

  p3.add(bMC);

  p3.add(bMR);

  p3.add(bMS);

  p3.add(bM);

 

  f.setVisible(true);

  f.addWindowListener(this);

 

 }

 public void actionPerformed(ActionEvent e)

 {

  //key 0 to 9

  if(this.keyAvailable && e.getActionCommand().length()==1 && e.getActionCommand().compareTo("0")>=0 && e.getActionCommand().compareTo("9")<=0)

  {

   if(this.isTempNowInput)

   {

    this.dNowInput=0;

    this.isTempNowInput=false;

   }

   this.nBitsNum++;

   if(this.alreadyHaveDot==false)

    this.dNowInput=this.dNowInput*10+Double.parseDouble(e.getActionCommand());

   else

   {

    double temp=Double.parseDouble(e.getActionCommand());

    for(int i=this.n;i<0;i++)

    {    

     temp*=0.1;

    }

    this.dNowInput+=temp;

    this.n--;

   }

   this.tf1.setText(Double.toString(this.dNowInput));

  }

  // key dot

  if(this.keyAvailable && e.getActionCommand()==".")

  {

   if(this.alreadyHaveDot==false)

   {

    this.nBitsNum++;

    this.alreadyHaveDot=true;

    this.n=-1;

   }

  }

  //key "+","-","*","/"

  if(this.keyAvailable && e.getActionCommand()=="+" || e.getActionCommand()=="-" || e.getActionCommand()=="*" || e.getActionCommand()=="/")

  {

   if(this.alreadyClickedEqueal)

   {

    this.dNowInput=this.dResult;

    this.isTempNowInput=true;

   }

   else

   {

    switch(this.nOperation)

    {

     case 1: this.dResult+=this.dNowInput; break;

     case 2: this.dResult-=this.dNowInput; break;

     case 3: this.dResult*=this.dNowInput; break;

     case 4:

     {

      if(this.dNowInput==0)

      {

       tf1.setText("除数不能为零");

       this.keyAvailable=false;

      }

      else this.dResult=this.dResult/this.dNowInput;

     }

    }

    if(this.keyAvailable)tf1.setText(Double.toString(this.dResult));

    this.dNowInput=0;

   }  

   if(e.getActionCommand()=="+")

   {

    this.nOperation=1;

   }

   if(e.getActionCommand()=="-")

   {

    this.nOperation=2;

   }

   if(e.getActionCommand()=="*")

   {

    this.nOperation=3;

   }

   if(e.getActionCommand()=="/")

   {

    this.nOperation=4;

   }

   this.nBitsNum=0;

   this.alreadyClickedEqueal=false;

  }

  // key "+/-"

  if(this.keyAvailable && e.getActionCommand()=="+/-")

  {

   this.dNowInput=0-this.dNowInput;

   tf1.setText(Double.toString(this.dNowInput));  

  }

  // key "C"

  if(e.getActionCommand()=="C")

  {

   this.nBitsNum=0;

   this.dResult=0;

   this.dNowInput=0;

   this.alreadyHaveDot=false;

   this.n=0;

   this.nOperation=1;

   this.keyAvailable=true;

   this.alreadyClickedEqueal=false;

   tf1.setText("0.");

  }

  // key "CE"

  if(e.getActionCommand()=="CE")

  {

   this.nBitsNum=0;

   this.dNowInput=0;

   this.alreadyHaveDot=false;

   this.n=0;

   this.nOperation=1;

   this.keyAvailable=true;

   tf1.setText("0.");

  }

 

  // key "sqrt"

  if(this.keyAvailable && e.getActionCommand()=="sqrt")

  {

   if(this.alreadyClickedEqueal)

   {

    if(this.dResult>=0)

    {

     this.dResult=Math.sqrt(this.dResult);

     tf1.setText(Double.toString(this.dResult));

    }

    else

    {

     tf1.setText("函数输入无效");

     this.keyAvailable=false;

    }

   }

   else

   {

    if(this.dNowInput>=0)

    {

     this.dNowInput=Math.sqrt(this.dNowInput);

     tf1.setText(Double.toString(this.dNowInput));

    }

    else

    {

     tf1.setText("函数输入无效");

     this.keyAvailable=false;

    }

   }

  }

  // key "1/x"

  if(this.keyAvailable && e.getActionCommand()=="1/x")

  {

   if(this.dNowInput==0)

   {

    tf1.setText("除数不能为零");

    this.keyAvailable=false;

   }

   else

   {

    this.dNowInput=1/this.dNowInput;

    tf1.setText(Double.toString(this.dNowInput));

   }

  }

  // key "="

  if(this.keyAvailable && e.getActionCommand()=="=")

  {

   this.alreadyClickedEqueal=true;

   switch(this.nOperation)

   {

    case 1: this.dResult+=this.dNowInput; break;

    case 2: this.dResult-=this.dNowInput; break;

    case 3: this.dResult*=this.dNowInput; break;

    case 4:

    {

     if(this.dNowInput==0)

     {

      tf1.setText("除数不能为零");

      this.keyAvailable=false;

     }

     else this.dResult=this.dResult/this.dNowInput;

    }

   }

   if(this.keyAvailable)tf1.setText(Double.toString(this.dResult)); 

  }

  // key "MS"

  if(this.keyAvailable && e.getActionCommand()=="MS")

  {

   this.dMemory=this.dNowInput;

   if(this.dMemory!=0)

    tf2.setText("M");

  }

  // key "MC"

  if(this.keyAvailable && e.getActionCommand()=="MC")

  {

   this.dMemory=0;

   tf2.setText("");

  }

  // key "MR"

  if(this.keyAvailable && e.getActionCommand()=="MR")

  {

   this.dNowInput=this.dMemory;

   tf1.setText(Double.toString(this.dNowInput));

  }

  // key "M+"

  if(this.keyAvailable && e.getActionCommand()=="M+")

  {

   this.dMemory+=this.dNowInput;

   if(this.dMemory!=0)

    tf2.setText("M");

   else tf2.setText("");

  }

  // key "%"

  if(this.keyAvailable && e.getActionCommand()=="%")

  {

   this.dNowInput=(this.dResult*this.dNowInput)/100;

   tf1.setText(Double.toString(this.dNowInput));

  }

  // key "Backspace"

  if(this.keyAvailable && e.getActionCommand()=="Backspace")

  {

   if(!this.alreadyClickedEqueal){

    if(this.dNowInput!=0)

    {

     if(this.alreadyHaveDot)

     {

      if(this.n==-1)

      {

       this.alreadyHaveDot=false;

       this.n=0;

      }

      else

      {

       String str,str1;

       str=tf1.getText();

       str1=str.substring(0,this.nBitsNum-1);

       this.nBitsNum--;

       this.n++;

       this.dNowInput=Double.parseDouble(str1);

       tf1.setText(Double.toString(this.dNowInput));     

      }

     }

     else

     {

      int temp;

      temp=(int)(this.dNowInput/10);

      this.dNowInput=(double)temp;

      tf1.setText(Double.toString(this.dNowInput));

     }

    }

   }

   }

 }

 public static void main(String args[])

 {

  Calculation cal=new Calculation();

  cal.display();

 }

 public void windowClosing(WindowEvent e)

 {

  System.exit(0);

 }

}

四、项目总结

计算器功能具体设计如下:

1 加(+)法:对两个数进行求和计算也就是求a与b的和 如3+3=6。

 2 减(-)法:对两个数进行求余计算也就是求a与 b的余数 如 6-3=3。

3 乘(*)法:对两个数进行相乘计算也就是求a与b 的乘积 如3x3=9。

 4 除(/)法:对两个数进行除法计算也就是求 a与 b的除值 如 4/2=2。

5 开根号(sqrt):对一个数进行开根号也就是求a开根号的值 如 16 sqrt=4。

6 求倒数(1/x):对一个数进行求倒也就是求a的倒数 如 1/5=0.5。

 7 加减乘除运算也可以是正负数、小数。

8 如果输错了数还能退格。

9   CE :清除当前显示的数,不影响已经输入的数。

10   C :清除当前的计算,开始新的计算。

11  MC:清除储存数据。

12  MR:读取储存的数据。

13  MS:将计算器所显示的数存入存储器中,存储器中原有的数据被冲走。

14  M+:将显示的数据加到存储器中,与已存入的数据相加

程序还没有完善后续还将完成以下功能:

① 不能实现进制数之间的相互转换,比如:二进制转换为十进制等等。

② 计算器中的%功能还未实现。

③ cos余弦, sin正弦, tan正切, log常用对数, n!阶乘, ln自然对数

五、心得体会

经过一个星期的我的计算器的课程设计,我在老师的指导下,顺利完成该课程设计。通过该课程设计,了解常用类的属性和方法,我发现在用常用类的时候,经常会把类里面的方法和自定义的方法搞混。通过实训我更加认识到了Java强大的功能,丰富了我的知识,提高运用java语言解决实际问题的能,让我收获颇多。

首先,让我加深了对Java语言的理论知识的理解;

其次,让我更加熟练的掌握了Java语言的设计能力并且有了实践经验;

再次,在设计过程中,学到了老师没有在课堂上没有教授的知识;

最后,加强了我对Java语言的学习兴趣和好感。

相关推荐