计应192 第二组 张梦涵
一.规划格式
把这个图的各个线路,各个站点,换乘信息等用文本文件 ,设定名字叫 Zhengzhou-subway.txt的形式保存起来,应该保存的信息有 (线路号,线路的各个站名,车站的换乘信息), 应用程序可以读取这个文件,就能掌握关于郑州地铁线路的所有信息。
二.写程序命令
写一个命令行程序subway.exe,这个程序启动的时候, 会读取Zhengzhou-subway.txt 的信息,然后这个程序就等待用户的输入, 用户可以输入地铁的线路编号,然后程序就输出此地铁线路的所有站名(按某一方向顺序输出即可)。 输出站名后,程序又进入等待状态。
三.实现细节
能否进一步找到两点之间的最有效线路。实现下面这个需求:
subway.exe /b 龙子湖 二七广场
返回经历的站名的个数,和路径,如果有换乘,请列出换乘的线路, 例如:
郑州东站 换乘5号线
在我们做测试的过程中,我们可以比较具体的车站的名字,已验证算法的正确性, 但是我们实际上并不在乎这个具体名字是,给每个车站一个数字的标识这样便于比较,修改Zhengzhou-subway.txt 地图文件,把车站的唯一标识ID 加上,然后再修改程序中读取文件的部分,让它能处理ID,而不是仅仅车站名字。修改程序之后,请保证程序依然能够完成它原有的功能。
既然有了地图和 “返回两个站点之间最短路径” 的功能, 我们怎么知道程序员实现的这个功能是正确的呢? 我们可以抽样调查,但是不能确保。能否测试这个模块呢? 这个模块可能是程序中的一个类,或几个相关的类,我们可以通过给它写单元测试,或模块测试的办法。
把subway 程序中 “返回两个站点之间最短路径” 的功能独立出来,成为一个DLL,或者一个类,那么我们就可以用《构建之法》 提到的单元测试, 或者 四则运算练习题 提到的测试模块的方法测试。
从现实生活中我们知道,在地铁系统中换乘是比较麻烦的一件事情,花费额外的时间和体力 ,如果上一个遍历算法没有考虑到这一点,有点不符合现实。 如果做一个改进, 每次换乘,相当于额外经历了 3 个车站, 我们还是要求遍历所有车站的最优线路,修改程序:总的车站数量 = 实际经过的车站数量 + 换乘等价的车站数量。
在前面几步的修改中, 把数据格式,程序的功能,程序的结构都稍稍修改了一些,但是整体程序还能按原来的需求运行。 在每一步都只改一个方面,修改之后,能测试程序,保证没有引入其它错误。
如何验证:
subway.exe /z filename
filename 指向一个文本文件,里面放了 /a 参数的答案 (就是题目 3 的输出, 一个数字加上站名)
这个 /z 参数要求在命令行输出
true: 如果filename 文件中的数据的确覆盖了整个地铁的所有站点至少一次,并且车站的数量是对的,车站的遍历次序是合理的。
false: 车站的遍历次序仍然合理,但是有遗漏的站点,或者车站的数量错误。 如果有遗漏的站点,这个程序要至少输出一个遗漏的车站名。
若要做出图形界面,首先我们要给每个站点一个坐标信息:
1)请修改 beijing-subway.txt 文件,加入适当的信息,为实现图形界面做准备。 你要如何设计这些坐标呢?
2)请改进 subway.exe, 加一个 /g 的命令行参数, 让它根据你提供的坐标画出各个地铁站,线路,以及换乘站。
我们看到,所有要展现的信息都要存储起来,存储还要有一定的规则,这样程序才好正确地,高效地读出来。 存储有下面三个方案。
a) 用文本文件, 用自定义的格式存放
b) 用XML 格式存放
c) 还可以用数据库的方式来存放, 例如 sqlite
d) 还可以用自己定义的二进制的格式来存放。
比较几种方式的优缺点,特别是,这些方式如何应对变化的内部,外部因素。
现在我们回过头来,把遍历的解法搬到GUI (图形界面)来。
1)扩展 subway.exe, 处理下面参数的时候:
subway.exe /g 龙子湖
程序在图形界面中显示地铁地图 (各个站点的相对位置和官方地图类似即可),然后用一个小亮点表示乘客,乘客正在经过的车站就会闪亮,乘客走过的路用不同的颜色标识,同时在适当的地方有数字表明乘客已经经过车站的数目。
解决完图形界面,接下来就是工程问题了:
让程序能处理郑州的地铁地图,或者其它城市的地图。把程序由 “固定处理一个地图” 升级为 “能处理多个地图”, 程序的什么模块需要变化?
把程序移植到网页/手机,用户指定起点和终点,程序就报告这两个点的最优路径。 把程序从 PC 平台搬到 Web 或 Mobile。
总结:程序是需要处理各种谨小细微的细节以及考虑到众多突发问题的,要把所有的都假设都想一遍,才是一个及格的软件工程。