结对项目

结对项目

这个作业来自哪个班级 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社区版如何对代码进行性能分析和性能改进的方法。这是一次宝贵的经验,我们都很认真和努力特别是廖莹同学,每次讨论有不懂得地方,她都会很认真的为我讲解,有与她不同的思路她也愿意和我一起讨论思考。这个项目仍有不足,不过我们都会继续努力提高自己的编程能力
廖莹:这是我第一次和同学一起结对编程,从审题到具体实现,每一次的交流与讨论我都能从邓金玲同学那里获得新的思路、收获惊喜,她总能想到很巧妙的算法解决问题,而我自己想出来的算法很普通、效率也很低下。这次项目从她带给我的一些启发和思路,对我以后也是很有帮助的。

posted @ 2024-03-26 09:30  廖莹  阅读(17)  评论(0编辑  收藏  举报