地铁票价信息表生成系统
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) {