2024年5月7日发(作者:)

华南农业大学理学院

(面向对象的程序设计)

课程设计

实验题目: 设计一个简单的计算器应用程序

简易计算器应用程序的制作

问题陈述

设计一个计算器应用程序,用于进行简单的加减乘除四则运算。

需求分析

1设计思想

要设计一个计算器应用程序,则计算器必须要进行简单的四则运算功能,并

且可以通过人机互动来进行操作。计算器功能主要包括下面几个方面:

*计算简单的加减乘除四则运算;

*通过鼠标点击输入数字信息;

*显示计算结果;

*计算器具有返回功能:按AC键不会清除重现存储器的内容;返零功能;

2设计划分

用JAVA布局管理器来创建图形界面(包括TextField,Button),框架和面板

主要分成三大块:框架、显示面板、和数字面板;具体分布如下:

主框架

主面板

显示面板 数字面板 功能面板

相应对象 各组件 各组件

按钮 按钮

3界面布局

按一般计算器表面布局,主要以网格的行数和列数在创建布局管器的构造方

法中通过参数进行设置,另外边界布局管理器。这两种布局结合最适合计算

器,大方美观。

4设计要求和步骤

第一步,设计图形界面。

采用边界布局管理器把三个面板添加到框架上,再采用网格布局管理器,把

标准AWT组件添加到界面上。

第二步,根据各按钮需要,标明对象名,便于计算操作。

第三步,设定各按钮的特性。

第四步,实例化所有按钮、设置其前景色并注册监听器。

第五步,运行APPLET

*运行小应用

*测试各按钮的性能,是否满足问题要求。

5、编译环境

编码语言:JAVA

编译环境:JDK 1.5.0_11

概要设计

1设计方案要求

整个程序分三部分,首先是确定程序交互的对象,每个组件要用有意义的标

签标明,设计出一个大体的框架,再添加面板,各面板设计分布相互独立,各面

板中的按钮分布也相互独立,其各自响应的事件都会由各自的监听动作事件所决

定。当Jbutton被按下时会产生一个动作事件(action event)。各编码要有适当的

注释。

2面板设置

为了美观和整齐,采用了网格布局管理器进行编排显示面板和按钮排列。为

了更好看,还可以添加计算器的背景色。采用边界布局管理器排面板,合理有效。

由整体界面可知,显示信息主要设置在顶部(则北面),功能键设置在左面

(则西面),数字按钮和运算按钮主要设置在右面(则在东面)。各按扭均有相应

的数字或字母作为标签。

3主要模块概要

(1) 主框架模块

存储则是以非记忆的模式,通过读取缺省静态数据和允许用户进行动态

的受限操作实现的。处理则是通过存储的数据,根据需要对参数进行修

改、返回等操作。具体变量声明界面设置大小如下:

根据数据运算需要,数据均用双精度储存。

public class Counter extends Frame

{

//声明三个面板的布局

GridLayout gl1,gl2,gl3;

Panel p0,p1,p2,p3;

JTextField tf1;

TextField tf2;

Button

StringBuffer str;//显示屏所显示的字符串

double x,y;//x和y都是运算数

int z;//Z表示单击了那一个运算符.0表示"+",1表示"-",2表示"*",3表示"/"

static double m;//记忆的数字….

public Counter()

{

//实例化三个面板的布局

…..

//实例化所有按钮、设置其前景色并注册监听器

….

//构造监听器

….

.}

setResizable(false);

setBackground();

setBounds(100,100,320,280);

setVisible(true);

}

(2) 驱动模块

public static void main(String args[])

{

new Counter();

}

(3) 事件监听器模块

class Bt implements ActionListener

{

public void actionPerformed(ActionEvent e2)

{

try{

if ( )

….

else if ( )

…..

}

}

}

(4) 异常处理模块

catch(NumberFormatException e){

t("数字格式异常");

}

catch(StringIndexOutOfBoundsException e){

t("字符串索引越界");

}

4事件处理

为了响应一个事件,需要建立事件监听器与触发事件的某个组件之间的联系,

通过给组件添加一个监听器的方式就可建立监听器与被监听器的组件之间的联

系。如程序中各个按钮ButtonListener代表一个动作监听器,通过按数字按钮进

行输送信息,使内部储存信息并处理输出相关信息。

Jbutton button = new Jbutton( );

ionListener(new ButtonListener());

