PSP2.1 | Personal Software Process Stages | Time(预测/实际) |
Planning | 计划 | 3天 |
· Estimate | · 估计这个任务需要多少时间 | |
Development | 开发 | |
· Analysis | · 需求分析 (包括学习新技术) | 半天/半天 |
· Design Spec | · 生成设计文档 | 2小时/1小时 |
· Design Review | · 设计复审 (和同事审核设计文档) | null/null |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 1小时/1小时 |
· Design | · 具体设计 | 3小时/2小时 |
· Coding | · 具体编码 | 1天半/1天半 |
· Code Review | · 代码复审 | |
· Test | · 测试(自我测试,修改代码,提交修改) | 半天/一天 |
Reporting | 报告 | |
· Test Report | · 测试报告 | null/1小时 |
· Size Measurement | · 计算工作量 | null/10分钟 |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | null/半小时 |
合计 |
2.性能分析(...)
3.共享测试的10个样例
正确的格式举例:
(1)正确的格式举例1:-r 10 -n 10 或者 -n 10 -r 10
(2)正确的格式举例2:-e 文件 -a 文件 或者 -a 文件 -e 文件 -e exercise.txt -a answer.txt
(3)-r 10 -n -10 int i=0;i<n;i++ 来遍历的,所以随着i增大再也无法满足条件了。加入一个输入判断即可解决这个问题
(4)参数输入错误:未按照规定的格式输入,程序会无法运行直到正确输入参数
(5)-n 100000 -r-10 超范围的算式数量,由于程序效率不是很高,所以程序会死,加入一个输入数判断语句后可以解决这个问题
(6)-e 空 -r 空 指定的路径没有文件,打开文件失败,程序无法继续运行
(7)exercises.txt (100道题)和answer.txt (200道题)两个文件的题目数目不一样,由于是首先读exercises然后再堵answer,判断eof也是以exercises为基准的,所以answer比exercises多的话是没有问题的
(8)exercises.txt (200道题)和answer.txt (100道题)根据(5)的原因,程序执行到100道题之前是完全没有问题的,当answer不够的时候,由于判断的条件所致,101到200判断条件都不满足,所以直接一路false到exercises的eof结束,结果是后100道题算wrong。
(9)-n 10000 -r 1 n输入大,r输入小 我的程序并没有计算给定r之后n的最大值,只是不断通过随机来尽量扩大生成算式的规模,但是1是无论如何生成不了10000个式子的,所以程序无法继续运行。
(10)-n 10000 -r 1000 虽然n很大,但是r的值很大,所以随机遍历的结果很多,可生成的算式很多,可以遍历完全
4.个人项目设计思路
首先先粘一下各个函数头和main(),函数命名都是很直接的,所以一眼就能看懂函数是干什么的
首先,先讲-n -r 的部分。输入参数-n -r 之后会调用createToFile,也就是将算式生成到文件当中。
一开始的分析有多种考虑:
(1)生成表达式的类型:后缀还是中缀呢,中缀可以直接输出,后缀便于计算
(2)查重复算式的要求
(3)运算过程中不能出现负数的要求
(4)极限测试,给定r之后n的最大值
一开始,比较偏向与生成中缀,因为既可以直接输出,中缀计算也不是很复杂,只要像往常的中缀转后缀算一下就可以了。接下来考虑(2)(3),查重的话,产生重复式子的原因主要有两个,括号改变计算顺序和+×的交换律
①中缀判断起来的话需要很麻烦,因为生成的过程中需要直接生成括号。但是后缀表达式就没有这个麻烦,后缀表达式没有括号,一旦表达式确定,计算顺序就确定了,这样就省去了括号的烦恼。
②交换律的问题,如果保证生成的时候只有一种的话就没有问题了,所以我的解决方法是决定生成的运算数是有大小顺序的,降序排列,这样就保证只有一种情况了,而且这样的话能够保证减法的过程中没有负数的产生,这样就同时保证了两个限制条件
③极限测试的要求,一开始我还想算出给定r的时候n的最大值,然后限制住,但是发现算起来有点麻烦,而且由于我①②的限制规则,我舍弃掉了好多算式,更无法保证最大值。而且计算的过程中发现,哪怕r很小的话,事实上n的限定值也可以很大的,因为可生成的算式实在是太多了。哪怕仅仅是3、4,可生成的算式也能够超过1万(我舍弃掉了好多,所以太小的满足不了了,但是r给10生成1万的话还是能够保证的)
生成的细节就不叙述了,规则确定之后生成就不是很复杂了。
生成之后需要计算,由于是支持分数的计算的,所以索性计算的过程中直接就先全部转化为分数计算,0的话也转换成0/1一起计算。分数计算的细节也不讲了,简单的很,加减就是先通分-计算-约分,乘除就直接乘除然后约分。
计算之后需要print出来,所以还是要转成中缀表达式打印出来,后缀转中缀只需要用一点栈的知识就可以解决,括号也直接跟随着就生成了
接下来,讲一下-e -a 的部分,有了前一部分的基础,这一部分就很简单了,只需要将exercises中的计算出来之后和answers中的逐个对比就可以了,然后生成grades。计算的过程就是中缀表达式的计算,数据结构就讲过,所以这一部分只是算出结果之后简单的对比即可。
5感受及收获
1.首先,是第一次按照psp里面的顺序开发程序,虽然其中有的过程没有经历,表格中也填的是null,比如写规范的设计文档之类的暂时没有了,但是设计的过程还是很完整的,这样的过程对以后项目的开发是很有帮助的,而且这样的话,看似很繁琐,但是效率却比以往要高出许多。
2.其次,就是这个程序本身了,刚开始留这个作业的时候,看起来很简单,但是写起来的过程中却发现了好多难题。后来和同学讨论的过程中也发现,由于设计思路不同,产生的难题也不太相同,比如说查重的问题,如果是直接生成中缀表达式的话,我想查重应该是很麻烦的(自己没写但是分析过),而我的程序由于直接生成的就是后缀,所以查重这一方面的好了许多。
3,还有,第一次写c++额,虽然写的和c没有什么大区别,写的也只是面向过程的程序,但是了解到了好多c++的函数以及库,也就是了解了好多C++语言本身的特性之类的,而且由于有上学期oo的基础,所以我想再了解点C++的语法知识之后,写出“”真正的“c++应该不是很难的。而且现在c++ 的使用也相当广泛,所以掌握这门语言本身来说对我也是很有帮助的。