源码在Github的仓库主页链接地址
https://github.com/devilwjy/Second
a. 需求分析:
(1)总体需求:由计算机从题库文件中随机选择20道加减乘除混合算式,用户输入算式答案,程序检查答案是否正确,每道题正确计5分,错误不计分,20道题测试结束后给出测试总分;
(2)题库文件可采用实验二的方式自动生成,也可以手工编辑生成,文本格式如下:
(3)程序为用户提供三种进阶四则运算练习功能选择:百以内整数算式(必做)、带括号算式、真分数算式练习;
(4)程序允许用户进行多轮测试,提供用户多轮测试分数柱状图,示例如下:
(5)程序记录用户答题结果,当程序退出再启动的时候,可为用户显示最后一次测试的结果,并询问用户可否进行新一轮的测试;
(6)测试有计时功能,测试时动态显示用户开始答题后的消耗时间。
(7)程序人机交互界面是GUI界面(WEB页面、APP页面都可),界面支持中文简体(必做)/中文繁体/英语,用户可以进行语种选择。
b. 软件设计:
各个模块的主要功能:
(1)Main()类:利用calculate类生成表达式,调用选择模块,即Select()类。
(2)Select()类:让用户登录,并选择答整数题还是分数题。
(3)Test()类:生成用户答题的界面。
(4)Summer()类:显示本轮的分数并打印错误题目及答案,并让用户选择是做下一轮题还是看看做题情况。
(5)Histogram()类:画出每一轮的统计图。
(6)TimerThread()类:产生计时功能。
c. 核心功能代码展示:
1、下面为画统计图的代码:主要方法为在JFrame内加入Jpanel,在Jpane加入矩形框,和Label。
public Histogram(final ArrayList<String> summer) { length = summer.size(); count = new int[length]; System.out.print(length); this.setLayout(null); for(int i=0;i<summer.size();i++) { count[i] = Integer.parseInt(summer.get(i)); } for(int i=1;i<summer.size();i=i+2) { JLabel Label = new JLabel("第"+((i+1)/2)+"轮",JLabel.LEFT); Label.setFont(new Font("SansSerif", Font.BOLD + Font.ITALIC, 18)); Label.setBounds(30+(i-1)*30, 610, 60,50); JLabel Label2 = new JLabel(count[i]+"",JLabel.CENTER); Label2.setFont(new Font("SansSerif", Font.BOLD + Font.ITALIC, 18)); Label2.setBounds(25+(i-1)*30, 555-6*count[i], 60,50); label.add(Label); label.add(Label2); this.add(label.get(i-1)); this.add(label.get(i)); } } protected void paintComponent(Graphics g) { int x=10; g.setColor(Color.red); for (int i = 0; i < count.length; i++) { g.fillRect(x, 600-6*count[i], 30,6*count[i] ); x += 30; } }
2、下面为显示答题时间的代码(新建了一个JFrame让它显示,但是必须设置它为最上面放置)。
public class TimerThread extends JFrame implements Runnable { private JFrame frame; private JPanel timePanel; private JLabel timeLabel; private JLabel displayArea; private String DEFAULT_TIME_FORMAT = "HH:mm:ss"; private int ONE_SECOND = 1000; int time = 1; boolean isRun = true; public TimerThread() { timePanel = new JPanel(); timeLabel = new JLabel("您本次用时:"); displayArea = new JLabel(); timePanel.add(timeLabel); timePanel.add(displayArea); this.add(timePanel); this.setDefaultCloseOperation(EXIT_ON_CLOSE); this.setBounds(800, 100, 200, 80); } public void run() { while(isRun) { try { displayArea.setText(time+"s"); time++; Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } }
d. 程序运行:程序运行时每个功能界面截图。
1、输入学号和姓名,选择答分数还是整数:
2、如果选择整数,开始答题与计时(图片很大,放不下)。
3、查看得分和用时,并显示错误题目和答案(图片很大,放不下)。
4、再来一轮:
5、如果选择分数:
6、查看的分和用时:
7、经过多轮测试后,点总结,统计图如下:
e.描述结对的过程,提供两人在讨论、细化和编程时的结对照片(非摆拍)。
f.提供此次结对作业的PSP
PSP2.1 |
任务内容 |
计划共完成需要的时间(min) |
实际完成需要的时间(min) |
Planning |
计划 |
60 |
100 |
· Estimate |
· 估计这个任务需要多少时间,并规划大致工作步骤 |
60 |
100 |
Development |
开发 |
890 |
1256 |
·· Analysis |
需求分析 (包括学习新技术) |
6 |
10 |
· Design Spec |
· 生成设计文档 |
30 |
20 |
· Design Review |
· 设计复审 (和同事审核设计文档) |
4 |
6 |
· Coding Standard |
代码规范 (为目前的开发制定合适的规范) |
30 |
20 |
· Design |
具体设计 |
100 |
150 |
· Coding |
具体编码 |
600 |
700 |
· Code Review |
· 代码复审 |
120 |
200 |
· Test |
· 测试(自我测试,修改代码,提交修改) |
100 |
150 |
Reporting |
报告 |
38 |
32 |
·· Test Report |
· 测试报告 |
3 |
2 |
· Size Measurement |
计算工作量 |
5 |
10 |
· Postmortem & Process Improvement Plan |
· 事后总结 ,并提出过程改进计划 |
30 |
20 |
g. 请使用汉堡评价法给你的小伙伴一些点评。
刚开始我们都说了各自设计本次项目的想法,基本差不多,稍微有点不一样的想法我们就择优选取了。可以说是配合的相当默契,并不是谁写谁的,而是一个人看一个人写,遇到问题商量,商量不出来就百度。刚开始我觉得分工比较好,效率高,但是合作后才发现并不是这样,一个人写会马虎或者想不明白,然后就卡在那了,而一起写会注意对方是否马虎写错了,或者遇到不会的时候可以商量,一经商量就迎刃而解了。重点是我的小伙伴相当有耐心,认真的听取我的想法,而且我打字很慢,容易打错,她总是一直提醒我。她动手能力很强,而且反应很快,我看她写的时候,有时候都跟不上节奏,每次我们约着写代码她都相当积极,总之就一句话,合作很好,小伙伴更好!很期待下次与她的合作!(注明:我们宿舍就在隔壁,天天在宿舍商量着写,所以在github基本没怎么传代码)
h. 结对编程真的能够带来1+1>2的效果吗?通过这次结对编程,请谈谈你的感受和体会。
有,这个绝对有,举个例子,(1)我的小伙伴说,让我把我们写的代码写一部分后给她发一份,不然丢了咋办,我觉得没事,一般丢不了,结果第二天我们果真丢了一个类里面的代码,重新写了一遍。唯一的想法就是听她的该多好,(2)我在写代码的时候总是会马虎,一个小小的问题马虎了,类似于数组溢出的那种错误,程序报错了,因为程序代码量比较大,一查就是几个小时,有了小伙伴的提醒,我马虎出错的次数基本没有了,(3)有时候我写代码,运行的结果并不是我想象的结果,然后我就和小伙伴重新把代码审核一遍,一下子就找到问题出在哪了。如果我一个人审核,第一当局者迷,自己就又跟着错误的思路走了,第二,自己找着找着就反应不过来了。(4)在设计界面的时候因为组件特别多,一个人根本盯不住。(5)我写的反应不过来了或累了她接着写。不然一直写,会大脑跟不上节奏。再多的例子我就不举了,上面的一些例子足以说明我在这次写代码中因为有了小伙伴,节省了大量的时间。而且设计的界面我也很满意,我们一直在计算组件该放的位置,看起来算是比较简洁大方了。