由于为了方便程序需要,并没有采用按钮数组化,每一个按钮都附带一个动作监

听器,可以灵活调用。

5功能设计

本程序的设计功能比较简单,除了加减乘除之外,还有倒数,平方和百分比

的计算功能。对于广大中小学生的学习有巨大的帮助。使用人员能快捷简单地进

行操作。即时准确地获得需要的计算的结果,充分降低了数字计算的难度和节约

了时间。

6对象窗口的设计

为了使用者更好的使用本计算器,计算器的窗口化设计跟日常生活中的计

算器一样。外观醒目美观。如:

调试分析

1数据调试分析

本设计主要目的就是进行简单的四则运算,因此现以随机数进行测试:

输入信息 显示结果 信息操作

从0~9数字 数字输入

输入1点5 小数点插入

输入2和-2 正负符号插入

输入2+5

输入2*5

输入10/2

输入16-2

输入16

输入16和1/X

输入2和%

输入16和sqrt

输入16和Backspace

返回操作

平方操作

百分数操作

倒数运算

清除操作

减法运算

除法运算

加号、等号输入

加法运算

乘法运算

2 异常处理测试

在四则运算过程中,0不能作为除数,当数据不能被除尽时,结果通常保留双

精度,当输入数据不当时,也会产生各种异常反应。如:

信息输入 显示结果 异常原因

输入16除以0 因为0不能作为除数

输入运算符

输入sqrt和Backspace

输入1/X和sqrt

运算抛出异常驻

没有输入数字直接输运

算符

不是有效的数字信息

3信息处理测试

如上是对计算器中的各个部分的测试,现在是对计算器的综合测试:

数据输入 显示结果

45+248*6 1533.0

486/2-4286 -4043.0

4869的开方 69.778220097804

56的% 0.56

468的倒数 0.752137

通过核对以上数据计算,显示结果较为准确,且精确度也比较高。故符合要求。

程序的改进

本程序核心在于模拟操作系统,对信息进行统一的中转及处理。在程序功能

上,还缺少一连串信息通道,很多运算符号并没具备,很多其他的运算方法运行

不了。因此,程序在框架结构上还可进行改进,加入一个信道类,来实现各类间

的消息传递。加多其他功能类,更完善计算器的功能选取择。

另外,由于水平所限,进行运算操作过程中,本计算器还不能识别运算符的

优先级运算,因此本程序还不能直接运算组合运算式,方程式等。程序的外观界

面及布局还不尽人意,今后改进中,可增加其他亲各元素,令外观更好看。

参考文献

1《JAVA程序设计教程》(第五版)[美] JohnLewis WilliamLoftus 著,电子工

业出版社;

2《JAVA项目案例导航》 杨小平 编著 科学出版社

3《JAVA编程技巧》 宛廷岂著 机械工业出版社

总结

JAVA不仅仅是一门语言,而且已经形成了一门技术。它包括JAVA 软件技

术、JAVA虚拟机技术、JAVA嵌入技术、JAVA信息综合处理技术和JAVA应用

技术等。要学好JAVA,我知道一定要学会编程,如果你不编程序,就永远学不

会JAVA。

但是,对于如何学习JAVA程序设计语言,如何将JAVA的编程技巧应用到

实际生活之中,并循序渐进地进行JAVA程序设计。也是我一直在探索的问题。

对于一个程序的开发,最重要就是构思思想和开发的步骤。就像本程序编写过程

中,只要确立了其核心思想,和主要步骤后,那编译原代码只是一个按号入座的

步骤。尽管中间会遇到很多错误,但只要思路清楚,分块设计,抓住最重要的思

路线索,不断的修改,就可以完成。这只是一个小部分。对于一个程序的需求分

析往往是最难的,也是最伤头脑的。这也许就是别人所说的预期工作是占了整个

设计的一半时间。

通过一个学期的学习,也许我并没有真正把握JAVA编程的真谛。不过我也

总结了一些经验。就是实践---理解---再实践,从中深入理解JAVA的思想,在不

断实践过程中,不断地吸取JAVA编程的知识和技巧。子日:“知之者不如好之

者,好之者不如乐之者。”要学好一门语言,我们就必须不断的输入、修改、编

译、运行每一个实例程序,每运行一个程序,都可能给我们一些新的启示。

编程路上没有孤独者,每一个程序方案的设计都是琳琅满目,没有什么程序

是最好的,只有最适合的。也没有什么程序是最完美的,只有更改进的。所以在

