四則運算生成器——感想

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的逼迫,是不會在這麼短的時間裏寫出來的。

相關文章
相關標籤/搜索