结对项目

这个作业属于哪个课程 https://edu.cnblogs.com/campus/gdgy/SoftwareEngineering2024/
这个作业要求在哪里 结对项目
这个作业的目标 熟悉结对开发流程、熟悉各类工具的使用,学会用工具评估程序质量并优化程序

GitHub链接:SE_Homework_02

姓名:王喆
学号:3122004625

姓名:郭森标
学号:3122004606

PSP表格

PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
Planning 计划 20 20
· Estimate · 估计这个任务需要多少时间 20 20
Development 开发 890 1630
· Analysis · 需求分析 (包括学习新技术) 90 60
· Design Spec · 生成设计文档 120 90
· Design Review · 设计复审 (和同事审核设计文档) 60 60
· Coding Standard · 代码规范 (为目前的开发制定合适的规范) 20 20
· Design · 具体设计 60 80
· Coding · 具体编码 240 600
· Code Review · 代码复审 120 240
· Test · 测试(自我测试,修改代码,提交修改) 120 480
Reporting 报告 90 60
· Test Report · 测试报告 40 20
· Size Measurement · 计算工作量 20 20
· Postmortem & Process Improvement Plan · 事后总结, 并提出过程改进计划 30 20
合计 940 1710

效能分析

以下是生成10000个式子,同时批改另外生成好的100个式子的性能开销情况,vs中设置的命令参数如下:
-n 10000 -r 500 -e $(SolutionDir)\x64\Release\exercisesfile.txt -a $(SolutionDir)\x64\Release\answerfile.txt



其中生成式子的开销最大,在生成式子的过程中调用了很多次生成一条式子的方法,生成一条式子中又调用了一个递归方法,相关函数截图如下:


对于生成式子的优化:
起初操作数都是先随机生成再判断是否合法,这样可能会进行许多次的循环,之后直接算操作数的范围,然后再来生成操作数。
最初的分数并没有用pair来表示,而时直接用字符串,这样会使运算时需要进行很多的字符串处理,后来改进成了用pair来存储分数,有效的减少了很多字符串操作。

设计实现过程

最初设计时,计划设计4个类,一个计算的类,一个算式生成的类,一个文件读写类,一个输入处理类。
并且,计划算式生成类做成一个抽象类,在派生的子类中去实现各种生成时的条件约束,
输入类也做成一个抽象类,并依据参数用反射技术去动态生成相应操作的派生类,
计算类做成静态的工具类。
而在实现时,发现算式生成类并没有做出多套约束的想法,于是就只做成了一个普通的类。
cpp原生态并不支持反射,于是输入类直接做成了一个输入的方法。

主流程:

代码说明

比较核心的两个函数:

这是由target和denominator生成式子的递归函数,在最开始,随机生成一个值,做为式子的最终结果(最开始传给target和denominator,target/denominator组成一个分数形式的数num),
然后把随机生成一种操作符(如果denominator不为1,则操作符设为除法),依据操作符把 num 变为两个操作数 ta,tb(num = ta op tb),再递归的对ta和tb进行相似的操作。


该函数用于计算式子str的结果,其中op默认为加法,操作数s全部默认为右操作数,遍历str,每次同时op和s都不是空的时,
依据op对操作数进行操作,加法直接压入nums栈中,减法取相反数后压入nums中,乘(除)法则需要取出左操作数,也就是nums的栈顶元素,乘(除)完后压入栈中,
遇到括号则取出括号里的子串,对子串进行计算。最后的结果只需要将栈中所有元素相加即可。

测试运行

对于分数运算类的部分单元测试:


测试用例,取一些合法的例子,如负数和负数进行运算,整数和分数进行运算,整数和整数...
对于计算式子结果的方法,则是先写一些合法的格式正确的算式字符串,用计算器计算的结果和函数计算的比对。
在确保函数计算的方法无误后,在对生成的式子进行计算,并和生成的结果进行比对。

式子生成函数生成的结果和式子截图:




(为了方便判断是否相似,哈希表采用的是结果为key,式子为value来存储的,导致写入文本时,同一个答案会连在一起)

项目小结

关于生成算式:起初是随机生成操作数和操作符,在逐步的得到式子和结果(相当于正向),这样生成比较难,而后改进从答案开始分解(相当于逆向),难度相比正向生成低了很多。
关于设计:设计经验较少,对语言的一些特性并不了解,设计的并不理想。
关于结对合作:有问题尽早提出,别到快截止再说做不下,在设计完成之后尽早分好工。

posted @ 2024-03-25 17:21  柠筱  阅读(27)  评论(0编辑  收藏  举报