201571030114/201571030143《小学四则运算练习软件》结对项目报告
一:源码
github地址:https://github.com/Lei-surely/Project3
二:项目报告
1:需求分析
(1)由计算机从题库文件中随机选择20道加减乘除混合算式,用户输入算式答案,程序检查答案是否正确,每道题正确计5分,错误不计分,20道题测试结束后给出测试总分;
(2)题库文件可采用实验二的方式自动生成,也可以手工编辑生成,文本格式如下:
(3)程序为用户提供三种进阶四则运算练习功能选择:百以内整数算式(必做)、带括号算式、真分数算式练习;
(4)程序允许用户进行多轮测试,提供用户多轮测试分数柱状图,示例如下:
(5)程序记录用户答题结果,当程序退出再启动的时候,可为用户显示最后一次测试的结果,并询问用户可否进行新一轮的测试;
(6)测试有计时功能,测试时动态显示用户开始答题后的消耗时间。
(7)程序人机交互界面是GUI界面(WEB页面、APP页面都可),界面支持中文简体(必做)/中文繁体/英语,用户可以进行语种选择。
2. 软件设计:
(1)MainTest()类:调用四则运算模块,即MyFrame()类。
(2)MyFrame()类:点击开始测试按钮,调用CalTest()类,生成题库;点击提交按钮,调用Submit()类,统计结果按钮调用Chart()类,显示多轮答题结果的柱状图。
(3)Submit()类:显示本轮测试的正确答案以及用户提交的答案以及测试的正确率,并让用户选择是进行下一轮还是返回统计结果界面。
(4)CalTest():运算式生成,实现了随机生成一百以内的混合运算。
3. 核心功能代码展示:
(1)计算四则运算界面监听器
//注册监听 2 private void registerListener() { 3 //计时 4 Timer timer = new Timer(1000, new ActionListener() { 5 public void actionPerformed(ActionEvent e) { 6 Date now2 = new Date(now.getTime() + 1000); 7 now = now2; 8 SimpleDateFormat formatter = new SimpleDateFormat("HH:mm:ss"); 9 lbl.setText(formatter.format(now)); 10 } 11 }); 12 btn_begin.addActionListener(new ActionListener() { 13 public void actionPerformed(ActionEvent arg0) { 14 //开始测试函数调用 15 begin(); 16 timer.start(); 17 } 18 }); 19 btn_tj.addActionListener(new ActionListener() { 20 public void actionPerformed(ActionEvent arg0) { 21 timer.stop(); 22 try { 23 submit(); 24 } catch (IOException e) { 25 e.printStackTrace(); 26 } 27 } 28 }); 29 btn_js.addActionListener(new ActionListener() { 30 @Override 31 public void actionPerformed(ActionEvent arg0) { 32 //统计结果函数 33 counts(); 34 } 35 }); 36 }
(2)显示测试结果
private void registerListener() { btn_again.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) { onceagain(); } }); btn_xianshi.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) { File file = new File("answer.txt"); if (file.exists() && file.isFile()) { try { BufferedReader input = new BufferedReader(new FileReader(file)); String text; while ((text = input.readLine()) != null) r_answer.setText(r_answer.getText() + text + "\n"); } catch (IOException ioException) { System.err.println("File Error!"); } } result();//显示测试结果函数调用 try { compare(); } catch (IOException e) { e.printStackTrace(); } } }); btn_exit.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent arg0) { onceagain(); } }); }
//显示测试结果 2 public void result() { 3 File file = new File("result.txt"); 4 if (file.exists() && file.isFile()) { 5 try { 6 BufferedReader input = new BufferedReader(new FileReader(file)); 7 String text; 8 while ((text = input.readLine()) != null) 9 my_answer.setText(my_answer.getText() + text + "\n"); 10 } catch (IOException ioException) { 11 System.err.println("File Error!"); 12 } 13 } 14 } 15 16 //比较结果 17 public int compare() throws IOException { 18 //封装数据源 19 BufferedReader br_a = new BufferedReader(new FileReader("answer.txt")); 20 BufferedReader br_r = new BufferedReader(new FileReader("result.txt")); 21 //封装目的地 22 ArrayList<String> answer = new ArrayList<String>(); 23 ArrayList<String> result = new ArrayList<String>(); 24 //读取数据写到集合中 25 String line1 = null; 26 String line2 = null; 27 28 while((line1 = br_a.readLine())!= null){ 29 answer.add(line1); 30 } 31 while((line2 = br_r.readLine())!= null){ 32 result.add(line2); 33 } 34 //遍历进行比较并计算正确率 35 int i=0; 36 int count=0; 37 for(i=0;i<answer.size();i++) 38 { 39 String s1=answer.get(i); 40 String s2=result.get(i); 41 if(s1.equals(s2)) 42 { 43 count++; 44 } 45 } 46 NumberFormat numberFormat = NumberFormat.getInstance(); 47 numberFormat.setMaximumFractionDigits(2); 48 String s3 = numberFormat.format((float) count / (float)answer.size() * 100); 49 correct.setText("您做对了"+count+"道, "+"正确率为:"+String.valueOf(s3)+"%"); 50 int b=count*5; 51 return b; 52 }
(3)绘制柱状图
//绘制矩形 32 g2.fillRoundRect(leftMargin+step*2, Height-(Height/110)*f-5, 30, (Height/110)*f-3,30, 0); 33 g2.drawString("第"+(i+1)+"轮", leftMargin+step*2,Height-(Height/110)*f-10);
4. 程序运行:
(1)程序启动,点击开始测试按钮出题并开始计时
(2)答题完毕,点击提交按钮提交测试结果,跳转到显示结果页面,点击显示结果按钮后,显示正确结果以及用户测试结果,并计算出正确率。
(3)用户可选择再来一侧或者返回查看测试详细结果图,再来一轮步骤与上面相同,不做赘述,当用户测试几轮完毕,返回点击统计结果按钮
5.描述结对的过程,
6.提供此次结对作业的PSP
PSP2.1 |
任务内容 |
计划共完成需要的时间(min) |
实际完成需要的时间(min) |
Planning |
计划 |
30 |
40 |
· Estimate |
· 估计这个任务需要多少时间,并规划大致工作步骤 |
30 |
40 |
Development |
开发 |
600 |
720 |
·· Analysis |
需求分析 (包括学习新技术) |
60 |
90 |
· Design Spec |
· 生成设计文档 |
30 |
45 |
· Design Review |
· 设计复审 (和同事审核设计文档) |
20 |
30 |
· Coding Standard |
代码规范 (为目前的开发制定合适的规范) |
15 |
20 |
· Design |
具体设计 |
40 |
65 |
· Coding |
具体编码 |
400 |
480 |
· Code Review |
· 代码复审 |
30 |
30 |
· Test |
· 测试(自我测试,修改代码,提交修改) |
25 |
30 |
Reporting |
报告 |
30 |
30 |
·· Test Report |
· 测试报告 |
15 |
15 |
· Size Measurement |
计算工作量 |
10 |
10 |
· Postmortem & Process Improvement Plan |
· 事后总结 ,并提出过程改进计划 |
10 |
15
|
7. 请使用汉堡评价法给你的小伙伴一些点评。
在这次的结对编程中,我的小伙伴是我的好朋友,我们俩人编程能力都不是很强,但是俗话说得好,两个臭皮匠顶个诸葛亮,还是顺利的把这次的项目完成了。我们已经有了很好的默契,所以在合作完成这个项目时起到了很多的作用,基本没有出现很大的分歧,很多想法一拍即合,然后一起讨论编程实现,小伙伴提出了很多好的建议,对我们完成项目至关重要,通过这次项目合作,提升了我们得能力同时也增强了我们得默契,如果以后还有合作,相信也会很顺利。
8. 结对编程真的能够带来1+1>2的效果吗?通过这次结对编程,请谈谈你的感受和体会。
我觉得结对编程带来的效果超过了1+1>2,一个人的时候出现了问题只能自己解决要花费很长的时间,结对编程两个人知识互补,问题很快就能得到解决。并且结对编程大大降低了出错率,为后面的代码测试和审查节省了好多时间,在结对编程的过程中两个人共同学习和解决问题,知识的提升也是大于二的。