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

  • 相关阅读:
    bzoj3530 [SDOI2014]数数
    bzoj3940 Censoring
    线性代数基础
    hdu1085 Holding Bin-Laden Captive!
    hdu1028 Ignatius and the Princess III
    luogu2000 拯救世界
    博弈论入门
    树hash
    luogu2173 [ZJOI2012]网络
    luogu1501 [国家集训队]Tree II
  • 原文地址:https://www.cnblogs.com/someonefighting/p/4830965.html
Copyright © 2011-2022 走看看