《人机交互》实验报告
----简单计算器的功能实现
院系:信息工程学院 专业: 组员姓名: 指导教师:
2010年11月21日
1
目录
一、实验目的 3 二、实验内容 3 三、实验设计的基本思想和方法要求 4
3.1软件开发方式 4 3.2开发语言 43.3开发集成环境 4 3.4 设计思路 4 3.5系统硬件要求 53.6软件要求 四、实验过程和步骤 54.1需求分析 5 4.2概要设计 4.3详细设计 64.3.1类的设计 6 4.3.2算法的设计 4.3.3界面的设计 6 4.4编写代码 6 4.5系统测试 4.5.1测试目的 7 4.5.2测试过程 7 五、实验心得 5
6 7 8
2
5
一、实验目的
信息技术的高速发展给人类生产、生活带来了广泛而深刻的影响。新产品、新概念层出不穷,不断冲击着人们的视听。这些高科技成果为人们带来了便捷、快乐的同时,也促进了人机交互技术的发展。为使我们更进一步的了解人机交互这门技术,实现简单计算器的功能实验意在巩固我们所学的基础理论和专业知识,掌握利用状态转换网络进行系统设计的方法,增强我们分析问题解决问题的能力,提高我们的动手能力和创新能力。
二、实验内容
实现一个简单的计算器程序,具体内容如下:
设计一个四则运算计算程序,实现“operand1 operator operand2‘=’”,operand1可以是整数或者小数或者是上一次的运算结果,operand2是整数或者小数,操作符是“+ - * /”。另外还要实现辅助键的功能,CE(Clear Entry)键清零,C键取消用户上一次的操作。界面如下图:
3
三、实验设计的基本思想和方法要求 3.1软件开发方式
本次实验采用队友软件开发方式,小组成员根据实验要求进行需求分析,根据平时使用计算器的经验讨论出各个功能模块的相关设计及其基本实现方法,利用状态转换网络进行系统设计,由组长进行分工,负责整个设计,组长协同组员完成各个模块的设计编码实现和文档,最终完成编码的整合及测试工作。
3.2开发语言
由于Java语言作为一种完全面向对象的语言,它吸取了其他语言的各种优点,设计简洁而优美,使用起来方便而有效。所以本次实验设计采用Java语言进行编码, Java语言中的文本框、事件监听器、标签、按钮等多种组件均被用在本次实验中。
3.3开发集成环境
Java不仅提供了一个丰富的语言和运行环境,而且还提供了一个免费的开发工具集,即JDK。由于本次实验采用Java语言进行编码,故开发集成环境选择安装在JDK环境下,运用不仅仅提供最基本的编辑、编译功能,而且还提供了强大附加功能的Myeclipse-7.5进行集成编码测试。
3.4 设计思路
本实验设计的计算器应用程序JFrame继承自框架类(Frame)。通过Swing包中的可视化组件进行界面设计,通过对面板的监听以进行后台的计算。设计中采用模型-视图-控制器(MVC)模式,用模型存储内容,用视图显示内容,用控制器处理输入。同时用类来实现抽象和封装,实现模块化处理。
4
3.5系统硬件要求
内存1024MB,硬盘SCSI 36GX2 ,CPU 双至强2.0,双千兆卡,250W ~ 400W电源。
3.6软件要求
由于本次实验采用Java语言进行编码实现,故需要安装JDK环境,或者安装在JDK环境下可以进行编译运行Java编码的软件,如Myeclipse等软件。
四、实验过程和步骤
在本次实验过程中,系统设计主要由五部分组成:需求分析、概要设计、详细设计、编写代码和系统测试。如图4-1所示:
需求分析 概要设计 详细设计 编写代码 系统测试 图4-1 4.1需求分析
在日常生活中经常需要使用到计算器,比如科学计算、数值计算、会计业务等。用Java语言实现一个简单精巧实用的计算器,不仅使我们更熟悉Java语言的使用,而且更进一步了解人机交互这门技术,熟悉各个状态间的转换关系。本次实验项目需要实现一个简单的四则运算的计算器,拥有加、减、乘、除等基本运算功能及相应的状态转换。
4.2概要设计
本次实验设计的简单计算器包含的功能有:加、减、乘、除等基本功能。计算器的屏显为JTEXTFIELD控件,显示屏下面的数字、操作符按键为JBUTTON控件,每种计算功能均为独立设计算法。CE(Clear Entry)键可以清除所有已输
5
入的数据从头计算,C键取消用户上一次的操作,重新输入数据可以继续当前的计算。
4.3详细设计
详细设计部分则是在概要设计的基础上对计算器的功能实现做出更为详细的介绍。主要对各个设计模块中的各个类做出说明,包括对每个类如何在以后的程序设计中的定义做出介绍,并做出相应的说明,同时对各个参数也会做出介绍。
4.3.1类的设计
本实验使用类对计算器的各个功能进行抽象和封装。首先定义计算器类
Calculator,主要进行计算器的界面设计。然后分别对输入数字、输入运算符、输入退格和清除分别设计类A、类Operating、类Clear,以实现对相应操作的抽象和封装。实验中继承的类是默认的系统软件包java.lang中的Object类。
4.3.2算法的设计
对每个类单独设计算法,以增大内聚性,减小耦合性。详细算法见源代码。
4.3.3界面的设计
界面设计秉持着简洁明了,符合人们习惯的原则。
本实验中,先将JLable标签、JtextField文本框、Jbutton按钮等轻量级控件放在中间容器Container中,再将容器添加到顶层容器mainJFrame中。同时对按钮创建按钮事件监听器,以随时对按钮事件进行监听。
4.4编写代码
这一部分主要根据前面的详细设计内容用具体的语言实现计算器系统,主要采用Java语言实现,这一部分主要是将前一阶段的设计思想用代码的形式实现。
6
4.5系统测试 4.5.1测试目的
测试是软件设计中一个独立的、关键的阶段,也是保证软件质量的重要手段。为了发现系统的错误,使系统更加完善,就必须进行测试,测试阶段的目标就是为了验证各阶段所完成的工作是否满足需求分析和详细的设计要求,识别出期望的结果和真正结果之间的差别,以便修正设计和代码实现中潜在的错误,保证系统运行的正确性和功能的完备性,提高系统运行的性能。
4.5.2测试过程
(1)代码审查
人工测试源程序由编写程序本人非正式的进行,小组内的其他成员再进行核查。
(2)软件调试
在成功测试之后,发现的是故障的表现,小组成员对发现的错误进行了诊断,找到其发生的原因和位置,然后改正错误。组员的调试工作包括: 对错误进行定位并分析原因。 对于错误部分重新编码以改正错误。 重新调试。
五、实验心得
自从拿到题目到完成整个编程,从理论到实践,可以学到很多很多的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论
7
知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。在设计的过程中遇到了种种问题,尤其是运行程序时不断发现意想不到的bug,但这毕竟独立做的,难免会遇到过问题。同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,比如说算法和监听等,以后还得继续加强。 状态转换图:
输入数字error除数为0input number输入运算符input operation输入数字退格输出结果输入操作符输入数字输出结果输入运算符输入数字begin输出结果清除清除output result清除输入运算符输出结果清除输出结果清除backspace清除elimination退格
附源代码:
8
import java.awt.*; import javax.swing.*; import java.awt.event.*; public class a { JFrame mainJFrame; Container con; JLabel JLabel1;
JTextField usertext1;
JTextField usertext2; JButton b1=new JButton(\"7\"); JButton b2=new JButton(\"8\");
JButton b3=new JButton(\"9\"); JButton b4=new JButton(\"C\"); JButton b5=new JButton(\"CE\"); JButton b6=new JButton(\"4\"); JButton b7=new JButton(\"5\");
JButton b8=new JButton(\"6\");
JButton b9=new JButton(\" + \");
JButton b10=new JButton(\" - \");
JButton b11=new JButton(\"1\");
JButton b12=new JButton(\"2\");
9
JButton b13=new JButton(\"3\"); JButton b14=new JButton(\" * \"); JButton b15=new JButton(\" / \");
JButton b16=new JButton(\" 0 \"); JButton b17=new JButton(\" . \");
JButton b18=new JButton(\" = \");
public a(){
mainJFrame=new JFrame(\"Quantum Calc\"); con=mainJFrame.getContentPane();
JLabel1=new JLabel(\" State:\"); try{
usertext1=new JTextField(\"begin\");
usertext1.setColumns(10); //设置文本框宽度
usertext1.setHorizontalAlignment(JTextField.LEFT); //设置文本框的水平方向向为左
10
usertext1.setEditable(false); //设置文本框为不可编辑状态
usertext1.setBackground(Color.white);
usertext2=new JTextField(\"0\"); //设置文本框初始状态为\"0\"
usertext2.setColumns(20); //设置文本框宽度
usertext2.setHorizontalAlignment(JTextField.RIGHT); //设置文本框的水平方向向为右
usertext2.setEditable(false); //设置文本框为不可编辑状态
usertext2.setBackground(Color.white);
con.setLayout(new FlowLayout()); con.add(JLabel1); con.add(usertext1); con.add(usertext2); //设置面板
mainJFrame.setSize(260,225); mainJFrame.setVisible(true);
mainJFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
11
A aa=new A();
Opertion op=new Opertion(); Clear clar=new Clear();
//设置按钮监听
b1.addActionListener(aa); b2.addActionListener(aa); b3.addActionListener(aa); b4.addActionListener(clar); b5.addActionListener(clar); b6.addActionListener(aa); b7.addActionListener(aa); b8.addActionListener(aa); b9.addActionListener(op); b10.addActionListener(op); b11.addActionListener(aa); b12.addActionListener(aa); b13.addActionListener(aa); b14.addActionListener(op); b15.addActionListener(op); b16.addActionListener(aa);
12
b17.addActionListener(aa); b18.addActionListener(op);
//添加按钮到面板 con.add(b1); con.add(b2); con.add(b3); con.add(b4); con.add(b5); con.add(b6); con.add(b7); con.add(b8); con.add(b9); con.add(b10); con.add(b11);
con.add(b12);
con.add(b13); con.add(b14); con.add(b15); con.add(b16);
con.add(b17);
13
con.add(b18);
}
catch(Exception e) {
System.out.println(e.getMessage()); } }
/////////////////////////////////////////////////////////////////// String s1=\"\ int i=0; //记录小数点个数
//输入数字
class A implements ActionListener {
public void actionPerformed(ActionEvent e) { usertext1.setText(\"input number\"); if(e.getSource()==b1)
{ if(s1.equals(\"0\")) {s1=b1.getText();usertext2.setText(s1);} {s1+=b1.getText();usertext2.setText(s1);} }
else
14
if(e.getSource()==b2)
{ if(s1.equals(\"0\")) {s1=b2.getText();usertext2.setText(s1);}
else {s1+=b2.getText();usertext2.setText(s1);} }
if(e.getSource()==b3)
{ if(s1.equals(\"0\")) {s1=b3.getText();usertext2.setText(s1);}
else {s1+=b3.getText();usertext2.setText(s1);} }
if(e.getSource()==b6)
{ if(s1.equals(\"0\")) {s1=b6.getText();usertext2.setText(s1);}
else {s1+=b6.getText();usertext2.setText(s1);} } if(e.getSource()==b7)
{ if(s1.equals(\"0\")) {s1=b7.getText();usertext2.setText(s1);}
else {s1+=b7.getText();usertext2.setText(s1);} } if(e.getSource()==b8)
{ if(s1.equals(\"0\")) {s1=b8.getText();usertext2.setText(s1);}
else {s1+=b8.getText();usertext2.setText(s1);} }
15
if(e.getSource()==b11)
{ if(s1.equals(\"0\")) {s1=b11.getText();usertext2.setText(s1);}
else {s1+=b11.getText();usertext2.setText(s1);} } if(e.getSource()==b12)
{ if(s1.equals(\"0\")) {s1=b12.getText();usertext2.setText(s1);} else {s1+=b12.getText();usertext2.setText(s1);} } if(e.getSource()==b13)
{ if(s1.equals(\"0\")) {s1=b13.getText();usertext2.setText(s1);} else {s1+=b13.getText();usertext2.setText(s1);} } if(e.getSource()==b16) { if(s1.length()>0)
if(Float.parseFloat(s1)==0) {
if(usertext2.getText()==\"0.\")
{ s1+=\"0\";usertext2.setText(s1); } else { s1=\"0\";usertext2.setText(s1);}
}
else {s1+=\"0\";usertext2.setText(s1);}
16
else {s1+=\"0\";usertext2.setText(s1);}
}
if(e.getSource()==b17) { if(i==0) { if(s1==\"0\"||s1==\"\") {s1=\"0.\";i++;} else{ s1+=\".\"; i++ ;}
}
usertext2.setText(s1);
}
} }
class Opertion implements ActionListener {
public void actionPerformed(ActionEvent e) { //加法运算
if(e.getSource()==b9)
{
17
usertext1.setText(\"input operation\"); flag=b9.getText(); if(s2!=\"\")
s2=String.valueOf(Float.parseFloat(usertext2.getText())+Float.parseFloat(s2));
else s2=usertext2.getText(); s1=\"\"; }
//减法运算
if(e.getSource()==b10) {
usertext1.setText(\"input operation\");
flag=b10.getText(); if(s2!=\"\")
s2=String.valueOf(Float.parseFloat(usertext2.getText())+Float.parseFloat(s2));
else s2=usertext2.getText(); s1=\"\"; } //乘法运算
if(e.getSource()==b14)
18
{
usertext1.setText(\"input operation\");
flag=b14.getText(); if(s2!=\"\")
s2=String.valueOf(Float.parseFloat(usertext2.getText())+Float.parseFloat(s2));
flag=b15.getText(); if(s2!=\"\")
else s2=usertext2.getText(); s1=\"\"; }
//除法运算
if(e.getSource()==b15) {
usertext1.setText(\"input operation\");
s2=String.valueOf(Float.parseFloat(usertext2.getText())+Float.parseFloat(s2));
else s2=usertext2.getText(); s1=\"\"; }
//运算结果
19
if(e.getSource()==b18){
i=0; if(flag==\"\")
{usertext1.setText(\"output result\");if(s1==\"\"){} else
usertext2.setText(String.valueOf(Float.parseFloat(s1)));}
if(flag==\"other\") {usertext1.setText(\"output result\");}
if(flag==\"other1\"){usertext1.setText(\"output result\"); if(s3==\"\"){if(s4==\"\"){} else
usertext2.setText(String.valueOf(Float.parseFloat(s4)));}
else
if(s4==\"\")usertext2.setText(String.valueOf(Float.parseFloat(s3)));
else
usertext2.setText(String.valueOf(Float.parseFloat(s4)+Float.parseFloat(s3)));}
if(flag==\" + \")
{usertext1.setText(\"output
result\");if(s1==\"\"){usertext2.setText(String.valueOf(Float.parseFloat(s2)));} else
20
usertext2.setText(String.valueOf(Float.parseFloat(s2)+Float.parseFloat(s1)));}
if(flag==\" - \")
{usertext1.setText(\"output
result\");if(s1==\"\"){usertext2.setText(String.valueOf(Float.parseFloat(s2)));} else
usertext2.setText(String.valueOf(Float.parseFloat(s2)-Float.parseFloat(s1)));}
if(flag==\" * \")
{usertext1.setText(\"output
result\");if(s1==\"\"){usertext2.setText(String.valueOf(Float.parseFloat(s2)));} else
usertext2.setText(String.valueOf((Float.parseFloat(s2))*(Float.parseFloat(s1))));}
if(flag==\" / \"){
if(s1==\"\"){usertext1.setText(\"output
result\");usertext2.setText(String.valueOf(Float.parseFloat(s2)));}
else{
21
if(Float.parseFloat(s1)!=0) { usertext1.setText(\"output
result\");usertext2.setText(String.valueOf(Float.parseFloat(s2)/Float.parseFloat(s1)));}
else { usertext1.setText(\"error\");usertext2.setText(\"除
数不能为0!\"); } } }
}
} }
class Clear implements ActionListener {
public void actionPerformed(ActionEvent e) {
if(e.getSource()==b4) 入为C时,退回一个字符
{
flag=\"other1\";
usertext1.setText(\"backspace\"); String temp=usertext2.getText();
if(temp.length()>1)
//输
22
{usertext2.setText(temp.substring(0,temp.length()-1)); s3=usertext2.getText(); }
else {usertext2.setText(\"0\");
i=0;s1=\"\";usertext1.setText(\"elimination\");
} s4=s2; s2=\"\"; }
if(e.getSource()==b5) //输
入为CE时,清0
{ usertext1.setText(\"elimination\");usertext2.setText(\"0\");
s1=\"\"; s2=\"\";i=0; flag=\"other\";} } }
public static void main(String[] args) { }
}
new a();
23
24
因篇幅问题不能全部显示,请点此查看更多更全内容