這個作業屬於哪個課程 | 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.項目小結
學到許多細節處理要點。