zoukankan      html  css  js  c++  java
  • 个人项目——四则运算生成器和解析器(补充版本)

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

  • 相关阅读:
    2018 ACM 网络选拔赛 徐州赛区
    2018 ACM 网络选拔赛 焦作赛区
    2018 ACM 网络选拔赛 沈阳赛区
    poj 2289 网络流 and 二分查找
    poj 2446 二分图最大匹配
    poj 1469 二分图最大匹配
    poj 3249 拓扑排序 and 动态规划
    poj 3687 拓扑排序
    poj 2585 拓扑排序
    poj 1094 拓扑排序
  • 原文地址:https://www.cnblogs.com/someonefighting/p/4830965.html
Copyright © 2011-2022 走看看