源码地址链接: https://github.com/devilwjy/Second
需求分析:
(1)由计算机从题库文件中随机选择20道加减乘除混合算式,用户输入算式答案,程序检查答案是否正确,每道题正确计5分,错误不计分,20道题测试结束后给出测试总分;
(2)题库文件可采用实验二的方式自动生成,也可以手工编辑生成,文本格式如下:
(3)程序为用户提供三种进阶四则运算练习功能选择:百以内整数算式(必做)、带括号算式、真分数算式练习;
(4)程序允许用户进行多轮测试,提供用户多轮测试分数柱状图,示例如下:
(5)程序记录用户答题结果,当程序退出再启动的时候,可为用户显示最后一次测试的结果,并询问用户可否进行新一轮的测试;
(6)测试有计时功能,测试时动态显示用户开始答题后的消耗时间。
(7)程序人机交互界面是GUI界面(WEB页面、APP页面都可),界面支持中文简体(必做)/中文繁体/英语,用户可以进行语种选择。
软件设计:
类图:
流程图:
各个模块的功能:
(1)calculate()类:随机生成整数或者分数四则运算题目。
(2)Main()类:调用calculate类随机生成四则运算表达式,调用选择模块,即Select()类。
(3)Select()类:让用户登录,并选择练习的题目类型,整数题或者分数题。
(4)Test()类:生成UI界面,方便用户进行练习。
(5)Summary()类:显示本轮的所得分数并打印出错误题目及其答案,让用户选择是否进行下一轮练习,或者选择进行“总结”,即查看分数柱状图。
(6)Histogram()类:画出每一轮得分的分数柱状图。
(7)TimerThread()类:产生计时功能,帮助用户计时。
核心代码:
计时功能:新建一个JFrame显示计时,同时将其位置设置在最上面放置,这样在做题的过程中可以实时查看。
1 public class TimerThread extends JFrame implements Runnable 2 { 3 private JFrame frame; 4 private JPanel timePanel; 5 private JLabel timeLabel; 6 private JLabel displayArea; 7 private String DEFAULT_TIME_FORMAT = "HH:mm:ss"; 8 private int ONE_SECOND = 1000; 9 int time = 1; 10 boolean isRun = true; 11 public TimerThread() 12 { 13 timePanel = new JPanel(); 14 timeLabel = new JLabel("您本次用时:"); 15 displayArea = new JLabel(); 16 timePanel.add(timeLabel); 17 timePanel.add(displayArea); 18 this.add(timePanel); 19 this.setDefaultCloseOperation(EXIT_ON_CLOSE); 20 this.setBounds(800, 100, 200, 80); 21 } 22 public void run() 23 { 24 while(isRun) 25 { 26 try { 27 displayArea.setText(+time+"s"); 28 time++; 29 Thread.sleep(1000); 30 } catch (InterruptedException e) { 31 e.printStackTrace(); 32 } 33 } 34 } 35 }
分数柱状图:在JFrame中加一个JPanel,然后在JPanel中加入矩形框和Label。
1 public class Histogram extends JPanel 2 { 3 private int x; 4 private static int length ; 5 int i=0; 6 public int[] count; 7 ArrayList<JLabel> label = new ArrayList<JLabel>(); 8 public Histogram(final ArrayList<String> summer) 9 { 10 length = summer.size(); 11 count = new int[length]; 12 System.out.print(length); 13 this.setLayout(null); 14 for(int i=0;i<summer.size();i++) 15 { 16 count[i] = Integer.parseInt(summer.get(i));//将每轮练习所得分数传进count[i] 17 } 18 for(int i=1;i<summer.size();i=i+2) 19 { 20 JLabel Label = new JLabel("第"+((i+1)/2)+"轮",JLabel.LEFT);//显示第几轮 21 Label.setFont(new Font("SansSerif", Font.BOLD + Font.ITALIC, 18)); 22 Label.setBounds(30+(i-1)*30, 610, 60,50);//给Label1设置位置 23 JLabel Label2 = new JLabel(count[i]+"",JLabel.CENTER);//显示分数 24 Label2.setFont(new Font("SansSerif", Font.BOLD + Font.ITALIC, 18)); 25 Label2.setBounds(25+(i-1)*30, 555-6*count[i], 60,50);//给Label2设置位置 26 label.add(Label); 27 label.add(Label2); 28 this.add(label.get(i-1)); 29 this.add(label.get(i)); 30 } 31 } 32 protected void paintComponent(Graphics g) 33 { 34 int x=10; 35 g.setColor(Color.red); 36 for (int i = 0; i < count.length; i++) 37 { 38 g.fillRect(x, 600-6*count[i], 30,6*count[i] ); 39 x += 30; 40 } 41 } 42 }
测试运行:
登录界面:输入学号和姓名,并选择做整数练习还是分数练习。
选择整数练习:开始答题并且计时。
答题完毕后:显示所得分数以及错误的题目和答案,同时计时停止,选择再来一轮或者是查看分数柱状图。
选择分数练习:开始答题并且计时。
答题完毕后:显示所得分数以及错误的题目和答案,同时计时停止,选择再来一轮或者是查看分数柱状图。
答题结束后,根据几轮练习的得分画出分数柱状图。
结对过程:
我们是一起设计的UI界面,因为没有什么分歧,所以初步设计定下来的很快。在代码实现部分因为会有很多大大小小的问题,所以两个人很是苦恼,除了有重要的事离开一段时间之外,整个周末的时间从早到晚都用来做这个项目,最后的结果还是不错的,差不多的功能都实现了,初次结对编程也进行的很愉快。
结对作业的PSP:
PSP |
任务内容 |
计划完成需要的时间(min) |
实际完成需要的时间(min) |
Planning |
计划 |
60 |
100 |
Estimite |
估计任务所需时间,并规划大致工作步骤 |
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 |
汉堡评价法点评小伙伴:
我的小伙伴能力很强,跟她结对编程很轻松。因为她的逻辑思维能力很好,可以将全部代码串联起来,在代码出现错误时,排除一些不可能的原因,快速准确的找到症结所在;她的编程能力很强,在她的主导下,我们从开始的程序总体设计到后来的设计实现进行的都比较顺利;她的思维也很快,有时候我还没有反应过来她的代码已经敲好了,只等运行验证了;她的耐力很强,可以一直坐在电脑前面改很久的程序,不会不耐烦。测试程序的过程中,哪里有不足,我们两个人可以商量着进行修改。总体来说,跟她的合作很顺利,很开心。
感受和体会:
两个人结对编程确实比一个人单独写要高效,所以说1+1有时候真的是大于2的。两个人在初开始的设计上观点都差不多,所以没有异议的按照设计开始实现,我的编程能力比较差,但是她的编程能力很强,她在一些细节处理上可能会注意不到,而我在旁边可以提醒她,这正好可以互补,把各自擅长的发挥出来,比一个人写要快得多,往往我不会的地方,她可能会,或者她忽视的小问题,我会多加注意。两个人在一起发挥出来的能量有时候是超出预期的,而且两个人一起编程,可以互相鼓励,互相监督,共同进步。