计算器设计的java课程设计报告

 

课程设计(论文)任务书

 基础   学  院  信息与计算科学   专  业 20101 

一、课程设计(论文)题目 计算器的设计  

二、课程设计(论文)工作自2013 6 23日起至2013 627日止。

三、课程设计(论文) 地点:  计算机中心

四、课程设计(论文)内容要求:

1.本课程设计的目的

(1)使学生掌握系统各功能模块的基本工作原理;

(2)掌握Java的基本编程原理和基本的编程方法;

(3)使学生学会系统调试;

(4)培养学生分析、解决问题的能力;

(5)提高学生的软件文档写作能力和团队合作精神。   

2.课程设计的任务及要求

1)基本要求:

(1)分析系统各功能模块的工作原理;

(2)提出系统的设计方案;

(3)对所进行编程、调试、修改。

2)创新要求:

在基本要求达到后,可进行创新设计,如:用虚函数,文件流,重载流插入运算符等。

3)课程设计论文编写要求

(1)要按照书稿的规格打印誊写设计论文;

(2)论文包括目录、摘要、正文、总结等;

(3)毕业论文装订按学校的统一要求完成。

4)答辩与评分标准:

(1)达到课程设计的目的与要求,程序的可读性较好,并调试正确,60分;

(2)能正确回答老师所提问题,可增加10分;

(3)课程设计报告书写规范整齐,可增加10分;

(4)心得体会认真总结,可增加10分;

(5)程序有创新性,可增加10分;

成绩评定实行优秀、良好、中等、及格和不及格五个等级。不及格者需重做。

5)参考文献:

(1)丁振凡.《J ava语言程序设计》 清华大学出版社

(2)丁振凡.《J ava语言程序设计实验指导与习题解析》清华大学出版社

(3)http:/ /mvcpro.cloudfoundry.com

6)课程设计进度安排

内容                   天数        地点

总体需求与分析构思及收集资料       1        图书馆

各模块的编程实现,调试与修改       3         机房

撰写论文与答辩                     1         图书馆,机房

学生签名:              

2013 年6 月18 日

课程设计(论文)评审意见

(1)态度评价(20分):优( )、良( )、中( )、一般( )、差( );

(2)任务难度(20分):优( )、良( )、中( )、一般( )、差( );

(3)设计分析(20分):优( )、良( )、中( )、一般( )、差( );

(4)创新性评价(20分):优( )、良( )、中( )、一般( )、差( );

(5)回答问题(20分):优( )、良( )、中( )、一般( )、差( );

(6)论文格式规范性及考勤是否降等级:是( )、否(   )

                                                           

                                     评阅人签名:              职称: 教授

2013  年6 月25日


目 录

第1章 系统概要... - 1 -

1.1系统介绍... - 1 -

1.2 基本功能要求... - 1 -

第2章 设计思路与算法... - 2 -

2.1 应用的基本工作流程... - 2 -

2.2 类设计... - 3 -

2.3 应用界面的设计... - 3 -

2.4 事件处理原理、具体设计... - 3 -

2.5 算法考虑... - 4 -

第3章 源程序代码... - 5 -

第4章 运行结果及分析... - 15 -

第5章 心得体会... - 17 -

5.1系统需要完善的地方... - 17 -

5.2课程设计感想... - 17 -

参考文献... - 17 -


第1章 系统概要

1.1系统介绍     

编写一个简易计算器,实现Windows计算器的主要功能。

本次课程设计就是利用java语言来编写简单计算器的应用程序,模拟Windows计算器的功能,能进行加、减、乘、除四则算术运算和求倒数、求平方根等简单函数运算,且有小数点、清零和存储等功能。

1.2基本功能要求

通过计算器的设计,掌握Java编程的基本知识点。

(1)掌握基于AWT的图形用户界面的设计,如常用的的布局设计,容器中面板、按钮、文本框等组件的添加和布局。

(2)掌握图形界面的事件处理方法,注册动作事件监听者。

(3)掌握各类功能的实现思路,及程序表达。熟悉实例变量、类变量与局部变量的差异。

(4)掌握方法的封装与调用。尽量将重复用到的一段功能设计为方法。

(5)掌握if和switch等语句的使用。

(6)掌握如何给按钮设置颜色及给页面背景设计颜色。

