兰州道路交通网络信息查询设计说明书.docx
- 文档编号:7067971
- 上传时间:2023-01-16
- 格式:DOCX
- 页数:18
- 大小:325.81KB
兰州道路交通网络信息查询设计说明书.docx
《兰州道路交通网络信息查询设计说明书.docx》由会员分享,可在线阅读,更多相关《兰州道路交通网络信息查询设计说明书.docx(18页珍藏版)》请在冰豆网上搜索。
兰州道路交通网络信息查询设计说明书
摘要
在本设计实验中,我所采用的是邻接矩阵作为数据的存储结构,根据线性表、树、图的基本概念、逻辑结构、存储结构及有向网最短路径等算法的应用,用不同的功能模块对两地距离和道路交通信息进行编辑。
兰州道路交通网络信息查询程序的目的是为人们提供各种信息查询服务:
即查询任意两地之间的一条最短的简单路径、还有两地之间的距离等。
最短路径的输出有各种方法,此程序中采用迪杰斯特拉算法。
迪杰斯特拉算法用于求解一个有向图(也可以是无向图,无向图是有向图的一种特例)的一个点(称之为原点)到其余各点(称之为周边点)的最短路径问题。
关键词:
交通网络,邻接矩阵,迪杰斯特拉。
前言
随着计算机科学的迅速发展,计算机已深入到人类社会的各个领域,它的应用已不再局限于科学计算,以解决一些数学问题,而且可以解决一些抽象化的具体问题,更多地用于控制,管理及数据处理等非数值计算的处理工作,这便为我们的日常生活提供了很多的方便。
我们在对一些问题进行求解时,会发现有些问题很难找到规律,或者根本无规律可寻。
对于这样的问题,可以利用计算机运算速度快的特点,先搜索查找所有可能出现的情况,再根据题目条件从所有可能的情况中,删除那些不符合条件的解。
图是一种复杂的非线性结构,在人工智能,工程,数学,物理,化学,计算机学科等领域中,都有着广泛的应用。
我们用最短路径问题,通过一个人们熟悉的交通咨询系统实例来验证迪杰斯特拉算法。
兰州道路交通网络信息查询是以兰州道路交通网络为背景,设计出的一个简单的能够实现兰州道路交通网络信息查询功能的c语言程序系统,对兰州道路交通信息进行编辑,为旅客提供了两地之间的最短路径及距离。
查询的实现以用户和计算机对话的方式进行,要注意人机交互的屏幕界面,由用户选择要查询的地点,输入要查询路径的起点和终点。
正文
1.采用类C语言定义相关数据类型
函数有:
voidCreateUGN();/*造图函数*/
voidShortwstPath();/*最短路径函数*/
voidnarrate();/*说明函数*/
voidintroduce();/*介绍函数*/
voidoutput();/*输出函数*/
voidmain()/*主函数*/
类有:
ArcCell;/*定义边的类型*/
VertexType;/*定义顶点的类型*/
MGraph;/*定义图的类型*/
全局变量有:
MGraphG;/*把图定义为全局变量*/
intP[14][14];
longintD[14];
1)问题描述
在交通网络非常发达,交通工具和交通方式不断更新的今天,人们在出差,旅行或做其他出行时,不仅关心节省交通费用,而且对里程和所需时间也感兴趣。
对于这样一个人们关心的问题,可用一个图结构来表示交通网络系统,利用计算机建立一个交通咨询系统。
图中顶点表示站点,边表示站之间的交通关系。
这个系统可以回答旅客提出的各种问题。
2)需求分析
设计一个交通咨询系统,能让旅客咨询从一个站顶点到另一个站顶点之间的最短路径或最少距离等。
对于不同咨询要求,可输入站之间的路程或所走距离。
该设计共分三部分,一是建立交通网络图的存储结构;二是解决单源最短路径问题;最后再实现两个站顶点之间的最短路径问题。
兰州道路交通网络信息查询系统实现了查询两地点之间的最短路径、查询某地到其它所有目的地的最短路径、查询某地点相关信息等简单的功能。
2.各模块流程图及伪码算法
1)其功能模块图如下:
2)伪码算法如下:
voidShortwstPath(intnum)/*最短路径函数*/
{intv,w,i,t;
intfinal[14];
intmin;
for(v=0;v<14;++v)/*初始化*/
{
final[v]=0;/*标志数组初始化*/
D[v]=G.arcs[num][v].adj;
for(w=0;w<14;++w)
P[v][w]=0;/*设空路径*/
if(D[v]<20000)/*v,v0间有边存在*/
{P[v][num]=1;P[v][v]=1;/*到v的最短路径上包含v0及v*/
}/*if*/
}
D[num]=0;
final[num]=1;/*初始化,v0顶点属于B集*/
/*开始主循环,每次求得v0到某个v顶点的最短路径,并加v到B集*/
for(i=0;i<14;++i)/*其余G.vexnum-1各顶点*/
{
min=20000;
for(w=0;w<14;++w)
if(!
final[w])/*w顶点在V-S中*/
if(D[w] final[v]=1;/*离v0顶点最近的v加入B*/ for(w=0;w<14;++w)/*更新当前最短路径及距离*/ if(! final[w]&&((min+G.arcs[v][w].adj) { D[w]=min+G.arcs[v][w].adj;/*修改D和P数组*/ for(t=0;t<14;t++)P[w][t]=P[v][t]; P[w][w]=1; } } } 3.函数的调用关系图 首先用一个数组来定义邻接矩阵,并定义当前顶点数,顶点用来表示地点,数组的值用来表示路径长度。 然后给各个顶点赋予初值,亦即兰州各个地方的名称,并确定各个地方之间的距离,还要标注各个地方的简单信息,让旅客一目了然,并用迪杰斯特拉算法来实现最短路径的求解。 之后在主函数main()中调用各个子函数,显示两地点之间的最短路径、某地点相关信息。 整个程序功能就这样实现了。 4.调试分析 1)调试中遇到的问题及对问题的解决方法 遇到的问题: 在调试时,有时会把值输错,导致超出范围,输出错误结果或程序直接结束。 或者有时候还会在错误的环境下运行。 解决方法: 首先注意值的范围,输入在范围内的任意值。 其次注意运行环境,有中文的一定要在中文运行环境中进行。 2)算法的时间复杂度和空间复杂度 时间复杂度O(n2)。 空间复杂度O(n2) 5.测试结果 我对所到地点信息查询进行了如下测试,先运行程序,就出现如下结果: 然后选择服务项目,输入1或2,若输入1之后再回车就出现如下结果: 之后输入需要查询的地点的序号,如13,再按回车,结果如下 最后再按任意键结束。 若在选择服务项目是输入2,再按回车就出现如下结果: 然后后输入从哪个地点出发,如0,按回车 在输入要去的目的地的序号,如13,按回车: 最后按任意键结束程序。 总结 在这次数据结构课程设计中,我的题目是: 兰州道路交通网络信息查询,经过两周的课程设计,我进一步理解了数据结构中的理论和算法,加深了对图的基本概念、逻辑结构及存储结构的理解,并进一步掌握了图的重要应用—最短路径等的算法的应用,从而进一步理解和熟练掌握课本中所学的各种数据结构,学会如何把学到知识用于解决实际的问题,而且动手能力得到了进一步的增强。 两周的时间虽然很短暂,但其间的内容是很充实的,在其中我学习到了很多平时书本中无法学到的东西,积累了经验,锻炼了自己分析问题,解决问题的能力,并学会了如何将所学的各科知识融会,组织,来配合学习。 总之,这段时间中我收益很大,学到很多。 在课程设计时我遇到了很多的问题,但在老师的帮助和对各种资料的查阅中,最终将问题解决,这培养了我自主动手,独立研究的能力,为今后在学习工作中能更好的发展打下了坚实的基础。 在以后的学习中我会更加注意各个方面的能力的协调发展。 参考文献 1严蔚敏,吴伟民.《数据结构(C语言版)》.清华大学出版社. 2严蔚敏,吴伟民.《数据结构题集(C语言版)》.清华大学出版社. 3《DATASTRUCTUREWITHC++》.WilliamFord,WilliamTopp.清华大学出版社(影印版). 4谭浩强.《c语言程序设计》.清华大学出版社. 5数据结构与算法分析(Java版),APracticalIntroductiontoDataStructuresandAlgorithmAnalysisJavaEditionCliffordA.Shaffer,张铭,刘晓丹译 电子工业出版社2001年1月 致谢 在本次设计的过程中我遇到了很多困难,衷心的感谢老师和同学在课设期间对我的辛勤指导和帮助,老师的引导与点拨使我在学习过程中少走了许多的弯路,而且增加了不少的经验,学会了许多课本上没有的东西,同学的帮助同样也让我进步了很多。 才使我在顺利完成设计项目的同时又加深了对数据结构这门学问的理解,并且发现了自己的不足。 许多同学也对我给予了许多帮助,向我推荐了一些好的书籍,它们给我提供了许多优秀的设计思路和简洁而精辟的算法,使我在整体设计的基础上得以完善各个模块的设计,从而设计了一个比较合理的道路查询程序,在这里一并致谢。 我还要感谢我所参考的那几本书的编者,它们对我的帮助也不小,总之我要对所有在这次课设中帮助过我的人说声谢谢! 附件Ⅰ部分源程序代码 #include"string.h" #include"stdio.h" typedefstructArcCell{ intadj; char*info; }ArcCell;/*定义边的类型*/ typedefstructVertexType{ intnumber; char*place; }VertexType;/*定义顶点的类型*/ typedefstruct{ VertexTypevex[14]; ArcCellarcs[14][14]; intvexnum,arcnum; }MGraph;/*定义图的类型*/ MGraphG;/*把图定义为全局变量*/ intP[14][14]; longintD[14]; voidCreateUDN(intv,inta)/*造图函数*/ {inti,j; G.vexnum=v; G.arcnum=a; for(i=0;i G.vex[i].number=i; G.vex[0].place="甘肃农业大学"; G.vex[1].place="兰州交通大学"; G.vex[2].place="甘肃政法学院"; G.vex[3].place="西北师范大学"; G.vex[4].place="培黎广场"; G.vex[5].place="师大附中"; G.vex[6].place="黄河桥北"; G.vex[7].place="黄河桥南"; G.vex[8].place="兰州西站"; G.vex[9].place="啤酒厂"; G.vex[10].place="胶鞋厂"; G.vex[11].place="杨家桥"; G.vex[12].place="龚家湾"; G.vex[13].place="兰州理工大西校区"; for(i=0;i for(j=0;j G.arcs[i][j].adj=20000; G.arcs[0][1].adj=G.arcs[1][0].adj=2000; G.arcs[1][2].adj=G.arcs[2][1].adj=500; G.arcs[2][3].adj=G.arcs[3][2].adj=600; G.arcs[3][4].adj=G.arcs[4][3].adj=300; G.arcs[4][5].adj=G.arcs[5][4].adj=700; G.arcs[5][6].adj=G.arcs[6][5].adj=1100; G.arcs[6][7].adj=G.arcs[7][6].adj=400; G.arcs[7][8].adj=G.arcs[8][7].adj=800; G.arcs[8][9].adj=G.arcs[9][8].adj=1500; G.arcs[9][10].adj=G.arcs[10][9].adj=1000; G.arcs[9][11].adj=G.arcs[11][9].adj=800; G.arcs[11][12].adj=G.arcs[12][11].adj=800; G.arcs[12][13].adj=G.arcs[13][12].adj=300; } voidnarrate()/*说明函数*/ { inti,k=0; printf("\n以下是选项: \n\n"); for(i=0;i<14;i++) { printf("(%d)%-10s",i,G.vex[i].place); k=k+1; if(k%4==0)printf("\n\n"); } } voidintroduce() { intb; printf("请输入您想查询信息地方的编号: "); scanf("%d",&b); getchar(); printf("\n"); switch(b) {case0: printf("0: 甘肃农业大学\n\n甘肃省一所农业大学。 \n\n");break; case1: printf("1: 兰州交通大学\n\n 前兰州铁道学院。 \n\n");break; case2: printf("2: 甘肃政法学院\n\n兰州另一所重要的政法学校。 \n\n");break; case3: printf("3: 西北师范大学\n\n 兰州一所重要的师范类学校。 \n\n");break; case4: printf("4: 培黎广场\n\n 安宁区的一个重要的广场。 \n\n");break; case5: printf("5: 师大附中\n\n 兰州市一所很有名的高中学校。 \n\n");break; case6: printf("6: 黄河桥北\n\n 在黄河市场附近,是交通枢纽。 \n\n");break; case7: printf("7: 黄河桥南\n\n 重要的交通枢纽,在黄河桥南面。 \n\n");break; case8: printf("8: 兰州西站\n\n 火车站兼购物市场,相当繁华。 \n\n");break; case9: printf("9: 啤酒厂\n\n啤酒制造厂。 \n\n");break; case10: printf("10: 胶鞋厂\n\n鞋子制造厂。 \n\n");break; case11: printf("11: 杨家桥\n\n七里河区西面的一个重要交通枢纽。 \n\n");break; case12: printf("12: 龚家湾\n\n兰州理工大学西校区旁边的一个集市。 \n\n");break; case13: printf("13: 兰州理工大西校区\n\n兰州理工大学的分校区。 \n\n");break; default: printf("目的地编号输入错误! 请输入0->13的数字编号! \n\n");break; } } voidShortwstPath(intnum)/*最短路径函数*/ {intv,w,i,t; intfinal[14]; intmin; for(v=0;v<14;++v)/*初始化*/ { final[v]=0;/*标志数组初始化*/ D[v]=G.arcs[num][v].adj; for(w=0;w<14;++w) P[v][w]=0;/*设空路径*/ if(D[v]<20000)/*v,v0间有边存在*/ {P[v][num]=1;P[v][v]=1;/*到v的最短路径上包含v0及v*/ }/*if*/ } D[num]=0; final[num]=1;/*初始化,v0顶点属于B集*/ /*开始主循环,每次求得v0到某个v顶点的最短路径,并加v到B集*/ for(i=0;i<14;++i)/*其余G.vexnum-1各顶点*/ { min=20000; for(w=0;w<14;++w) if(! final[w])/*w顶点在V-S中*/ if(D[w] final[v]=1;/*离v0顶点最近的v加入B*/ for(w=0;w<14;++w)/*更新当前最短路径及距离*/ if(! final[w]&&((min+G.arcs[v][w].adj) { D[w]=min+G.arcs[v][w].adj;/*修改D和P数组*/ for(t=0;t<14;t++)P[w][t]=P[v][t]; P[w][w]=1; }/*if*/ }/*for*/ } voidoutput(intplace1,intplace2)/*输出函数*/ { inta,b,c,d,q=0; a=place2; if(a! =place1) { printf("\n最短路径从%s到%s\n",G.vex[place1].place,G.vex[place2].place); printf("\n最短距离%dm.\n",D[a]); printf("%s",G.vex[place1].place); d=place1; for(c=0;c<20;++c) { gate: ; P[a][place1]=0; for(b=0;b<14;b++) { if(G.arcs[d][b].adj<20000&&P[a][b]) { printf("----->%s",G.vex[b].place); q=q+1; P[a][b]=0; d=b; if(q%4==0)printf("\n"); gotogate; } } } } } voidmain()/*主函数*/ { voidCreateUGN(); voidnarrate(); voidintroduce(); intz; charc; intv0,v1; CreateUDN(14,16); { narrate(); printf("\n请输入服务项目\n"); printf(" (1)地点介绍\n"); printf(" (2)最短路径查询\n"); scanf("%d",&z); if(z==1) { printf("地点信息: \n"); introduce(); } if(z==2) { printf("\n请输入开始地点! \n"); scanf("%d",&v0); printf("请输入结束地点! \n"); scanf("%d",&v1); ShortwstPath(v0); output(v0,v1); } } } 目录 摘要1 前言2 正文3 1.采用类C语言定义相关数据类型3 2.各模块流程图及伪码算法4 3.函数的调用关系图6 4.调试分析7 5.测试结果7 总结11 参考文献12 致谢13 附件Ⅰ部分源程序代码14
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 兰州 道路交通 网络 信息 查询 设计 说明书
![提示](https://static.bdocx.com/images/bang_tan.gif)