1. 程式人生 > 其它 >NC11179 D. 牛牛種小樹(完全揹包)

NC11179 D. 牛牛種小樹(完全揹包)

這個作業屬於哪個課程 19網工3軟工
這個作業要求在哪裡 結對專案
這個作業的目標 實現一個自動生成小學四則運算題目的命令列程式

結對專案github

隊員:3119005893柯新宇(碼字的),3119006062劉熠(主講師)

1.PSP表格

PSP2.1 Personal Software Process Stages 預估耗時(分鐘) 實際耗時(分鐘)
Planning 計劃 20 15
· Estimate · 估計這個任務需要多少時間 450 454
Development 開發
· Analysis · 需求分析 (包括學習新技術) 80 90
· Design Spec · 生成設計文件 20 20
· Design Review · 設計複審 10 10
· Coding Standard · 程式碼規範 (為目前的開發制定合適的規範) 10 12
· Design · 具體設計 30 30
· Coding · 具體編碼 60 40
· Code Review · 程式碼複審 20 24
· Test · 測試(自我測試,修改程式碼,提交修改) 70 80
Reporting 報告 10 10
· Test Repor · 測試報告 10 10
· Size Measurement · 計算工作量 10 10
· Postmortem & Process Improvement Plan · 事後總結, 並提出過程改進計劃 20 18
Total · 合計 370 369

2.需求分析

  1. 命令實現類 Arithmetic -n [題目數量] -r [所有數字範圍] -d [算式運算次數,符號數]

    -d 為個人額外新增引數,用於調整題目的計算難度。

  2. 算式規定類 參考專案文件3.3-3.7。

  3. 運算表示式 對於存在括號的普通式,可以直接轉成波蘭式(為了程式碼便捷,使用逆波蘭式)

  4. 數值隨機類 需要生成1w+的算式,為了高效能考慮,使用mt19937偽隨機數產生器。

3.設計實現

四則運算部分用逆波蘭式表達,便於隨機生成數值和符號。

例,3×,(1+2)表示為 3,1,2,+, ×,可以直接解決運算次序的問題。

使用stack結構,內數值個數滿足2個時,可插入運算子,再將top和次top彈出並運算,得到結果重新加入stack。

隨機項自定,滿足插入運算子和數值近似均等比例即可。

最後stack剩下1個數值且表示式結束即為答案。

在每次運算時,可分配元素id,構建樹形結構,便於轉成普通式(新增括號)cedge陣列

程式一次執行生成的題目不能重複,即任何兩道題目不能通過有限次交換+和×左右的算術表示式變換為同一道題目

使用hash判斷並按照固定規則對運算子的左右項交換(−, ÷ 以左右項值的大小關係為第一關鍵字,以hash為第二關鍵字)。例,滿足hash_left<hash_right。並將左右hash進行合併歸成hash_father。得到的stack最後剩下的唯一元素的hash定為hash_total,即該表示式的hash值。可知,具有交換相等性質的不同算式會被改寫成同一算式且為同一個hash值。判斷hash是否一致可知是否題目重複。(理論上可採用多次hash判斷減少hash衝突)

為了消除hash交換對隨機性的影響,程式得到hash_total作為特徵值後,對轉成普通式部分隨機交換左右項。

程式開 4 倍的算式生成,補hash衝突的棄項。

4.程式碼說明

程式碼結構:

Cmaking.h為標頭檔案,統籌結構體和全域性變數。

Ccreate.cpp為生成四則運算表示式,同時得到算式的各類引數。

Main.cpp為主程式,負責算式去重,統計答案(與輸入輸出檔案的互動)。

具體實現和解析見程式碼和註釋。

5.執行

生成算式 Arithmetic -n (生成個數) -r (數值範圍) [-d] (運算子個數)

統計答案 Arithmetic -e (exercisefile).txt -a (answerfile).txt

測試:Arithmetic -n 10000 -r 5(執行時間在1s以內)

常規測試:(生成和判斷)

6.專案小結

學到許多