JAVA保存计算过程的计算器课程设计报告

                 保存计算过程的java计算器      

                        目    录

1 概    述......................................................... 1

1.1 课程设计目的................................................ 1

1.2 课程设计内容................................................ 1

2 系统需求分析...................................................... 1

2.1 系统目标.................................................... 1

2.2 主体功能.................................................... 1

2.3 开发环境.................................................... 1

3 系统概要设计...................................................... 1

3.1 系统的功能模块划分.......................................... 1

3.2 系统流程图.................................................. 2

4系统详细设计...................................................... 2

5 测试............................................................. 6

5.1 测试方案.................................................... 6

5.2 测试结果.................................................... 6

6 小结............................................................. 6

参考文献........................................................... 8

附    录........................................................... 9

附录1 源程序清单.................................................. 9


1 概    述        

1.1 课程设计目的

 1.掌握JAVA语言编程的基础知识并能熟练运用。

 2.熟悉类声明与对象的使用。

 3.理解委托时间处理模型。

 4.了解JAVA语言的图形用户界面JAVAS WING的设计知识。

 5.运用JAVA SWING编写简单计算器程序,并实现其功能 。

1.2 课程设计内容

 
设计GUI界面的计算机程序,用户可以通过鼠标依次输入参加计算的数值,进行加,减,乘,除,等混合运算。

2 系统需求分析

2.1 系统目标

一个简单的计算器程序。用户可以利用鼠标点击数值或操作符按键完成计算的输入,计算的结果将被显示在窗口上部的文本框中。

2.2 主体功能

1.按下数字键在文本框上会显示数字,这是计算器最基本的功能

2.在任何时候按下“+-”键,计算器文本框上的数字置反

3.上面一个文本框显示计算过程,下面一个文本框显示输入的数字

4.当按下的运算符号时前面已经按下过运算符号时,下面一个文本框显示上一个运算符号以及两个数之间的运算结果。

5.  按下清除“C”键,数据被全部清除。

2.3 开发环境

 JDK

3 系统概要设计

3.1 系统的功能模块划分

1主界面模块

2.事件相应模块

3.2 系统流程图


4系统详细设计

1.主界面模块详细设计

   顶层容器:ComputerPad类实现主窗口,顶层容器中包含了1个panel容器,1个resultshow文本框,1个process文本框。

   各组件作用:其中panel容器用于放数字按钮,小数点,运算符按钮,清零按钮,正负转换按钮以及退格按钮。两个文本框一个用于显示输入数据和计算结果,另一个用于显示计算过程。

   布局方式:顶层容器用BroadLayOut布局,process和resultshow文本框以及panel容器分别放在定岑容器的noth,center以及south面,panel容器 用GridLayOut布局

部分代码如下

数字按钮类:实现数字按钮的定义

public class NumberButton extends Button{}

运算符按钮类:实现运算符号的定义

public class OperationButton extends Button{}

主窗口类实现监视器的注册,窗口布局,组件颜色大小等的设置

