现代软件工程讲义 个人项目和结对项目练习 地铁
很多老師反映教軟件工程和程序設(shè)計(jì)的時(shí)候沒有合適的題目,《構(gòu)建之法》提供了下面的題目,都是從簡(jiǎn)單的解題思路入手,逐步增量改進(jìn)。學(xué)生們可以復(fù)習(xí)基本的編程技能,然后逐步加入模塊化,文件處理,單元測(cè)試,信息隱藏,面向?qū)ο蟮姆治?#xff0c;MVC 等概念和實(shí)踐。? 大家可以選用:
? ? - 黃金點(diǎn)游戲和單詞頻率問題
? ? -?四則運(yùn)算練習(xí)
? ? - 計(jì)算程序文件的行數(shù),及其擴(kuò)展問題
? ? - 電梯調(diào)度
? ? - 網(wǎng)頁前端技術(shù)的練習(xí)題
下面的題目, 從簡(jiǎn)單的數(shù)據(jù)結(jié)構(gòu)開始,讓同學(xué)們逐步練習(xí)。
0. 請(qǐng)上網(wǎng)搜到最新的北京地線路圖。
1. 把這個(gè)圖的各個(gè)線路,各個(gè)站點(diǎn),換乘信息等用文本文件? (假設(shè)名字叫 beijing-subway.txt)的形式保存起來,應(yīng)該保存的信息有 {線路號(hào),線路的各個(gè)站名,車站的換乘信息}, 應(yīng)用程序可以讀取這個(gè)文件,就能掌握關(guān)于北京地鐵線路的所有信息,應(yīng)該用什么樣的格式呢?? 在我們生活中,我們用自然語言,或者圖表來表示信息, 當(dāng)一個(gè)有足夠生活經(jīng)歷的成年人看到上面的線圖路,她馬上可以理解? “兩個(gè)小白圓點(diǎn)中間有一條線表示這兩個(gè)車站是相鄰的”。?當(dāng)你要讓電腦程序來處理這些信息,但是程序只知道一行,一個(gè)字,一個(gè)字節(jié)地處理信息, 怎么辦,怎么表示 “這個(gè)車站可以轉(zhuǎn) 5 號(hào)線”?
2. 寫一個(gè)命令行程序 (不妨叫 subway.exe),這個(gè)程序啟動(dòng)的時(shí)候, 會(huì)讀取beijing-subway.txt 的信息,然后這個(gè)程序就等待用戶的輸入, 用戶可以輸入地鐵的線路編號(hào),然后程序就輸出此地鐵線路的所有站名(按某一方向順序輸出即可)。 輸出站名后,程序又進(jìn)入等待狀態(tài)。
3. 能否進(jìn)一步, 找到兩點(diǎn)之間的最有效線路? 請(qǐng)實(shí)現(xiàn)下面這個(gè)需求:
subway.exe?? /b 知春路?? 中關(guān)村
返回經(jīng)歷的站名的個(gè)數(shù),和路徑,如果有換乘,請(qǐng)列出換乘的線路, 例如:
4
知春路
知春里
海淀黃莊? 換乘10號(hào)線
中關(guān)村
3.1 抽象
????? 在我們做測(cè)試的過程中,我們可以比較具體的車站的名字,已驗(yàn)證算法的正確性, 但是我們實(shí)際上并不在乎這個(gè)具體名字是 "知春路", 還是 "惠新西街南口",我們只要知道它們相同就好了。?能否給每個(gè)車站一個(gè)數(shù)字的標(biāo)識(shí),這樣便于比較?? 請(qǐng)修改你的 beijing-subway.txt 地圖文件,把車站的唯一標(biāo)識(shí)ID 加上,然后再修改程序中讀取文件的部分,讓它能處理ID,而不是僅僅車站名字。修改程序之后,請(qǐng)保證程序依然能夠完成它原有的功能。
4. 既然有了地圖和 “返回兩個(gè)站點(diǎn)之間最短路徑” 的功能, 我們?cè)趺粗莱绦騿T實(shí)現(xiàn)的這個(gè)功能是正確的呢? 我們可以抽樣調(diào)查,但是不能確保。能否測(cè)試這個(gè)模塊呢? 這個(gè)模塊可能是程序中的一個(gè)類,或幾個(gè)相關(guān)的類,我們可以通過給它寫單元測(cè)試,或模塊測(cè)試的辦法。
??? 請(qǐng)把subway 程序中 “返回兩個(gè)站點(diǎn)之間最短路徑” 的功能獨(dú)立出來,成為一個(gè)DLL,或者一個(gè)類,那么我們就可以用《構(gòu)建之法》 提到的單元測(cè)試, 或者 四則運(yùn)算練習(xí)題 提到的測(cè)試模塊的方法測(cè)試了。
請(qǐng)把這個(gè)exe 分解為幾個(gè)獨(dú)立的模塊,然后用你所在的平臺(tái)的單元測(cè)試工具來測(cè)試。
5. 如果乘客有錢又有閑,那么,怎樣才能盡可能快地遍歷地鐵的所有車站呢(只用經(jīng)過一次,不用下車,就算經(jīng)過車站)。 例如,注意到13號(hào)線 和 10 號(hào)線相交的知春路地鐵站,我們選它作為一個(gè)起始站,從這個(gè)站出發(fā),要經(jīng)歷多少站(換乘不出地鐵系統(tǒng),即不能從一個(gè)地鐵口走到路面,然后從另一個(gè)站進(jìn)去),才能把所有地鐵站都遍歷呢?
?? 擴(kuò)展命令行程序,讓它接受一個(gè)地鐵站名。? 例如這個(gè)格式: subway.exe /a? 知春路 ?
程序輸出總共經(jīng)歷多少站, 以及經(jīng)歷的站名, 舉一個(gè)特例,假如地鐵系統(tǒng)只有知春路, 西土城兩個(gè)站, 那么這個(gè)程序應(yīng)該輸出:
3
知春路
西土城
知春路
5.1 從現(xiàn)實(shí)生活中我們知道,在地鐵系統(tǒng)中換乘是比較麻煩的一件事情,花費(fèi)額外的時(shí)間和體力 (下車,步行到下一個(gè)線路,等車,擠上車,再找座位),我們上一個(gè)遍歷算法沒有考慮到這一點(diǎn),有點(diǎn)不接地氣。 如果我們做一個(gè)改進(jìn), 每次換乘,相當(dāng)于額外經(jīng)歷了 3 個(gè)車站, 我們還是要求遍歷所有車站的最優(yōu)線路,我們的程序應(yīng)該怎么修改呢?? 總的車站數(shù)量 = 實(shí)際經(jīng)過的車站數(shù)量 + 換乘等價(jià)的車站數(shù)量
我們?cè)谇懊鎺撞降男薷闹?#xff0c; 把數(shù)據(jù)格式,程序的功能,程序的結(jié)構(gòu)都稍稍修改了一些,但是整體程序還能按原來的需求運(yùn)行。 希望初學(xué)者在每一步都只改一個(gè)方面,修改之后,能測(cè)試程序,保證沒有引入其它錯(cuò)誤。 有基礎(chǔ)的同學(xué)可以用源代碼管理工具來管理各個(gè)版本的代碼。
5.2 既然有程序能輸出解答, 那么我們?cè)趺打?yàn)證呢? 睜大眼睛一個(gè)一個(gè)地?cái)?shù)么?? 我們不是會(huì)寫程序么? 來一個(gè):
subway.exe? /z filename?
????? filename 指向一個(gè)文本文件,里面放了 /a? 參數(shù)的答案 (就是題目 3 的輸出, 一個(gè)數(shù)字加上站名)
這個(gè) /z? 參數(shù)要求在命令行輸出
????? true: 如果filename 文件中的數(shù)據(jù)的確覆蓋了整個(gè)地鐵的所有站點(diǎn)至少一次,并且車站的數(shù)量是對(duì)的,車站的遍歷次序是合理的。
false: 車站的遍歷次序仍然合理,但是有遺漏的站點(diǎn),或者車站的數(shù)量錯(cuò)誤。 如果有遺漏的站點(diǎn),這個(gè)程序要至少輸出一個(gè)遺漏的車站名。
error: 如果車站的遍歷次序不合理(例如直接從“知春路” 站到了“中關(guān)村” 站), 打印出出錯(cuò)的兩個(gè)站名。
6. 我們前面的練習(xí)都是基于命令行的,能否做成圖形界面呢? 首先我們要給每個(gè)站點(diǎn)一個(gè)坐標(biāo)信息。
??? 1)請(qǐng)修改 beijing-subway.txt 文件,加入適當(dāng)?shù)男畔?#xff0c;為實(shí)現(xiàn)圖形界面做準(zhǔn)備。 你要如何設(shè)計(jì)這些坐標(biāo)呢?
??? 2)請(qǐng)改進(jìn) subway.exe,? 加一個(gè)? /g??的命令行參數(shù),?讓它根據(jù)你提供的坐標(biāo)畫出各個(gè)地鐵站,線路,以及換乘站。
??? 我們看到,所有要展現(xiàn)的信息都要存儲(chǔ)起來,存儲(chǔ)還要有一定的規(guī)則,這樣程序才好正確地,高效地讀出來。 存儲(chǔ)有下面三個(gè)方案:
????a) 用文本文件, 用自定義的格式存放
??? b) 用XML 格式存放
??? c) 還可以用數(shù)據(jù)庫(kù)的方式來存放, 例如 sqlite
??? d) 還可以用自己定義的二進(jìn)制的格式來存放。
??? 請(qǐng)比較幾種方式的優(yōu)缺點(diǎn),特別是,這些方式如何應(yīng)對(duì)變化的內(nèi)部,外部因素。 例如,在 d) 方案中, 如果要增加一個(gè)地鐵站,或者修改一個(gè)地鐵站的名字,我們應(yīng)該怎么做呢?
7. 現(xiàn)在我們回過頭來,把遍歷的解法搬到GUI (圖形界面)來。?
??? 1)擴(kuò)展 subway.exe,? 處理下面參數(shù)的時(shí)候,
???????????? subway.exe /g? 知春路
???????? 程序在圖形界面中顯示地鐵地圖 (各個(gè)站點(diǎn)的相對(duì)位置和官方地圖類似即可),然后用一個(gè)小亮點(diǎn)表示乘客,乘客正在經(jīng)過的車站就會(huì)閃亮,乘客走過的路用不同的顏色標(biāo)識(shí),同時(shí)在適當(dāng)?shù)牡胤接袛?shù)字表明乘客已經(jīng)經(jīng)過車站的數(shù)目。
8. 前面幾步都做好了,下面就是工程問題了:
??? 8.1 請(qǐng)讓程序能處理上海的地鐵地圖,或者其它城市的地圖。把程序由 “固定處理一個(gè)地圖” 升級(jí)為 “能處理多個(gè)地圖”, 程序的什么模塊需要變化?
??? 8.2 請(qǐng)把程序移植到網(wǎng)頁/手機(jī),用戶指定起點(diǎn)和終點(diǎn),程序就報(bào)告這兩個(gè)點(diǎn)的最優(yōu)路徑。? 把程序從 PC 平臺(tái)搬到 Web 或 Mobile,? 原來寫的所有代碼都要扔掉么?? 還是有很多部分可以重用? 怎樣重用?
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的现代软件工程讲义 个人项目和结对项目练习 地铁的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 现代软件工程 作业 原型设计
- 下一篇: sql having是什么意思_图解sq