校园导游系统程序课程设计报告_第1页
校园导游系统程序课程设计报告_第2页
校园导游系统程序课程设计报告_第3页
校园导游系统程序课程设计报告_第4页
校园导游系统程序课程设计报告_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、1、需求分析设计一个校园导游系统程序,为来访的客人提供各种服务的信息查询。(1).设计工商学院校园无向图,所含的景点不少于10个。以图中顶点表示校内各景点,存放景点名称、代号、简介等信息;以边表示路径,存放路径长度等相关信息。(2).为来访客人提供图中任意景点相关信息的查询。(3).为来访客人提供图中任意景点的问路查询,即查询任意两个景点之间的一条最短的简单路径。2、设计思路校园旅游模型是由景点和景点之间的路径组成的,所以这完全可以用数据结构中的图来模拟。用图的结点代表景点,用图的边代表景点之间的路径。所以首先应设计一个图类。结点值代表景点信息,边的权值代表景点间的距离。结点值及边的权值用顺序

2、表存储,所以需要设计一个顺序表类。本系统需要查询景点信息和求一个景点到另一个景点的最短路径长度及路线,为方便操作,所以给每个景点一个代码,用结构体类型实现。计算路径长度和最短路线时可用弗洛伊德(floyd)算法实现。最后用switch选择语句选择执行浏览景点信息或查询最短路径。3 算法设计3.1 概要设计 3.1.1 程序中包含的模块(1)主程序模块主函数:void main(void)void cmd(void) cmd修改显示框大小,字体背景颜色,初始化景点,景点信息打印菜单, mgraph initgraph(void); /初始化图。mgraph * creatudn(mgraph *

3、g); /初始化图形接受用户输入void menu(void);/菜单函数 void browser(mgraph *g);/浏览函数void shortestpath_dij(mgraph *g);void floyd(mgraph *g);/ 查询图中任意两个景点间的所有路径void search(mgraph *g);/查找函数int locatevex(mgraph *g,char*v); / 迪杰斯特拉算法 计算起点各顶点间短路径,void print(mgraph *g); /输出函数(2)查询模块景点信息查询:void introduce()最短路径查询:要查找的两景点的最短距离

4、:用floyd算法求两个景点的最短路径: (3)打印模块:void print(mgraph *g);3.1.2模块间的调用关系主函数main()调用void cmd(void)调用menu 并且用switch设置开关语句。3.2 详细设计3.2.1定义符号变量#define infinity 1000 /*穷*/#define max_vertex_num 40/*定义全局变量*/创建两个类 存储景点信息和存储景点道路和长度typedef struct arcell /邻接矩阵int adj; /存储路径长度arcell,adjmatrixmax_vertex_nummax_vertex_n

5、um; typedef struct /图顶点表示主要景点存放景点编号、名称、简介等信息char name20;int num;char introduction60;/简介infotype;typedef struct/图中的边表示景点间的道路,存放路径长度等信息。infotype vexsmax_vertex_num;/顶点信息域adjmatrix arcs;int vexnum,/*顶点数*/ arcnum;/边个数mgraph;mgraph b;3.2.2自定义函数原型说明给出函数声明void cmd(void);mgraph initgraph(void);void menu(voi

6、d);void browser(mgraph *g);void shortestpath_dij(mgraph *g);void floyd(mgraph *g);void search(mgraph *g);int locatevex(mgraph *g,char*v);mgraph * creatudn(mgraph *g);void print(mgraph *g);3.2.3定义各顶点之间的距离:for(i=0;ig.vexnum;i+) for(j=0;jg.vexnum;j+) g.arcsij.adj=infinity; g.arcs01.adj=80;/*路径度*/ g.arc

7、s02.adj=180; g.arcs06.adj=200; g.arcs111.adj=120; g.arcs12.adj=100; g.arcs25.adj=50; g.arcs34.adj=60; g.arcs49.adj=140; g.arcs59.adj=250; g.arcs57.adj=150; g.arcs67.adj=190; g.arcs69.adj=150; g.arcs87.adj=130; g.arcs86.adj=50; g.arcs1012.adj=100; g.arcs910.adj=150; g.arcs34.adj=190; g.arcs513.adj=15

8、0; g.arcs147.adj=350; g.arcs23.adj=190; g.arcs29.adj=150; g.arcs211.adj=120; g.arcs08.adj=120; g.arcs12.adj=50; g.arcs1012.adj=170; g.arcs1215.adj=160; for(i=0;ig.vexnum;i+) for(j=0;jg.vexnum;j+) g.arcsji.adj=g.arcsij.adj; return g;3.2.4界面菜单设计:菜单选择 void menu() printf(n 武汉工商学院院导游图n); printf( n); prin

9、tf( 1.浏览校园全景 n); printf( 2.查看所有游览路线 n); printf( 3.确定两景点之间最短距离 n); printf( 4.查看景点信息 n); printf( 5.退出导游系统 n); printf( n); printf(option-:);menu(); scanf(%d,&i); while(i!=5) switch(i) case 1:system(cls);browser(&b);menu();break; case 2:system(cls);shortestpath_dij(&b);menu();break; case 3:system(cls);f

10、loyd(&b);menu();break; case 4:system(cls);search(&b);menu();break; case 5:exit(1);break; default:break; 3.2.6介绍景点:void browser(mgraph *g) int v; printf(n); printf(编号景点名称 简介 n); printf(n); for(v=0;vvexnum;v+)printf(%-4d%-20s%-60s n,g-vexsv.num,g-,g-roduction); printf(n);3.2.7要查找的两个

11、景点的最短距离:用floyd算法求两个景点的最短路径void floyd(mgraph *g)/查询图中任意两个景点间的所有路径。 int v,u,i,w,k,j,flag=1,p202020,d2020; for(v=0;vvexnum;v+) for(w=0;wvexnum;w+) dvw=g-arcsvw.adj; for(u=0;uvexnum;u+) pvwu=0; if(dvwinfinity) pvwv=1;pvww=1; for(u=0;uvexnum;u+) for(v=0;vvexnum;v+) for(w=0;wvexnum;w+) if(dvu+duwdvw) dvw=

12、dvu+duw; for(i=0;ivexnum;i+) pvwi=pvui|puwi; while(flag) printf(请输入出发地编号:); scanf(%d,&k); if(kg-vexnum) printf(景点编号存!n请输入出发地编号:); scanf(%d,&k); printf(请输入目的地编号:); scanf(%d,&j); if(jg-vexnum) printf(景点编号存!n请输入目的地编号:); scanf(%d,&j); if(k=0&kvexnum&j=0&jvexnum) flag=0; printf(%s,g-); for(u=0;

13、uvexnum;u+) if(pkju&k!=u&j!=u) printf(-%s,g-); printf(-%s,g-); printf( 总路线%dmn,dkj); 3.2.8查看所有游览路线算法计算,引进一个辅助向量d,它的每个分量d表示当前所找到的从始点v0到每个终点vi的的长度。若从v到vi有弧,则d为弧上的;否则置d为。4 测试分析 4.1 主程序界面 主程序从void main()开始运行void cmd(void) cmd修改显示框大小,字体背景颜色,初始化景点,景点信息的赋值初始化无向邻接图b=initgraph(); 调用menu菜单

14、函数打印菜单,提示用户输入选择功能。 图4-1.主程序界面4.2 浏览景点信息输出浏览比较简单就是把原来的景点信息利用for循环输出,int v=0;v小于最多的景点个数输出景点信息。依次输出。 图4-2 浏览景点信息4.3查看所有游览线路查看所有路线是使用void shortestpath_dij(mgraph * g)/ 迪杰斯特拉算法 计算起点各顶点间短路径,然后利用for循环输出计算的结果。输入景点不正确时会输出景点不存在请重新输入景点编号。图4-3:查看所有游览路线4.4 确定两景点之间最短距离利用void floyd(mgraph *g)/函数 利用循环嵌套 查询图中存在的任意两个

15、景点间的最短路径再利用循环输出,如果景点不存在将会输出景点不存在 请输入出发地(目的地)编号。 图4-4:确定两景点之间最短距离4.5 查看景点信息利用void search(mgraph *g)/函数,查看景点信息 查找景点编号,当输入景点编号不在范围时输出“景点编号不存在请重新输入编号:”输入正确时输出景点信息。图4-5:查看景点信息5系统功能及实现5.1 主程序界面 定义一个i,然后,调用initgraph()函数初始化图,再调用menu()函数,再输入选择,利用switch开关语句,用户选择,需要的功能,实现想要的.。 图5-1.主程序界面5.2 浏览景点信息定义v;用for循环for

