结对作业
1.
这个作业属于哪个课程 | https://edu.cnblogs.com/campus/gdgy/InformationSecurity1912-Softwareengineering |
---|---|
这个作业要求在哪里 | https://edu.cnblogs.com/campus/gdgy/InformationSecurity1912-Softwareengineering/homework/12147 |
这个作业的目标 | 组队编写四则运算生成器 |
组员1 | 3119005421 林俊斌 |
组员2 | 3119005412 何斌 |
github:https://github.com/georgebooker13/sorftware_homework_third
2.PSP表格
*PSP2.1* | *Personal Software Process Stages* | *预估耗时(分钟)* | *实际耗时(分钟)* |
---|---|---|---|
Planning | 计划 | 15 | 10 |
· Estimate | · 估计这个任务需要多少时间 | 30 | 20 |
Development | 开发 | 300 | 480 |
· Analysis | · 需求分析 (包括学习新技术) | 30 | 45 |
· Design Spec | · 生成设计文档 | 40 | 40 |
· Design Review | · 设计复审 | 20 | 20 |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 10 | 20 |
· Design | · 具体设计 | 60 | 60 |
· Coding | · 具体编码 | 240 | 180 |
· Code Review | · 代码复审 | 30 | 30 |
· Test | · 测试(自我测试,修改代码,提交修改) | 180 | 200 |
Reporting | 报告 | 40 | 50 |
· Test Repor | · 测试报告 | 20 | 20 |
· Size Measurement | · 计算工作量 | 10 | 10 |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 10 | 20 |
· 合计 | 930 | 1100 |
3.性能分析
可以看到,代码覆盖率总体达到97%,各模块的代码覆盖率达到90%、100%、100%、100%、96%
(运行时间)
4.代码实现过程分析
1)基于二叉树原理生成表达式
实现对一个数学表达式的求值,例如:(1+2)*3 这个表达式的值为 9
这个问题主要要分为如下几个步骤:
- 语法分析: 将字符串表达式转化为数字和操作符的数组,['(' , '1', '+', '2', ')' , '*' , '3']
- 转逆波兰表达式: 将中缀表达式转后缀表达式,['1', '2', '3', '+', '*']
- 逆波兰表达式求值: 9
2)模块结构
5.运行测试分析
1)使用 -n 参数控制生成题目的个数;使用 -r 参数控制题目中数值(自然数、真分数和真分数分母)的范围,格式如下:
python main.py -n 10 -r 10
(默认)
2)生成的题目存入执行程序的当前目录下的Exercises.txt文件
(生成文件于output文件夹中)
3)在生成题目的同时,计算出所有题目的答案,并存入执行程序的当前目录下的Answers.txt文件
(生成文件于output文件夹中)
4)程序支持对给定的题目文件和答案文件,判定答案中的对错并进行数量统计
统计结果输出到文件Grade.txt*
(生成文件于output文件夹中)
(看得出来第1、2、3道题这3道题是正确的,第4、5、6、7、8、9、10题这7道题是错误的)
5)可生成10000道题
6.代码说明分析
1)生成的题目中计算过程不能产生负数,也就是说算术表达式中如果存在形如e1− e2的子表达式,那么e1≥ e2。
operator.lt(value1, value2):
raise NegativeError()
else:
answer = operator.sub(value1, value2)
判断value1是否小于value2,通过operator的lt方法,若value1<value2则返回1,否则返回0;
当被减数大于减数的时则抛出异常。
2)生成的题目中如果存在形如e1÷ e2的子表达式,那么其结果应是真分数。
def convert_fraction(answer):
if (answer > 1 or answer < -1) and answer.denominator != 1:
answerNumerator = answer.numerator % answer.denominator
answerDenominator = answer.denominator
answerRight = fractions.Fraction(answerNumerator, answerDenominator)
answerLeft = answer.numerator // answer.denominator
result = str(answerLeft) + '\'' + str(answerRight)
else:
result = str(answer)
return result
对分母为0进行抛出异常:
3)程序一次运行生成的题目不能重复,即任何两道题目不能通过有限次交换+和×左右的算术表达式变换为同一道题目。
通过二叉树来实现题目的生成与查重
4)测试运行代码
7.项目小结
1)
组员1林俊斌的感受:
对于这次项目,这我认为挺难的,涉及到的具体知识较为广泛,我负责的是代码实现的过程,查阅了很多资料,重新复习了二叉树,学会了怎么使用逆波兰树原理进行查重。对于项目,我先是与组员何斌进行了一番交流,规划了各自要负责的部分,并且我们俩有问题都有在交流与解决,就是为了让此次项目的实现更加完整和高效。这次我与小组有了很愉快的合作,我也会虚心学习,做好自己负责的那一部分,让整个合作更加的高效。
组员2何斌的感受:
这次结对项目,我负责的是简单的代码模块的设计,用的是面向对象的思想,为此我翻阅了很多博客,从中学到了很多。在这过程中,我学习了很多python的基础语法,重新温习了数据结构的二叉树。还有很重要的一点是,我明白了在结对项目中,要多与组员交流,有任何想法都可以提出,这样在实现的过程中才能够更高效。同时,我也希望自己能够坚持阅读代码,认真学习代码的设计与编写,这样我的专业能力才能够有提升,才能够小组中贡献更大的一份力。
2)参考博客:
https://segmentfault.com/a/1190000021240147?sort=newest