GitHub地址:https://github.com/TUOZF/sizeyunsuan.git
- 需求分析
在《实验二 软件工程个人项目》中,同学们实现了一个命令行四则运算出题小程序,本次实验采用结对编程方式,设计开发一个小学生四则运算练习软件,使之具有以下功能:
(1)由计算机从题库文件中随机选择20道加减乘除混合算式,用户输入算式答案,程序检查答案是否正确,每道题正确计5分,错误不计分,20道题测试结束后给出测试总分;
(2)题库文件可采用实验二的方式自动生成,也可以手工编辑生成,文本格式如下:
(3)程序为用户提供三种进阶四则运算练习功能选择:百以内整数算式(必做)、带括号算式、真分数算式练习;
(4)程序允许用户进行多轮测试,提供用户多轮测试分数柱状图,示例如下:
(5)程序记录用户答题结果,当程序退出再启动的时候,可为用户显示最后一次测试的结果,并询问用户可否进行新一轮的测试;
(6)测试有计时功能,测试时动态显示用户开始答题后的消耗时间。
(7)程序人机交互界面是GUI界面(WEB页面、APP页面都可),界面支持中文简体(必做)/中文繁体/英语,用户可以进行语种选择。
- 软件设计
程序流程图
程序类图
- 核心功能代码展示
四则运算结果的判断:
if( Expressions.get(0).equals(answers.get(0)) ) {answer1.setText("正确 "); sum++;} else answer1.setText("错误"); if( Expressions.get(1).equals(answers.get(1)) ) {answer2.setText("正确 "); sum++;} else answer2.setText("错误"); if( Expressions.get(2).equals(answers.get(2)) ) {answer3.setText("正确 "); sum++;} else answer3.setText("错误"); if( Expressions.get(3).equals(answers.get(3)) ) {answer4.setText("正确 "); sum++;} else answer4.setText("错误"); num.add(sum*5+""); //num.add(sum+""); //将判断结果存入文件 try { File f = new File("result.txt"); FileWriter fw = new FileWriter(f,true); PrintWriter pw = new PrintWriter(fw); //pw.println(" 201571030126"); //pw.println(); for(String con:num) { pw.println(con); } fw.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }
计时:
class shishi3 extends Thread { private long noww = 0l; private long start = System.currentTimeMillis();// 程序启动时间的毫秒值 private long time; public void run() { int i=0; while (true) { noww = System.currentTimeMillis();// 获取一秒之后的毫秒值 time = noww - start;// 两个时间相减的到毫秒差 timetime=time; String ssss=String.format("%02d:%02d:%02d ", time / (1000 * 60 * 60) % 60/* 时 */, time / (1000 * 60)% 60/* 分 */, (time / 1000 % 60)/* 秒 */);// 格式化字符串输出 l1.setText(ssss); i++; try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } }
统计结果并绘制柱状图:
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); }
- 程序运行
- 结对过程
- PSP
PSP2.1 |
任务内容 |
计划共完成需要的时间(min) |
实际完成需要的时间(min) |
Planning |
计划 |
20 |
30 |
Estimate |
估计这个任务需要多少时间,并规划大致工作步骤 |
40 |
40 |
Development |
开发 |
360 |
480 |
Analysis |
需求分析 (包括学习新技术) |
10 |
10 |
Design Spec |
设计 |
20 |
30 |
Design Review |
设计复审 |
10 |
10 |
Coding Standard |
代码规范 (为目前的开发制定合适的规范) |
5 |
10 |
Design |
具体设计 |
20 |
20 |
Coding |
具体编码 |
240 |
320 |
Code Review |
代码复审 |
20 |
30 |
Test |
测试(自我测试,修改代码,提交修改) |
20 |
40 |
Reporting |
报告 |
15 |
20 |
Test Report |
测试报告 |
5 |
10 |
Size Measurement |
计算工作量 |
3 |
5 |
Postmortem & Process Improvement Plan |
事后总结 ,并提出过程改进计划 |
5 |
5 |
- 请使用汉堡评价法给你的小伙伴一些点评
本次实验是软件工程第一次用新的模式(结对编程)来进行的,以前和同学也合作过一些作业,但这次作业和以前的不一样,是通过一台电脑来进行编程的,所以合作比以前的更加密切了。刚开始时我们先讨论了实验的大概过程,但是在实验过程中有时候时间会和别的学习有冲突,最后在我们两的协调下对各自的时间进行了调整;刚开始时我们的编程习惯也不是很习惯,所以刚开始时有很多的错误出现,后来我们统一使用了标准的编程规则使得错误巨减;我们遇到分歧时会互相指出对方的优点,从而考虑这些优点进行下一步的选择。最后顺利完成了这次的结对编程。
- 结对编程真的能够带来1+1>2的效果吗?通过这次结对编程,请谈谈你的感受和体会。
个人感觉结对编程会带来1+1>2的效果。一个人编程的时候遇到问题有时候会卡好长时间,有时候很简单的错误也需要好久才能找见,但是结对编程的时候这种问题出现次数比较少,遇到问题时解决问题的思路和时间会很大幅度的减少,经过两个人的讨论会对问题理解的更透彻,效率更高,所以说结对编程和团队合作还是很有必要的。