结对项目
这个作业属于哪个课程 | 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来存储的,导致写入文本时,同一个答案会连在一起)
项目小结
关于生成算式:起初是随机生成操作数和操作符,在逐步的得到式子和结果(相当于正向),这样生成比较难,而后改进从答案开始分解(相当于逆向),难度相比正向生成低了很多。
关于设计:设计经验较少,对语言的一些特性并不了解,设计的并不理想。
关于结对合作:有问题尽早提出,别到快截止再说做不下,在设计完成之后尽早分好工。