结对项目
这个作业来自哪个班级 | https://www.cnblogs.com/Liao-Ying/p/18063083 |
---|---|
这个作业要求在哪里 | https://edu.cnblogs.com/campus/gdgy/SoftwareEngineering2024/homework/13137 |
这个作业目标 | 结对完成一个小学运算题目自动生成的程序 |
姓名 | 学号 |
---|---|
廖莹 | 3222004640 |
邓金玲 | 3221003139 |
github地址:https://github.com/3222004640/3222004640
一、PSP表格:
PSP | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 60 | 50 |
Estimate | 估计这个任务需要多少时间 | 600 | 1000 |
Development | 开发 | 1200 | 1000 |
Analysis | 需求分析 (包括学习新技术) | 240 | 360 |
Design Spec | 生成设计文档 | 60 | 30 |
Design Review | 设计复审 | 60 | 25 |
Coding Standard | 代码规范 | 60 | 30 |
Design | 具体设计 | 70 | 40 |
Coding | 具体编码 | 1000 | 1200 |
Code Review | 代码复审 | 60 | 50 |
Test | 测试(自我测试,修改代码,提交修改) | 120 | 80 |
reporting | 报告 | 90 | 90 |
Test Report | 测试报告 | 60 | 80 |
Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 60 | 50 |
总计 | 3680 | 4085 |
二、需求分析
- 需求分析在题目的需求和说明中已经讲解的非常清楚了,在思考需求分析的时候,我发现有几点是比较难实现了。比如,e1− e2的子表达式,那么e1≥ e2该点,要确保e1>=e2,刚开始的我一直在思考如何把两个字符串算术表达式比较大小,后来发现python中有一个numexpr库,可以直接将其计算出来就可以比较大小了。
三、设计实现过程:
1、算法思路
(1)生成题目部分:本算法就通过随机生成数来控制生成题目的类型和运算符的个数,生成一个运算符的题目generate_integer_two()是通过随机生成两个数字和一个运算符来组成,生成两个运算的题目generate_integer_three()则是在generate_integer_two()的基础上再随机生成一个数字和一个运算符来组成,同理,generate_integer_four()是在generate_integer_three()的基础上形成的,在题目生成的基础上调用insert()随机插入(),每一次生成题目都会保证被除数不能为0,且调用计算函数calculation()判断结果会不会为负,如果为负则重新生成。
(2)计算答案部分:通过调用python的sympy库来计算,由于该方法计算出来的结果全部是分数,需要对结果进行进一步处理,如果分子能整除分母,则返回整数,如果分子不能整除分母,则将分数化成最简,且是真分数,如果计算结果为负,返回"0"。
(3)比较答案对错部分:打开两个要对比的文件,按行读取文件,然后比较,将相同的行数和不相同的行数分别记录下来。
2、函数调用
四、代码说明
(1)生成整数题目:
生成一个运算符的题目generate_integer_two()是通过随机生成两个数字和一个运算符来组成,生成两个运算的题目generate_integer_three()则是在generate_integer_two()的基础上再随机生成一个数字和一个运算符来组成,同理,生成三个运算符是在生成两个运算符的基础上形成的
(2)生成分数题目
分数的本质是除法,生成一个分数需要两个数字和一个"",生成的每一个分数都要判断是否符合规范,不符合需要化简
(3)随机插入括号:通过生成随机数控制插入括号的个数,观察左右括号能插入的位置,随机插入,比如左括号可以插入的位置数字的前面,可以是0、2...表达式结尾前两个位置
五、测试运行:
单元测试部分代码:
单元测试覆盖率:
运行结果:就目前测试来看,根据题目运算出来的结果没有问题,每个函数也通过了单元测试,所以我们认为这个程序应该没有问题
六、性能分析:
目前本算法中消耗最大的函数是generate_integer_two()和static_error(),因为无论生成运算符为多少个的题目都会调用它generate_integer_three(),而statistics_error()需要对比文件每一行内容,我们并没有想到这个函数消耗那么大。
改进思路:对于generate_integer_two()采用递归的办法生成题目,每次生成一个子表达式,深度减1,直至深度为0。由于题目要求运算符不能超过三个,所以本题采用递归的方法效率比上面的算法效率更高,但是由于时间关系,只是初步完成了该算法生成题目的部分,还没有实现全部要求,故没有将优化后的程序及代码放出来,但是后续我们会继续完成利用该算法实现的程序,而对于statistics_error(),目前还没有想到更好的办法。
七、项目小结
成败:虽然我们的程序已经实现了大部分要求,但程序在生成题目和计算上还有一些缺陷,比如分数的运算只实现了一位运算符这一种情况(性能优化那里提出的方法可以解决这一问题)还有有题目的查重没有实现。
感受:
邓金玲: 我和廖莹同学一起完成了这个项目,从思考题目的要求到使用代码实现,我们都在每一次编写代码中学习到更多的编程知识以及python中一些常用的库的用法,同时学到python社区版如何对代码进行性能分析和性能改进的方法。这是一次宝贵的经验,我们都很认真和努力特别是廖莹同学,每次讨论有不懂得地方,她都会很认真的为我讲解,有与她不同的思路她也愿意和我一起讨论思考。这个项目仍有不足,不过我们都会继续努力提高自己的编程能力
廖莹:这是我第一次和同学一起结对编程,从审题到具体实现,每一次的交流与讨论我都能从邓金玲同学那里获得新的思路、收获惊喜,她总能想到很巧妙的算法解决问题,而我自己想出来的算法很普通、效率也很低下。这次项目从她带给我的一些启发和思路,对我以后也是很有帮助的。