结对作业

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. 语法分析: 将字符串表达式转化为数字和操作符的数组,['(' , '1', '+', '2', ')' , '*' , '3']
  2. 转逆波兰表达式: 将中缀表达式转后缀表达式,['1', '2', '3', '+', '*']
  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

posted @ 2021-10-25 23:02  georgebooker13  阅读(33)  评论(0编辑  收藏  举报