全国铁路最短路径经由问题.docx
- 文档编号:27256104
- 上传时间:2023-06-28
- 格式:DOCX
- 页数:33
- 大小:197.95KB
全国铁路最短路径经由问题.docx
《全国铁路最短路径经由问题.docx》由会员分享,可在线阅读,更多相关《全国铁路最短路径经由问题.docx(33页珍藏版)》请在冰豆网上搜索。
全国铁路最短路径经由问题
中南大学数据结构
课程设计报告
题目全国铁路最短路径经由问题
学生姓名任秋峥
指导教师李登
学院信息科学与工程学院
学号**********
专业班级电子信息专业0901班
完成时间2011年6月30号
第一章、课程设计题目
1、问题描述
题目为全国铁路最短路径经由问题
该题目采用我国铁路运输网的数据进行编程和运行验证。
铁路运输网络中由铁路线和火车站的两个主要概念,譬如:
1号铁路线表示京广线,2号铁路线表示京沪线等。
铁路线对象包括铁路线编号,铁路线名称,起始站编号,终点站编号,该铁路线长度,通行标志(00B客货运禁行,01B货运通行专线,10B客运通行专线,11B客货运通行)。
火车站对象包括所属铁路线编号,车站代码,车站名,车站简称,离该铁路线起点站路程及终点站路程。
2、基本要求
(1)查询某站所属的铁路线
(2)要求具备新增铁路线的管理功能
(3)要求具备新增车站的管理功能
(4)针对客运,货运情况能计算任何一个起始车站到任何一个终点站之间的最短路径。
并且要求能够显示出该最短路径的各个火车站的经由顺序
3、实现提示
要在计算机上建立一个交通咨询系统则主要采取图的结构来表示实际的交通网路。
我们可以将其转换为一个源点到另一个源点的最短路径,这里我应用了Floyd的算法。
下图为简单交通线路
程序分别采用三个结构体来存储信息。
views存储车站信息
车站身份编号
车站名
车站编码
车站简称
车站所属铁路线
line存储铁路信息
铁路编码
铁路名字
起始站编码
终点站编码
通行标志
ways存储道路信息
车站1
车站2
两站间距离
也可以将以上信息也存入三个文件夹中,在程序中利用fread函数把信息从文件中读出赋给三个结构体。
1在实现查找车站功能时,首先利用fread函数从文件中读取数据,再调用strcmp函数比较输入车站名与文件存贮的车站名,如果相同,就输出该车站名的相关信息。
2实现最短路径时,利用Floyd的算法。
3在实现增加信息功能时可以利用fprintf函数和fscanf函数向文件中输入信息,同时文件中记录个数增加1.
第二章、全国铁路最短路径经由问题的具体实现
2.1需求分析
1、可以直接向客户输出所有铁路和城市的信息
2、可以为客户提供查询车站的功能
3、可以为客户提供查询从一个车站到另一个车站的最短路径的功能
4、可以及时增加新的铁路和车站信息。
2.2概要设计
1、设计思路
用文件存储信息,从文件中读取信息存储在views、lines、ways三个结构体中。
再构造函数,分别实现输出、查询、最短路径、增加信息等功能。
在用switch和while的循环语句来调用上述函数来实现功能,属于模块化实现功能。
2、设计方案
①readviews()、readlines、readways()函数分别实现输出车站、铁路、道路信息。
从文件中读取信息赋给结构体,循环输出。
②search()实现查询车站功能。
利用fread函数把文件中的信息赋给结构体后,调用strcmp函数比较输入车站名,如果相同,就输出该车站的相关信息。
③addviews()函数实现增加车站信息,可以调用fwrite或者fprintf函数向文件中写入信息。
4Floyd()函数实现最短路径的查询
5addllines()函数实现增加铁路线的信息,可以调用fwrite或者fprintf函数向文件中写入信息。
6利用switch循环,在case1——case5情况下,分别调用以上函数的功能。
7构建三个结构体,分别存放城市、铁路、道路的信息。
数据结构中图的定义和术语为以下:
ADTGraph{
数据对象V:
V是具有相同特性的数据元素的集合,称为顶点集。
数据关系R:
R={VR}
VR={
基本操作P:
CreateGraph(&G,V,VR);
初始条件:
V是图的顶点集,VR是图中弧的集合。
操作结果:
按V和VR的定义构造图G
DestroyGraph(&G);
初始条件:
图G存在
操作结果:
销毁图G
LocateVex(G,u);
初始条件:
图G存在,u一G中顶点有相同特征
操作结果:
若G中存在顶点u,则返回该顶点在图中位置;否则返回其它信息。
GetVex(G,v);
初始条件:
图G存在,v是G中某个顶点
操作结果:
返回v的值。
PutVex(&G,v,value);
初始条件:
图G存在,v是G中某个顶点
操作结果:
对v赋值value
FirstAdjVex(G,v);
初始条件:
图G存在,v是G中某个顶点
操作结果:
返回v的第一个邻接顶点。
若顶点在G中没有邻接顶点,则返回“空”
NextAdjVex(G,v,w);
初始条件:
图G存在,v是G中某个顶点,w是v的邻接顶点。
操作结果:
返回v的(相对于w的)下一个邻接顶点。
若w是v的最后一个邻接点,则返回“空
InsertVex(&G,v);
初始条件:
图G存在,v和图中顶点有相同特征
操作结果:
在图G中增添新顶点v
DeleteVex(&G,v);
初始条件:
图G存在,v是G中某个顶点
操作结果:
删除G中顶点v及其相关的弧
InsertAcr(&G,v,w);
初始条件:
图G存在,v和w是G中两个顶点
操作结果:
在G中增添弧
DeleteArc(&G,v,w);
初始条件:
图G存在,v和w是G中两个顶点
操作结果:
在G中删除弧
DFSTraverser(G,v,Visit());
初始条件:
图G存在,v是G中某个顶点,Visit是顶点的应用函数
操作结果:
从顶点v起深度优先遍历图G,并对每个顶点调用函数Visit一次。
一旦Visit()失败,则操作失败。
BFSTRaverse(G,v,Visit());
初始条件:
图G存在,v是G中某个顶点,Visit是顶点的应用函数
操作结果:
从顶点v起广度优先遍历图G,并对每个顶点调用函数Visit一次。
一旦Visit()失败,则操作失败。
}ADTGraph
2.3详细设计
1、定义结构体
structview_info\\存放车站信息的结构体
{
intid;\\车站身份编码
charname[20];\\车站名字
intcode;\\车站编码
charshortname[20];\\车站简写
charLName[100];\\车站所属的铁路线
}views[SIZE_view];
structline_info\\铁路信息
{
intLid;\\铁路身份编码
charLName[20];\\铁路名字
intstart_id;\\起始车站编码
intend_id;\\重点车站编码
intdist;\\铁路线长度
charsign[10];\\通行标志
}lines[SIZE_line];
structway_info\\道路信息
{
intstation1;\车站1
intstation2;\\车站2
intdist;\\两车站间距离
}ways[SIZE_way];
structpath_info\\最短路径
{
intcount;\\最短路径的路径个数
intpath[SIZE_view];表明通过的车站
}path_list[SIZE_view][SIZE_view];
2、输出车站信息
首先打开views这个文件,用一个for循环,再调用fread函数把文件中的信息按照顺序赋给view_info结构体,再输出到终端上。
其算法描述如下:
voidreadviews()
{
打开文件views.txt文件
for(fread函数对文件的信息读取赋给view_info结构体并且不为0)
{
输出车站车站身份编码、车站名字、车站编码、车站简写、车站所属的铁路线
}
记录文件中信息的个数
关闭文件
3、输出铁路信息
voidreadlines()
{
打开文件lines.txt文件
for(fread函数对文件的信息读取赋给line_info结构体并且不为0)
{
输出车站铁路身份编码、铁路名字、起始车站编码、终点站编码、通行标志
}
记录文件中信息的个数
关闭文件
4、输出道路的信息
voidreadways()
{
打开文件ways.txt文件
for(fread函数对文件的信息读取赋给way_info结构体并且不为0)
{
输出车站1、车站2、两车站间距离
}
记录文件中信息的个数
关闭文件
5、查询车站的功能
voidsearch()
{
输入你要查询的车站名称
打开文件views
for(i<文件中记录个数)
把文件中的信息赋给结构体
调用strcmp比较结构体中车站名字与输入车站名字,如果两者相等
输出该车站的相关信息
}
如果查找到文件中的最后一个信息仍不能找到
输出“不能找到所要查询的车站“
}
6、增加车站信息
addviews()
{
输入新车站身份编码、车站名字、车站编码、车站简写、车站所属的铁路线,并将其存入到view_info结构体中
打开文件
将该新信息写入到文件中
}
7、增加铁路信息
voidaddline()
{
输入新铁路身份编码、铁路名字、起始车站编码、终点站编码、通行标志
,并将其存入到line_info结构体中
打开文件
将该新信息写入到文件中
}
8、最短路径的实现
floyd()
{
把所有路径的长度赋给一个二维数组,二维数组可以表示该路径的起始和终点
把所有路径的起点和终点赋给i和j;
在起始点和终点间找一点k,首先考虑(i,k)(k,j)是否存在,如如果存在,比较(i,j)与(i,k,j)的长度,取长度较短者为i到j得一个最短路径。
在路径上在加一个顶点也是如此比较,取较短者作为最短路径
经过多次比较后,便会得到最短路径的顶点集合
输出这些顶点的对应的车站名称
9、实现所有函数功能
main()
{
输出铁路、车站、路径信息
情况一:
增加铁路信息
情况二:
增加车站信息
情况三:
查询车站信息
情况四:
查询最短路径
情况五:
退出
}
2.4测试分析
1、测试数据
views中的信息
10000beijingzhan0jingjingguangxianinghuxianjingbaoxianjinghaxianjingjiuxian
10001zhengzhouzhan1zhengjingguangxianlonghaixian
10002zhuzhouzhan2zhujingguangxianxiangqianxian
10003xuzhouzhan3xujinghuxianlonghaixian
10004shanghaizhan4hujinghuxianhuhangxian
10005nanchangzhan5changzheganxianjingjiuxian
10006xianzhan6xiningxixianlonghaixianbaoxixian
10007baotouzhan7baojingbaoxianbaolanxianbaoxixian
10008lanzhouzhan8lanlonghaixian、baolanxian
10009chengduzhan9chengbaochengxianchengkunxianchengyuxian
10010guiyangzhan10guixiangqianxian
10011guangzhouzhan11guangjingguangxianguangjiuxian
10012kunmingzhan12kunchengkunxianguikunxian
line.txt的信息
20000jingguangxian1000010011229411B
20001jinghuxian1000010004146311B
20002jingbaoxian100001000781011B
20003guikunxian100101001253211B
20004chengkunxian100091001239711B
20005longhaixian1000310008175911B
20006xiangqianxian100021001090511B
ways.txt中的信息
01812108121292121921037213072134563435631498141981453575435725471524711667161671073927039278975879756829086290695619656191229112929110123761210376210469102469
2、测试过程
分别调用各个函数,输入一个车站名字,看是否能查询到车站信息。
输入起始站点和终点站的代码,检测是否能查询到最短路径。
增加新的车站和铁路信息,检测是否能够写入文件。
3、测试结果
能够查询到车站信息,并且最短路径也符合实际情况,同时也可以向文件中添加新的车站和铁路信息。
2.5用户使用说明
1程序运行环境
程序名为railway.exe,运行环境为WindowsXP。
2主界面
运行程序后首先显示图3-5-2所示程序主界面。
1、增加新的车站信息
选择此项后,会出现以下的提示
按照提示依次输入车站名字编码等,最终程序将会显示所有的信息,证明程序已经添加新的信息
2、增加铁路信息
将会出现以下界面
按照提示依次输出,最终程序将会显示所有的信息,证明程序已经添加新的信息。
3、查询车站信息
会出现以下界面
以上是查询到输入车站的情况,当输入的车站不能够查询到的时候,会出现以下提示
4、查询最短路径时会出现以下提示
然后输入起始站和终点站的编码,就会有最短路径的出现
2.6小结
1调试过程中遇到的主要问题及解决过程
首先是在从文件中读取数据并存入到数组的过程中,因为文件中有中文,但因电脑解码器的问题最终输出的为乱码,所以最终只有把中文改成了英文。
然后在最短路径的设计问题上,我没有考虑到双向的问题,所以导致图画的不合理。
在增加信息到文件中的时候,信息增加到了文件的开头,我的目的是要增加到文件的末尾。
程序中有些变量可以作为全局变量来定义,但是我却过多的定义了。
2.7总结和体会
这次的课程设计的内容是用C语言实现全国铁路最短路径经由问题,这对我来说是个很具有挑战性的任务,虽然只做了一个很简单的铁路路线,但通过两个星期的设计也从中学到了不少东西,更深刻的理解了课本中的内容。
《数据结构》是一门实践性较强的课程,为了学好这门课程,必须在掌握理论知识的同时,加强上机实践。
同时再次深刻理解了C++中类的思想和实现,文件的概念和相关操作,以及有关数据结构的很多知识。
根据实际问题的需要,对个方面的优缺点加以综合平衡,从中选择比较适宜的实现方法。
在本次课程设计中,我明白了理论与实际相结合的重要性,并提高了自己组织数据及编写程序的能力,培养了基本的,良好的程序设计技能。
提高综合运用所学知识的能力。
在这次课程设计中曾遇到了不少问题,就单凭我一个人的能力很难准时有效的完成这次的课程设计,在此要要感谢我的老师同学,他们为我提出了很多有用的建议,帮助我完成了这次的课程设计。
最后也要感谢我们学校为我们提供良好的编程环境,使我们能够按时完成任务。
2.8附录
1、源程序代码
#include
#include
#include
#defineSIZE_view70
#defineSIZE_line100
#defineSIZE_way300
#defineMAXNODE30
#defineMAX1000
structview_info\\存放车站信息的结构体
{
intid;\\车站身份编码
charname[20];\\车站名字
intcode;\\车站编码
charshortname[20];\\车站简写
charLName[100];\\车站所属的铁路线
}views[SIZE_view];
structline_info\\铁路信息
{
intLid;\\铁路身份编码
charLName[20];\\铁路名字
intstart_id;\\起始车站编码
intend_id;\\重点车站编码
intdist;\\铁路线长度
charsign[10];\\通行标志
}lines[SIZE_line];
structway_info\\道路信息
{
intstation1;\车站1
intstation2;\\车站2
intdist;\\两车站间距离
}ways[SIZE_way];
structpath_info\\最短路径
{
intcount;\\最短路径的路径个数
intpath[SIZE_view];表明通过的车站
}path_list[SIZE_view][SIZE_view];
voidreadviews()
{
FILE*fp;
inti;
if((fp=fopen("views.txt","rb"))==NULL)
{
printf("\nCannotopenfilestrikeanykeyexit!
");
exit(0);}
printf("idnamecodeshortnameLName\n");
for(i=0;fread(&views[i],sizeof(structview_info),1,fp)!
=0;i++)
{
printf("%d%-10s%d%-10s%d\n",views[i].id,views[i].name,views[i].code,views[i].shortname,views[i].LName);}
view_count=i+1;
fclose(fp);\\\\把文件中的信息赋给station_info结构体,并且把车站信息输出到终端
}
voidreadways()
{
FILE*fp;
inti;
if((fp=fopen("ways.txt","rb"))==NULL)
{
printf("\nCannotopenfilestrikeanykeyexit!
");
exit(0);}
printf("station1station2dist");
for(i=0;i { fscanf(fp,"%d%d%d",&ways[i].station1,&ways[i].station2,&ways[i].dist); printf("%d%d%d\n",ways[i].station1,ways[i].station2,ways[i].dist);\\把文件中的信息赋给way_info结构体,并且把道路信息输出到终端上 }\fclose(fp); } voidreadlines() { FILE*fp; inti; if((fp=fopen("lines.txt","rb"))==NULL) { printf("\nCannotopenfilestrikeanykeyexit! "); exit(0);} printf("LidLNamestart_idend_iddistsign"); for(i=0;fread(&lines[i],sizeof(structline_info),1,fp)! =0;i++) { printf("%d%-10s%d%-10d%d%-10s\n",lines[i].Lid,lines[i].LName,lines[i].start_id,lines[i].end_id,lines[i].dist,lines[i].sign); }\\把文件中的信息赋给line_info结构体,并且把铁路信息输出到终端上 line_count=i+1; fclose(fp); } voidsearch() { FILE*fp; inti,mark; charsta_name[20]; printf("pleaseenterthestationname: "); scanf("%s",sta_name); if((fp=fopen("views.txt","r+"))==NULL) { printf("\nCannotopenfilestrikeanykeyexit! "); exit(0);} for(i=0;i { fread(&views[i],sizeof(structview_info),1,fp); } fclose(fp); for(i=0;i { if(strcmp(sta_name,views[i].name)==0) { printf("thestation'sinformationsis: \n"); printf("idnamecodeshortnameLName"); printf("%d%s%d%s%d",views[i].id,views[i].name,views[i].code,views[i].shortname,views[i].LName); break;对比输入的车名和结构体中车站名字,如果相同,就输出该车站的相关信息。 } mark=i; } if(mark==(view_count-1)) { printf("sorry,thestationisnotinhere"); } } voidaddview() { FILE*fp; inti; printf("please
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 全国铁路 路径 经由 问题