本程序中,同样也是存在着缺陷,如果要更加完善,还需要很多的改进。这是我

感到无力之处。拥有的知识实在太薄弱了,难以解决改进方案。

自知自己的无知,在今后的编程路上,我会更加努力学习,提高自己的编程

能力和编程技巧,努力攻破编程路上一个一个的难关,尽自己所能,做到最好!

附录1

模块UML图

Counter

Main(args:String[]):void

Frame

setResizable(): void

setBackground():void

setBounds():void

setVisible():void

setHorizontalAlignment(

)

setEnabled():void

setText():void

setForeground(Color):void

ActionListener

actionPerformed(ActionEven):void

getSource():void

getText():void

getActionCommand():void

toString():double

Counter

G11: GridLayout

G12: GridLayout

G13: GridLayout

P0: Panel

P1: Panel

P2: Panel

P3: Panel

Tf1: JtextField

Tf2: TextField

Str: StringBuffer

Bt: Button

windowClosing(WindowEvent):void

附录2

源程序代码

//********************************************************//

//《计算器程序》

// 作者:

// 班级:

// 日期:

//*********************************************************

import .*;

import .*;

import .*;

import .*;

public class Counter extends Frame

{

//声明三个面板的布局

GridLayout gl1,gl2,gl3;

Panel p0,p1,p2,p3;

JTextField tf1;

TextField tf2;

Button

b0,b1,b2,b3,b4,b5,b6,b7,b8,b9,b10,b11,b12,b13,b14,b15,b16,b17,b18,b19,b20,b21,b2

2,b23,b24,b25,b26;

StringBuffer str;//显示屏所显示的字符串

double x,y;//x和y都是运算数

int z;//Z表示单击了那一个运算符.0表示"+",1表示"-",2表示"*",3表示"/"

static double m;//记忆的数字

public Counter()

{

gl1=new GridLayout(1,4,10,0);//实例化三个面板的布局

gl2=new GridLayout(4,1,0,15);

gl3=new GridLayout(4,5,10,15);

tf1=new JTextField(27);//显示屏

izontalAlignment();

bled(false);

t("0");

tf2=new TextField(10);//显示记忆的索引值

table(false);

//实例化所有按钮、设置其前景色并注册监听器

b0=new Button("Backspace");

eground();

ionListener(new Bt());

b1=new Button("CE");

eground();

ionListener(new Bt());

b2=new Button("C");

eground();

ionListener(new Bt());

b7=new Button("7");

eground();

ionListener(new Bt());

b8=new Button("8");

eground();

ionListener(new Bt());

b9=new Button("9");

eground();

ionListener(new Bt());

b10=new Button("/");

eground();

ionListener(new Bt());

b11=new Button("sqrt");

eground();

ionListener(new Bt());

b12=new Button("4");

eground();

ionListener(new Bt());

b13=new Button("5");

eground();

ionListener(new Bt());

b14=new Button("6");

eground();

ionListener(new Bt());

b15=new Button("*");

eground();

ionListener(new Bt());

b16=new Button("%");

eground();

ionListener(new Bt());

b17=new Button("1");

eground();

ionListener(new Bt());

b18=new Button("2");

eground();

ionListener(new Bt());

b19=new Button("3");

eground();

ionListener(new Bt());

b20=new Button("-");

eground();

ionListener(new Bt());

b21=new Button("1/X");

eground();

ionListener(new Bt());

b22=new Button("0");

eground();

ionListener(new Bt());

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

eground();

ionListener(new Bt());

b24=new Button(".");

eground();

ionListener(new Bt());

b25=new Button("+");

eground();

ionListener(new Bt());

b26=new Button("=");

eground();

ionListener(new Bt());

//实例化四个面板

p0=new Panel();

p1=new Panel();

p3=new Panel();

//创建一个空字符串缓冲区

str=new StringBuffer("计算器");

//添加面板p0中的组件和设置其在框架中的位置和大小

(tf1);

nds(10,25,300,40);

//添加面板p1中的组件和设置其在框架中的位置和大小

out(gl1);

(tf2);

(b0);

(b1);

(b2);

nds(10,65,300,25);

//添加面板p2中的组件并设置其的框架中的位置和大小

/*out(gl2);

(b3);

(b4);

(b5);

(b6);

nds(10,110,40,150); */

//添加面板p3中的组件并设置其在框架中的位置和大小

out(gl3);//设置p3的布局

(b7);

(b8);

(b9);

(b10);

(b11);

(b12);

(b13);

(b14);

(b15);

(b16);

(b17);

(b18);

(b19);

(b20);

(b21);

(b22);

(b23);

(b24);

(b25);

(b26);

nds(60,110,250,150);

//设置框架中的布局为空布局并添加3个面板

setLayout(null);

add(p0);

add(p1);

//add(p2);

add(p3);

setResizable(false);//禁止调整框架的大小

//匿名类关闭窗口

addWindowListener(new WindowAdapter(){

public void windowClosing(WindowEvent e1)

{

(0);

}

});

setBackground();

setBounds(100,100,320,280);

setVisible(true);

}

//构造监听器

class Bt implements ActionListener

{

public void actionPerformed(ActionEvent e2)

{

try{

if(rce()==b1)//选择"CE"清零

{

t("0");//把显示屏清零

gth(0);//清空字符串缓冲区以准备接收新的输入运算数

}

else if(rce()==b2)//选择"C"清零

{

t("0");//把显示屏清零

gth(0);

}

else if(rce()==b23)//单击"+/-"选择输入的运算数是正数还是负数

{

x=ouble(t().trim());

t(""+(-x));

}

else if(rce()==b25)//单击加号按钮获得x的值和z的值并清空y的值

{

x=ouble(t().trim());

gth(0);//清空缓冲区以便接收新的另一个运算数

y=0d;

z=0;

}

else if(rce()==b20)//单击减号按钮获得x的值和z的值并清空y的值

{

x=ouble(t().trim());

gth(0);

y=0d;

z=1;

}

else if(rce()==b15)//单击乘号按钮获得x的值和z的值并清空y的值

{

x=ouble(t().trim());

gth(0);

y=0d;

z=2;

}

else if(rce()==b10)//单击除号按钮获得x的值和z的值并空y的值

{

x=ouble(t().trim());

gth(0);

y=0d;

z=3;

}

else if(rce()==b26)//单击等号按钮输出计算结果

{

gth(0);

switch(z)

{

case 0 : t(""+(x+y));break;

case 1 : t(""+(x-y));break;

case 2 : t(""+(x*y));break;

case 3 : t(""+(x/y));break;

}

}

else if(rce()==b24)//单击"."按钮输入小数

{

if(t().trim().indexOf('.')!=-1)//判断字符串中是否已经包含了小数点

{

}

else//如果没数点有小

{

if(t().trim().equals("0"))//如果初时显示为0

{

gth(0);

t((("0"+ionCommand())).toString());

}

else if(t().trim().equals(""))//如果初时显示为空则不做任何操作

{

}

else

{

t((ionCommand()).toString());

}

}

y=0d;

}

else if(rce()==b11)//求平方根

{

x=ouble(t().trim());

t("数字格式异常");

if(x<0)

t("负数没有平方根");

else

t(""+(x));

gth(0);

y=0d;

}

else if(rce()==b16)//单击了"%"按钮

{

x=ouble(t().trim());

t(""+(0.01*x));

gth(0);

y=0d;

}

else if(rce()==b21)//单击了"1/X"按钮

{

x=ouble(t().trim());

if(x==0)

{

t("除数不能为零");

}

else

{

t(""+(1/x));

}

gth(0);

y=0d;

}

else if(rce()==b3)//MC为清除内存

{

m=0d;

t("");

gth(0);

}

else//选择的是其他的按钮

{

if(rce()==b22)//如果选择的是"0"这个数字键

{

if(t().trim().equals("0"))//如果显示屏显示的为零不做操作

{

}

else

{

t((ionCommand()).toString());

y=ouble(t().trim());

}

}

else if(rce()==b0)//选择的是“BackSpace”按钮

{

if(!t().trim().equals("0"))//如果显示屏显示的不是零

{

if(()!=1)

{

t((()-1,()).toString());//可能抛出字符串越界异

}

else

{

t("0");

gth(0);

}

}

y=ouble(t().trim());

}

else//其他的数字键

{

t((ionCommand()).toString());

y=ouble(t().trim());

}

}

}

catch(NumberFormatException e){

t("数字格式异常");

}

catch(StringIndexOutOfBoundsException e){

t("字符串索引越界");

}

}

}

public static void main(String args[])

{

new Counter();

}

}

评语及评分

评阅人签名: