




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
课程设计题目/XX学院数据结构课程设计报告题目城市交通咨询系统作者杨朝专业信息管理与信息系统学号1514210121指导老师张慧答辩时间目录目录……………………11系统需求分析………21.1用户需求分析………………21.2功能需求分析…………………31.3数据需求分析…………………31.4小结……………32系统设计………………42.1系统设计思路…………………42.2系统设计功能…………………42.3每个模块的具体能……………52.4主函数的调用关图…………103系统测试……………113.1操作说明………113.2测试数据………113.2.1用户进入界面……………113.2.2具体功能的实现…………123.2.3选择0结束程序…………144总结…………………145致谢…………………146附录…………………151.系统需求分析描述:现如今网络非常发达.无论人们出差.旅游或者做其他的出行之时.都会想到道路问题.切不仅仅关心的是交通费用.而且对于里程和所需要的时间等的问题也是同样的关心.在此系统中.完全面向用户.可以用一个图结构来表示交通网络系统.利用计算机建立一个交通咨询系统。且在图中.顶点表示城市.边表示城市之间的交通关系。设计一个交通咨询系统.能够让旅客咨询从任一城市顶点到达另外一个城市之间顶点的最短路径问题〔最短里程问题。对系统分析.主要从以下几个方面进行分析。1.用户需求分析2.功能需求分析3.数据需求分析用户需求分析现如今网络非常发达.无论人们出差.旅游或者做其他的出行之时.都会想到道路问题.切不仅仅关心的是交通费用.而且对于里程和所需要的时间等的问题也是同样的关心.在此系统中.完全面向用户.可以用一个图结构来表示交通网络系统.利用计算机建立一个交通咨询系统。且在图中.顶点表示城市.边表示城市之间的交通关系。设计一个交通咨询系统.能够让旅客咨询从任一城市顶点到达另外一个城市之间顶点的最短路径问题〔最短里程问题。当要查询某两个城市之间的最短交通路线或者其中一个城市到达其余城市的最短路线时.是一个很繁琐的过程。根据用户自己的需求.可以自定义地图.此程序就是主要以满足用户自己的环境与实际情况.在难以计算路程时.可将地图输入进行计算.系统将会为用户提供所用路径最短的出现路线.更好的满足用户需求。以下是针对咨询用户说明其最基本的模块功能。〔1进入程序后.用户可自己设置城市的个数.以及所有城市之间总共的路径.且分别用顶点和边表示城市与路径〔2用户根据自己设置的城市个数和路径数.具体输入每个路径的起始点以及每条路径的长度。〔3进入菜单选择界面〔4选择2.系统为用户进行提供任意城市的交通查询,即查询任意两个城市之间的一条最短路径。〔5选择1.系统为用户提供指定城市的交通查询.即查询指定城市到其他城市之间的最短路径。如若输入顶点超出范围显示错误.系统回到菜单重新选择〔6选择0.系统推出程序。1.2功能需求分析城市交通咨询系统总体的设计目标:用《数据结构》中的邻接矩阵作数据结构.并结合数据结构有向图的最短路径计算方法.结合相应的数据算法以及c语言的相关知识.编写一个良好的.具有可操作性的.以及能方便用户的使用.包括自定义地图.路径与城市个数可结合实际情况而言.相对操作.简便易懂并无难度。系统在菜单可根据命令进行相应的操作.已满足用户的需求。1.2.1城市交通系统基本功能根据以上分析.此系统具备以下功能:用户进入后的地图创建界面〔明确地图中城市的个数以及路径的个数地图完善界面〔用户自己输入地图中相关路径的起始点以及路径长度菜单界面包含两条命令命令1求一个城市到所有城市的最短距离命令2求任意的两个城市之间的最短距离回复命令0可推出程序。1.3数据需求分析用邻接矩阵建立交通网络模块VertexTypevexs[MVNum];//顶点数组.类型假定为charAdjmatrixarcs[MVNum][MVNum];//邻接矩阵.类型假定为int型建立邻接矩阵.用函数voidCreateMGraph<MGraph*G,intn,inte>{//采用邻接矩阵表示法构造有向图G.n、e表示图的当前顶点数和边数用迪杰斯特拉算法计算某顶点到其余顶点的最短路径用函数voidDijkstra<MGraph*G,intn,inte>来定义此函数采用邻接矩阵表示法构造有向图G.n、e表示图的当前顶点数和边数用弗洛伊德算法求任意一对顶点的最短路径用函数voidFloyd<MGraph*G,intn>来定义。利用费洛伊德算法.求出最短路径。1.4小结从各种需求方面下手改编代码.并不断调试.让界面更加友好。不断地尝试上.在各种问题上不断突破.慢慢的完善代码.等最大限度的满足用户需求。这几天短时间的课程设计也让我认识到了自己在这门课程上还面临着许许多多的问题.为以后的具体实践明确了努力方向。同时.城市交通咨询系统的实现.为用户更好的解决了再实际出行时遇到的路径问题.最初的设计也为代码敲定了编写方向。再三考虑后确定了系统的功能.确定什么功能有实现必要.什么功能可有可无。在这样的基础之下使得思路更加清晰。2.系统设计2.1系统设计思路本程序首先是用户编辑界面.用户根据自己的需求编写地图.从而加入顶点的数组之中.创建的地图用邻接矩阵存储.在从主函数之中进行调用.实现对两个算法的调用。用户在输入顶点以及边的信息都会存储.在存储成功之后会提示用户存储成功.之后进入到菜单界面.菜单界面提供两种选择口令.分别可以调运Dijkstra和Floyd算法.调用之后输入相应的口令以及要查询的城市编号.算法会根据邻接矩阵存储的地图进行计算.求出最短路径。在以后使用完系统后.可输入口令0.系统会结束一切运算.退出程序。2.2系统设计功能菜单界面的主要功能有两个:〔1、求一个城市到所有城市的最短距离〔2、求任意的两个城市之间的最短距离城市交通咨询系统主要有三个模块分别为:〔1、邻接矩阵的输入与存储构建交通网络〔2、任意两个城市的最短距离查询〔3、两个指定城市的最短距离查询主界面的模块概念图如下:用户进入系统用户进入系统交通网络构建交通网络构建结果,退出系统任意两个城市的结果,退出系统任意两个城市的最短距离查询两个指定城市的最短距离查询图2.12.3每个模块的具体功能。〔1、采用C语言定义相关数据类型1.定义一个.用来存储顶点信息。typedefstruct{VertexTypevexs[MAX];Adjmatrixarcs[MAX][MAX];}MGraph;..2.定义一个Dijkstra函数voidDijkstra<MGraph*G,intv,intn>;3.定义一个Floyd函数voidFloyd<MGraph*G,intn>;〔2、建立邻接矩阵交通网络:N结束k<=e,k+++开始N结束k<=e,k+++开始输入顶点和边数n,e输入顶点和边数n,e输入输入i,j,wY图2.2邻接矩阵构造图结构函数数据类型定义:typedefstruct{VertexTypevexs[MAX];Adjmatrixarcs[MAX][MAX];}MGraph;voidCreateMGraph<MGraph*G,intn,inte>//邻接矩阵构成有向图{inti,j,k,w;for<i=1;i<=n;i++>G->vexs[i]=<char>i;for<i=1;i<=n;i++>for<j=1;j<=n;j++>G->arcs[i][j]=IDF;printf<"输入%d条边的i,j及w:\n",e>;for<k=1;k<=e;k++> {scanf<"%d,%d,%d",&i,&j,&w>;G->arcs[i][j]=w;}printf<"有向图的存储结构建立完毕!\n">;其中vexs[MAX]保存顶点信息.arcs[MAX][MAX]用于保存边与边之间的信息。在构建时通过输入的边数i.j作为矩阵的行、列确定顶点的出度和入度。用邻接矩阵方法存储图。〔3、查询指定城市到其他城市自己建的最短路程:开始开始输入顶点v输入顶点v狄克斯特拉算法狄克斯特拉算法输出路径,距离输出路径,距离结束结束图2.3应用狄克斯特拉算法来具体实现这一步的需求。基本思想:设G〔V,E是一个带权有向图.把图中的顶点集合V分成两组.第一组为已经求出的最短路径的顶点集合〔用S表示.初始时S中只有一个原点.以后每求得一条最短路径就加入的集合S中.知道全部顶点都加入到集合中.第二组.为其余未确定最短路径的顶点集合〔用U表示.按最短路径长度的递增次序依次把第二组的顶点就如S中。如果两个顶点之间有权值.并且各个路径的权值不同.就把最小的作为顶点与顶点的最短距离。kkyuvxuvz图2.4如图所示若x+y<z.则最短的路径就是v=>k=>u。同理若x+y<z.则最短的路径就是v=>u.D[v1]=0;S[v1]=1;//原点编号放入s中 for<i=2;i<n;i++> { min=IDF; for<w=1;w<=n;w++> if<!S[w]&&D[w]<min> { v=w;min=D[w]; } S[v]=1;//修改顶点u放入s中 for<w=1;w<=n;w++> if<!S[w]&&<D[v]+G->arcs[v][w]<D[w]>> { D[w]=D[v]+G->arcs[v][w]; P[w]=v; } }〔4、查询任意两个城市之间的一条最短路径:开始开始输入起点v,输入起点v,终点w调用弗洛伊德调用弗洛伊德算法输出路径,距离输出路径,距离结束结束图2.5此过程需要应用弗洛伊德算法来具体实现。用邻接矩阵保存图存储后.另外需要存一个二维数组A存放当前顶点之间的最短路径长度。分量A[i][j]表示当前顶点i到j的最短路径长度。弗洛伊德算法的基本思维是递推产生一个矩阵序列A0.A1.A2.….Ak.…An.其中Ak[i][j]表示从顶点到vi到顶点vj的路径上所经过的顶点编号不大于k的最短路径长度。A[i][j]=cost[i][j]A<k+1>[i][j]=min{Ak[i][j],Ak[i+1][k+1]+Ak[k+1][j]}弗洛伊德主要算法.若Ak[i][j]已求出.顶点i到顶点k+1的路径长度为Ak[i][k+1].顶点路径长度为Ak[i][j].顶点k+1到顶点j的路径长度为Ak[k+1][j].如果此时Ak[i][k+1]+Ak[k+1][j]<Ak[i][j],则将原来的顶点i到顶点j的路径改为顶点.否则不需要修改顶点i到j的路径。k+1ik+1ijAk[i,k+1]Ak[k+1,j]jAk[i,j]图2.6若Ak[i][k+1]+Ak[k+1][j]<Ak[i][j],修改路径过程: for<k=1;k<=n;k++> { for<i=1;i<=n;i++> for<j=1;j<=n;j++> {if<D[i][k]+D[k][j]<D[i][j]> { D[i][j]=D[i][k]+D[k][j];//修改长度 P[i][j]=P[i][k]; }2.4主函数的调用关系图开始开始输入参数输入参数选择查询选择查询信息012弗洛伊德狄克斯特弗洛伊德狄克斯特退出输出结果输出结果退出输出结果输出结果结束结束3.系统测试3.1操作说明双击"城市交通咨询系统.exe".根据屏幕菜单提示信息.选择任意可选项进行相关操作。根据提示开始输入城市个数以及路径总个数。之后开始建立地图.建立成功后根据菜单界面选择功能。3.2测试数据输入测试数据可以对程序进行如下的图的数据进行数据测试。21821465436437下面运行程序检查输入.输出结果。用户进入界面:〔1、输入城市个数与路径个数〔2输入具体的顶点以及边的个数:地图输入完成.有向图存储结构建立完成。、具体功能的实现1、求一个城市到所有城市之间的最短距离。查询一个顶点到其他顶点的最短路径。如下图。经过手工计算:1=>1长度=0.1=>2长度=8.1=>3长度=8+6=14.1=>4长度=8+5=13;和下图完全一致为保证结果正确换一个顶点进行:如顶点2到其他的距离经过手工计算:2=>1长度=6+4=10.2=>2长度=0.2=>3长度=6.2=>4长度=5;和下图完全一致2、求任意的两个城市之间的最短距离例1到3之间的最短距离.经过计算可得最短距离为1=>2=>3.且路径为14.与下图结果相同。为保证结果正确换一个顶点进行:如顶点2到4之间的最短路径以及距离经过计算可得2到4的最短路径是2=>4,且最短路径为5、选择0结束程序4.总结通过这次数据结构课程设计.我对《数据结构》这门课程有了更深一步的了解.使我对《数据结构》这门课程掌握以及运用更加灵活。同时也让我发现了自己在这门课上的不足与缺陷.同时也明确了自己在以后的类似课程中的具体学习方法。这次在应用中.我发现了自己的很多不足.在编写城市交通咨询系统的过程中.自己C语言方面的只是掌握太少.很多功能需求只能退而求其次.一次又一次的更改.一次又一次的失败.也终于是在最后也完成了自己的要求.同时我也知道了平时用功学习的重要性。尤其是在日常学习之中.对于单一的只是点也许掌握的还不错.但是自己动手太少.实践经验严重不足.且面临课程设计之时.要求多方面的只是结和编码.对于我而言还是有很大的难度的。如此次对于邻接矩阵的存储于读取.以及最短路径算法的实现.两个及其重要的算法.狄克斯特拉算法和佛洛依德算法.在具体的应用上还是有很多不足。通过此次课程设计.我也明白了对于一个完成的程序而言.想要完成它最重要的代码.最初.也是最为重要的一个部分就是算法思想.以及具体程序功能规划.只有最重要的地基部分完美实现.才可以进行接下来的具体代码编程.以及更多细节上的完美。通过这次的课程设计我有懂得了好多数据结构的知识.以前上课没有听的.不知道的.这次都有所了解了.像有向图的构建.弗洛伊德算法.迪克斯特拉算法。这些知识从曾经的听说到现在的了解.进了一大步。不但如此.这次的课设也是我感觉到了数据结构的强大与神奇。渐渐的爱上他了。不仅让我了解了数据结构更加深了对它与C语言的联系的理解。因为自己的不学习.导致这次的课设变得如此的艰难。且因为自己生病住院也更是浪费了很大的时间.对于我自己做课程设计的时间就少的可怜.这也无疑是对我更大的挑战。在临近答辩.我的代码才基本完成.夜以继日的努力也终于是让我完成5.致谢本次课程设计我遇到了极大的问题.不管是时间方面还是内容方面.自己都显得慌乱过.我能够完成本次课程设计也完全感谢舍友的支持与帮助.在难点上能够对我进行帮助。尤其感谢我的知道老师张老师。感谢她在百忙之中抽出时间来为我解答疑惑.解决问题.她对我此次的课程设计有极大的帮助。再次感谢张老师。课程设计马上结束.同时也谢谢所有的负责老师.谢谢她们这几天对我们的付出.老师辛苦了。6.附录#include<stdio.h>#include<stdlib.h>#defineMVNum100//最大顶点数#defineMaxint32767enumboolean{FALSE,TRUE};typedefcharVertexType;typedefintAdjmatrix;typedefstruct{VertexTypevexs[MVNum];//顶点数组.类型假定为charAdjmatrixarcs[MVNum][MVNum];//邻接矩阵.类型假定为int型}MGraph;intD1[MVNum],P1[MVNum];intD[MVNum][MVNum],P[MVNum][MVNum];/*建立有向图的储存结构*/voidCreateMGraph<MGraph*G,intn,inte>{//采用邻接矩阵表示法构造有向图G.n、e表示图的当前顶点数和边数inti,j,k,w;for<i=1;i<=n;i++>//输入顶点信息G->vexs[i]=<char>i;for<i=1;i<=n;i++>for<j=1;j<=n;j++>G->arcs[i][j]=Maxint;//初始化邻接矩阵printf<"===输入%d条边人i〔起点、j〔终点及w〔路径长度:\n",e>;for<k=1;k<=e;k++>//读入e条边.建立邻接矩阵{printf<"===">;scanf<"%d,%d,%d",&i,&j,&w>;G->arcs[i][j]=w;}printf<"===有向图人存储结构建立完毕!===\n">;}/*迪杰斯特拉算法*/voidDijkstra<MGraph*G,intv1,intn>{//利用迪杰斯特拉算法.求出有向图G的v1顶点到其他顶点v的最短路径P[v]及权D[v]intD2[MVNum],P2[MVNum];intv,i,w,min;enumbooleanS[MVNum];for<v=1;v<=n;v++>//初始化S和D{S[v]=FALSE;//置空最短路径终点集D2[v]=G->arcs[v1][v];//置初始的最短路径值if<D2[v]<Maxint>P2[v]=v1;//v1是v的前趋〔双亲elseP2[v]=0;//v无前趋〔双亲}D2[v1]=0;S[v1]=TRUE;//S集初始时只有源点.距离为0for<i=2;i<n;i++>//其余n-1个顶点{min=Maxint;for<w=1;w<=n;w++>if<!S[w]&&D2[w]<min>{v=w;min=D2[w];}//w顶点离v1顶点更近S[v]=TRUE;for<w=1;w<=n;w++>//更新当前最短路径及距离if<!S[w]&&<D2[v]+G->arcs[v][w]<D2[w]>>{D2[w]=D2[v]+G->arcs[v][w];P2[w]=v;}}printf<"===路径长度.路径===\n">;for<i=1;i<=n;i++>{printf<"===%5d",D2[i]>;printf<"%5d",i>;v=P2[i];while<v!=0>{printf<"<-%d",v>;v=P2[v];}printf<"\n">;}}/*费洛伊德算法*/voidFloyd<MGraph*G,intn>{//利用费洛伊德算法.求出最短路径inti,j,k;for<i=1;i<=n;i++>for<j=1;j<=n;j++>{if<G->arcs[i][j]!=Maxint>P[i][j]=j;elseP[i][j]=0;D[i][j]=G->arcs[i][j];}for<k=1;k<=n;k++>{for<i=1;i<=n;i++>for<j=1;j<=n;j++>{if<D[i][k]+D[k][j]<D[i][j]>{D[i][j]=D[i][k]+D[k][j];P[i][j]=P[i][k];}}}}voidmain<>{ printf<"***********欢迎使用城市交通咨询系统**********\n">;printf<"\n">; printf<"=============================================\n">;MGraph*G;intn,e,v,w,k;intxz=1;G=<MGraph*>malloc<sizeof<MGraph>>;printf<"===输入城市个数和路径个数n.e:">;scanf<"%d,%d",&n,&e>;CreateMGraph<G,n,e>;//建立图的存储结构while<xz!=0>{printf<"**************求城市之间的最短距离*********
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论