NC11179 D. 牛牛種小樹(完全揹包)
這個作業屬於哪個課程 | 19網工3軟工 |
---|---|
這個作業要求在哪裡 | 結對專案 |
這個作業的目標 | 實現一個自動生成小學四則運算題目的命令列程式 |
隊員: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.需求分析
-
命令實現類 Arithmetic -n [題目數量] -r [所有數字範圍] -d [算式運算次數,符號數]
-d 為個人額外新增引數,用於調整題目的計算難度。
-
算式規定類 參考專案文件3.3-3.7。
-
運算表示式 對於存在括號的普通式,可以直接轉成波蘭式(為了程式碼便捷,使用逆波蘭式)
-
數值隨機類 需要生成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.專案小結
學到許多