1、海南大学课程名称 数据结构(基于 C 语言)课程设计 题 目 校园导游程序的设计与实现 院 系 信息科学技术学院班 级 通信工程 B 班 软件专题训练任务书软件专题训练题目 校园导游程序姓名 学号 专业班级组别 组长 同组成 员 指导教师 吴泽辉专题训练目的通过校园导游程序的设计与实现,熟 1 练掌 7 握图型结构在实际问题中的应用。专题训练环境 运行环境为 Visual C+ 6.0课程设计任务和要求设计校园导游程序,基本要求:1咨询以用户和计算机的对话方式进行,由用户输入起始点和终点,输出信息:最短路径是多少?并指出所经过的场所。2、计算并记录从校门口到各个场所的最短路径,即求单源点到其它
2、各个场所的最短路径。3、提供校园中任意场所的问路查询,即求任意两点之间的最短路径。参考文献1、严蔚敏等. 数据结构(C 语言版). 清华大学出版社 20042、谭浩强. C 语言程序设计. 清华大学出版社. 20023、李春保. 数据结构教程上机实验指导. 清华大学出版社. 2005校园导游程序 一、简介1设计目的:通过校园导游程序的设计与实现,熟练掌握图型结构在实际问题中的应用。2问题的描述:设计一个校园模拟导游程序,为新生或来访的客人通过与机器的“对话“提供最短路径的信息查询服务。 1任意选取 n 个场所,构成一个无向带权图,图中顶点表示场所,边上的权值表示两点间的距离,图的存储结构可采用
3、带权的邻接矩阵。2咨询以用户和计算机的对话方式进行,由用户输入起始点和终点,输出信息:最短路径是多少?并指出所经过的场所。3、计算并记录从校门口到各个场所的最短路径,即求单源点到其它各个场所的最短路径。4、提供校园中任意场所的问路查询,即求任意两点之间的最短路径。二、数据结构的设计:由于各个场所通过校园中的道路相连,各个场所和连接它们的道路构成了整个校园的地理环境,所以使用图这种数据结构对他们去进行描述。以图中的顶点表示校园内各个场所,应包含场所名称、代号、简介等信息;以边表示连接各个场所的道路,应包含路径的长度等信息;顶点和边均使用结构体定义,整个图的数据结构采用教材中介绍的带权的邻接矩阵方
4、法。二、数据结构的设计:typedef struct ArCellint adj; /路径长度ArCell,AdjMatrixMAX_VERTEX_NUMMAX_VERTEX_NUM;typedef struct /图中顶点表示主要景点,存放景点的序号、名称、介绍等信息,char name30;int num;char introduction100;/简介infotype;typedef structinfotype vexsMAX_VERTEX_NUM;AdjMatrix arcs;int vexnum,arcnum;MGraph;MGraph b;void cmd(void)int i;
5、b=InitGraph();Menu();scanf(“%d“,while(i!=4)switch(i)case 1:Browser(Menu();break;case 2:ShortestPath_DIJ(Menu();break;case 3:Floyd(Menu();break;case 4:exit(1);break;default: printf(“输入序号不存在,请重新输入“);break;scanf(“%d“,MGraph InitGraph(void)MGraph G;int i,j;G.vexnum=10;G.arcnum=14;for(i=0;iG-vexnum)print
6、f(“输入错误,景点序号不存在!请再次输入景点序号:“);scanf(“%d“,if(v0=0for(v=0;vvexnum;v+)finalv=0;Dv=G-arcsv0v.adj;for(w=0;wvexnum;w+)pvw=0;if(Dvvexnum;i+)min=INFINITY;for(w=0;wvexnum;w+)if(!finalw)if(Dwvexnum;w+)if(!finalwfor(x=0;xvexnum;x+) pwx=pvx;pww=1;for(v=0;vvexnum;v+)if(v0!=v) printf(“%s“,G-vexsv0.name);for(w=0;wv
7、exnum;w+)if(pvwt+;if(tG-vexnum-1/ShortestPath_DIJ endvoid Floyd(MGraph *G)int v,u,i,w,k,j,flag=1,p101010,D1010;for(v=0;vvexnum;v+)for(w=0;wvexnum;w+)Dvw=G-arcsvw.adj;for(u=0;uvexnum;u+)pvwu=0;if(Dvwvexnum;u+)for(v=0;vvexnum;v+)for(w=0;wvexnum;w+)if(Dvu+Duwvexnum;i+)pvwi=pvui|puwi;while(flag)printf(“
8、请输入始点和终点的序号:“);scanf(“%d%d“,if(kG-vexnum|jG-vexnum)printf(“景点序号错误!请再次输入始点和终点的序号:“);scanf(“%d%d“,if(k=0printf(“%s“,G-vexsk.name);for(u=0;uvexnum;u+)if(pkjuprintf(“%s“,G-vexsj.name);printf(“ 总路线长%dmn“,Dkj);/Floyd endint LocateVex(MGraph *G,char* v) int c=-1,i;for(i=0;ivexnum;i+)if(strcmp(v,G-vexsi.nam
9、e)=0)c=i;break;return c;MGraph * CreatUDN(MGraph *G)int i,j,k,w;char v120,v220;printf(“输入图的顶点数,弧数:“);scanf(“%d%d“,printf(“输入景点的编号:、名称、介绍:n“);for(i=0;ivexnum;i+)printf(“景点序号:“);scanf(“%d“,printf(“景点名称:“);scanf(“%s“,G-vexsi.name);printf(“景点介绍:“);scanf(“%s“,G-vexs-introduction);for(i=0;ivexnum;i+)for(j
10、=0;jvexnum;j+)G-arcsij.adj=INFINITY;printf(“请输入路径长度:n“);for(k=0;karcnum;k+)printf(“第%d 条边:n“,k+1);printf(“景点对(x,y):“);scanf(“%s“,v1);scanf(“%s“,v2);printf(“路径长度:“);scanf(“%d“,i=LocateVex(G,v1);j=LocateVex(G,v2);if(i=0G-arcsji=G-arcsij;return G;void print(MGraph *G)int v,w,t=0;for(v=0;vvexnum;v+)for(
11、w=0;wvexnum;w+) if(G-arcsvw.adj=INFINITY)printf(“ “);else printf(“%-7d“,G-arcsvw.adj);t+;if(t%G-vexnum=0)printf(“n“);旅客进行查询:1. 查看校园各景点 2. 查看所有游览线路; 3. 选择始点和终点 4. 退出程序三、功能(函数)设计:一本程序从总体上分为四个功能模块,分别为: (1)查看校园各景点,这一功能主要为来客提供要查的信息。 (2) 查看所有游览线路,这一功能主要提供来客所要到达目的地的所有的线路,方便选择最短的的路线。 (3)选择始点和终点 ,这一功能的实现为了找出
12、所走线路中的最短路径(4). 退出程序二,流程图如下(1) 程序功能介绍和操作提示模块选项操作菜单查看校园各景点查看所有游览路线选择始点和终点退出程序(2)查看所有游览线路开始用求迪杰斯特拉算法出中转最少的路径输入 v0,vv0,v 合理v0=v递归调用此算法输出中转最少的路径v0,v 直接到达结束NYYNYN权值小于无穷带权最少的路径(3)选择始点和终点开始初始化 pathij,distij用弗洛伊德算法计算最小路径输入 vi,vjvi,vj 合理输出最短路径结束NYYY 用 弗 洛 伊 德 算 法 计 算 最 小 路 径 YNdistik+distkjdistijdistij=distik
13、+distkj;pathij=JoinList(pathik,pathkj);调用 JoinList()和 Addtail()四、界面设计:本程序界面本着易于操作简单整洁而不失美观的理念,采用数字对应功能选项,结合详细的操作提示,使得操作方便快捷,界面清晰明朗。函数 MGraph InitGraph():初始化图。函数 void Menu():创建菜单。函数 void Browser(MGraph *G):浏览全景。函数 void Search(MGraph *G):查询某点信息。函数 void Floyd(MGraph *G):查询任意两点之间的最短路径。函数 void ShortestPa
14、th_DIJ(MGraph * G):查询校门口到其他各点之间的最短路径六、运行与测试:1、测试的数据及其结果:(1)浏览各景点选项功能(2)选择查看校门口到各个景点的最短路径(3)从各个景点中任意选择两景点之间的最短距离( 4)查询完毕,退出程序2、运行与测试期间遇到的问题及其解决办法。1. 对文件的输入、输出打开方式不够熟悉,导致输入输出信息有误,后参照教材等材料进行修改,使得程序正常进行; 2. 删除函数中循环使用不当,导致运行结果及写入文件结果错误,经修改后恢复正常;3. 经过反复修改测试运行,程序功能基本实现,基本完成题目要求。 。七、设计后的思考:1.首先经过这一个星期的紧张而又充
15、实的课程设计,是我对数据结构这一门课程的相关知识有了全面深刻的认识,尤其是对图这一数据结构的相关知识掌握的更加全面和牢固,特别是对迪杰斯特拉算法的思想和具体实现更是经历了从不知所云到熟练运用的学习过程,同时也全面而又系统的复习了 C+相关知识。 2.此次课程设计最大的收获可以说是全面掌握了数据结构图的相关知识。虽说图这一章也是数据结构的终点,但是由于考试只考一些算法的思想,对具体的实现没有做要求,因此课程设计之前我对迪杰斯特拉算法可以说是一窍不通,更谈不上了解。经过几天的探索和同学的指点,终于可以运用迪杰斯特拉算法实现对无向网中各顶点间的最小路径和具体路径的求解。 3.经过此次课程设计,使我懂
16、得任何一门计算机语言学习,都是应该理论与实际的结合,光有理论知识是不行的。在以前的学习中,我往往知识以备考为目的,只注重对教材理论知识的学习,不注重实践,平时很少主动去写一些代码,从以前的 C 语言到 C+语言包括现在的数据结构都是这样一个情况。虽然在期末考试中往往有不错的表现,但是真正到要我自己动手去编写一个程序时,往往都是困难重重。 4.学习无止境,但不代表这门课程的学习彻底结束,因为我还没掌握的知识还有很多很多,就拿本次课程设计来说,在设计输出相关路径时,最初的设计思想是输出相关顶点的名称而不是其序号,因为这样就可以是相关的路径信息表达的更为直观明了,使用户更容易使用。但是真正到了实现的时候困难重重,最后只能退而求其次,用各顶点的序号代替其名称。这导致用户在查询相关路径信息时必须拿路径中所列出的序号同主登入界面中所列出的景点名称一一对照,加大了用户的工作量。这可谓是本系统的一大遗憾,所以我决定在寒暑假等课余时间将这些知识重新学习,达到真正对这门课程的掌握。