(7)掌握java中“对象”和“类”的知识,类的设计及成员的控制访问


第2章 设计思路与算法

2.1 应用的基本工作流程

1.打开命令提示符和记事本;

2.输入源程序代码;

3.保存并运行源程序;

4.运行,检查是否有误;

5.修改错误并再次运行;

6.测试计算器的工作状况。

2.2 类设计

本次计算器的设计,主要用到的是GUI编程的相关方法。所以我们所用到的类和方法主要有:

主类:Calculation类

继承的父类为WindowAdapter类,实现了ActionListener接口,定义了一个窗体f和多个面板,按钮和文本框。

(1)方法名:display方法

作用:构建计算器的主界面

在方法display中,定义了窗体的标题,设置了窗体的大小并通过setVisible(true)方法使窗体可见,setBackground()方法设置背景颜色,setResizable(false)方法使窗体大小不可变。用setLayout()方法给容器指定按BorderLayout布局排列部件:  

  通过容器的add()方法将面板放置在North区域:f.add(p5,BorderLayout.NORTH),通过add方法用来向面板中加入部件。

添加GUI部件并给各个部件各自不同的标识,创建中间面板时,如面板p1,p1=new Panel(new GridLayout(1,3,5,5)),设置为GridLayout布局,再用add方法把按钮都加进去,按(1,3,5,5)方式排列

通过按钮对象的addActionListener方法为其注册事件监听处理者。

(2)方法名:actionPerformed方法

作用:设置各个GUI部件的事件处理

在 actionPerformed方法中,分别设置了不同按钮的操作事件,当不同按钮单击发生动作时自动调用执行相应的动作,从而实现计算器的多种运算功能。

通过e.getActionCommand()获得按钮事件对象的命令名,再在if语句中根据操作命令符按情况分别处理事件,进行相应运算。通过setText()方法将结果转化为数字串写入文本输入框中。

事件监听器中的事件处理方法void actionPerformed(ActionEvent e)完成主要的按钮事件的处理。事件处理分以下几种情况:数字按钮事件(“0”,“1”,“2”,“3”···“8”,“9”),小数点按钮事件(“.”),运算符按钮处理事件(“+”,“-”,“*”,“/”),正负号按钮事件(“+/-”),退格按钮事件(“Backspace”),清除按钮事件(“C”),等号按钮事件(“=”),存储按钮事件(“MS”,“MC”,“MR” ,“M+”)等。

(3)方法名:main方法

在该方法中,通过new运算符创建一个类Calculation的对象Cal,通过调用display()方法。

(4)方法名:windowClosing方法

在该方法中,在处理窗体的“关闭”事件的监听者采用继承WindowsAdapter的方式。

2.3 应用界面的设计

参考了windows计算器的布局,我们把总体界面采用BorderLayout布局,文本框所在的面板p5位于最上方(North区域),存储按钮及显示M状态文本框所在的面板p3在最左边(West区域),而Backspace,CE,C所在的面板p1和数字按钮、运算符按钮等所在面板p2放置在面板p4中,面板p4统一分布在中央(Center区域),同时面板中又按GridLayout布局分布多行多列。具体如下图所示。

2.4 事件处理原理、具体设计

首先,对计算器的整体布局构思清楚,将整个计算器分成多行多列组成的单元,使得整个计算器的布局更加合理、有序。采用网格块布局,整体分为6行,第一行为输入及显示框,第二行为退格键和清零键,下面几行分别为数字按钮与运算符按钮,以及MC,MR,MS,M+等存储按钮。

第二,设计依次添加GUI部件。

第三,为各个部件注册监听者,考虑到数字键,运算符,等于,小数点,求平方根等的不同以及程序的调理清晰,我们分别为其设置了不同的监听者。

第四,设置相应的各类算法。

第五,设置主程序和退出方法。

在编写完源程序代码后,进行运行,发现错误并更正。

最后,测试制作的计算器运行状况即计算能力。

动作事件的各方关系,结合代码大致如下图所示:

2.5 算法考虑

在 actionPerformed方法中,分别设置了不同按钮的操作事件,当不同按钮单击发生动作时自动调用执行相应的动作,从而实现计算器的多种运算功能。

