結對程式設計項目-四則運算
什麼是結對程式設計?
引用《建構之法》-4.5.2
在結對程式設計模式下,一對程式員肩并肩地、平等地、互補地進行開發工作。兩個程式員并排坐在一台電腦前,面對同一個顯示器,使用同一個鍵盤,同一個滑鼠一起工作。他們一起分析,一起設計,一起寫測試用例,一起編碼,一起單元測試,一起內建測試,一起寫文檔等。
結對程式設計不是程式開發者獨到的發明,在現實生活中,也存在着類似的搭檔關系(Partnership):
- 越野賽車(駕駛,領航員)
- 駕駛飛機(駕駛,副駕駛)
- 戰鬥機的編組(長機,僚機)
...
結對程式設計中有兩個角色:這兩個角色是可以互換的。和現實生活中的例子類似,一個人負責具體的執行(駕駛,用鍵盤編輯程式等),另一人負責導航、檢查、掩護等。
- 駕駛員(Driver)是控制鍵盤輸入的人。
- 領航員(Navigator)起到領航、提醒的作用。
詳見:鄒老師部落格
準備
花5分鐘選擇自己的結對小夥伴。
需求
實作一個指令行程式,要求:
- 自動生成國小四則運算題目(加、減、乘、除)
- 支援整數
- 支援多運算符(比如生成包含100個運算符的題目)
- 支援真分數
- 統計正确率
例如以下的運作示例:
請輸入要生成的題目數:<輸入6>
題目1:
3 + 4 = <輸入7>
正确!
題目2:
5 ÷ 8 = <輸入5/6>
錯誤,正确答案為:5/8
題目3:
2/3 - 1/5 = <輸入7/15>
正确!
題目4:
1/6 * 3/7 = <輸入3/42>
正确!
題目5:
10 - 5 * 4 = <輸入20>
錯誤,正确答案為:-20
題目6:
(1/3 + 1/2) * 11/20 = <輸入55/120>
錯誤,正确答案為:11/24
完成6道題目,正确率為50%
HINTS:
如何對表達式求值,請參考:
- 逆波蘭表示法
- 排程場算法
- http://hczhcz.github.io/2014/02/27/shunting-yard-algorithm.htm
- https://en.wikipedia.org/wiki/Shunting-yard_algorithm
擴充需求
- 檔案:
- 處理生成題目并輸出到檔案
- 完成題目後從檔案讀入并判題
- 多語言支援:
,簡體中文
繁體中文
English
-
生成題目去重
引用自:http://www.cnblogs.com/jiel/p/4810756.html
程式一次運作生成的題目不能重複,即任何兩道題目不能通過有限次交換+和×左右的算術表達式變換為同一道題目。例如,23 + 45 = 和45 + 23 = 是重複的題目,6 × 8 = 和8 × 6 = 也是重複的題目。3+(2+1)和1+2+3這兩個題目是重複的,由于+是左結合的,1+2+3等價于(1+2)+3,也就是3+(1+2),也就是3+(2+1)。但是1+2+3和3+2+1是不重複的兩道題,因為1+2+3等價于(1+2)+3,而3+2+1等價于(3+2)+1,它們之間不能通過有限次交換變成同一個題目。
更多參考
http://www.cnblogs.com/xinz/p/3803035.html
要求
- 第一周(2017-5-14 23:59截止)輸出階段總結部落格
- 需求分析
- 設計思路
- 整數/多運算符(題目生成/題目運算判題)
- JUnit測試
- 第二周(2017-5-21 23:59截止)輸出整體總結部落格
- 真分數(題目生成/題目運算判題)
- 如第一周完成比較輕松,可繼續完成第二周内容,不必等
- 部落格(兩周都需要輸出以下完整内容)
- 結對程式設計的兩位同學須各自發表部落格
- 部落格需描述各環節的輸出,如:
- 需求分析(描述自己對需求的了解,以及後續擴充的可能性)
- 設計思路(同時輸出UML類圖)
- 實作過程中的關鍵代碼解釋
- 測試方法
- 運作過程截圖
- 代碼托管位址
- 遇到的困難及解決方法
- 對結對的小夥伴做出評價(重點指出需要改進的地方)
- 部落格内容中如需展示兩人的共同成果,請進行說明
- 如有參考或引用的設計、實作,請進行說明
- PSP
- 實作之前先在PSP中預估時間
- 實施後各個環節實際花費多少時間也請做記錄
- 表中有一項: Estimate 指的“預估”這個活動,“預估時間”也是一項任務。
- 例如:我估計自己需要花30分鐘來估算出整個項目需要多少時間完成,結果我花了20分鐘估算出整個項目需要6個小時完成。Estimate這一項應該在“預估耗時”填寫30分鐘,實際耗時填寫“20”分鐘。
- 一級和二級活動的包含關系:
- Planning 這個一級活動包含了1個二級活動(Estimate)
- Development 這個一級活動包含了8個二級活動
- Reporting 這個一級活動包含了3個二級活動
- 大家在記錄時間的時候, 隻用記錄二級活動, 然後把總數加了, 就是相應的一級活動的時間
- 這個時間的長短并不會對分數有直接影響,這是為了大家自己總結。
PSP2.1 | Personal Software Process Stages | 預估耗時(分鐘) | 實際耗時(分鐘) |
---|---|---|---|
Planning | 計劃 | ||
· Estimate | · 估計這個任務需要多少時間 | ||
Development | 開發 | ||
· Analysis | · 需求分析 (包括學習新技術) | ||
· Design Spec | · 生成設計文檔 | ||
· Design Review | · 設計複審 (和同僚稽核設計文檔) | ||
· Coding Standard | · 代碼規範 (為目前的開發制定合适的規範) | ||
· Design | · 具體設計 | ||
· Coding | · 具體編碼 | ||
· Code Review | · 代碼複審 | ||
· Test | · 測試(自我測試,修改代碼,送出修改) | ||
Reporting | 報告 | ||
· Test Report | · 測試報告 | ||
· Size Measurement | · 計算工作量 | ||
· Postmortem & Process Improvement Plan | · 事後總結, 并提出過程改進計劃 | ||
合計 |
打分細則
- 本次作業滿分100分
- 不按時交作業,0分
- 越期一周不交作業,倒扣本次作業分數
- 作業檢查項:
- 正确生成題目 10分
- 正确判題 10分
- 真分數支援 10分
- 正确率統計 5分
- 測試 10分
-
- 生成題目并輸出到檔案 5分
- 完成題目後讀入檔案判題 5分
- 支援多語言 5分
- 支援生成題目去重 5分
- 部落格
- 基礎分(按時送出)5分
- PSP表格 5分
- 需求分析 5分
- 設計思路 5分
- 實作過程中的關鍵代碼解釋 5分
- 遇到的困難及解決方法 5分
- 對結對小夥伴做出評價 5分
- 附加分:在作業過程及時回報,提供建議被采納可追加附加分,最高不超過10分
- 嚴禁抄襲,違反者列入抄襲作業者的曝光台
參考建議
以下隻是作為參考的建議,不是要求,同學們可以提出自己的想法和設計,展現在自己的部落格中
- 大概功能劃分
- 題目生成
- 可獨立使用
- 考慮可擴充支援配置生成不同難度的題目,比如通過參數指定:
- 運算符個數範圍
- 運算符限定(國小一年級題目隻生成
+
題目)-
- 題目合法性判斷
- 可用于測試生成題目的正确性
- 可用于以下輸入的合法性檢測
- 題目運算(判題)
- 轉換為字尾表達式(當然你也可以直接計算中綴表達式)
- 題目去重
- 考慮支援不同的去重級别,比如:
- Level 0:字元串相同算重複 --
1 + 2
算不同題目2 + 1
- Level 1:滿足交換律算重複 --
1 + 2
算相同題目2 + 1
- Level ...
- Level n: 參考以上 擴充需求
- Level 0:字元串相同算重複 --
- 題目生成
- 測試
- 題目生成測試
- 最直接的就是人肉看輸出是否合法
- 效率低
- 容易出錯
- 題目合法性判定程式
- 自動化
- 如何測試自己的判定程式是準确無誤的?
- 最直接的就是人肉看輸出是否合法
- 題目運算測試
- 正确性測試
- 手動準備題目
- 利用題目生成程式
- 利用第三方運算工具做運算結果對比,比如Linux
bc
- 錯誤處理測試, 比如輸入以下非法表達式,能否正常工作:
-
"2394809+sdk*fsdjsakldf-"
-
"+2 3 4 ***"
-
""
-
- 正确性測試
- 壓力測試
- 生成100個、1000個運算符題目
- 運算100個、1000個運算符題目
- 生成100萬道題目需要多長時間
- 運算100萬道題目需要多長時間
- 題目生成測試