zoukankan      html  css  js  c++  java
  • 四则运算生成器——感想

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



                   理想太丰满,显示太骨干

    PSP2.1

    Personal Software Process Stages

    Time

    Planning

    计划

     

      · Estimate

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

     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的逼迫,是不会在这么短的时间里写出来的。

     

  • 相关阅读:
    2008年具有高校自主选拔录取资格的考生名单 江苏版
    OpenGL ES 2.0 for iPhone Tutorial
    Mathematica三维点插值算法(高维插值,多维插值)
    Mathematica颜色系,你喜欢哪一个?
    Khronos EGL and Apple EAGL
    ssh 免密码登陆配置
    2008年高考招生:北京大学自主选拔录取资格考生名单
    PlotLegends 应用
    Mathematica 如何更改文档的样式
    您为何而工作?
  • 原文地址:https://www.cnblogs.com/hongzs/p/4830583.html
Copyright © 2011-2022 走看看