数字按钮与其他按钮作为事件源都注册了监听者,且监听者符合ActionListener接口的要求。数据与运算符的键入通过点击按钮来触发事件,在按下“=”按钮时通过调用之前按下的相应运算符所表示的运算函数进行运算,将所的结果保存在dResult中,并显示在文本框内。求平方根、求倒数等运算时,调用了Math类的方法进行运算。当输入小数时,将小数点拼接到数字串中。按下清除按钮时,变量初始化。

第3章 源程序代码

//用JAVA编写简易计算器的程序(模拟Windows计算器)

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);

 }

}


第4章 运行结果及分析

如图1所示,以下就是我们设计出的计算器的运行界面截图,这一计算器采用的是BorderLayout布局,能够实现十进制下正负数的加法、减法、乘法、除法四则运算以及求平方根、百分号、求倒数、清零、退格等简单操作。Backspace表示退格,CE表示将当前文本框内数据清空,C表示文本框内数据清除。相应按钮上的名称代表了相应的数字或运算,最终通过“=”按钮将运算结果显示在第一行的文本框内,整体上说设计还成功。

图4-1   计算器界面

我们发现了程序能够准确地进行运算,并显示出正确结果,同时发现该计算器可进行一般的语法分析,例如如果除数为零,计算结果显示“除数不能为零”。

例如如果对超过八位的数据进行操作,计算结果用科学表示法表示。

例如如果对非负数进行求平方根,计算结果显示“函数输入无效”。

 

但是也发现了计算器对于类似5+6*3的运算不能判断运算顺序。

如图4-2所示,5+6*3计算器计算结果为33,而正确结果应为23。

   

图4-2   5+6*3的运算结果


第5章 心得体会

5.1系统需要完善的地方

1.在第四章提到的不能对类似5+6*3的运算判断运算顺序。

2.程序比较长,还可以进行简化。

3.对于运算方法等方面仍可以进行一些改进。

4.这界面还可设有菜单操作(包括:“编辑”,“查看”,“帮助”三个菜单项)

5.2 课程设计感想

本计算器模拟Windows计算器的界面和功能,由于时间仓促和能力有限等问题,只能实现以上功能。本次课程设计到此算是告一段落了,经过这次的学习,我学到了很多东西,在此基础上更加巩固了自己对java的认识与了解。

在做本项目是时候,会遇到很多小问题,比如说,在整个运算过程中要如何确保输入的计算数据哪个是第一个计算数据的,哪个是第二个计算数据的,同时也要区分运算符,因为该计算器程序应用的都是利用字符串来完成计算的,而且不能重复输出运算符,更不能将运算符错误的存储在了第一个计算数据的数值中,也得考虑到万一不小心重复点击了运算符按钮会不会造成第一个计算数据的重新赋值等等问题,最后想到利用布尔类型来很好的控制运算符的应用!

此次课程设计让我更了解熟悉了Java中的图形用户界面和它的编程方式。在完成课题的过程中也不断充实了自己,学习到了很多以前没有学习到的知识,收获很大。最大的收获就是对大学学习的总结和培养了解决困难的信心和能力,使我对所学知识能够融会贯通,又不断丰富了新知识。Java计算器设计使得我们对所学的专业课有了更为深刻的认识,使得知识得到了巩固和提高。

在以前,我们只是对书上已经给出的程序进行编译和运行,而这次我们算是真正自己编写了一个程序(虽然参考了书上的程序),觉得自己对于java的应用得到了很大的提高,也体会到了编写一个程序是一个十分艰辛的过程,需要不断的调试,改进,以及小组成员的努力思考。

在制作简易计算器的过程中,很容易打错源程序代码而导致编译通不过。这是一个细心程度的问题,做什么事都必须细心严谨,这样才不容易出错。在编译通过运行程序出现了一个计算器界面时心里非常高兴,迫不及待地使用制作出来的计算器。编一个程序真心不容易啊,程序员都是伟大的人啊,向他们看齐。这次的课设作业让我明白了无论多复杂的东西都是由好多基础的东西组合在一起的。

在接下来的时间里,我觉得我要更加努力的往深一层次的方面看齐,了解更多有关java的知识,对java有更深一步的了解,我会一步一步的走下去!

参考文献

(1)丁振凡.《J ava语言程序设计》 清华大学出版社

(2)丁振凡.《J ava语言程序设计实验指导与习题解析》清华大学出版社

(3)http://mvcpro.cloudfoundry.com

相关推荐