public class ComputerPad extends Frame implements ActionListener

   NumberButton numberButton[];                 

   OperationButton oprationButton[];            

   Button 小数点按钮,正负号按钮,退格按钮,

          求倒数按钮,等号按钮,清零按钮;

   Panel panel;                                

   JTextField resultShow;

   JTextField process;                    

   String 运算符号[]={"+","-","*","/"};

   LinkedList 链表;                             

   boolean  是否按下等号=false;                 

   public ComputerPad()

   {

     super("计算器");

     链表=new LinkedList();

//进行组件的声明,初始化设置,注册监视器

     numberButton=new NumberButton[10];         

     for(int i=0;i<=9;i++)

        {

          numberButton[i]=new NumberButton(i);

          numberButton[i].addActionListener(this);

        }

     oprationButton=new OperationButton[4];   

     for(int i=0;i<4;i++)

        {

          oprationButton[i]=new OperationButton(运算符号[i]);

          oprationButton[i].addActionListener(this);

        }

     小数点按钮=new Button(".");

     正负号按钮  =new Button("+/-");

     等号按钮=new Button("=");

     求倒数按钮=new Button("1/x");

     退格按钮=new Button("退格");

     清零按钮=new Button("C");

     清零按钮.setForeground(Color.red);

     退格按钮.setForeground(Color.red);

     等号按钮.setForeground(Color.red);

     求倒数按钮.setForeground(Color.blue);

     正负号按钮.setForeground(Color.blue);

     小数点按钮.setForeground(Color.blue);

     退格按钮.addActionListener(this);

     清零按钮.addActionListener(this);

     等号按钮.addActionListener(this);

     小数点按钮.addActionListener(this);

     正负号按钮.addActionListener(this);

     求倒数按钮.addActionListener(this);

     //对显示过程的文本框进行设置

     process=new JTextField(10);

     process.setHorizontalAlignment(JTextField.LEFT);

     process.setForeground(Color.blue);

     process.setFont(new Font("TimesRoman",Font.PLAIN,14));

     process.setBorder(new SoftBevelBorder(BevelBorder.LOWERED));

     process.setBackground(Color.white);

     process.setEditable(false);

     //对显示输入值以及运算结果的文本框进行设置

     resultShow=new JTextField(10);

     resultShow.setHorizontalAlignment(JTextField.RIGHT);

     resultShow.setForeground(Color.blue);

     resultShow.setFont(new Font("TimesRoman",Font.PLAIN,14));

     resultShow.setBorder(new SoftBevelBorder(BevelBorder.LOWERED));

     resultShow.setBackground(Color.white);

     resultShow.setEditable(false);

     //进行主窗口布局

     panel=new Panel();                                            

     panel.setLayout(new GridLayout(5,4));

     Panel.add(清零按钮);

     Panel.add(退格按钮);

     panel.add(numberButton[1]);

     panel.add(numberButton[2]);

     panel.add(numberButton[3]);

     Panel.add(numberButton[4]);

     panel.add(numberButton[5]);

     panel.add(numberButton[6]);

     Panel.add(numberButton[7]);

     panel.add(numberButton[8]);

     panel.add(numberButton[9]);

     Panel.add(numberButton[0]);

     Panel.add(oprationButton[0]);

     panel.add(oprationButton[1]);

     panel.add(oprationButton[2]);

     panel.add(oprationButton[3]);

     panel.add(求倒数按钮);

     panel.add(正负号按钮);

     panel.add(小数点按钮);

     Panel.add(等号按钮);

     add(panel,BorderLayout.SOUTH);

     add(resultShow,BorderLayout.CENTER);

     add(process,BorderLayout.NORTH);

     addWindowListener(new WindowAdapter()

                    { public void windowClosing(WindowEvent e)

                       {

                         System.exit(0);

                       }

                    });

    setVisible(true);

    setBounds(100,50,170,190);

    setResizable(false);

    validate();

   }

2.事件响应模块详细设计

   模块功能:事件响应模块用于实现数据输入,保存,运算以及显示。

   具体实现:将主窗口作为窗口中所有组件的监视器 ,链表用来存储输入的数字以及操作符以便运算时提取出来,监视器用if,else if语句  分数字按钮,小数点,运算符按钮,清零按钮,正负转换按钮以及退格按钮6种情况进行相应处理,其中除了清零按钮每种情况又分成链表长度为1,2,3作相应的处理。

   事件响应模块的框架代码如下

  public void actionPerformed(ActionEvent e){

   按下数字按钮时的事件处理

   if(e.getSource() instanceof NumberButton)  

     {

       NumberButton b=(NumberButton)e.getSource();

       if(链表.size()==0) {}

       else if(链表.size()==1&&是否按下等号==false){}

       else if(链表.size()==1&&是否按下等号==true) {}

       else if(链表.size()==2)  {}                

       else if(链表.size()==3)  {}

     }              

      //按下运算符号时的事件处理

  else if(e.getSource() instanceof OperationButton)

     {

       OperationButton b=(OperationButton)e.getSource();

       if(链表.size()==1) {}

       else if(链表.size()==2) {}

       else if(链表.size()==3)  {}

     }

 //按下等号后的事件处理

else if(e.getSource()==等号按钮)

     {

        是否按下等号=true;

        if(链表.size()==1||链表.size()==2) {}                       

        else if(链表.size()==3) {}

      }

//按下小数点后的事件处理

 else if(e.getSource()==小数点按钮)

     {

        if(链表.size()==0)  {}

        else if(链表.size()==1)  {}                              

        else if(链表.size()==3) {}

      }

//按下退格键后的事件处理

else if(e.getSource()==退格按钮)

     {

       if(链表.size()==1)  {}                               

       else if(链表.size()==3) {}

     }

//按下正负号后的事件处理

else if(e.getSource()==正负号按钮)

     {if(链表.size()==1) {}

       else if(链表.size()==3) {}

     }

//按下求倒数按钮后的事件处理

   else if(e.getSource()==求倒数按钮)

     {

       if(链表.size()==1||链表.size()==2) {}

       else if(链表.size()==3) {}

     }

//按下清零按钮后的事件处理

 else if(e.getSource()==清零按钮) {}

  }

}

5 测试

