天天看點

結對程式設計項目-四則運算

結對程式設計項目-四則運算

什麼是結對程式設計?

引用《建構之法》-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: 參考以上 擴充需求
  • 測試
    • 題目生成測試
      • 最直接的就是人肉看輸出是否合法
        • 效率低
        • 容易出錯
      • 題目合法性判定程式
        • 自動化
        • 如何測試自己的判定程式是準确無誤的?
    • 題目運算測試
      • 正确性測試
        • 手動準備題目
        • 利用題目生成程式
        • 利用第三方運算工具做運算結果對比,比如Linux

          bc

      • 錯誤處理測試, 比如輸入以下非法表達式,能否正常工作:
        • "2394809+sdk*fsdjsakldf-"

        • "+2 3 4 ***"

        • ""

    • 壓力測試
      • 生成100個、1000個運算符題目
      • 運算100個、1000個運算符題目
      • 生成100萬道題目需要多長時間
      • 運算100萬道題目需要多長時間