1、华南农业大学理学院(面向对象的程序设计)课程设计实验题目: 设计一个简单的计算器应用程序 简易计算器应用程序的制作问题陈述设计一个计算器应用程序,用于进行简单的加减乘除四则运算。需求分析1 设计思想要设计一个计算器应用程序,则计算器必须要进行简单的四则运算功能,并且可以通过人机互动来进行操作。计算器功能主要包括下面几个方面:*计算简单的加减乘除四则运算;*通过鼠标点击输入数字信息;*显示计算结果;*计算器具有返回功能:按 AC 键不会清除重现存储器的内容;返零功能;2 设计划分用 JAVA 布局管理器来创建图形界面(包括 TextField,Button) ,框架和面板主要分成三大块:框架、显
2、示面板、和数字面板;具体分布如下:主框架主面板显示面板 数字面板 功能面板相应对象 各组件按钮各组件按钮3 界面布局按一般计算器表面布局,主要以网格的行数和列数在创建布局管器的构造方法中通过参数进行设置,另外边界布局管理器。这两种布局结合最适合计算器,大方美观。4 设计要求和步骤第一步,设计图形界面。采用边界布局管理器把三个面板添加到框架上,再采用网格布局管理器,把标准 AWT 组件添加到界面上。第二步,根据各按钮需要,标明对象名,便于计算操作。第三步,设定各按钮的特性。第四步,实例化所有按钮、设置其前景色并注册监听器。第五步,运行 APPLET*运行小应用*测试各按钮的性能,是否满足问题要求
3、。5、编译环境编码语言:JAVA编译环境:JDK 1.5.0_11概要设计1 设计方案要求整个程序分三部分,首先是确定程序交互的对象,每个组件要用有意义的标签标明,设计出一个大体的框架,再添加面板,各面板设计分布相互独立,各面板中的按钮分布也相互独立,其各自响应的事件都会由各自的监听动作事件所决定。当 Jbutton 被按下时会产生一个动作事件 (action event)。各编码要有适当的注释。2 面板设置为了美观和整齐,采用了网格布局管理器进行编排显示面板和按钮排列。为了更好看,还可以添加计算器的背景色。采用边界布局管理器排面板,合理有效。由整体界面可知,显示信息主要设置在顶部(则北面)
4、,功能键设置在左面(则西面) ,数字按钮和运算按钮主要设置在右面(则在东面) 。各按扭均有相应的数字或字母作为标签。3 主要模块概要(1) 主框架模块存储则是以非记忆的模式,通过读取缺省静态数据和允许用户进行动态的受限操作实现的。处理则是通过存储的数据,根据需要对参数进行修改、返回等操作。具体变量声明界面设置大小如下: 根据数据运算需要,数据均用双精度储存。 public class Counter extends Frame /声明三个面板的布局 GridLayout gl1,gl2,gl3; Panel p0,p1,p2,p3; JTextField tf1; TextField tf2;
5、 Button StringBuffer str;/显示屏所显示的字符串 double x,y;/x 和 y 都是运算数 int z;/Z 表示单击了那一个运算符.0 表示“+“,1 表示 “-“,2 表示“*“,3 表示“/“ static double m;/记忆的数字.public Counter() /实例化三个面板的布局/实例化所有按钮、设置其前景色并注册监听器./构造监听器.setResizable(false);setBackground(Color.pink); setBounds(100,100,320,280); setVisible(true); (2) 驱动模块publ
6、ic static void main(String args) new Counter(); (3) 事件监听器模块class Bt implements ActionListener public void actionPerformed(ActionEvent e2) tryif ( ).else if ( )(4) 异常处理模块catch(NumberFormatException e) tf1.setText(“数字格式异常“); catch(StringIndexOutOfBoundsException e) tf1.setText(“字符串索引越界“); 4 事件处理为了响应一个
7、事件,需要建立事件监听器与触发事件的某个组件之间的联系,通过给组件添加一个监听器的方式就可建立监听器与被监听器的组件之间的联系。如程序中各个按钮 ButtonListener 代表一个动作监听器,通过按数字按钮进行输送信息,使内部储存信息并处理输出相关信息。Jbutton button = new Jbutton( );Button.addActionListener(new ButtonListener();由于为了方便程序需要,并没有采用按钮数组化,每一个按钮都附带一个动作监听器,可以灵活调用。5 功能设计本程序的设计功能比较简单,除了加减乘除之外,还有倒数,平方和百分比的计算功能。对于广
8、大中小学生的学习有巨大的帮助。使用人员能快捷简单地进行操作。即时准确地获得需要的计算的结果,充分降低了数字计算的难度和节约了时间。6 对象窗口的设计为了使用者更好的使用本计算器,计算器的窗口化设计跟日常生活中的计算器一样。外观醒目美观。如:调试分析1 数据调试分析本设计主要目的就是进行简单的四则运算,因此现以随机数进行测试:输入信息 显示结果 信息操作从 09 数字 数字输入输入 1 点 5 小数点插入输入 2 和-2正负符号插入输入 2+5加号、等号输入加法运算输入 2*5乘法运算输入 10/2除法运算输入 16-2减法运算输入 16清除操作输入 16 和 1/X倒数运算输入 2 和%百分数
9、操作输入 16 和 sqrt平方操作输入 16 和 Backspace返回操作2 异常处理测试在四则运算过程中,0 不能作为除数,当数据不能被除尽时,结果通常保留双精度,当输入数据不当时,也会产生各种异常反应。如:信息输入 显示结果 异常原因输入 16 除以 0 因为 0 不能作为除数输入运算符 没有输入数字直接输运算符输入 sqrt 和 Backspace 不是有效的数字信息输入 1/X 和 sqrt 运算抛出异常驻 3 信息处理测试如上是对计算器中的各个部分的测试,现在是对计算器的综合测试:数据输入 显示结果45+248*6 15330486/2-4286 -4043.04869 的开方
10、69.77822009780456 的% 0.56468 的倒数 0.002136752136752137通过核对以上数据计算,显示结果较为准确,且精确度也比较高。故符合要求。程序的改进本程序核心在于模拟操作系统,对信息进行统一的中转及处理。在程序功能上,还缺少一连串信息通道,很多运算符号并没具备,很多其他的运算方法运行不了。因此,程序在框架结构上还可进行改进,加入一个信道类,来实现各类间的消息传递。加多其他功能类,更完善计算器的功能选取择。另外,由于水平所限,进行运算操作过程中,本计算器还不能识别运算符的优先级运算,因此本程序还不能直接运算组合运算式,方程式等。程序的外观界面及布局还不尽人意
11、,今后改进中,可增加其他亲各元素,令外观更好看。参考文献1JAVA 程序设计教程 (第五版)美 JohnLewis WilliamLoftus 著,电子工业出版社;2JAVA 项目案例导航 杨小平 编著 科学出版社3JAVA 编程技巧 宛廷岂著 机械工业出版社总结JAVA 不仅仅是一门语言,而且已经形成了一门技术。它包括 JAVA 软件技术、JAVA 虚拟机技术、JAVA 嵌入技术、JAVA 信息综合处理技术和JAVA 应用技术等。要学好 JAVA,我知道一定要学会编程,如果你不编程序,就永远学不会 JAVA。但是,对于如何学习 JAVA 程序设计语言,如何将 JAVA 的编程技巧应用到实际生
12、活之中,并循序渐进地进行 JAVA 程序设计。也是我一直在探索的问题。对于一个程序的开发,最重要就是构思思想和开发的步骤。就像本程序编写过程中,只要确立了其核心思想,和主要步骤后,那编译原代码只是一个按号入座的步骤。尽管中间会遇到很多错误,但只要思路清楚,分块设计,抓住最重要的思路线索,不断的修改,就可以完成。这只是一个小部分。对于一个程序的需求分析往往是最难的,也是最伤头脑的。这也许就是别人所说的预期工作是占了整个设计的一半时间。通过一个学期的学习,也许我并没有真正把握 JAVA 编程的真谛。不过我也总结了一些经验。就是实践-理解- 再实践,从中深入理解 JAVA 的思想,在不断实践过程中,
13、不断地吸取 JAVA 编程的知识和技巧。子日:“知之者不如好之者,好之者不如乐之者。 ”要学好一门语言,我们就必须不断的输入、修改、编译、运行每一个实例程序,每运行一个程序,都可能给我们一些新的启示。编程路上没有孤独者,每一个程序方案的设计都是琳琅满目,没有什么程序是最好的,只有最适合的。也没有什么程序是最完美的,只有更改进的。所以在本程序中,同样也是存在着缺陷,如果要更加完善,还需要很多的改进。这是我感到无力之处。拥有的知识实在太薄弱了,难以解决改进方案。自知自己的无知,在今后的编程路上,我会更加努力学习,提高自己的编程能力和编程技巧,努力攻破编程路上一个一个的难关,尽自己所能,做到最好!附
14、录 1模块 UML 图CounterMain(args:String):voidFramesetResizable(): voidsetBackground():voidsetBounds():voidsetVisible():voidsetHorizontalAlignment(JtextField.RIGHT)setEnabled():void附录 2源程序代码/*/计算器程序setText():voidCounterG11: GridLayoutG12: GridLayoutG13: GridLayoutP0: PanelP1: PanelP2: PanelP3: PanelTf1: J
15、textFieldTf2: TextFieldStr: StringBufferBt: ButtonwindowClosing(WindowEvent):voidsetForeground(Color):voidActionListeneractionPerformed(ActionEven):voidgetSource():voidgetText():voidgetActionCommand():voidtoString():double/ 作者: / 班级:/ 日期:/*import java.awt.*; import java.awt.event.*; import java.lang
16、.*; import javax.swing.*; 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,b22,b23,b24,b25,b26; StringBuffer str;/显示屏所显示的字符串 double x,y;/x 和 y 都
17、是运算数 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);/显示屏 tf1.setHorizontalAlignment(JTextField.RIGHT); tf1.setEnabled(false); tf1
18、.setText(“0“); tf2=new TextField(10);/显示记忆的索引值 tf2.setEditable(false); /实例化所有按钮、设置其前景色并注册监听器 b0=new Button(“Backspace“); b0.setForeground(Color.red); b0.addActionListener(new Bt(); b1=new Button(“CE“); b1.setForeground(Color.red); b1.addActionListener(new Bt(); b2=new Button(“C“); b2.setForeground(C
19、olor.red); b2.addActionListener(new Bt(); b7=new Button(“7“); b7.setForeground(Color.blue); b7.addActionListener(new Bt(); b8=new Button(“8“); b8.setForeground(Color.blue); b8.addActionListener(new Bt(); b9=new Button(“9“); b9.setForeground(Color.blue); b9.addActionListener(new Bt(); b10=new Button(
20、“/“); b10.setForeground(Color.red); b10.addActionListener(new Bt(); b11=new Button(“sqrt“); b11.setForeground(Color.blue); b11.addActionListener(new Bt(); b12=new Button(“4“); b12.setForeground(Color.blue); b12.addActionListener(new Bt(); b13=new Button(“5“); b13.setForeground(Color.blue); b13.addAc
21、tionListener(new Bt(); b14=new Button(“6“); b14.setForeground(Color.blue); b14.addActionListener(new Bt(); b15=new Button(“*“); b15.setForeground(Color.red); b15.addActionListener(new Bt(); b16=new Button(“%“); b16.setForeground(Color.blue); b16.addActionListener(new Bt(); b17=new Button(“1“); b17.s
22、etForeground(Color.blue); b17.addActionListener(new Bt(); b18=new Button(“2“); b18.setForeground(Color.blue); b18.addActionListener(new Bt(); b19=new Button(“3“); b19.setForeground(Color.blue); b19.addActionListener(new Bt(); b20=new Button(“-“); b20.setForeground(Color.red); b20.addActionListener(n
23、ew Bt(); b21=new Button(“1/X“); b21.setForeground(Color.blue); b21.addActionListener(new Bt(); b22=new Button(“0“); b22.setForeground(Color.blue); b22.addActionListener(new Bt(); b23=new Button(“+/-“); b23.setForeground(Color.blue); b23.addActionListener(new Bt(); b24=new Button(“.“); b24.setForegro
24、und(Color.blue); b24.addActionListener(new Bt(); b25=new Button(“+“); b25.setForeground(Color.red); b25.addActionListener(new Bt(); b26=new Button(“=“); b26.setForeground(Color.red); b26.addActionListener(new Bt(); /实例化四个面板 p0=new Panel(); p1=new Panel(); p3=new Panel(); /创建一个空字符串缓冲区 str=new StringB
25、uffer(“计算器“); /添加面板 p0 中的组件和设置其在框架中的位置和大小 p0.add(tf1); p0.setBounds(10,25,300,40); /添加面板 p1 中的组件和设置其在框架中的位置和大小 p1.setLayout(gl1); p1.add(tf2); p1.add(b0); p1.add(b1); p1.add(b2); p1.setBounds(10,65,300,25); /添加面板 p2 中的组件并设置其的框架中的位置和大小 /*p2.setLayout(gl2); p2.add(b3); p2.add(b4); p2.add(b5); p2.add(b
26、6); p2.setBounds(10,110,40,150); */添加面板 p3 中的组件并设置其在框架中的位置和大小 p3.setLayout(gl3);/设置 p3 的布局 p3.add(b7); p3.add(b8); p3.add(b9); p3.add(b10); p3.add(b11); p3.add(b12); p3.add(b13); p3.add(b14); p3.add(b15); p3.add(b16); p3.add(b17); p3.add(b18); p3.add(b19); p3.add(b20); p3.add(b21); p3.add(b22); p3.a
27、dd(b23); p3.add(b24); p3.add(b25); p3.add(b26); p3.setBounds(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) System.exit(0); ); setBac
28、kground(Color.pink); setBounds(100,100,320,280); setVisible(true); /构造监听器 class Bt implements ActionListener public void actionPerformed(ActionEvent e2) try if(e2.getSource()=b1)/选择 “CE“清零 tf1.setText(“0“);/把显示屏清零 str.setLength(0);/清空字符串缓冲区以准备接收新的输入运算数 else if(e2.getSource()=b2)/选择“C“ 清零 tf1.setText
29、(“0“);/把显示屏清零 str.setLength(0); else if(e2.getSource()=b23)/单击“+/-“选择输入的运算数是正数还是负数 x=Double.parseDouble(tf1.getText().trim(); tf1.setText(“+(-x); else if(e2.getSource()=b25)/单击加号按钮获得 x 的值和 z 的值并清空 y 的值 x=Double.parseDouble(tf1.getText().trim(); str.setLength(0);/清空缓冲区以便接收新的另一个运算数 y=0d; z=0; else if(
30、e2.getSource()=b20)/单击减号按钮获得 x 的值和 z 的值并清空 y 的值 x=Double.parseDouble(tf1.getText().trim(); str.setLength(0); y=0d; z=1; else if(e2.getSource()=b15)/单击乘号按钮获得 x 的值和 z 的值并清空 y 的值 x=Double.parseDouble(tf1.getText().trim(); str.setLength(0); y=0d; z=2; else if(e2.getSource()=b10)/单击除号按钮获得 x 的值和 z 的值并空 y
31、的值 x=Double.parseDouble(tf1.getText().trim(); str.setLength(0); y=0d; z=3; else if(e2.getSource()=b26)/单击等号按钮输出计算结果 str.setLength(0); switch(z) case 0 : tf1.setText(“+(x+y);break; case 1 : tf1.setText(“+(x-y);break; case 2 : tf1.setText(“+(x*y);break; case 3 : tf1.setText(“+(x/y);break; else if(e2.g
32、etSource()=b24)/单击“.“ 按钮输入小数 if(tf1.getText().trim().indexOf(.)!=-1)/判断字符串中是否已经包含了小数点 else/如果没数点有小 if(tf1.getText().trim().equals(“0“)/如果初时显示为 0 str.setLength(0); tf1.setText(str.append(“0“+e2.getActionCommand().toString(); else if(tf1.getText().trim().equals(“)/如果初时显示为空则不做任何操作 else tf1.setText(str.
33、append(e2.getActionCommand().toString(); y=0d; else if(e2.getSource()=b11)/求平方根 x=Double.parseDouble(tf1.getText().trim(); tf1.setText(“数字格式异常“); if(x0) tf1.setText(“负数没有平方根“); else tf1.setText(“+Math.sqrt(x); str.setLength(0); y=0d; else if(e2.getSource()=b16)/单击了“%“按钮 x=Double.parseDouble(tf1.getT
34、ext().trim(); tf1.setText(“+(0.01*x); str.setLength(0); y=0d; else if(e2.getSource()=b21)/单击了“1/X“ 按钮 x=Double.parseDouble(tf1.getText().trim(); if(x=0) tf1.setText(“除数不能为零“); else tf1.setText(“+(1/x); str.setLength(0); y=0d; else if(e2.getSource()=b3)/MC 为清除内存 m=0d; tf2.setText(“); str.setLength(0)
35、; else/选择的是其他的按钮 if(e2.getSource()=b22)/如果选择的是 “0“这个数字键 if(tf1.getText().trim().equals(“0“)/如果显示屏显示的为零不做操作 else tf1.setText(str.append(e2.getActionCommand().toString(); y=Double.parseDouble(tf1.getText().trim(); else if(e2.getSource()=b0)/选择的是“BackSpace ”按钮 if(!tf1.getText().trim().equals(“0“)/如果显示屏
36、显示的不是零 if(str.length()!=1) tf1.setText(str.delete(str.length()-1,str.length().toString();/可能抛出字符串越界异常 else tf1.setText(“0“); str.setLength(0); y=Double.parseDouble(tf1.getText().trim(); else/其他的数字键 tf1.setText(str.append(e2.getActionCommand().toString(); y=Double.parseDouble(tf1.getText().trim(); catch(NumberFormatException e) tf1.setText(“数字格式异常“); catch(StringIndexOutOfBoundsException e) tf1.setText(“字符串索引越界“); public static void main(String args) new Counter(); 评语及评分评阅人签名: