1、数据结构课程设计校园导航系统软 件 学 院课程设计报告书课程名称 数据结构 设计题目 校园导航系统 专业班级 软件11-04班 学 号 * 姓 名 张鸿雷 指导教师 刘亮 2013年1月1 设计时间 2013年1月20日至2013年1月23日2 设计目的 数据结构是计算机专业的核心课程,是计算机科学的算法理论基础和软件设计的技术基础。数据结构是实践性很强的课程。课程设计是加强学生实践能力的一个强有力手段。23设计任务要求学生掌握数据结构的应用、算法的编写、类C语言的算法转换成C程序并上机调试的基本方法。课程设计要求学生在完成程序设计的同时能够写出比较规范的设计报告。严格实施课程设计这一环节,对
2、于学生基本程序设计素养的培养和软件工作者工作作风的训练,将起到显著的促进作用。14 设计内容题目:校园导航系统设计任务:给出校园各主要建筑的名称信息及有线路联通的建筑之间的距离,利用校园导航系统计算出给定的起点到终点之间的最近距离及线路。设计要求:1、输入各建筑信息及线路信息,构建图。2、计算给定起点到终点之间最近距离的进行线路。3、输出线路及总距离。4.1需求分析 1.程序所能达到的功能;(1) CreateDN(MGraph *G) 创建有向网G,储存学校的各个景点。(2) ShortPath(MGraph G,int v0,int pMAX_VMAX_V,int d)求的有向网G中某个顶
3、点到其余顶点的最短路径及其带权长度。(3) menu()目录函数,按照要求选择相应的功能。2、输入的形式和输入值的范围首先输入导航功能号,只能在x至y之间进行选择;要实现两点之间最短路径导航,需输入起点和终点号,输入的起点和终点号在所给景点号里选择;要实现某点到其他点的最短路径,需输入这个顶点号,顶点号也是在所给的景点号里选择。3、输出的形式学校的所有景点,某个景点到其他景点的最短路径,或者两个景点之间的最短路径4、测试数据:输入导航功能x输入起始点和终点号0和16,输出正确的最短路径和路径长度;重新选择导航功能。选择导航功能y,输入,出发点2,输出景点2的简介。选择导航功能3,退出导航系统。
4、若要实现导航功能x时输入错误,输出时就无路经。重新输入起始点,结束点。若要实现功能2时输入错误,就会提示不存在这个地方。4.2总体设计1、说明本程序中用到的所有抽象数据类型的定义2ADT Graph数据对象V:V是具有相同特性的数据元素的集合,称为顶点集.数据关系R:R=VRVR=(v,w)|v,wV且P(v,w),表示从v到w的弧,谓词P(v,w)定义了弧的意义和信息3基本操作P:Int CreateDN(MGraph *G)操作结果:创造有向网G。void Shortpath(MGraph G,int v0,int pMAX_VMAX_V,int d)初始条件:有向网G已创建。操作结果:有
5、向网G的V0定点到其余定点V的最短路径Pv及其带权长度Dv。若Pvw为True,则w是从V0到V当前求得最短路径上的顶点。Finalv为True当且仅当VS,即已经求得从V0到V的最短路径。void menu()初始条件:有向网G已创建。操作结果:选择相应的功能。2、说明主程序的流程 图4.2-2 主程序流程图3.各程序模块之间的层次(调用)关系 4.3详细设计从流程图中可以看出来,主函数读取用户指令,根据指令调用函数,最终得到用户想要查询的信息。11.采用邻接表存储结构, 定义的抽象数据类型:1)typedef struct ArCell存放构造图的权值 int adj; ArCell,Ad
6、jMatrixMAX_VERTEX_NUMMAX_VERTEX_NUM;2)typedef struct 图中顶点表示主要景点,存放景点的编号、名称、简介等信息, char name30; int num; char introduction100; infotype; 3)typedef struct infotype vexsMAX_VERTEX_NUM; AdjMatrix arcs; int vexnum,arcnum; MGraph; MGraph b;2.主程序以及主要函数21)主函数void main(void) system(color 5f); /*修改控制台的颜色信息,改为
7、白字蓝底的模式*/system(mode con: cols=140 lines=130); /*设置批处理运行时窗口大小的*/cmd(); 2)cmd函数通过这个函数实现选择服务项目的内容void cmd(void) char k; b=InitGraph(); show1();Menu(); while(1) scanf(n%c,&k); switch(k) case x: system(cls); show1(); Menu(); list(); ShortestPath_DIJ(&b); printf(-欢迎您的使用-n); printf(n请您继续选择服务:); break; cas
8、ey: system(cls); Menu(); list(); Search(&b); printf(-欢迎您的使用-n); printf(n请您继续选择服务:); break; case z: system(cls);printf( n); printf( 感谢使用 n); printf( 辽宁工程技术大学 n); printf( 智能导航系统 n); printf( n); exit(0); default: printf(输入信息错误!n请输入x或y或z.n); break; 3)计算最短路径的迪杰斯特拉算法实现1void ShortestPath_DIJ(MGraph * G) in
9、t v,w,i,min,t=0,x,flag=1,v0,v1,have100,k; int final20, D20, p2323; while(flag) printf(请输入起始景点编号:n); scanf(%d,&v0); if(v0G-vexnum) printf(景点编号不存在!); printf(请输入终止景点编号:n); scanf(%d,&v1); if(v1G-vexnum) printf(景点编号不存在!); if(v0=0&v0vexnum&v1=0&v1vexnum) flag=0; for(v=0;vvexnum;+v) finalv=0; Dv=G-arcsv0v.
10、adj; for(w=0;wvexnum;+w) pvw=INFINITY; if(DvINFINITY) pvv0=1; pvv=1; Dv0=0; finalv0=1; have0=v0; for(i=1;ivexnum;+i) min=INFINITY; for(w=0;wvexnum;+w) if(!finalw) if(Dwmin) v=w; min=Dw; finalv=1; havek=v; k+; for(w=0;wvexnum;+w) if(!finalw&(min+(G-arcsvw.adj)arcsvw.adj; for(x=0;xvexnum;x+) pwx=pvx;
11、pww=1; for(i=0;ivexnum;i+) if(pv1havei=1) printf(-%s,G-vexshavei.name); if(v1-v0)=1)printf(n路径长度:%dn,G-arcsv0v1); else printf(n路径长度:%dn,Dv1); /ShortestPath_DIJ end4)查找函数的建立实现用户对景点查找的实现:void Search(MGraph *G) int k,flag=1; while(flag) printf(请输入要查询的景点编号:); scanf(%d,&k); if(kG-vexnum) printf(景点编号不存在!请
12、重新输入景点编号:); scanf(%d,&k); if(k=0&kvexnum) flag=0; printf(n); printf(编号景点名称 简介 n); printf(%-4d%-16s%-58sn,G-vexsk.num,G-vexsk.name,G-vexsk.introduction); printf(n); /Search end5)对要进行浏览的地区的平面图输出void show1() printf(tt 欢迎使用辽宁工程技术大学智能导航系统 n); printf(ttt辽宁工程技术大学葫芦岛校区平面图nn); printf(t 学校北门n); printf(t n); p
13、rintf(t 行政楼静远楼n); printf(t n); printf(t 耘慧楼n); printf(t n); printf(t n); printf(t 体育场 尔雅楼n); printf(t n); printf(t 二食堂 n); printf(t n); printf(t D楼 n); printf(t E楼 n); printf(t C楼 n); printf(t n); printf(t 小体育场,篮球场综合楼小拱桥n); printf(t n); printf(t 一食堂 n); printf(t 浴池 B楼A楼 n); 6)用户根据显示的学校景点序号,查询景点信息:vo
14、id list() printf(学校景点列表:n); printf(0:学校南门 ); printf(1:静远楼 ); printf(2:耘慧楼 ); printf(3:尔雅楼 ); printf(4:小拱桥n); printf(5: A楼 ); printf(6:B楼 ); printf(7:一食堂 ); printf(8:综合楼 n); printf(9:行政楼 ); printf(10:体育场 ); printf(11:二食堂 ); printf(12:D楼 ); printf(13:E楼n); printf(14:C楼 ); printf(15:浴池 ); printf(16:篮球场
15、、足球场nn); 7)目录函数对本系统提供的服务进行提示,以便用户使用:void Menu() printf(n 辽宁工程技术大学葫芦岛校区导游图n); printf( n); printf( x.选择出发点和目的地 n); printf( y.查看景点信息 n); printf( z.退出系统 n); printf( n); printf(请选择服务); 8)对无向网的构建以便于实现本系统的功能MGraph InitGraph(void) MGraph G; int i,j; G.vexnum=17; /顶点是17个G.arcnum=25; /弧线有25个for(i=0;iG.vexnum;
16、i+) G.vexsi.num=i; strcpy(G.vexs0.name,学校北门); strcpy(G.vexs0.introduction,学校的正门,行政楼高高耸立,气势宏伟); strcpy(G.vexs1.name,静远楼); strcpy(G.vexs1.introduction,电控、电信学院用楼,设有图书馆、阅览室等。); strcpy(G.vexs2.name,耘慧楼); strcpy(G.vexs2.introduction,软件、工商学院用楼,设有若干机房,为同学提供更多方便。); strcpy(G.vexs3.name,尔雅楼); strcpy(G.vexs3.in
17、troduction,学生上课、自习的地方。); strcpy(G.vexs4.name,小拱桥); strcpy(G.vexs4.introduction,连接生活区和教学区的桥。); strcpy(G.vexs5.name,A楼); strcpy(G.vexs5.introduction,男生宿舍); strcpy(G.vexs6.name,B楼); strcpy(G.vexs6.introduction,女生宿舍); strcpy(G.vexs7.name,一食堂); strcpy(G.vexs7.introduction,食堂,可用饭卡吃饭); strcpy(G.vexs8.name,
18、综合楼); strcpy(G.vexs8.introduction,校区内的百货大楼); strcpy(G.vexs9.name,行政楼); strcpy(G.vexs9.introduction,学校行政办公场所,校区最高的建筑); strcpy(G.vexs10.name,体育场); strcpy(G.vexs10.introduction,运动会举办地); strcpy(G.vexs11.name,二食堂); strcpy(G.vexs11.introduction,校区最实惠的食堂,内有回民餐厅); strcpy(G.vexs12.name,D楼); strcpy(G.vexs12.i
19、ntroduction,男生宿舍); strcpy(G.vexs13.name,E楼); strcpy(G.vexs13.introduction,男生宿舍); strcpy(G.vexs14.name,C楼); strcpy(G.vexs14.introduction,女生宿舍); strcpy(G.vexs15.name,浴池); strcpy(G.vexs15.introduction,学生洗澡的地方); strcpy(G.vexs16.name,篮球场、足球场); strcpy(G.vexs16.introduction,比赛以及学生运动的地方); for(i=0;iG.vexnum;
20、i+) for(j=0;jG.vexnum;j+) G.arcsij.adj=INFINITY; G.arcs01.adj=50; G.arcs12.adj=15; G.arcs13.adj=40; G.arcs23.adj=30; G.arcs03.adj=90; G.arcs34.adj=30; G.arcs49.adj=1000; G.arcs45.adj=20; G.arcs56.adj=10; G.arcs67.adj=8; G.arcs68.adj=12; G.arcs78.adj=7; G.arcs09.adj=30; G.arcs910.adj=500; G.arcs1011.
21、adj=25; G.arcs1112.adj=8; G.arcs1213.adj=5; G.arcs1314.adj=10; G.arcs1214.adj=10; G.arcs1415.adj=150; G.arcs1516.adj=3; G.arcs515.adj=150; G.arcs415.adj=30; G.arcs111.adj=300; G.arcs814.adj=40;for(i=0;iG.vexnum;i+) for(j=0;jG.vexnum;j+) G.arcsji.adj=G.arcsij.adj; return G; /InitGraph end 3.函数的调用关系图。
22、3 、 图4.3-3函数的调用关系图 1、4.4测试与分析4.4.1测试输入导航功能x输入起始点和终点号0和16,输出正确的最短路径和路径长度;重新选择导航功能。选择导航功能y,输入,出发点2,输出景点2的简介。选择导航功能3,退出导航系统。若要实现导航功能x时输入错误,输出时就无路经。重新输入起始点,结束点。若要实现功能2时输入错误,就会提示不存在这个地方。4.4.2分析1.调试过程中遇到的问题是如何解决的以及对设计与实现的回顾讨论和分析;在调试的过程中发现在导航功能2中缺少判断语句,使得输入错误顶点时,没有提示出现错误的运行结果,在进行导航功能2之前加一个判断语句就可以了。这次的程序设计主
23、要是设计求最短路径的算法,这个算法比较复杂,我根据书上算法一步步地进行分析,并通过请教同学和上网查相关程序,花费了很长时间在使得这个算法能正常运行。4.5 附录123#define INFINITY 10000 #define MAX_VERTEX_NUM 40#define MAX 40#include #include #include #include typedef struct ArCell int adj; /*路径长度 */ArCell,AdjMatrixMAX_VERTEX_NUMMAX_VERTEX_NUM; typedef struct /*图中顶点表示主要景点,存放景点的
24、编号、名称、简介等信息, */ char name30; int num; char introduction100;/*简介*/ infotype; typedef struct infotype vexsMAX_VERTEX_NUM; AdjMatrix arcs; int vexnum,arcnum; MGraph; MGraph b; void cmd(void); MGraph InitGraph(void); void show1();void list();void Menu(void); void ShortestPath_DIJ(MGraph * G); void Searc
25、h(MGraph *G); int LocateVex(MGraph *G,char* v); /*主函数*/ void main(void) system(color 5f); /*修改控制台的颜色信息,改为白字蓝底的模式*/system(mode con: cols=140 lines=130); /*设置批处理运行时窗口大小的*/cmd(); /*自定义函数*/ /* cmd函数(根据目录选择要进行的项目)*/void cmd(void) char k; b=InitGraph(); show1();Menu(); while(1) scanf(n%c,&k); switch(k) case x: system(cls); show1(); Menu(); list(); ShortestPath_DIJ(&b); printf(-欢迎您的使用-
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1