地鐵票價信息表生成系統
1. 需求分析
1.1 背景
地鐵已經成為大多數人出行的首選,北京地鐵有多條運營線路, 截至 2019 年 12 月,北京市軌道交通路網運營線路達 23 條、總里程 699.3 公里、車站 405 座。2019 年,北京地鐵年乘客量達到 45.3 億人次,日均客流為 1241.1 萬人次,單日客運量最高達 1327.46 萬人次。由于采用浮動票價,乘客在乘坐地鐵時需要知道出發站和目的站所需低票價以避免不必要的浪費,這就需要在乘客購票前夠告知此次乘車的票價。因此,每個車站,均要提供從該站出發,到其他所有地鐵站的最少票價信息表供乘客購票前查看。如果有新的地鐵線路的加入,就會導致價格表的變更,因此需要使用計算機軟件自動生成該票價表。
請設計一個地鐵票價信息表生成軟件,當輸入任意起始站后,能夠自動計算出以該站為起始點到其他所有各地鐵站點(僅限地鐵出行)的票價信息表。
1.2 用戶需求
1.2.1 文字輸入查詢
路徑查詢:用戶輸入起始站、終點站,點擊相應按鈕,系統查找輸出里程最短的路徑。
票價表查詢:用戶輸入起始站,點擊相應按鈕,系統查找并輸出以相應站點為起始站,到地鐵線路中每一站的票價、里程等信息。
1.2.2 圖形界面查詢
顯示完整的北京地鐵線路圖,用戶點擊選取自己旅程的起點、終點站,點擊相應查詢按鈕,系統在地鐵書上突出顯示最短路徑。
1.3 系統需求
1.3.1 地鐵信息數據結構
每個站點的名稱、線路等信息;站點之間的連接、距離等關系;最短路查詢算法中用到的標記信息等等,都需要被儲存在易于查找、更改的數據結構中。
1.3.2 最短路徑查詢算法
最短路徑問題是圖論研究中的一個經典算法問題,旨在尋找圖(由結點和路徑組成的)中兩結點之間的最短路徑。
在本任務中,輸入一個站時,需要能查找到整個圖中其他所有站點到他的最短路徑及其長度。
1.3.3 TXT 文件讀入地鐵信息
北京地鐵線路基礎信息數據通過一個名為“BaseSubWayInfo.txt”的文本文件讀入。需要有算法能夠讀取并切割提取該文本文檔中的內容,儲存在相應的地鐵信息數據結構中。
1.3.4 前端圖形界面
需要生成可通按鈕、輸入框等形式與用戶進行交互的 GUI(Graphical User Interface),通過點擊按鈕、上傳文件、輸入站點、提交表單等等方式完成用戶的查詢需求。
1.3.5 前后端交互
前端的圖形界面要與后端的數據、算法進行有效、可信的交互。把輸入的信息提取出來,作為參數傳遞給后端相應的算法,獲得結果再傳回前端圖形界面,使得用戶的操作能夠輸出正確的結果。這是本任務中最不好入門,也是我在上面耗費時間最長的部分。
2. 數據結構設計
由于本項目的數據結構由 JavaScript 語言寫就。
JavaScript 是 Web 的編程語言。所有現代的 HTML 頁面都使用 JavaScript。
2.1 Station 類
2.1.1 需求和思想
Name[]數組儲存站名,
2.1.2 代碼實現
class Station {constructor (name) {this.name = name;this.lines = [];//this.location = [0];this.toEdge = undefined;//this.isTransfer = false;//用于求最短路徑this.preStation = undefined;this.isVisited = false;this.distance = Number.MAX_SAFE_INTEGER;this.fare = Number.MAX_SAFE_INTEGER;}
2.2 Edge 類
2.2.1 需求和思想
2.2.2 代碼實現
class Edge {constructor(from, to, weight) {this.nextEdge = undefined; //指向鄰接表中的下一條邊this.from = from; this.to = to;this.weight = weight;}
}
2.3 StationGraph 類
2.3.1 需求和思想
2.3.2 代碼實現
class StationsGraph {//無向圖constructor() {//頂點this.stationArray = [];}StationAdd(stationName, lineNumber) {for (let element of this.stationArray) {if (element.name == stationName) {element.lines.push(lineNumber);element.isTransfer = true;return element;}};let stationNew = new Station(stationName);stationNew.lines.push(lineNumber);this.stationArray.push(stationNew);return stationNew;};StationGet(stationName) {for (const iterator of this.stationArray) {