5.1 测试方案

  进行各种情况的输入检测进行加,减,乘,除运算,数字很大,小数,整数以及先按下“=”等非法输入情况。

5.2 测试结果

程序正常的响应按钮事件,能显示计算过程,当运算结果很大时用科学记数法显示运算结果

6 小结

在做本项目是时候,会遇到很多问题,最大的问题的如何保存已经输入的数字或者符号进行运算,如何显示运算过程,经过多次研究和查询发现运可以运用链表进行存储和提取数据,用栈也是可以的。

此次课程设计让我更了解熟悉了Java中的图形用户界面和它的编程方式。在完成课题的过程中也不断充实了自己,学习到了很多以前没有学习到的知识,收获很大。最大的收获是在弯完成过程中培养的解决问题的能力,在做项目时必然会遇到困难,会有不会的东西,重要的不是现在会不会,而是遇到问题知道如何找到解决的途径。还使我对所学知识能够融会贯通,又不断丰富了新知识。Java计算器设计使得我们对所学的专业课有了更为深刻的认识,使得知识得到了巩固和提高。

参考文献

[1]耿祥义,张跃平.  Java2实用教程(第三版)[M] . 北京:清华大学出版社, 20## [2]耿祥义.  Java课程设计(第三版)[M] . 北京:清华大学出版社, 2004

[3]张跃平.Java2实用教程实验指导与习题解答(第三版)[M]. 北京:清华大学出版社, 2004

 

 

 

 

 

 

 

 

 

 


附    录

附录1 源程序清单

NumberButton.java

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

public class NumberButton extends Button

{

  int number;

  public NumberButton(int number)

   {

    super(""+number);

    this.number=number;

    setForeground(Color.blue);

   }

  public int getNumber()

   {

     return number;

   }

}

OperateButton.java

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

public class OperationButton extends Button

{

  String 运算符号;

  public OperationButton(String s)

   {

    super(s);

    运算符号=s;

    setForeground(Color.red);

   }

  public String get运算符号()

   {

     return 运算符号;

   }

}

ComputerPad.java

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

import javax.swing.border.*;

import java.util.LinkedList;

import java.text.NumberFormat;

public class ComputerPad extends Frame implements ActionListener

{

   NumberButton numberButton[];                  

   OperationButton oprationButton[];            

   Button 小数点按钮,正负号按钮,退格按钮,

          求倒数按钮,等号按钮,清零按钮;

   Panel panel;                                

   JTextField resultShow;

   JTextField process;                    

   String 运算符号[]={"+","-","*","/"};

   LinkedList 链表;                             

   boolean  是否按下等号=false;                 

 

 public ComputerPad()

   {

     super("计算器");

     链表=new LinkedList();

     numberButton=new NumberButton[10];         

     for(int i=0;i<=9;i++)

        {

          numberButton[i]=new NumberButton(i);

          numberButton[i].addActionListener(this);

        }

     oprationButton=new OperationButton[4];   

     for(int i=0;i<4;i++)

        {

          oprationButton[i]=new OperationButton(运算符号[i]);

          oprationButton[i].addActionListener(this);

        }

     小数点按钮=new Button(".");

     正负号按钮  =new Button("+/-");

     等号按钮=new Button("=");

     求倒数按钮=new Button("1/x");

     退格按钮=new Button("退格");

     清零按钮=new Button("C");

     清零按钮.setForeground(Color.red);

     退格按钮.setForeground(Color.red);

     等号按钮.setForeground(Color.red);

     求倒数按钮.setForeground(Color.blue);

     正负号按钮.setForeground(Color.blue);

     小数点按钮.setForeground(Color.blue);

     退格按钮.addActionListener(this);

     清零按钮.addActionListener(this);

     等号按钮.addActionListener(this);

     小数点按钮.addActionListener(this);

     正负号按钮.addActionListener(this);

     求倒数按钮.addActionListener(this);

     process=new JTextField(10);

     process.setHorizontalAlignment(JTextField.LEFT);

     process.setForeground(Color.blue);

     process.setFont(new Font("TimesRoman",Font.PLAIN,14));

     process.setBorder(new SoftBevelBorder(BevelBorder.LOWERED));

     process.setBackground(Color.white);

     process.setEditable(false);

    

     resultShow=new JTextField(10);

     resultShow.setHorizontalAlignment(JTextField.RIGHT);

     resultShow.setForeground(Color.blue);

     resultShow.setFont(new Font("TimesRoman",Font.PLAIN,14));

     resultShow.setBorder(new SoftBevelBorder(BevelBorder.LOWERED));

     resultShow.setBackground(Color.white);

     resultShow.setEditable(false);

     panel=new Panel();                                            

     panel.setLayout(new GridLayout(5,4));

     Panel.add(清零按钮);

     Panel.add(退格按钮);

     panel.add(numberButton[1]);

     panel.add(numberButton[2]);

     panel.add(numberButton[3]);

     Panel.add(numberButton[4]);

     panel.add(numberButton[5]);

     panel.add(numberButton[6]);

     Panel.add(numberButton[7]);

     panel.add(numberButton[8]);

     panel.add(numberButton[9]);

     Panel.add(numberButton[0]);

     Panel.add(oprationButton[0]);

     panel.add(oprationButton[1]);

     panel.add(oprationButton[2]);

     panel.add(oprationButton[3]);

     panel.add(求倒数按钮);

     panel.add(正负号按钮);

     panel.add(小数点按钮);

     Panel.add(等号按钮);

     add(panel,BorderLayout.SOUTH);

     add(resultShow,BorderLayout.CENTER);

     add(process,BorderLayout.NORTH);

     addWindowListener(new WindowAdapter()

                    { public void windowClosing(WindowEvent e)

                       {

                         System.exit(0);

                       }

                    });

    setVisible(true);

    setBounds(100,50,170,190);

    setResizable(false);

    validate();

   }

