現代軟件工程講義 我的項目和結對項目練習 地鐵

不少老師反映教軟件工程和程序設計的時候沒有合適的題目,《構建之法》提供了下面的題目,都是從簡單的解題思路入手,逐步增量改進。學生們能夠複習基本的編程技能,而後逐步加入模塊化,文件處理,單元測試,信息隱藏,面向對象的分析,MVC 等概念和實踐。  你們能夠選用:html

    - 黃金點遊戲和單詞頻率問題前端

    - 四則運算練習程序員

    - 計算程序文件的行數,及其擴展問題算法

    - 電梯調度sql

    - 網頁前端技術的練習題數據庫

下面的題目, 從簡單的數據結構開始,讓同窗們逐步練習。編程

0. 請上網搜到最新的北京地線路圖數據結構

 

 

 

1. 把這個圖的各個線路,各個站點,換乘信息等用文本文件  (假設名字叫 beijing-subway.txt)的形式保存起來,應該保存的信息有 {線路號,線路的各個站名,車站的換乘信息}, 應用程序能夠讀取這個文件,就能掌握關於北京地鐵線路的全部信息,應該用什麼樣的格式呢?  在咱們生活中,咱們用天然語言,或者圖表來表示信息, 當一個有足夠生活經歷的成年人看到上面的線圖路,她立刻能夠理解  「兩個小白圓點中間有一條線表示這兩個車站是相鄰的」。 當你要讓電腦程序來處理這些信息,可是程序只知道一行,一個字,一個字節地處理信息, 怎麼辦,怎麼表示 「這個車站能夠轉 5 號線」?模塊化

2. 寫一個命令行程序 (不妨叫 subway.exe),這個程序啓動的時候, 會讀取beijing-subway.txt 的信息,而後這個程序就等待用戶的輸入, 用戶能夠輸入地鐵的線路編號,而後程序就輸出此地鐵線路的全部站名(按某一方向順序輸出便可)。 輸出站名後,程序又進入等待狀態。工具

 

3. 可否進一步, 找到兩點之間的最有效線路? 請實現下面這個需求:

  subway.exe   /b 知春路   中關村

  返回經歷的站名的個數,和路徑,若是有換乘,請列出換乘的線路, 例如:

  4

  知春路

  知春裏

  海淀黃莊  換乘10號線

  中關村

 

3.1 抽象

      在咱們作測試的過程當中,咱們能夠比較具體的車站的名字,已驗證算法的正確性, 可是咱們實際上並不在意這個具體名字是 "知春路", 仍是 "惠新西街南口",咱們只要知道它們相同就行了。 可否給每一個車站一個數字的標識,這樣便於比較?  請修改你的 beijing-subway.txt 地圖文件,把車站的惟一標識ID 加上,而後再修改程序中讀取文件的部分,讓它能處理ID,而不是僅僅車站名字。修改程序以後,請保證程序依然可以完成它原有的功能。

 

4. 既然有了地圖和 「返回兩個站點之間最短路徑」 的功能, 咱們怎麼知道程序員實現的這個功能是正確的呢? 咱們能夠抽樣調查,可是不能確保。可否測試這個模塊呢? 這個模塊多是程序中的一個類,或幾個相關的類,咱們能夠經過給它寫單元測試,或模塊測試的辦法。

    請把subway 程序中 「返回兩個站點之間最短路徑」 的功能獨立出來,成爲一個DLL,或者一個類,那麼咱們就能夠用《構建之法》 提到的單元測試, 或者 四則運算練習題 提到的測試模塊的方法測試了。

 請把這個exe 分解爲幾個獨立的模塊,而後用你所在的平臺的單元測試工具來測試。

 

 

5. 若是乘客有錢又有閒,那麼,怎樣才能儘量快地遍歷地鐵的全部車站呢(只用通過一次,不用下車,就算通過車站)。 例如,注意到13號線 和 10 號線相交的知春路地鐵站,咱們選它做爲一個起始站,從這個站出發,要經歷多少站(換乘不出地鐵系統,即不能從一個地鐵口走到路面,而後從另外一個站進去),才能把全部地鐵站都遍歷呢?

   擴展命令行程序,讓它接受一個地鐵站名。  例如這個格式: subway.exe /a  知春路  

程序輸出總共經歷多少站, 以及經歷的站名, 舉一個特例,假如地鐵系統只有知春路, 西土城兩個站, 那麼這個程序應該輸出:

  3

  知春路

  西土城

  知春路

 

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,  原來寫的全部代碼都要扔掉麼?  仍是有不少部分能夠重用? 怎樣重用?

相關文章
相關標籤/搜索