201421123002 翁珊,201421123006 黄月梅,201421123007 徐晓珊
题目描述:
我们在个人作业1中,用各种语言实现了一个命令行的四则运算小程序。进一步,本次要求把这个程序做成GUI(可以是Windows PC 上的,也可以是Mac、Linux,web,手机上的),成为一个有基本功能、一定价值的程序。在下面的功能需求中实现两个:
- 记录用户的对错总数,程序退出再启动的时候,能把以前的对错数量保存并在此基础上增量计算。
- 有计时功能,能显示用户开始答题后的消耗时间。
- 界面支持中文简体/中文繁体/英语,用户可以选择一种;
在软件开发中,我们需要大量使用工具来辅助设计,每个环节大家都要善于学习和使用工具。设计的时候,请使用思维导图设计你的模块之间的关系,
需求分析:
- 除了整数以外,还要支持真分数的四则运算,真分数的运算,例如:1/6 + 1/8 = 7/24
- 运算符为 +, ?, ×, ÷,可以处理用户的输入。
- 有计时功能,能显示用户开始答题后的消耗时间。
- 界面支持中文简体/中文繁体/英语,用户可以选择一种;
思维导图如下:
关键代码分析:
(1)Frames类制作基本框架
- 以流式结构排列
1 flow = new FlowLayout(); 2 flow.setAlignment(FlowLayout.LEFT); 3 flow.setHgap(30); 4 flow.setVgap(15); 5 setTitle(name); 6 setSize(525, 500); 7 setLayout(flow);
- 界面支持切换语言利用按钮的事件监听器实现(以下只显示繁体部分)
B6.addActionListener(new ActionListener(){//选择繁体 public void actionPerformed(ActionEvent e) { B1.setText("生成題目"); B2.setText("查看答案"); B3.setText("清除信息"); B4.setText("提交答案"); L1.setText("題目數"); L2.setText("範圍"); L3.setText("伱的答案"); } });
- 计时功能实现
... while(true) { validate(); if(open==1) { Minute.setText(String.valueOf(M)); Second.setText(String.valueOf(S)); if(H==99) { H=0; S++; } if(S==60) { H=0; S=0; M++; } if(M==60) { M=0; S=0; H=0; } try{ Thread.sleep(10); } catch(Exception e){ } H++; } if(clear==1) { M=S=H=0; Minute.setText(String.valueOf(M)); Second.setText(String.valueOf(S)); clear=0; } ...
(2)Aswer类进行答案的正误判断
1 static boolean compare(String a, String b) 2 3 { 4 5 if (a.equals(b)) 6 7 {System.out.println("回答正确"); 8 9 return true;} 10 11 else 12 13 { 14 15 System.out.println("回答错误,正确答案是" + b); 16 17 return false; 18 19 } 20 21 }
(3)compute类进行+,—, *,÷的运算(以加法为例)
1 public static String add(Frac a, Frac b) 3 { 5 int i, j, k, s, m, n, p; 7 i = a.getZi(); 9 j = a.getMu(); 11 k = b.getZi(); 13 s = b.getMu(); 15 m = i * s + j * k; 17 n = s * j; 19 p = Answer.getGCD(m, n); 21 return Answer.Reduction(m / p, n / p); 23 }
(4)进行分数的构造及化简
1 public class Frac { 2 3 private int Zi; 4 5 private int Mu; 6 7 private String fra; 8 9 public Frac() { 10 11 }
(5)Test类调用四则运算的图形框架
1 public class Test { 5 public static void main(String[] args) throws Throwable{ 7 Frac f1 = new Frac(); 9 Frac f2 = new Frac(); 11 new Frames("欢迎来到711制作的四则运算",f1,f2); 13 } 15 }
实验结果:
语言切换功能展示:
a.简体:
b.繁体:
c.英语:
结对照片展示:
coding链接:https://coding.net/u/xxs24/p/pairhomework1/git/tree/master
PSP表格:
PSP2.1 |
Personal Software Process Stages |
Estimated Time(hour) |
Actual Time (hour) |
Planning |
计划 |
0.5 |
0.5 |
· Estimate |
估计这个任务需要多少时间 |
10 |
12 |
Development |
开发 |
5 |
4 |
· Analysis |
需求分析 (包括学习新技术) |
0.5 |
1 |
· Design Spec |
生成设计文档 |
1 |
1 |
· Design Review |
设计复审 |
1.5 |
2 |
· Coding Standard |
代码规范 |
0.5 |
0.5 |
· Design |
具体设计 |
1 |
1.5 |
· Coding |
具体编码 |
6 |
6.5 |
· Code Review |
代码复审 |
0.5 |
1/3 |
· Test |
测试(自我测试,修改代码,提交修改) |
0.5 |
2/3 |
Reporting |
报告 |
0.5 |
0.5 |
· |
测试报告 |
1/6 |
1/6 |
· |
计算工作量 |
1/6 |
0.25 |
· |
并提出过程改进计划 |
0.25 |
0.25 |
小结:
本次实验由于上次的实验我是基于C++的,黄月梅是基于Python的,而我对C++的图形界面还不熟悉,月梅也对Python框架比较模糊,所以在我们三个的讨论下,一致同意使用翁珊同学的实验来进行图形界面的实现。
首先我们一起讨论了总体的布局和分析其需要的功能。也觉得翁珊同学的控制题目范围的这个设计很不错,也继续沿用了下来。主要是增加了GUI框架、计时功能以及语言的切换功能(这里对于本实验很多繁体等于简体表示难过)。由于这个实验翁珊比较熟悉,所以主体编程是由翁珊负责的,我和黄月梅主要负责代码的复审和测试运行以及提出不足,期间效率得到不小的提升。遇到问题一起讨论,也比之前自己一个人思考解决的速度更快!
对于本次实验我们觉得计时器的那一块比较有挑战性。后来经过讨论查找资料以及请教同学之后也顺利解决了。因为经过这次实验后,觉得结对编程的好处真的很多!
汉堡包式评价:
- 先来一片面包:三人达成结对编程的共识,况且我们是一个宿舍的,让人觉得处于一个安全的环境
- 再把肉放上:这次编程过程中,虽然翁珊负责主体编程,但是期间遇到了诸多问题和不足都是大家一起提出来一起想办法解决的。也因为我们三个的编程基础相对也比较薄弱,所以遇到棘手问题也比较难以解决,也比较缺乏耐心。但是我相信,通过几次编程实验的努力完成,吸取经验教训后,我们将会做的更好。
- 然后再来一片面包: 这次编程让我们对对方的编程实力有了更深的了解,也发现只要认真努力对待就可以把工作做好。