结对编程项目-四则运算
结对编程项目-四则运算
什么是结对编程?
引用《构建之法》-4.5.2
在结对编程模式下,一对程序员肩并肩地、平等地、互补地进行开发工作。两个程序员并排坐在一台电脑前,面对同一个显示器,使用同一个键盘,同一个鼠标一起工作。他们一起分析,一起设计,一起写测试用例,一起编码,一起单元测试,一起集成测试,一起写文档等。
结对编程不是程序开发者独到的发明,在现实生活中,也存在着类似的搭档关系(Partnership):
- 越野赛车(驾驶,领航员)
- 驾驶飞机(驾驶,副驾驶)
- 战斗机的编组(长机,僚机)
...
结对编程中有两个角色:
- 驾驶员(Driver)是控制键盘输入的人。
- 领航员(Navigator)起到领航、提醒的作用。
这两个角色是可以互换的。和现实生活中的例子类似,一个人负责具体的执行(驾驶,用键盘编辑程序等),另一人负责导航、检查、掩护等。
详见:邹老师博客
准备
花5分钟选择自己的结对小伙伴。
需求
实现一个命令行程序,要求:
- 自动生成小学四则运算题目(加、减、乘、除)
- 支持整数
- 支持多运算符(比如生成包含100个运算符的题目)
- 支持真分数
- 统计正确率
例如以下的运行示例:
请输入要生成的题目数:<输入6>
题目1:
3 + 4 = <输入7>
正确!
题目2:
5 ÷ 8 = <输入5/6>
错误,正确答案为:5/8
题目3:
2/3 - 1/5 = <输入7/15>
正确!
题目4:
1/6 * 3/7 = <输入3/42>
正确!
题目5:
10 - 5 * 4 = <输入20>
错误,正确答案为:-20
题目6:
(1/3 + 1/2) * 11/20 = <输入55/120>
错误,正确答案为:11/24
完成6道题目,正确率为50%
HINTS:
如何对表达式求值,请参考:
- 逆波兰表示法
- 调度场算法
扩展需求
-
文件:
- 处理生成题目并输出到文件
- 完成题目后从文件读入并判题
-
多语言支持:
简体中文
,繁體中文
,English
-
生成题目去重
引用自:http://www.cnblogs.com/jiel/p/4810756.html程序一次运行生成的题目不能重复,即任何两道题目不能通过有限次交换+和×左右的算术表达式变换为同一道题目。例如,23 + 45 = 和45 + 23 = 是重复的题目,6 × 8 = 和8 × 6 = 也是重复的题目。3+(2+1)和1+2+3这两个题目是重复的,由于+是左结合的,1+2+3等价于(1+2)+3,也就是3+(1+2),也就是3+(2+1)。但是1+2+3和3+2+1是不重复的两道题,因为1+2+3等价于(1+2)+3,而3+2+1等价于(3+2)+1,它们之间不能通过有限次交换变成同一个题目。
更多参考
http://www.cnblogs.com/xinz/p/3803035.html
要求
-
第一周(2017-5-14 23:59截止)输出阶段总结博客
- 需求分析
- 设计思路
- 整数/多运算符(题目生成/题目运算判题)
- JUnit测试
- 扩展需求
-
第二周(2017-5-21 23:59截止)输出整体总结博客
- 设计思路
- 真分数(题目生成/题目运算判题)
- JUnit测试
- 扩展需求
-
如第一周完成比较轻松,可继续完成第二周内容,不必等
-
博客(两周都需要输出以下完整内容)
- 结对编程的两位同学须各自发表博客
- 博客需描述各环节的输出,如:
- 需求分析(描述自己对需求的理解,以及后续扩展的可能性)
- 设计思路(同时输出UML类图)
- 实现过程中的关键代码解释
- 测试方法
- 运行过程截图
- 代码托管地址
- 遇到的困难及解决方法
- 对结对的小伙伴做出评价(重点指出需要改进的地方)
- 博客内容中如需展示两人的共同成果,请进行说明
- 如有参考或引用的设计、实现,请进行说明
-
PSP
-
实现之前先在PSP中预估时间
-
实施后各个环节实际花费多少时间也请做记录
-
表中有一项: Estimate 指的“预估”这个活动,“预估时间”也是一项任务。
- 例如:我估计自己需要花30分钟来估算出整个项目需要多少时间完成,结果我花了20分钟估算出整个项目需要6个小时完成。Estimate这一项应该在“预估耗时”填写30分钟,实际耗时填写“20”分钟。
-
一级和二级活动的包含关系:
- Planning 这个一级活动包含了1个二级活动(Estimate)
- Development 这个一级活动包含了8个二级活动
- Reporting 这个一级活动包含了3个二级活动
-
大家在记录时间的时候, 只用记录二级活动, 然后把总数加了, 就是相应的一级活动的时间
-
这个时间的长短并不会对分数有直接影响,这是为了大家自己总结。
-
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | ||
· Estimate | · 估计这个任务需要多少时间 | ||
Development | 开发 | ||
· Analysis | · 需求分析 (包括学习新技术) | ||
· Design Spec | · 生成设计文档 | ||
· Design Review | · 设计复审 (和同事审核设计文档) | ||
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | ||
· Design | · 具体设计 | ||
· Coding | · 具体编码 | ||
· Code Review | · 代码复审 | ||
· Test | · 测试(自我测试,修改代码,提交修改) | ||
Reporting | 报告 | ||
· Test Report | · 测试报告 | ||
· Size Measurement | · 计算工作量 | ||
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | ||
合计 |
打分细则
-
本次作业满分100分
-
不按时交作业,0分
-
越期一周不交作业,倒扣本次作业分数
-
作业检查项:
- 正确生成题目 10分
- 正确判题 10分
- 真分数支持 10分
- 正确率统计 5分
- 测试 10分
- 扩展需求
- 生成题目并输出到文件 5分
- 完成题目后读入文件判题 5分
- 支持多语言 5分
- 支持生成题目去重 5分
- 博客
- 基础分(按时提交)5分
- PSP表格 5分
- 需求分析 5分
- 设计思路 5分
- 实现过程中的关键代码解释 5分
- 遇到的困难及解决方法 5分
- 对结对小伙伴做出评价 5分
-
附加分:在作业过程及时反馈,提供建议被采纳可追加附加分,最高不超过10分
-
严禁抄袭,违反者列入抄袭作业者的曝光台
参考建议
以下只是作为参考的建议,不是要求,同学们可以提出自己的想法和设计,体现在自己的博客中
-
大概功能划分
- 题目生成
- 可独立使用
- 考虑可扩展支持配置生成不同难度的题目,比如通过参数指定:
- 运算符个数范围
- 运算符限定(小学一年级题目只生成
+
-
题目)
- 题目合法性判断
- 可独立使用
- 可用于测试生成题目的正确性
- 可用于以下输入的合法性检测
- 题目运算(判题)
- 可独立使用
- 转换为后缀表达式(当然你也可以直接计算中缀表达式)
- 题目去重
- 可独立使用
- 考虑支持不同的去重级别,比如:
- Level 0:字符串相同算重复 --
1 + 2
,2 + 1
算不同题目 - Level 1:满足交换律算重复 --
1 + 2
,2 + 1
算相同题目 - Level ...
- Level n: 参考以上 扩展需求
- Level 0:字符串相同算重复 --
- 题目生成
-
测试
- 题目生成测试
- 最直接的就是人肉看输出是否合法
- 效率低
- 容易出错
- 题目合法性判定程序
- 自动化
- 如何测试自己的判定程序是准确无误的?
- 最直接的就是人肉看输出是否合法
- 题目运算测试
-
正确性测试
- 手动准备题目
- 利用题目生成程序
- 利用第三方运算工具做运算结果对比,比如Linux
bc
-
错误处理测试, 比如输入以下非法表达式,能否正常工作:
"2394809+sdk*fsdjsakldf-"
"+2 3 4 ***"
""
- ...
-
- 压力测试
- 生成100个、1000个运算符题目
- 运算100个、1000个运算符题目
- 生成100万道题目需要多长时间
- 运算100万道题目需要多长时间
- 题目生成测试