 public void actionPerformed(ActionEvent e)

   {

  

    if(e.getSource() instanceof NumberButton)  

     {

       NumberButton b=(NumberButton)e.getSource();

        if(链表.size()==0)

         {

           int number=b.getNumber();         

           链表.add(""+number);              

           resultShow.setText(""+number);

           process.setText(""+number);

           是否按下等号=false;

         }

       

        else if(链表.size()==1&&是否按下等号==false)

         {

           int number=b.getNumber();

           String num=(String)链表.getFirst();

           String s=num.concat(""+number);    

           链表.set(0,s);

           resultShow.setText(s);

           process.setText(s);

          

         }

        else if(链表.size()==1&&是否按下等号==true)

         {

           int number=b.getNumber();

            链表.removeFirst();

           链表.add(""+number);                

           是否按下等号=false;

           resultShow.setText(""+number);

           process.setText(""+number);

         }

        else if(链表.size()==2)               

         {

           int number=b.getNumber();          

           链表.add(""+number);

           resultShow.setText(""+number);         

           process.setText(""+((String)链表.get(0))+((String)链表.get(1))+number);

          

          

         }

        else if(链表.size()==3)               

         {

           int number=b.getNumber();

           String num=(String)链表.getLast();

           String s=num.concat(""+number);

           process.setText(""+((String)链表.get(0))+((String)链表.get(1))+((String)链表.get(2))+number);    

           链表.set(2,s);

           resultShow.setText(s);

          

         }

     }

   else if(e.getSource() instanceof OperationButton)

     {

       OperationButton b=(OperationButton)e.getSource();

       if(链表.size()==1)

         {

           String fuhao=b.get运算符号();

           process.setText(""+((String)链表.get(0))+fuhao);

           链表.add(fuhao);

                    

         }

       else if(链表.size()==2)

         {

           String fuhao=b.get运算符号();

           链表.set(1,fuhao);

           process.setText(""+((String)链表.get(0))+((String)链表.get(1)));            

         }

       else if(链表.size()==3)

         {

           String fuhao=b.get运算符号();

           String number1=(String)链表.getFirst();

           String number2=(String)链表.getLast();

           String 运算符号=(String)链表.get(1);

           process.setText(""+((String)链表.get(0))+((String)链表.get(1))+((String)链表.get(2))+运算符号);

           try

            {

               double n1=Double.parseDouble(number1);

               double n2=Double.parseDouble(number2);

               double n=0;

               if(运算符号.equals("+"))

                 {

                   n=n1+n2;

                 }

               else if(运算符号.equals("-"))

                 {

                   n=n1-n2;

                 }

               else if(运算符号.equals("*"))

                 {

                   n=n1*n2;

                 }

               else if(运算符号.equals("/"))

                 {

                   n=n1/n2;

                 }

               链表.clear();

               链表.add(""+n);                  

               链表.add(fuhao);                 

               resultShow.setText(""+n);

            }

          catch(Exception ee)

            {

            }

         }

     }

   else if(e.getSource()==等号按钮)

     {

        是否按下等号=true;

        if(链表.size()==1||链表.size()==2)                      

         {

           String num=(String)链表.getFirst();

           resultShow.setText(""+num);

           process.setText(num+"=");

          

         }

        else if(链表.size()==3)

         {

           String number1=(String)链表.getFirst();

           String number2=(String)链表.getLast();

           String 运算符号=(String)链表.get(1);

           process.setText(""+((String)链表.get(0))+((String)链表.get(1))+((String)链表.get(2))+"=");

          

           try

            {

               double n1=Double.parseDouble(number1);

               double n2=Double.parseDouble(number2);

               double n=0;

               if(运算符号.equals("+"))

                 {

                   n=n1+n2;

                 }

               else if(运算符号.equals("-"))

                 {

                   n=n1-n2;

                 }

               else if(运算符号.equals("*"))

                 {

                   n=n1*n2;

                 }

               else if(运算符号.equals("/"))

                 {

                   n=n1/n2;

                 }

               resultShow.setText(""+n);

               链表.set(0,""+n);

               链表.removeLast(); 

               链表.removeLast(); 

           

            }

          catch(Exception ee)

            {

            }

         }

     }

   else if(e.getSource()==小数点按钮)

     {

        if(链表.size()==0)

         {

            是否按下等号=false;

         }

       else if(链表.size()==1)                              

        {

           String dot=小数点按钮.getLabel();            

           String num=(String)链表.getFirst();

           String s=null;

           if(num.indexOf(dot)==-1)                    

               {

                 s=num.concat(dot);

                 链表.set(0,s);                 

               }

           else

               {

                 s=num; 

               }

           链表.set(0,s);

           resultShow.setText(s);

           process.setText(s);

        }

      

       else if(链表.size()==3)

        {

           String dot=小数点按钮.getLabel();            

           String num=(String)链表.getLast();

           String s=null;

           if(num.indexOf(dot)==-1)

              {

                s=num.concat(dot);

                链表.set(2,s);

               

              }

           else

              {

                s=num;

              }

           resultShow.setText(s);

           process.setText(""+((String)链表.get(0))+((String)链表.get(1))+((String)链表.get(2)) );

        }

     }

     else if(e.getSource()==退格按钮)

     {

       if(链表.size()==1)                              

        {

           String num=(String)链表.getFirst();

           if(num.length()>=1)

            {

             num=num.substring(0,num.length()-1);

             链表.set(0,num);                 

             resultShow.setText(num);

             process.setText(""+((String)链表.get(0)) );

            }

          else

            {

              链表.removeLast();                 

              resultShow.setText("0");

            }

        }

      else if(链表.size()==3)

        {

           String num=(String)链表.getLast();

           if(num.length()>=1)

            { num=num.substring(0,num.length()-1);

              链表.set(2,num);                 

              resultShow.setText(num);

              process.setText(""+((String)链表.get(0))+((String)链表.get(1))+((String)链表.get(2)) );

            }

           else

            {

              链表.removeLast();                 

              resultShow.setText("0");

            }

        }  

     }

   else if(e.getSource()==正负号按钮)

     {

       if(链表.size()==1)

        {

          String number1=(String)链表.getFirst();

           try

              {

                double d=Double.parseDouble(number1);

                d=-1*d;

                String str=String.valueOf(d);

                链表.set(0,str);

                resultShow.setText(str);

                process.setText(str);

               

              }

           catch(Exception ee)

              {

              }

        }

      else if(链表.size()==3)

        {

          String number2=(String)链表.getLast();

           try

              {

                double d=Double.parseDouble(number2);

                d=-1*d;

                String str=String.valueOf(d);

                链表.set(2,str);

                resultShow.setText(str);

                process.setText(""+((String)链表.get(0))+((String)链表.get(1))+((String)链表.get(2)) );

              }

           catch(Exception ee)

              {

              }

        }

     }

   else if(e.getSource()==求倒数按钮)

     {

       if(链表.size()==1||链表.size()==2)

        {

          String number1=(String)链表.getFirst();

           try

              {

                double d=Double.parseDouble(number1);

                d=1.0/d;

                String str=String.valueOf(d);

                链表.set(0,str);

                resultShow.setText(str);

                process.setText(str);

               

              }

           catch(Exception ee)

              {

              }

        }

       else if(链表.size()==3)

        {

          String number2=(String)链表.getLast();

           try

              {

                double d=Double.parseDouble(number2);

                d=1.0/d;

                String str=String.valueOf(d);

              

                链表.set(2,str);

                resultShow.setText(str);

                process.setText(""+((String)链表.get(0))+((String)链表.get(1))+((String)链表.get(2)));

              }

           catch(Exception ee)

              {

              }

        }

     }

   else if(e.getSource()==清零按钮)

     {

        是否按下等号=false;

        resultShow.setText("0");

        process.setText("0");

        链表.clear();

     }

    }

 public  static void main(String args[])

   {

      new ComputerPad();

   } 

}

相关推荐