全国铁路运输网最佳经由问题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
目录
一、需求分析
1.问题描述
2.基本要求
二、概要设计
1. 程序流程图
2. 数据结构设计
三、详细设计
1.程序设计思想
2.软件模块结构图
3.源程序
四、调试分析
1.测试数据
2.时间复杂度分析
3.上机遇到的问题及解决方案
4.算法的改进设想
五、用户使用手册
六、心得体会
一、需求分析
1.问题描述
该题目采用我国铁路运输网的数据进行编程和运行验证。详细可在网上搜索《全国铁路局管辖线路示意图》,只要全国的主干线就可以了。
铁路运输网络中由铁路线和火车站的两个主要概念,譬如:1号铁路线表示京广线,2号铁路线表示京沪线等。
铁路线对象包括铁路线编号,铁路线名称,起始站编号,终点站编号,该铁路线长度,通行标志(00B客货运禁行,01B货运通行专线,10B客运通行专线,11B 客货运通行)。
火车站对象包括所属铁路线编号,车站代码,车站名,车站简称,离该铁路线起点站路程及终点站路程。
2.基本要求
(1)查询某站所属的铁路线
(2)要求具备新增铁路线的管理功能
(3)要求具备新增车站的管理功能
(4)针对客运,货运情况能计算任何一个起始车站到任何一个终点站之间的最短路径。并且要求能够显示出该最短路径的各个火车站的经由顺序
二、概要设计
1. 程序流程图(我负责的为除弗洛伊德算法外的设计)
在这里简单介绍弗洛伊德算法的核心思想:从图的带权邻接矩阵开始,假设从Vi到Vj有弧,则从Vi到Vj存在一条长度为arcs[i] [j]的路径,该路径不一定是最小路径,尚需进行n次试探。首先考虑路径(Vi,V0,Vj)是否存在。如果存在,则比较(Vi,Vj)和(Vi,V0,Vj)的路径长度取长度较短者为从Vi 到Vj的中间顶点的序号不大于0的最短路径。假如在路径上再增加一个顶点V1,如果(Vi,….,V1)和(V1,….,Vj)分别是当前找到的中间顶点的序号不大于0的最短路径,那么(Vi,…V1,…,Vj)就有可能是从Vi到Vj的中间顶点的序号不大于1的最短路径。将它和已经得到的Vi到Vj的中间顶点的序号不大于0的最短路径相比较,从中选出中间顶点的序号不大于1的最短路径之后,再增加一个V2继续试探,以此类推,经过n次比较后,即可求出从Vi到Vj的最短路径。
2.数据结构设计
存储结构:本程序部分函数采用的是文件进行数据的存储,所以采用的是顺序存储结构,如要添加数据,直接在文件里面进行操作就行了。弗洛伊德算法中采用的存储结构是图的邻接矩阵。
A.如下为抽象数据类型定义的模板以及抽象数据类型线性表的定义:
ADT List{
数据对象:D={ai| ai ∈ElemSet,i=1,2,3……,n,n≥0}
数据关系:R1={
基本操作:
void readviews()
初始条件:views.txt已经存在。
操作结果:将 views.txt里面的数据一次存入数组views[SIZE_view]里,并将数组里面的存储数据的个数赋值给全局变量view_count;
void readways()
初始条件:ways.txt已经存在。
操作结果:将 ways.txt里面的数据一次存入数组ways[SIZE_way]里,并将数组里面的存储数据的个数赋值给全局变量way_count;
void readlines()
初始条件:lines.txt已经存在。
操作结果:将 lines.txt里面的数据一次存入数组lines[SIZE_line]里,并将数组里面的存储数据的个数赋值给全局变量line_count;
void search();
初始条件:views[SIZE_view]存在,且里面放有相关信息。
操作结果:根据用户输入的车站名查找该车站的相关信息并输出;
void addview()
初始条件:views.txt已经存在。
操作结果:将 views.txt里面的数据一次存入数组views[SIZE_view]里,并将数组里面的存储数据的个数赋值给全局变量view_count;
void addway()
初始条件:ways.txt已经存在。
操作结果:将 ways.txt里面的数据一次存入数组ways[SIZE_way]里,并将数组里面的存储数据的个数赋值给全局变量way_count;
void addline()
初始条件:lines.txt已经存在。
操作结果:将 lines.txt里面的数据一次存入数组lines[SIZE_line]里,并将数组里面的存储数据的个数赋值给全局变量line_count;
void floyed()
初始条件: views[SIZE_view]、ways[SIZE_way]、lines[SIZE_line]已经存在并且存有相关信息。
操作结果:把每个车站到各个车站的最短经由路径及此路径的距离存储在path_info、path_list[SIZE_view][SIZE_view]数组里;
void shortest_path()
初始条件:path_info、path_list[SIZE_view][SIZE_view]存储相关的数据;操作结果:输出输入的两个站的最短距离及经过的所有站;
void addadta(int menu)
初始条件:views.txt、ways.txt、lines.txt已经存在。
操作结果:如果menu=1,则添加车站数据,如果menu=2,则添加路线数据;
B.弗洛伊德算法中,数据结构所用到的思想为图的思想,所以数据结构的设计主要的目的为便于图的操作的设计。因此我们用了下面这些数据定义。struct view_info /*城市信息结构*/
{
int id;
char name[20];
int code;
char shortname[20];
char LName[100];//经过此站的铁路线名称
}views[SIZE_view];