四则运算生成器——感想

1.预估时间及实际花费时间表格



               理想太丰满,显示太骨干java

PSP2.1算法

Personal Software Process Stages函数

Time性能

Planning学习

计划测试

 

  · Estimate编码

  · 估计这个任务须要多少时间spa

 15h设计

Development代码规范

开发

 

  · Analysis

  · 需求分析 (包括学习新技术)

 2h

  · Design Spec

  · 生成设计文档

2h 

  · Design Review

  · 设计复审 (和同事审核设计文档)

3h 

  · Coding Standard

  · 代码规范 (为目前的开发制定合适的规范)

 1h

  · Design

  · 具体设计

0.5h

  · Coding

  · 具体编码

10h 

  · Code Review

  · 代码复审

 2h

  · Test

  · 测试(自我测试,修改代码,提交修改)

 5h

Reporting

报告

 

  · Test Report

  · 测试报告

 1h

  · Size Measurement

  · 计算工做量

0.5h 

  · Postmortem & Process Improvement Plan

  · 过后总结, 并提出过程改进计划

 0.5h

 

合计

 27.5h

2.算法思路



 

       此次的题目实际上是两个程序(很不能理解这么作的目的。。。。),一个任务是:本身生成四则运算表达式,本身运算出答案,另外一个任务是:根据所给的题目文件及答案文件,判断正误。

       最初我认为第一个任务是比较简单的,由于当时以为比较运算符之间的优先级是比较麻烦的, 要先转化成后缀,再进行计算,一直想避免这个问题,最终仍是没绕过。第一个任务中,思路主要

      是:在生成一个算式以前,先生成一个随机数,来判断这个算式中将要有几个运算符,而整数与分数的生成也是靠一个随机数决定的,很重要的一点是整数也当作分数(整数/1)进行运算。而后再

      每次的循环中,随机生成一个数字与运算符,并利用运算符进行决定是否添加括号(随机数真的是一个很神奇的东西),这些都生成之后,就要调用deal()函数判断子式是否为负(小学生不懂

      负数。。。),并以此决定是否舍弃本次生成的数字和运算符;

       在一个式子生成之后,重头戏来了,查重!!我想了不少的方法,但对于个人程序来讲,操做起来都比较困难,最终,我选择了一个很“贱”的方法,直接比较答案,每生成一个式子,就令它的答

      案与以前全部的式子的答案进行比较,若是发现相等,那么很差意思,本次生成的式子就能够滚蛋了,直接舍去!我试验了一下,生成100道题目时,查重答案的操做会多生成20道题;生成1000道

    时,会多生成将近300道;但生成10000道题目时,会多生成将近7000道!!咳咳,这不是重点,重点是没有重复的题目了(我也以为这个效率有点低),而后就OK了。

       第二个任务相对于第一个来讲,就是至关之简单了,只要扫描题目文件,并套用第一个任务里的函数就能够实现了。

3.程序分析



 

      

      这是在测试—r 10 -n 1000的命令时,所生成的图,在to_string上花了较长的时间,在提高程序的性能中,也想了不少的方法,但最终都没有很大程度的提升,只在部分

    函数中提升了一点性能,没办法。。。。

 

 

      

      这是测试-e 1.txt -a 2.txt 命令时,生成的图

     在程序生成的过程当中,也发现了几个重要的问题(对于我而言):

       1.分数运算的问题

      因为程序涉及到分数的问题,因此在计算中,会出现通分,约分之类的问题;

     2.存储数据的问题

      因为int有范围,在运算过程当中可能出现超过int型范围的数字;

     3.substr()函数

      substr()函数在C++中与java中,是有差异的(这一个点坑死我了),substr(int 1,int 2) 2代表的含义是:要截取的字符串的长度,并非java中的字符位置;

     4.strtok()函数

      这个函数相似于java中的spilt(),char *strtok(char s[], const char *delim);

      分解字符串为一组字符串。s为要分解的字符串,delim为分隔符字符串。

        例如:strtok("abc,def,ghi",","),最后能够分割成为abc def ghi.
      可是注意,这里的s是char*,并非string s

4.测试用例



    1.  测试-r  x1 - n x2 命令时:

      x1不能大于100,虽然程序亲测1000之内的也能够生成,可是时间太长,不算!

    2.  SIZEYUNSUAN.exe -n 10000 -r 100

      //生成10000个式子,范围是100之内

    3.  SIZEYUNSUAN.exe -e exercise.txt -a answer.txt

      //校验两个文件里面的答案,生成结果在Grade.txt

    4.  SIZEYUNSUAN.exe -n 10

      //提示需输入正确并完整的参数

    5.  SIZEYUNSUAN.exe -r 10

      //提示需输入正确并完整的参数

    6.  SIZEYUNSUAN.exe -e exercise.txt

      //提示需输入正确并完整的参数

    7.  SIZEYUNSUAN.exe -a answer.txt

      //提示需输入正确并完整的参数

    8.  SIZEYUNSUAN.exe -n 10001 -r 100

      //提示需输入正确的题目个数

    9.  SIZEYUNSUAN.exe -n 1000 -r -1

      //提示需输入正确的数的范围

    10.  SIZEYUNSUAN.exe -e 1.txt -a answer.txt

      //提示文件1.txt不存在

    11.  SIZEYUNSUAN.exe -e exercise.txt -a 2.txt

      //提示文件2.txt不存在

      SIZEYUNSUAN.exe -n 10000 -r 100 -e exercise1.txt -a answer1.txt

      //生成题目并完成校验,两个功能依次完成

5.我的感悟



      理想很丰满,现实很骨干,我第一次看到题目的时候,虽以为有点麻烦,但仍是以为比较容易写的,就用了一个下午的时间写完了整个程序,而后发现。。。。。。和要求差

     的有点多,在推倒重写和维持之前的思路这两者之间挣扎了好久,最终仍是“屈服”了——重写!  

      虽然说“历经艰难”,但仍是完成了,以为仍是学到了不少,没有deadline的逼迫,是不会在这么短的时间里写出来的。

相关文章
相关标签/搜索