16、(v=0;ig.vexnum;v+)当条件成立的时候执行printf语句,直到循环不成立的时候输出结束, 图5-2 浏览景点信息5.3查找所有游览线路查找路径利用,迪杰斯特拉算法,第1重循环for(x=0;xvexnum;x+)/第1重循环条件成立时执行 pwx=pvx;不成立时结束循环。图5-:3-1:查找所有游览路线第2重循环for(w=0;wvexnum;w+)循环条件成立的时候执行if(!finalw&(min+g-arcsvw.adjarcsvw.adj;第一重循环 pww=1; 循环不成立时循环结束图5-:3-2:查找所有游览路线第3重循环定义一个w ,利用for循环for(w=0

17、;wvexnum;w+)当循环体成立时if(!finalw)if(dwmin) v=w;min=dw;finalv=1; 第2重for循环 循环条件 不成立循环终止结束跳出到第四重循环执行i+.图5-:3-3:查找所有游览路线第4重for循环定义i,利用for(i=0;ivexnum;i+)循环条件成立的时候执行 min=infinity; 以及第3重for循环 里面的代码 直到循环条件不成立,循环结束然后利用for输出查找结果 如图5-3-4图5-3-4:查看所有游览路线(第4重循环)这是查看所有路线功能里的输出循环,定义v ,i整型变量然后利用for(v=0;vvexnum;v+)判断if

18、(v0!=v)如果成立执行 printf(%s,g-); 然后执行第二重 for(w=0;wvexnum;w+) if(pvw&w!=v0) printf(-%s,g-); t+; if(tg-vexnum&v0!=v)printf( 总路线%dmnn,dv); 第1重循环结束后跳到第1重v+直到外重循环循环条件不成立循环结束图5-3-5:查看所有游览路线5.4 确定两景点之间最短距离利用多个for循环嵌套,计算出路径,计算出路径长度,当最外重循环不成立时循环结束.利用for循环输出图5-4-2:确定两景点之间最短距离6总结经过近两周的课程设计,总的来

19、说收获还是很大的!首先代码能力明显提高,有了想法基本都能顺利表达出来;再者就是数据结构的选择使用能力也有了很大的提高!虽说平时的试验课我们也有用各种数据做题,但那些都是很明确的知道该做什么操作,存什么,我们的发挥空间不大一般照做就行,然而这次实习我们却在自主的选择判断,这本身就是一个很大的提高!还有就是算法方面的学习有了初步进阶,如最短路径,这样比较简单的图论算法能比较熟练的写出来。但是还是有很多的只是不了解!收获真的很多,但是最大的收获可能就是对编程的兴趣吧,在一次次的改错,一次次的完成想要的效果后,越写越有感觉!当然还收获了无知,更确切的说是自知,原来我们现在什么也不算,还有很多有用的只是

20、等着我们去学习!7 参考文献1 谭浩强.c程序设计(第四版)m. 北京:清华大学出版社,2010:293-326.2 苏小红,孙志岗,陈惠鹏.c语言大学实用教程(第三版)m. 北京:电子工业出版社,2012:240-280.3 林锐.高质量c+/c编程指南m.北京:清华大学出版社2001.7:245-278.4 陈朔鹰,陈英.c语言程序设计习题集(第二版)m.北京:人民邮电出版社,2003.2:320-360.5 谭浩强.c语言程序设计题解与上机指导m.北京:清华大学出版社,2000.11:12-60.6 塞奇威克. 算法:c语言实现m. 北京:机械工业出版社,2009:213-225.7 里

21、斯.深入理解c指针m. 北京:人民邮电出版社,2014:103-122.8 陈正冲.c语言深度解剖(第2版)m.北京:北京航空航天大学出版社,2012:34-42.9 贾宗璞.c语言程序设计m.江苏:中国矿业大学出版社,2007.6:112-135.10周海燕,赵重敏,齐华山.c语言程序设计m. 北京:科学出版社,2001:165-187.8附录#define infinity 100000000 /*穷*/#define max_vertex_num 40#define max 40#include#include#include#includetypedef struct arcellin

22、t adj; /路径度arcell,adjmatrixmax_vertex_nummax_vertex_num;/邻接矩阵typedef struct /图顶点表示主要景点存放景点编号、名称、简介等信息char name20;int num;char introduction60;/简介infotype;typedef struct/图中的边表示景点间的道路,存放路径长度等信息。infotype vexsmax_vertex_num;/顶点信息域adjmatrix arcs;int vexnum,/*顶点数*/ arcnum;/边个数mgraph;mgraph b;void cmd(void)

23、;mgraph initgraph(void);void menu(void);void browser(mgraph *g);void shortestpath_dij(mgraph *g);void floyd(mgraph *g);void search(mgraph *g);int locatevex(mgraph *g,char*v);mgraph * creatudn(mgraph *g);void print(mgraph *g);/*/void main(void) system(color 0f); system(mode con: cols=150 lines=140);

24、cmd();/*/void cmd(void) int i; b=initgraph(); menu(); scanf(%d,&i); while(i!=5) switch(i) case 1:system(cls); browser(&b); menu();break;/1.浏览校园全景 case 2:system(cls); shortestpath_dij(&b); menu();break;/2.查看所有游览路线 case 3:system(cls); floyd(&b); menu(); break;/3.确定两景点之间最短距离 case 4:system(cls); search(

25、&b); menu();break;/4.查看景点信息 case 5:exit(1);break; default:break; printf(请重新输入(1-5):); scanf(%d,&i); mgraph initgraph(void)/初始化 mgraph g; int i,j; g.vexnum=16; g.arcnum=40; for(i=0;ig.vexnum;i+) g.vexsi.num=i; strcpy(g.,唐人街 ); strcpy(g.roduction,学校门口小吃街); strcpy(g.,校大门 );

26、 strcpy(g.roduction,学校大门是学校的门面); strcpy(g.,校 综合楼 ); strcpy(g.roduction,全体教师办公场所 楼高12层 各种设施齐全 ); strcpy(g.,体育馆 足球场 ); strcpy(g.roduction,体育馆一楼为室内羽毛球 乒乓球 馆,室外为塑胶跑道, 晚上散步); strcpy(g.,医务室 ); strcpy(g.roduction,体育馆一楼为医用费用较贵 .); strcpy(g.ve

27、,外语楼 ); strcpy(g.roduction,校第二教学楼,共7层环形 环境优美,适宜学习); strcpy(g.,5 号宿舍楼 ); strcpy(g.roduction,多个学院 女生宿舍楼 位于弘德楼旁边); strcpy(g.,湖边小树林 ); strcpy(g.roduction, 绿树荫阴,适宜休息 晨读 还有小情侣约会); strcpy(g.,弘德楼 ); strcpy(g.roduction,全校最高建筑物弘德楼 一楼与二楼

28、是学生第一食堂); strcpy(g.,图书馆 ); strcpy(g.roduction,藏书145万册,设施优良 一楼有咖啡厅 环境优雅 2楼设有电子阅览室); strcpy(g.,静思湖 ); strcpy(g.roduction,校内湖,环境好 内有荷花 湖上还造了回心转意桥夏天荷花漂亮); strcpy(g.,第三教学楼); strcpy(g.roduction,校第三教楼为实验楼,环境好 内设 物理 化学实验室和电脑机房); strcpy(g.vexs12.na

29、me,学生第二食堂 ); strcpy(g.roduction,环境比较好 ,饭菜还可以); strcpy(g.,1 2 3 4 号宿舍楼 ); strcpy(g.roduction,1 3 号是学院女生宿舍楼,2 4号是男生宿舍楼); strcpy(g.,6 号宿舍楼 ); strcpy(g.roduction,6 栋是学校的鸳鸯楼就是男生半栋女生半栋楼); strcpy(g.,黄家湖 ); strcpy(g.roduction,位于学校足球场旁边

30、生态湖,可以在那钓鱼 ); for(i=0;ig.vexnum;i+) for(j=0;jg.vexnum;j+) g.arcsij.adj=infinity; g.arcs01.adj=80;/*路径度*/ g.arcs111.adj=110; g.arcs12.adj=50; g.arcs15.adj=90; g.arcs211.adj=65; g.arcs25.adj=90; g.arcs210.adj=85; g.arcs29.adj=90; g.arcs23.adj=150; g.arcs59.adj=80; g.arcs53.adj=70; g.arcs513.adj=40; g.

31、arcs138.adj=50; g.arcs133.adj=100; g.arcs135.adj=80; g.arcs86.adj=55; g.arcs87.adj=50; g.arcs64.adj=55; g.arcs910.adj=45; g.arcs93.adj=65; g.arcs1014.adj=120; g.arcs1012.adj=150; g.arcs1214.adj=170; g.arcs1012.adj=170; g.arcs1215.adj=160; g.arcs910.adj=150; g.arcs1012.adj=100; g.arcs1215.adj=160; g.

32、arcs147.adj=150;for(i=0;ig.vexnum;i+) for(j=0;jg.vexnum;j+) g.arcsji.adj=g.arcsij.adj; return g;/initgraph endvoid menu()/菜单 printf(n 武汉工商学院院导游图n); printf( n); printf( 1.浏览校园全景 n); printf( 2.查看所有游览路线 n); printf( 3.确定两景点之间最短距离 n); printf( 4.查看景点信息 n); printf( 5.退出导游系统 n); printf( n); printf(option-:)

33、;void browser(mgraph *g)/浏览 int v; printf(n); printf(编号景点名称 简介 n); printf(n); for(v=0;vvexnum;v+) printf(%-4d%-20s%-60s n,g-vexsv.num,g-,g-roduction); printf(n);void shortestpath_dij(mgraph * g)/ 迪杰斯特拉算法 计算起点各顶点间短路径 查找所有路线 int v,w,i,min,t=0,x,flag=1,v0; int final20, d20, p2020; wh

34、ile(flag) printf(请输入起始景点编号:); scanf(%d,&v0); if(v0g-vexnum) printf(景点编号存!请重新输入景点编号:); scanf(%d,&v0); if(v0=0&v0vexnum) flag=0; for(v=0;vvexnum;v+) finalv=0; dv=g-arcsv0v.adj;/存储起始v0-末尾v之间权值 for(w=0;wvexnum;w+) pvw=0; if(dvinfinity) pvv0=1;pvv=1; dv0=0;finalv0=1; for(i=1;ivexnum;i+) min=infinity; for

35、(w=0;wvexnum;w+) if(!finalw) if(dwmin)v=w;min=dw; finalv=1; for(w=0;wvexnum;w+) if(!finalw&(min+g-arcsvw.adjarcsvw.adj; for(x=0;xvexnum;x+) pwx=pvx; pww=1; for(v=0;vvexnum;v+) if(v0!=v) printf(%s,g-); for(w=0;wvexnum;w+) if(pvw&w!=v0) printf(-%s,g-); t+; if(tg-vexnum&v0!=v)print

36、f( 总路线%dmnn,dv); /shortestpath_dij endvoid floyd(mgraph *g)/查询图中任意两个景点间的最短路径。 int v,u,i,w,k,j,flag=1,p202020,d2020; for(v=0;vvexnum;v+) for(w=0;wvexnum;w+) dvw=g-arcsvw.adj; for(u=0;uvexnum;u+) pvwu=0; if(dvwinfinity) pvwv=1;pvww=1; for(u=0;uvexnum;u+) for(v=0;vvexnum;v+) for(w=0;wvexnum;w+) if(dvu+

37、duwdvw) dvw=dvu+duw;for(i=0;ivexnum;i+)pvwi=pvui|puwi;while(flag)printf(请输入出发地编号:);scanf(%d,&k);if(kg-vexnum)printf(景点编号存!n请输入出发地编号:);scanf(%d,&k);printf(请输入目的地编号:);scanf(%d,&j);if(jg-vexnum)printf(景点编号存!n请输入目的地编号:);scanf(%d,&j);if(k=0&kvexnum&j=0&jvexnum)flag=0;printf(%s,g-);for(u=0;uvexnum;u+)if(pkju&k!=u&j!=u)printf(-%

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论