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

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的性能分析工具无法使用,更深一步的性能优化未完待续.....

原文地址:https://www.cnblogs.com/someonefighting/p/4830965.html