数据结构课程设计安徽省铁路运输网最佳经由.docx
- 文档编号:26570517
- 上传时间:2023-06-20
- 格式:DOCX
- 页数:20
- 大小:133.31KB
数据结构课程设计安徽省铁路运输网最佳经由.docx
《数据结构课程设计安徽省铁路运输网最佳经由.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计安徽省铁路运输网最佳经由.docx(20页珍藏版)》请在冰豆网上搜索。
数据结构课程设计安徽省铁路运输网最佳经由
学号
2014-2015学年第一学期
1308010107
《数据结构》
课程设计报告
题目:
安徽省铁路运输网最佳经由
专业:
计算机科学与技术
班级:
13
(1)班
姓名:
丁鑫
指导教师:
王源
成绩:
计算机与信息工程系
二0一四年十一月二十日
目录
1需求分析........................................................2
1.1问题描述......................................................2
1.2设计任务与要求................................................2
2概要设计........................................................2
2.1程序流程图....................................................3
2.2数据结构设计..................................................3
3详细设计........................................................5
3.1程序设计思想..................................................5
3.2软件模块结构..................................................6
4程序调试分析....................................................7
4.1测试数据......................................................7
4.2功能测试图....................................................8
4.3时间复杂度分析...............................................10
4.4上机过程中出现的问题及其解决案...............................11
5小结............................................................11
致谢...............................................................12
参考文献...........................................................12
附:
核心代码........................................................13
1需求分析
1.1问题描述
该题目采用安徽省铁路运输网的数据进行编程和运行验证。
详细可在网上搜索《安徽省铁路局管辖线路示意图》,只要安徽的主干线就可以了。
铁路运输网络中由铁路线和火车站的两个主要概念,譬如:
1号铁路线表示京广线,2号铁路线表示京沪线等。
铁路线对象包括铁路线编号,铁路线名称,起始站编号,终点站编号,该铁路线长度,通行标志(00B客货运禁行,01B货运通行专线,10B客运通行专线,11B客货运通行)。
火车站对象包括所属铁路线编号,车站代码,车站名,车站简称,离该铁路线起点站路程及终点站路程。
1.2设计任务与要求
(1)查询某站所属的铁路线
(2)要求具备新增铁路线的管理功能
(3)要求具备新增车站的管理功能
(4)针对客运,货运情况能计算任何一个起始车站到任何一个终点站之间的最短路径。
并且要求能够显示出该最短路径的各个火车站的经由顺序
2概要设计
2.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的最短路径。
menu=1menu=4
menu=2menu=3
menu=5
图1:
程序流程图
2.2数据结构设计
存储结构:
本程序部分函数采用的是文件进行数据的存储,所以采用的是顺序存储结构,如要添加数据,直接在文件里面进行操作就行了。
弗洛伊德算法中采用的存储结构是图的邻接矩阵。
A.如下为抽象数据类型定义的模板以及抽象数据类型线性表的定义:
ADTList{
数据对象:
D={ai|ai∈ElemSet,i=1,2,3„„,n,n≥0}
数据关系:
R1={
基本操作:
voidreadviews()
初始条件:
views.txt已经存在。
操作结果:
将views.txt里面的数据一次存入数组views[SIZE_view]里,并将数组里面的存储数据的个数赋值给全局变量view_count;
voidreadways()
初始条件:
ways.txt已经存在。
操作结果:
将ways.txt里面的数据一次存入数组ways[SIZE_way]里,并将数组里面的存储数据的个数赋值给全局变量way_count;
voidreadlines()
初始条件:
lines.txt已经存在。
操作结果:
将lines.txt里面的数据一次存入数组lines[SIZE_line]里,并将数组里面的存储数据的个数赋值给全局变量line_count;
voidsearch();
初始条件:
views[SIZE_view]存在,且里面放有相关信息。
操作结果:
根据用户输入的车站名查找该车站的相关信息并输出;
voidaddview()
初始条件:
views.txt已经存在。
操作结果:
将views.txt里面的数据一次存入数组views[SIZE_view]里,并将数组里面的存储数据的个数赋值给全局变量view_count;
voidaddway()
初始条件:
ways.txt已经存在。
操作结果:
将ways.txt里面的数据一次存入数组ways[SIZE_way]里,并将数组里面的存储数据的个数赋值给全局变量way_count;
voidaddline()
初始条件:
lines.txt已经存在。
操作结果:
将lines.txt里面的数据一次存入数组lines[SIZE_line]里,并将数组里面的存储数据的个数赋值给全局变量line_count;
voidfloyed()
初始条件:
views[SIZE_view]、ways[SIZE_way]、lines[SIZE_line]已经存在并且存有相关信息。
操作结果:
把每个车站到各个车站的最短经由路径及此路径的距离存储在path_info、path_list[SIZE_view][SIZE_view]数组里;
voidshortest_path()
初始条件:
path_info、path_list[SIZE_view][SIZE_view]存储相关的数据;操作结果:
输出输入的两个站的最短距离及经过的所有站;
voidaddadta(intmenu)
初始条件:
views.txt、ways.txt、lines.txt已经存在。
操作结果:
如果menu=1,则添加车站数据,如果menu=2,则添加路线数据;
B.弗洛伊德算法中,数据结构所用到的思想为图的思想,所以数据结构的设计主要的目的为便于图的操作的设计。
因此我们用了下面这些数据定义。
structview_info/*城市信息结构*/
{
intid;charname[20];intcode;charshortname[20];charLName[100];//经过此站的铁路线名称
}views[SIZE_view];
structline_info//铁路线信息结构
{
intLid;charLName[20];intstart_id;//始发站intend_id;//终点站intdist;//铁路线长charsign[5];//通行标志
}lines[SIZE_line];
structway_info//铁路度的信息结构
{
intstation1;intstation2;intdist;
}ways[SIZE_way];
structpath_info//用于最短路径的查询
{
};
3详细设计
3.1程序设计思想
设计思路:
核心问题:
求最短路径(弗洛伊德算法)
数据模型(逻辑结构):
带权有向图
输入输出:
初始数据是从views.txt、lines.txt、way.txt三个文件中读入,在读入数据后,用户可以根据选项选择相应的功能,不同的功能有不同的数据输入/输出,比如:
查询的功能是要求输入要查询的站的名称,然后输出是该站的相关信息;查询最intcount;intpath[SIZE_view];短路径的功能则是输入起点站、终点站的名称,输出则是该段路线距离和经由站等。
程序的输入:
(1)铁路线信息的输入:
依次输入“铁路线代码,铁路线名称,起始站代码,终点站代码,该铁路线长度、通行标志”,并且中间以空格隔开。
(2)火车站信息的输入:
依次输入“车站代码,车站名,车站编号、车站简称,所属铁路线编号”,并且中间以空格隔开。
程序的输出格式;
(1)当显示铁路线或者火车站的信息时,与输入时的格式完全一致;
(2)输出最短路径的长度,以及最短路径的经由顺序;
按照程序功能要求,设计了一下各个功能模块:
(1)文件读取模块
文件读取模块包括读取车站信息模块readviews、路段权值信息读取模块readlines、铁路线信息读取模块readlines。
这些模块的主要功能为从文件中读取所需的信息。
(2)添加信息模块adddata
添加信息模块又包括以下子功能模块:
A、添加站点信息模块addview。
B、添加路段权值模块addway。
C、添加铁路线信息模块addline。
(3)查询模块
根据用户需求,查询站点信息
(4)最短路径查询模块
该模块为本软件设计的核心部分。
根据该模块可以很方便的找出两个城市的最短路径。
该最短路径的算法为常用的弗洛伊德算法。
(5)操作菜单模块
该模块主要用于与用户的交互,一个界面友好的菜单可以提高软件的人机交互体验。
3.2软件模块结构
(1)主程序模块,其中主函数为:
oidmain()
{
新增火车站;新增铁路线;查询火车站的信息;针对客运、货运情况,求两站之间的最短路径及其经由顺寻;退出界面
}
(2)文件模块为:
voidreadways();voidreadviews();voidreadlines()
(3)图模块为:
voidshort_path();voidfloyed()
(4)查询函数和添加函数voidsearch();voidadddata(inmenu);voidaddway();voidaddline();voidaddview()函数的调用:
进入主函数,调用文件模块各函数以读取数据;
选择1或2,则调用voidadddata(inmenu),其中若选择1,则调用voidaddview()函数;
若选择2,则调用voidaddline()和voidaddway()函数;
选择3,调用voidsearch()函数进行查询;
选择4,调用voidshort_path()和voidfloyed()函数以得到最短路径。
4程序调试分析
4.1测试数据
数据读取如下:
图2:
数据读取显示
图3:
操作界面显示
4.2功能测试截图:
输入1,增加车站信息如下:
图4:
增加车站信息
输入2,增加铁路线信息如下:
图5:
增加铁路线信息
输入3,查询车站信息如下:
图6:
查询车站信息
输入4,查询最短路径如下:
图7:
查询最短路径
输入5,退出界面如下:
图8:
退出界面显示
4.3时间复杂度分析
程序中图的存储结构为带权邻接矩阵,其中对邻接矩阵的初始化的时间复杂度为O(n*n);在求最短路径的时候,用的是弗洛伊德算法,时间复杂度主要在于求每一站到任意站的最短路径由是的for循环,那有三个for循环,所以时间复杂度为O(n3)。
4.4上机过程中出现的问题及其解决方案
(1)刚刚看到题目要求的时候就想到了弗洛伊德算法,但是不知道如何去做,在网站搜索到类似代码,经过修改后,最终得出了源程序。
(2)源程序可以运行的时候,忘记添加相关文本文件,所以运行文件的时候会提示文件打开失败,无法进行接下来的功能使用,这时候才想起来要自行添加相关的文本文档,接着问题就解决了。
(3)在way.text文本文档中添加各站权值的时候,一开始不知道如何添加,经过思考和查询课本后,明白了添加权值时是以各站编码代表各站,由于是有向图,所以需要添加两站往返权值。
(4)在输入信息时,由于是输入汉字,系统不稳定,容易出现刷屏,这个问题,我是向学长寻求帮助并得以解决的。
5小结
本次课程设计我做的是安徽省铁路网最经经由问题,功能都实现了,运行顺畅。
对于这次的数据结构设计我觉得我们还是挺成功的。
以下是我在这次数据结构中的体会。
我觉得相比大一做的C语言程序设计而言,这次的程序难了很多,但同时教会了我更多的知识,最重要的就是让我明白了数据结构这门课程的使用价值。
以前,在课堂上老师一遍遍的讲到数据结构和编程语言的关系,自从完成了课程设计以后我突然恍然大悟,明白了数据结构和C语言等编程语言的关系。
简单的说,它就是一个程序所采用的逻辑结构(有集合,线性表,树和图等)和存储结构(顺序和链表)。
只有确定了这些,再加上算法才能写出一个程序。
在写本次程序时,遇到了不少的问题。
主要还是对编程语言的不熟悉,虽然
总体思路可以明确,但是真的写起来却漏洞百出。
因此,我们上网搜索相关资料,找到了类似的源程序,参考源程序之后,我们进行了一系列的改错和完善。
遇到不明白的部分,马上询问学长或者优秀的同学,让他们为我们指点迷津。
最终把他们都解决了。
虽然这次花的时间比较多,但是收获也是很大啊。
通过本次课程设计,增强了我的调试程序的能力,以及分析程序,分析算法的能力。
巩固了我数据结构的知识,对与去年学习的一门学科的温习,让我更了解了弗洛伊德算法,熟练掌握了函数的定义,函数的调用等编程能力。
我相信只有自己的能力不断地提高,才能编写出高质量的程序来。
最后我想说,数据结构是一门很复杂的学科,难懂。
但是只要你利用学习到的理论知识去实践,结合实践去分析和理解它,最终你会发现它也不过如此。
在实践的过程中互相帮助很重要,它能让你在困境中体会到快乐,在苦涩的学习中体会友情带来的快乐!
致谢
在这次数据结构课程设计中,我的老师和同学给了我及大的帮助。
特别是我的指导老师王源老师,在此,我对他们表示感谢!
感谢他们在我面对困难时给了我帮助和支持。
也感谢那些给我帮助的所有同学!
参考文献
[1]谭浩强著.C程序设计(第二版).北京:
清华大学出版社,1999
[2]谭浩强,张基温,唐永炎编著.C语言程序设计.北京:
高等教育出版社,1992
[3]谭浩强编著.QBASIC语言教程.北京:
电子工业出版社,1997
[4]谭浩强.C程序设计[M].3版.北京:
清华大学出版社,2005
源程序
structview_info/*城市信息结构*/
{
intid;
charname[20];
intcode;
charshortname[20];
charLName[100];//经过此站的铁路线名称
}views[SIZE_view];
structline_info//铁路线信息结构
{
intLid;
charLName[20];
intstart_id;//始发站
intend_id;//终点站
intdist;//铁路线长
charsign[5];//通行标志
}lines[SIZE_line];
while
(1)
{
intmenu;
cout< cout<<"安徽铁路运输网经由系统"< cout<<"**************************************"< cout<<"1、增加车站信息"< cout<<"2、增加铁路线信息"< cout<<"3、查询车站信息"< cout<<"4、查询最短路径"< cout<<"5、退出界面"< cout<<"**************************************"< cout<<"请选择你要的操作代码..1-5): "< cin>>menu; while(menu<1||menu>5) { //cout<<"error! pleaseenteragain: "; cout<<"错误! 请再次输入: "; cin>>menu; } voidfloyed()//弗洛伊德算法 { inti,j,k,m; //包含着count和path[]用来存储经过的路径 //for(i=0;i<=view_count;i++) //for(j=0;j<=view_count;j++) //dist_list[i][j]=MAXCOST;//先对任意两点的距离初始值为无穷 for(intt=0;t<=way_count;t++) { i=ways[t].station1; j=ways[t].station2; dist_list[i][j]=ways[t].dist;//把文件中的数据付给dist_list[i][j]=ways[t].dist;形式 } for(i=0;i<=view_count;i++) { for(j=0;j<=view_count;j++) { if(i==j)//车站到本车站的距离赋值为零 { dist_list[i][j]=0; continue; } dist_list[i][j]=-1;//先设置任意两点之间的距离为-1..表示这两点不通 path_list[i][j].count=0;//先设置任意两点之间的的路径的车站数为零 for(k=0;k { if(ways[k].station1==i&&ways[k].station2==j) { dist_list[i][j]=ways[k].dist; path_list[i][j].count=2; path_list[i][j].path[0]=i; path_list[i][j].path[1]=j; break; } } } } //下面是计算最短路径的代码 for(k=0;k<=view_count;k++) { for(i=0;i<=view_count;i++) for(j=0;j<=view_count;j++) { if(i==k||j==k||i==j)//三个站中至两个站是相同的的话就是继续循环 continue; if(dist_list[i][k]==-1||dist_list[k][j]==-1)//i、k不通或者k、j不通继续循环 continue; if((dist_list[i][j]==-1)||((dist_list[i][j]! =-1)&&(dist_list[i][k]+dist_list[k][j] {//i、j不通..或者是i、j通但是不是最短路径..执行下面语句 dist_list[i][j]=dist_list[i][k]+dist_list[k][j];//求出i、j的最短距离 //shortest[i][j]=shortest[i][k]+shortest[k][j]; path_list[i][j].count=path_list[i][k].count+path_list[k][j].count-1;//求出i、j路径的站的个数 //path_list[i][j]=k; for(m=0;m path_list[i][j].path[m]=path_list[i][k].path[m]; for(m=0;m path_list[i][j].path[m+path_list[i][k].count]=path_list[k][j].path[m+1];} } } } voidshortest_path() { floyed(); inti,k,m; intstart_num=-1,end_num=-1; stringstart_station,end_station;//定义起始站、终点站 //下面便是输出最短经由路径的代码 cout<<"Floyedtable: \n"; //cout<<"Allcitiesinthetable: \n"; cout<<"所有城市列表: \n"; for(i=0;i { cout< : left); cout< (2)< "< if(((1+i)%5)==0&&i! =0)cout< cout< : left); } cout< //cout<<"Pleaseinputthestartstationname: "; cout<<"请输入起点站名称: "
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程设计 安徽省 铁路 运输网 最佳 经由