您的位置:首页 > 其它

个人项目——四则运算生成器和解析器(补充版本)

2015-09-22 23:59 357 查看
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的性能分析工具无法使用,更深一步的性能优化未完待续.....
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: