很多老師反映教軟體工程和程式設計的時候沒有合適的題目,《構建之法》提供了下面的題目,都是從簡單的解題思路入手,逐步增量改進。學生們可以複習基本的程式設計技能,然後逐步加入模組化,檔案處理,單元測試,資訊隱藏,物件導向的分析,mvc 等概念和實踐。 大家可以選用:
- **點遊戲和單詞頻率問題
- 四則運算練習
- 計算程式檔案的行數,及其擴充套件問題
- 電梯排程
- 網頁前端技術的練習題
下面的題目, 從簡單的資料結構開始,讓同學們逐步練習。
0. 請上網搜到最新的北京地線路圖。
1. 把這個圖的各個線路,各個站點,換乘資訊等用文字檔案 (假設名字叫 beijing-subway.txt)的形式儲存起來,應該儲存的資訊有 , 應用程式可以讀取這個檔案,就能掌握關於北京地鐵線路的所有資訊,應該用什麼樣的格式呢? 在我們生活中,我們用自然語言,或者圖表來表示資訊, 當乙個有足夠生活經歷的成年人看到上面的線圖路,她馬上可以理解 「兩個小白圓點中間有一條線表示這兩個車站是相鄰的」。 當你要讓電腦程式來處理這些資訊,但是程式只知道一行,乙個字,乙個位元組地處理資訊, 怎麼辦,怎麼表示 「這個車站可以轉 5 號線」?
2. 寫乙個命令列程式 (不妨叫 subway.exe),這個程式啟動的時候, 會讀取beijing-subway.txt 的資訊,然後這個程式就等待使用者的輸入, 使用者可以輸入地鐵的線路編號,然後程式就輸出此地鐵線路的所有站名(按某一方向順序輸出即可)。 輸出站名後,程式又進入等待狀態。
3. 能否進一步, 找到兩點之間的最有效線路? 請實現下面這個需求:
subway.exe /b 知春路 中關村
返回經歷的站名的個數,和路徑,如果有換乘,請列出換乘的線路, 例如:
知春路知春裡
海淀黃莊 換乘10號線
中關村3.1 抽象
在我們做測試的過程中,我們可以比較具體的車站的名字,已驗證演算法的正確性, 但是我們實際上並不在乎這個具體名字是 "知春路", 還是 "惠新西街南口",我們只要知道它們相同就好了。 能否給每個車站乙個數字的標識,這樣便於比較? 請修改你的 beijing-subway.txt 地**件,把車站的唯一標識id 加上,然後再修改程式中讀取檔案的部分,讓它能處理id,而不是僅僅車站名字。修改程式之後,請保證程式依然能夠完成它原有的功能。
4. 既然有了地圖和 「返回兩個站點之間最短路徑」 的功能, 我們怎麼知道程式設計師實現的這個功能是正確的呢? 我們可以抽樣調查,但是不能確保。能否測試這個模組呢? 這個模組可能是程式中的乙個類,或幾個相關的類,我們可以通過給它寫單元測試,或模組測試的辦法。
請把subway 程式中 「返回兩個站點之間最短路徑」 的功能獨立出來,成為乙個dll,或者乙個類,那麼我們就可以用《構建之法》 提到的單元測試, 或者 四則運算練習題 提到的測試模組的方法測試了。
請把這個exe 分解為幾個獨立的模組,然後用你所在的平台的單元測試工具來測試。
5. 如果乘客有錢又有閒,那麼,怎樣才能盡可能快地遍歷地鐵的所有車站呢(只用經過一次,不用下車,就算經過車站)。 例如,注意到13號線 和 10 號線相交的知春路地鐵站,我們選它作為乙個起始站,從這個站出發,要經歷多少站(換乘不出地鐵系統,即不能從乙個地鐵口走到路面,然後從另乙個站進去),才能把所有地鐵站都遍歷呢?
擴充套件命令列程式,讓它接受乙個地鐵站名。 例如這個格式: subway.exe /a 知春路
程式輸出總共經歷多少站, 以及經歷的站名, 舉乙個特例,假如地鐵系統只有知春路, 西土城兩個站, 那麼這個程式應該輸出:
知春路西土城
知春路5.1 從現實生活中我們知道,在地鐵系統中換乘是比較麻煩的一件事情,花費額外的時間和體力 (下車,步行到下乙個線路,等車,擠上車,再找座位),我們上乙個遍歷演算法沒有考慮到這一點,有點不接地氣。 如果我們做乙個改進, 每次換乘,相當於額外經歷了 3 個車站, 我們還是要求遍歷所有車站的最優線路,我們的程式應該怎麼修改呢? 總的車站數量 = 實際經過的車站數量 + 換乘等價的車站數量
我們在前面幾步的修改中, 把資料格式,程式的功能,程式的結構都稍稍修改了一些,但是整體程式還能按原來的需求執行。 希望初學者在每一步都只改乙個方面,修改之後,能測試程式,保證沒有引入其它錯誤。 有基礎的同學可以用源**管理工具來管理各個版本的**。
5.2 既然有程式能輸出解答, 那麼我們怎麼驗證呢? 睜大眼睛乙個乙個地數麼? 我們不是會寫程式麼? 來乙個:
subway.exe /z filename
filename 指向乙個文字檔案,裡面放了 /a 引數的答案 (就是題目 3 的輸出, 乙個數字加上站名)
這個 /z 引數要求在命令列輸出
true: 如果filename 檔案中的資料的確覆蓋了整個地鐵的所有站點至少一次,並且車站的數量是對的,車站的遍歷次序是合理的。
false: 車站的遍歷次序仍然合理,但是有遺漏的站點,或者車站的數量錯誤。 如果有遺漏的站點,這個程式要至少輸出乙個遺漏的車站名。
error: 如果車站的遍歷次序不合理(例如直接從「知春路」 站到了「中關村」 站), 列印出出錯的兩個站名。
6. 我們前面的練習都是基於命令列的,能否做成圖形介面呢? 首先我們要給每個站點乙個座標資訊。
1)請修改 beijing-subway.txt 檔案,加入適當的資訊,為實現圖形介面做準備。 你要如何設計這些座標呢?
2)請改進 subway.exe, 加乙個 /g 的命令列引數, 讓它根據你提供的座標畫出各個地鐵站,線路,以及換乘站。
我們看到,所有要展現的資訊都要儲存起來,儲存還要有一定的規則,這樣程式才好正確地,高效地讀出來。 儲存有下面三個方案:
a) 用文字檔案, 用自定義的格式存放
b) 用xml 格式存放
c) 還可以用資料庫的方式來存放, 例如 sqlite
d) 還可以用自己定義的二進位制的格式來存放。
請比較幾種方式的優缺點,特別是,這些方式如何應對變化的內部,外部因素。 例如,在 d) 方案中, 如果要增加乙個地鐵站,或者修改乙個地鐵站的名字,我們應該怎麼做呢?
7. 現在我們回過頭來,把遍歷的解法搬到gui (圖形介面)來。
1)擴充套件 subway.exe, 處理下面引數的時候,
subway.exe /g 知春路
程式在圖形介面中顯示地鐵地圖 (各個站點的相對位置和官方地圖類似即可),然後用乙個小亮點表示乘客,乘客正在經過的車站就會閃亮,乘客走過的路用不同的顏色標識,同時在適當的地方有數字表明乘客已經經過車站的數目。
8. 前面幾步都做好了,下面就是工程問題了:
8.1 請讓程式能處理上海的地鐵地圖,或者其它城市的地圖。把程式由 「固定處理乙個地圖」 公升級為 「能處理多個地圖」, 程式的什麼模組需要變化?
8.2 請把程式移植到網頁/手機,使用者指定起點和終點,程式就報告這兩個點的最優路徑。 把程式從 pc 平台搬到 web 或 mobile, 原來寫的所有**都要扔掉麼? 還是有很多部分可以重用? 怎樣重用?
現代軟體工程講義 目錄
軟體工程牽涉的範圍很廣,同時也是一般院校的同學反映比較乏味的課程。但是軟體工程的技術對於投身it 產業的學生來說是非常重要的。經過幾年的探索,我總結了在16周的時間內讓同學們通過 做中學 learning by doing 掌握實用的軟體工程技術的教學計畫。這套講義在下面的學校正式課程中運用過 20...
現代軟體工程 結對程式設計 詞頻統計
這次的任務是對文字檔案的詞頻統計,要求在這裡 詞頻統計作業要求 雖然要求的細節一改再改,我們終於還是如期完成了這個專案,並且因為此次結對程式設計的主題任務是效能分析,我們還做了效能分析和一些優化。不同於要求,我們的幾次commit除了實現功能外,大多是因為要求的變化而對 進行修改,或是修復bug 優...
軟體工程結對專案 WordCount
二 小組成員及分工 1120161754 毛碩 1120161747 林宇翔 我負責基礎功能,林宇翔負責介面實現。三.預估時間 psp2.1 personai software process stage 預估耗時 分鐘 實際耗時 分鐘 planning 計畫30 50estimate 估計這個任務...