个人项目——四则运算生成器和解析器(补充版本)
1、预计耗费时间 vs 实际耗费时间
预计:
PSP2.1 |
Personal Software Process Stages |
Time |
Planning |
计划 |
|
· Estimate |
· 估计这个任务需要多少时间 |
2days |
Development |
开发 |
|
· Analysis |
· 需求分析 (包括学习新技术) |
1days |
· Design Spec |
· 生成设计文档 |
30min |
· Design Review |
· 设计复审 (和同事审核设计文档) |
10min |
· Coding Standard |
· 代码规范 (为目前的开发制定合适的规范) |
10min |
· Design |
· 具体设计 |
60min |
· Coding |
· 具体编码 |
1.5days |
· Code Review |
· 代码复审 |
30min |
· Test |
· 测试(自我测试,修改代码,提交修改) |
0.5days |
Reporting |
报告 |
|
· Test Report |
· 测试报告 |
2h |
· Size Measurement |
· 计算工作量 |
30in |
· Postmortem & Process Improvement Plan |
· 事后总结, 并提出过程改进计划 |
1h |
合计 |
2days |
实际:
PSP2.1 |
Personal Software Process Stages |
Time |
Planning |
计划 |
|
· Estimate |
· 估计这个任务需要多少时间 |
3days |
Development |
开发 |
|
· Analysis |
· 需求分析 (包括学习新技术) |
2h |
· Design Spec |
· 生成设计文档 |
0s |
· Design Review |
· 设计复审 (和同事审核设计文档) |
0s |
· Coding Standard |
· 代码规范 (为目前的开发制定合适的规范) |
0s |
· Design |
· 具体设计 |
2h |
· Coding |
· 具体编码 |
3days |
· Code Review |
· 代码复审 |
30min |
· Test |
· 测试(自我测试,修改代码,提交修改) |
1days |
Reporting |
报告 |
|
· Test Report |
· 测试报告 |
2h |
· Size Measurement |
· 计算工作量 |
0s |
· Postmortem & Process Improvement Plan |
· 事后总结, 并提出过程改进计划 |
0s |
合计 |
3days |
2、软件开发过程中遇到的Bug;
1)对四则运算的基本原则解析不够透彻:除法不支持除数为零,减法不支持结果为负
在不合法情况出现时应当重新生成随机真分数,此处应注意完整的循环条件
2)需要统一对同一类的操作:
类的属性有很多,将会在特定的方法中发挥作用,因而对于大部分类的实例来说,有些属性无关紧要,都不需要进行初始化。但这样做会对调试和改进程序性能造成很大的阻碍,不能及时查看各个属性值,因此对属性进行统一的初始化非常重要。比如:每生成一个分数,就要计算其真实值(double),打印字符串。
在本次项目中,处理的数据格式有三种:非负整数、真分数、假分数,为了便于编程和统一操作,生成和计算的过程中都使用真分数的形式,只有在输出时才进行具体形式的判断。
我对所有随机生成的分数都进行了如下的初始化,即使对于很多临时变量来说分数的值并没有用途
3)分类讨论的思想非常重要,能够便于理清编程的思路,让程序无懈可击:这里以分数除法为例进行分析
4)调试的过程中首先判断错误可能出现的位置,然后在多个地方加入printf进行标记,使用断言asssert。也可以尽可能的缩小范围,预测可能的原因,对错误点进行定位
5)判定等价四则运算表达式:生成逆波兰数,在执行加法或者乘法时,总是将较小的数记录在先
考虑到这一步实现起来可能比较麻烦,因此我先对完全相同的表达式进行删除:
在此基础上,我设计了一个栈,专门记录全部操作数的计算顺序,实现了完整的查重功能:
6)方法功能的专一性(事先确定),否则编程会很混乱,调试的时候找不到应当检测的函数
7)在求逆波兰数的过程中需要进栈出栈,因此变量的初始值非常重要
3
、正确性证明
(1)-n 30 -r 10 基本功能的实现——生成四则运算并对答案进行解析
(2) 删除等价四则运算表达式:
我将被判断为等价表达式的打印出来,其中包括完全相同的表达式,还有经有限次加法、乘法交换重合的表达式
执行 -n 1000 -r 2
如下图所示,左边为最终生成的表达式,右边为筛选中删除掉的表达式
4、性能优化
我对查重功能进行改进,对访问过的表达式进行标记,并且只对计算结果相等的表达式进行查重判断,有效减少了判断时间
优化之前:
优化之后:
(鉴于vs2013的性能分析工具无法使用,更深一步的性能优化未完待续.....