结对伙伴博客地址:http://www.cnblogs.com/zhangcunhui/
Github仓库主页链接地址:https://github.com/huicunzhang/Sizeyunsuan2
- 需求分析
1. 由计算机从题库文件中随机选择20道加减乘除混合算式,用户输入算式答案,程序检查答案是否正确,每道题正确计5分,错误不计分,20道题测试结束后给出测试总分;
2. 题库文件可采用实验二的方式自动生成,也可以手工编辑生成,文本格式如下:
(3)程序为用户提供三种进阶四则运算练习功能选择:百以内整数算式(必做)、带括号算式、真分数算式练习;
(4)程序允许用户进行多轮测试,提供用户多轮测试分数柱状图,示例如下:
(5)程序记录用户答题结果,当程序退出再启动的时候,可为用户显示最后一次测试的结果,并询问用户可否进行新一轮的测试;
(6)测试有计时功能,测试时动态显示用户开始答题后的消耗时间。
(7)程序人机交互界面是GUI界面(WEB页面、APP页面都可),界面支持中文简体(必做)/中文繁体/英语,用户可以进行语种选择。
- 设计类图:
Start类:用来创建进入系统的界面;
SimpleFrame类:做题界面、随机出题、调用shishi3类中的计时功能;
Sort类:成绩汇总界面,以柱状图的形式展现,用数组记录每次测试的结果。
- 程序流程图:
- 核心代码:
判断结果对错的代码:
1 if( Expressions.get(0).equals(answers.get(0)) ) 2 {answer1.setText("正确 "); sum++;} 3 else 4 answer1.setText("错误"); 5 6 if( Expressions.get(1).equals(answers.get(1)) ) 7 {answer2.setText("正确 "); sum++;} 8 else 9 answer2.setText("错误"); 10 11 if( Expressions.get(2).equals(answers.get(2)) ) 12 {answer3.setText("正确 "); sum++;} 13 else 14 answer3.setText("错误"); 15 16 if( Expressions.get(3).equals(answers.get(3)) ) 17 {answer4.setText("正确 "); sum++;} 18 else 19 answer4.setText("错误"); 20 21 22 23 num.add(sum*5+""); 24 //num.add(sum+""); 25 //将判断结果存入文件 26 try { 27 File f = new File("result.txt"); 28 FileWriter fw = new FileWriter(f,true); 29 PrintWriter pw = new PrintWriter(fw); 30 for(String con:num) 31 { 32 pw.println(con); 33 } 34 35 fw.close(); 36 37 } catch (IOException e) { 38 // TODO Auto-generated catch block 39 e.printStackTrace(); 40 }
计时器代码:
1 class shishi3 extends Thread { 2 private long noww = 0l; 3 private long start = System.currentTimeMillis();// 程序启动时间的毫秒值 4 private long time; 5 public void run() { 6 int i=0; 7 while (true) { 8 9 noww = System.currentTimeMillis();// 获取一秒之后的毫秒值 10 time = noww - start;// 两个时间相减的到毫秒差 11 timetime=time; 12 String ssss=String.format("%02d:%02d:%02d ", 13 time / (1000 * 60 * 60) % 60/* 时 */, 14 time / (1000 * 60)% 60/* 分 */, 15 (time / 1000 % 60)/* 秒 */);// 格式化字符串输出 16 17 l1.setText(ssss); 18 i++; 19 try { 20 Thread.sleep(1000); 21 } catch (InterruptedException e) { 22 e.printStackTrace(); 23 } 24 25 } 26 } 27 }
柱状图代码:
int Width = 400; int Height = 450; Random ran = new Random(); int leftMargin = 15;//柱形图左边界 int topMargin = 50;//柱形图上边界 Graphics2D g2 = (Graphics2D) g; g2.translate(50, 100); int ruler = Height-topMargin-5; int rulerStep = ruler/10;//将当前的高度评分为10个单位 g2.setColor(Color.gray);//绘制白色背景 g2.fillRect(0, 0, Width, Height);//绘制矩形图 g2.setColor(Color.LIGHT_GRAY); for(int i=0;i<=10;i++) {//绘制灰色横线和百分比 g2.drawString((100-10*i)+"", 10, topMargin+rulerStep*i);//写下百分比 g2.drawLine(10, topMargin+rulerStep*i, Width, topMargin+rulerStep*i);//绘制灰色横线 } g2.setColor(Color.PINK); for(int i=0;i<4;i++) {//绘制柱形图 int value =save[i]*4;// ran.nextInt(Height-topMargin-10)+10;//随机产生柱形的百分比 int step = (i+1)*35;//设置每隔柱形图的水平间隔为40 //绘制矩形 g2.fillRoundRect(leftMargin+step*2, Height-value-10, 40, value, 40, 10); //g2.fillRoundRect(leftMargin+step*2, Height-value, 40, value, 40, 10); //列出产品的编号 g2.drawString("测试"+(i+1), leftMargin+step*2, Height-value-15); }
- 运行结果:
- 结对过程:
- 总结与评价:
在本次结对过程中,我和我的小伙伴先通过查阅资料对软件系统进行了详细的设计,并作了合理的分工,但理想很丰满,现实过于骨感呐,由于双方编程基础都比较弱,开始去编程的时候出现了很多的困难,没办法,只好再次进行设计,去了很多复杂的东西,从简单的功能入手,等到程序能运行之后再慢慢进行补充。由于双方都不是很要强的那种,加之关系也好,在合作过程中能比较愉快地交流。
对于结对编程真的能够带来1+1>2的效果的说法,我自己是很赞同的,以前一个人编程完成实验项目,就算完成了也仍然会存在很多的问题,发现问题不及时,后知后觉的,但在此次结对过程中,我深切体会到了合作的力量,结对完成项目,无论在设计还是编程实现过程中,都能让该过程实现得堪称完美,存在的问题能得到及时的反馈、纠正,但前提是沟通要到位。结对完成还能收获其他的很多东西,比方说合作能力,通过结对,合作能力能得到不断提升。
- PSP:
PSP2.1 |
任务内容 |
计划共完成需要的时间(min) |
实际完成需要的时间(min) |
Planning |
计划 |
10 |
10 |
· Estimate |
· 估计这个任务需要多少时间,并规划大致工作步骤 |
10 |
10 |
Development |
开发 |
1302 |
1065 |
·· Analysis |
需求分析 (包括学习新技术) |
10 |
20 |
· Design Spec |
· 生成设计文档 |
5 |
5 |
· Design Review |
· 设计复审 (和同事审核设计文档) |
2 |
5 |
· Coding Standard |
代码规范 (为目前的开发制定合适的规范) |
5 |
5 |
· Design |
具体设计 |
30 |
25 |
· Coding |
具体编码 |
1200 |
960 |
· Code Review |
· 代码复审 |
30 |
20 |
· Test |
· 测试(自我测试,修改代码,提交修改) |
20 |
25 |
Reporting |
报告 |
25 |
28 |
·· Test Report |
· 测试报告 |
10 |
5 |
· Size Measurement |
计算工作量 |
5 |
3 |
· Postmortem & Process Improvement Plan |
· 事后总结 ,并提出过程改进计划 |
10 |
20 |