我們上節課講了 返回整數數組中最大子數組的和 這個問題。 我們第二次作業在這個基礎上擴展。
程序要使用的數組放在一個叫 input.txt 的文件中, 文件格式是:
數組的行數,
數組的列數,
每一行的元素, (用逗號分開)
每一個數字都是有符號32位整數, 見 MSDN 的定義. 當然, 行數和列數都是正整數。
例如下面的文件說明數組是有1行, 6列, 元素依次是: 5, 6, –3, 8, –9, 2
用你選擇的語言 (C, C#, C++, Java) 在Windows 系統下實現下面的功能, 並作單元測試和統計測試覆蓋率。 建議用VS2017 / 2019, 如果你有其它的工具可以達到同樣的效果, 歡迎使用。
1) 絕大部分同學都已經做出來了單維數組的 求數組中最大子數組的和, 但是你不妨試一試:
把你的程序編譯為可執行文件, 然后執行 例如 maxsum.exe <file name>
輸出就是最大子數組的和, 上面的例子就應該輸出 16.
如果輸入的數組很大, 並且有很多大的數字, 就會產生比較大的結果 (考慮一下數的溢出), 請保證你的程序能正常輸出。
另外, 如果輸入文件的參數有錯誤, 這個程序應該能正常退出, 並顯示相應的錯誤信息。 任何輸入錯誤都不能導致你的程序崩潰 (對的, TA 會模擬一些有錯誤的文件來檢查)。
2) 如果上面的問題解決了, 那我們就順利地進入第二個階段 - 處理二維數組. 在這個階段, 我們要求二維數組的子數組必須是矩形的
maxsum.exe <file name>
會返回 28
這是一個比較大的數組的例子:
3) 如果 “子數組” 並不要求是一個矩形, 而是聯通的元素即可 (上下或左右相鄰即視為聯通), 那解法會是怎么樣呢?
上面文件的正解就是:
請實現這一算法, 命令行要加一個參數, 表示這一特殊要求:
maxsum.exe /a <file name>
輸出是: 50
注: 考慮到同學們的反饋, 在這一問中, 可以假設數組的長度和寬度不大於 32. 同時,在和同學們的討論中,我們列舉了幾種較有意思的形狀,見下。
(圖3-2,兩個大正數 (50)通過它們之間的最小權值路徑相連)
(圖 3-4,和是135,是三個大正數通過公共的最小權值聯通路徑相連)
(圖3-5,和圖3-4 一樣,但是此圖的解法是通過兩兩大正數之間的最小連通圖得到。它們的和是 134,不是最佳)
4) 在步驟 2) 的基礎上, 我們還可以做另一個擴展, 假設數組的一頭一尾在水平方向上是首尾相連的。 我們用 /h 表示它在水平方向上相連。 如果在垂直方向上相連可以么? 當然可以, 我們用 /v 表示它在垂直方向相連。 這樣, 我們有:
maxsum.exe /h <file name>
maxsum.exe /v <file name>
5) 那么, 可以同時 /h /v 么? 我想是可以的。 這個矩陣會成一個什么樣呢? 是球形, 還是…?
啊, 是個輪胎, 可能還是備胎!
maxsum.exe /v /h <file name>
會輸出什么呢?
當然, 我們還有: maxsum.exe /v /h /a <file name>
6) 哇, 還有第六步? 仿佛聽到同學們叫苦連天… 那就算了, 以后再說
要求還是老一套:
a) 代碼都簽入你的 GitHub, TA 用你的代碼編譯並運行他們的測試用例, 來驗證你的程序的正確性。
b) 博客
描述在這么多相似的需求面前, 你怎么維護你的設計 (父類/子類/基類, UML, 設計模式, 或者其它方法) 讓整個程序的架構不至於崩潰的?
給出你做單元測試/代碼覆蓋率的最終覆蓋率的報告, 用截屏顯示你的代碼覆蓋率
閱讀 工程師的能力評估和發展 和相關文章, 在完成作業的時候記錄自己花費的時間, 並填下表。如果你對有些術語不太清楚,請查看教材和其它資料。如果你認為你不需要做某個步驟, 那就跳過去。
你在這個作業中學到了什么? 有什么好的設計值得分享? 感想如何 (太容易 / 太難 / 太無趣)?
| Personal Software Process Stages |
估計的時間(分鍾) |
實際花費的時間 (分鍾) |
|
| Planning |
計划-把工作細化並大致安排次序 |
||
| Development |
開發 |
||
| · Analysis |
· 需求分析 (包括學習新技術) |
||
| · Design Spec |
· 生成設計文檔 |
||
| · Design Review |
· 設計復審 (和同事審核設計文檔) |
||
| · Coding Standard |
· 代碼規范 (制定合適的規范) |
||
| · Design |
· 具體設計 |
||
| · Coding |
· 具體編碼 |
||
| · Code Review |
· 代碼復審 |
||
| · Test |
· 測試(自我測試,修改代碼,提交修改) |
||
| Reporting |
總結報告 |
||
| · Test Report |
· 測試報告 |
|
|
| · Size Measurement |
· 計算工作量 |
||
| · Postmortem & Improvement Plan |
· 事后總結, 並提出改進 |
||
| Total | 總計 |







