河南科技大学校园模拟导游程序设计报告.docx
- 文档编号:10221972
- 上传时间:2023-05-24
- 格式:DOCX
- 页数:18
- 大小:517.70KB
河南科技大学校园模拟导游程序设计报告.docx
《河南科技大学校园模拟导游程序设计报告.docx》由会员分享,可在线阅读,更多相关《河南科技大学校园模拟导游程序设计报告.docx(18页珍藏版)》请在冰点文库上搜索。
河南科技大学校园模拟导游程序设计报告
校园模拟导游程序
一、简介
1.设计目的:
为新生或来访的客人通过与机器的“对话“提供最短路径的信息查询服务。
2.问题的描述:
1.任意选取n个场所,构成一个无向带权图,图中顶点表示场所,边上的权值表示两点间的距离,图的存储结构可采用带权的邻接矩阵。
2.咨询以用户和计算机的对话方式进行,由用户输入起始点和终点,输出信息:
最短路径是多少?
并指出所经过的场所。
3、计算并记录从校门口到各个场所的最短路径,即求单源点到其它各个场所的最短路径。
4、提供校园中任意场所的问路查询,即求任意两点之间的最短路径。
二、数据结构的设计:
由于各个场所通过校园中的道路相连,各个场所和连接它们的道路构成了整个校园的地理环境,所以使用图这种数据结构对他们去进行描述。
以图中的顶点表示校园内各个场所,应包含场所名称、代号、简介等信息;以边表示连接各个场所的道路,应包含路径的长度等信息;顶点和边均使用结构体定义,整个图的数据结构采用教材中介绍的带权的邻接矩阵方法。
三、功能(函数)设计:
1、创建图模块:
函数MGraphInitGraph()
通过两个for循环创建图,并通过邻接矩阵存储各路径权值,因为是无向图,仅需对上三角各权值进行赋值,再通过两个for循环进行对称复制。
2、菜单模块:
函数voidMenu()
通过多个printf语句构建一个简单整洁的用户交互界面。
3、浏览模块:
函数voidBrowser(MGraph*G)
通过一个for循环得出所有地点的列表,实现浏览功能。
4、查询信息模块:
函数voidSearch(MGraph*G)
查询某一个地点的简介信息。
5、查询某两点最短路径模块:
函数voidFloyd(MGraph*G)
通过弗洛伊德算法查询任意两点之间的最短路径以及经过的场所。
6、查询某一点到其他各点的最短路径模块:
函数voidShortestPath_DIJ(MGraph*G)
通过迪杰斯特拉算法来计算出起点到各个顶点之间的最短路径,即求单源点到其它各个场所的最短路径。
4、界面设计:
本程序界面本着易于操作简单整洁而不失美观的理念,采用数字对应功能选项,结合详细的操作提示,使得操作方便快捷,界面清晰明朗。
欢迎界面(附带校园简介):
菜单界面:
5、程序设计:
函数MGraphInitGraph():
初始化图。
函数voidMenu():
创建菜单。
函数voidBrowser(MGraph*G):
浏览全景。
函数voidSearch(MGraph*G):
查询某点信息。
函数voidFloyd(MGraph*G):
查询任意两点之间的最短路径。
函数voidShortestPath_DIJ(MGraph*G):
查询校门口到其他各点之间的最短路径。
函数voidmain():
通过一个switch语句,实现不同函数的调用来实现不同的功能。
流程图如下:
利用迪杰特斯拉算法,求v0到其余顶点的最短路径:
六、运行与测试:
1、测试的数据及其结果:
(1)选择浏览功能:
(2)选择查看某两点之间的最短路径:
(3)选择查看校门口到各地点之间的最短路径:
(4)选择查看某点信息:
(5)如果输入代码有误:
(6)选择退出系统:
2、运行与测试期间遇到的问题及其解决办法。
(1).问题1:
一个很低级的错误就是在字符串的赋值上居然还会出错,本来是不可以像int型数据那样直接用等于号赋值的,可是刚开始由于失误却犯了这样低级的错误结果导致出现100多个错误,当时确实有点慌了,等冷静下来一想才把问题想明白,字符串的赋值必须用strcpy函数。
(2).问题2:
关于最短路径的输出问题。
在进行最短路径输出时,我刚开始时只能正序输出,当我逆向输出时,得到的结果却有点问题,经过分析调试后,找到了错误的所在。
在找最短路径的时候我用的是Floyd算法,在这个算法中有三重循环,形式均为:
for(k=0;k (3).问题3: 运行显示程序简介后,继续输入时没有清屏操作,导致运行结果不方便观察,后来查资料知道增加getch();system("cls");语句,可以实现按任意键继续,并清屏。 七、设计后的思考: 此次课程设计,付出了很多的时间和经历,编程过程中,我看到了自己许多不足,例如程序编写的有点杂乱,造成编译时错误不好找到,没有足够的耐心,有点急功近利,修改编译错误时不能做到系统的分析,造成程序越改越乱,影响了情绪,丢掉了信心。 同时,我也深切感受到了程序员的艰辛,明白了作为一个程序员应该尽可能的为用户考虑,缜密的思维,让程序不断地人性化,可操作性强,界面尽可能的友好,把完美作为自己的目标。 对于程序本身,我看到了良好的程序编写风格对于程序员的重要性,函数之间调用的便利与简洁,以及循环套用的魅力之所在。 总之,不管简单还是复杂的程序设计,都要求扎实的基础知识,因为各种程序都是由简单的一块块的函数结构组成的,并加强实践,从程序的编写中进一步加强对书本知识的掌握。 而且,需要耐心,做程序的编写时比较枯燥的,会出现许多错误,需要我们细心并耐心的进行修改。 回顾编程的过程,我也学到了许多程序之外的东西,编程的过程对一个人的耐心和毅力是一种极大地考验,不停地编译,不停地改错,不停地被打击,信心被一点点的消磨,如果放弃,将前功尽弃。 所以我选择了停一停稍作休息然后坚持下去,终于在完成的那一瞬间,内心充满了自豪和成就感。 这次任务完成的过程给我上了生动而难忘的一课,面对一次次的挫折与打击,我会选择咬牙坚持;为了远方的目标,我会不懈的努力,一点点的去接近。 附: 源代码: #defineM10000 #defineMAX_VERTEX_NUM40 #defineMAX40 #include #include #include #include typedefstructArCell { intadj;//路径长度 }ArCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; typedefstruct//图中顶点表示主要地点,存放地点的编号、名称、简介等信息, { charname[30]; intnum; charintroduction[100];//简介 }infotype; typedefstruct { infotypevexs[MAX_VERTEX_NUM]; AdjMatrixarcs; intvexnum,arcnum; }MGraph; MGraphb; MGraphInitGraph(); voidMenu(); voidBrowser(MGraph*G); voidShortestPath_DIJ(MGraph*G); voidFloyd(MGraph*G); voidSearch(MGraph*G); intLocateVex(MGraph*G,char*v); MGraph*CreatUDN(MGraph*G); voidprint(MGraph*G); voidmain() {system("color2f"); system("modecon: cols=140lines=130"); inti; b=InitGraph(); printf("|************************************************|\n"); printf("|************************************************|\n"); printf("|****************|\n"); printf("|********欢迎进入河南科技大学模拟导游系统********|\n"); printf("|********(西苑校区南院)********|\n"); printf("|************************************************|\n"); printf("|************************************************|\n"); printf("|注: 本程序操作容易,请注意跟随操作提示|\n"); printf("—————————————————————————\n"); printf("河南科技大学西苑校区位于洛阳市涧西区,西苑校区占地面积37公顷,建筑面积28万平方米,分为南、\n"); printf("北两院,西苑路横贯其中,将南、北两院分割开来,因而得名。 河南科技大学西苑校区是原洛阳工学院\n"); printf("所在地,始建于1952年,至今已有57年历史。 这里风景优美,环境幽雅,古树参天。 \n\n"); printf("请按任意键继续..................."); getch(); system("cls"); Menu(); scanf("%d",&i); while (1) { switch(i) { case1: Browser(&b);Menu();break; case2: Floyd(&b);Menu();break; case3: ShortestPath_DIJ(&b);Menu();break; case4: Search(&b);Menu();break; case5: printf("谢谢您的使用,再见! \n");exit (1);break; default: printf("对不起,您输入的选项有误...\n");printf("请重新输入: ");break; } scanf("%d",&i); } } MGraphInitGraph() { MGraphG; inti,j; G.vexnum=10; G.arcnum=14; for(i=0;i G.vexs[i].num=i; strcpy(G.vexs[0].name,"河南科技大学大门"); strcpy(G.vexs[0].introduction,"古朴典雅的学校大门"); strcpy(G.vexs[1].name,"足球场"); strcpy(G.vexs[1].introduction,"砖渣跑道,跑步健身的好去处"); strcpy(G.vexs[2].name,"3号办公楼"); strcpy(G.vexs[2].introduction,"内有教师办公室,财会办公室等"); strcpy(G.vexs[3].name,"图书馆"); strcpy(G.vexs[3].introduction,"设施良好,2楼为电子阅览室,环境幽雅"); strcpy(G.vexs[4].name,"大学生之家"); strcpy(G.vexs[4].introduction,"两栋男生公寓的集合"); strcpy(G.vexs[5].name,"餐厅"); strcpy(G.vexs[5].introduction,"学校最大的餐厅,共两层"); strcpy(G.vexs[6].name,"科技楼"); strcpy(G.vexs[6].introduction,"校园卡充值中心所在地"); strcpy(G.vexs[7].name,"女生公寓"); strcpy(G.vexs[7].introduction,"几栋女生公寓的集合,与大学生之家遥相呼应"); strcpy(G.vexs[8].name,"体育馆"); strcpy(G.vexs[8].introduction,"内有篮球,羽毛球,乒乓球,台球场馆及形体教室"); strcpy(G.vexs[9].name,"河南科技大学南门"); strcpy(G.vexs[9].introduction,"与主门对应,对面有大张生活超市"); for(i=0;i for(j=0;j G.arcs[i][j].adj=M; G.arcs[0][1].adj=100; G.arcs[0][2].adj=80; G.arcs[0][3].adj=100; G.arcs[1][4].adj=50; G.arcs[1][2].adj=60; G.arcs[2][3].adj=60; G.arcs[3][6].adj=50; G.arcs[4][5].adj=60; G.arcs[4][7].adj=20; G.arcs[5][6].adj=60; G.arcs[6][8].adj=20; G.arcs[7][8].adj=120; G.arcs[7][9].adj=130; G.arcs[8][9].adj=50; for(i=0;i for(j=0;j G.arcs[j][i].adj=G.arcs[i][j].adj; returnG; }//InitGraphend voidMenu() {printf("\n*********************************************\n"); printf("*请选择您需要的服务: *\n"); printf("*----------------------------------*\n"); printf("*1.浏览校园各地点列表*\n"); printf("*2.查看某两点之间的最短路径*\n"); printf("*3.查看校门口到其他各点的最短路径*\n"); printf("*4.查看某点信息*\n"); printf("*5.退出系统*\n"); printf("*********************************************\n\n"); printf("请输入您需要的服务代码: "); } voidBrowser(MGraph*G) { intv; printf("┏━━┳━━━━━━━━┳\n"); printf("┃编号┃地点名称┃\n"); for(v=0;v printf("┃%-4d┃%-16s┃\n",G->vexs[v].num,G->vexs[v].name); printf("┗━━┻━━━━━━━━┻"); } //迪杰斯特拉算法来计算出起点到各个顶点之间的最短路径,0为起点 voidShortestPath_DIJ(MGraph*G) { intv,w,i,min,t=0,x; intfinal[20],D[20],p[20][20]; for(v=0;v { final[v]=0; D[v]=G->arcs[0][v].adj; for(w=0;w p[v][w]=0; if(D[v] { p[v][0]=1;p[v][v]=1; } } D[0]=0;final[0]=1; for(i=1;i { min=M; for(w=0;w if(! final[w]) if(D[w] final[v]=1; for(w=0;w if(! final[w]&&(min+G->arcs[v][w].adj { D[w]=min+G->arcs[v][w].adj; for(x=0;x p[w][x]=p[v][x]; p[w][w]=1; } } for(v=0;v { if(0! =v)printf("%s",G->vexs[0].name); for(w=0;w { if(p[v][w]&&w! =0)printf("-->%s",G->vexs[w].name); t++; } if(t>G->vexnum-1&&0! =v)printf("总路线长%dm\n\n",D[v]); } } voidFloyd(MGraph*G) { intv,u,i,w,k,j,flag=1,p[10][10][10],D[10][10]; for(v=0;v for(w=0;w { D[v][w]=G->arcs[v][w].adj; for(u=0;u p[v][w][u]=0; if(D[v][w] { p[v][w][v]=1;p[v][w][w]=1; } } for(u=0;u for(v=0;v for(w=0;w if(D[v][u]+D[u][w] { D[v][w]=D[v][u]+D[u][w]; for(i=0;i p[v][w][i]=p[v][u][i]||p[u][w][i]; } while(flag) { printf("请输入出发点和目的地的编号: "); scanf("%d%d",&k,&j); if(k<0||k>G->vexnum||j<0||j>G->vexnum) { printf("地点编号不存在! 请重新输入出发点和目的地的编号: "); scanf("%d%d",&k,&j); } if(k>=0&&k flag=0; } printf("%s",G->vexs[k].name); for(u=0;u if(p[k][j][u]&&k! =u&&j! =u) printf("-->%s",G->vexs[u].name); printf("-->%s",G->vexs[j].name); printf("总路线长%dm\n",D[k][j]); } voidSearch(MGraph*G) { intk,flag=1; while(flag) { printf("请输入要查询的地点编号: "); scanf("%d",&k); if(k<0||k>G->vexnum) { printf("地点编号不存在! 请重新输入地点编号: "); scanf("%d",&k); } if(k>=0&&k flag=0; } printf("┏━━┳━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n"); printf("┃编号┃地点名称┃简介┃\n"); printf("┃%-4d┃%-16s┃%-56s┃\n",G->vexs[k].num,G->vexs[k].name,G->vexs[k].introduction); printf("┗━━┻━━━━━━━━┻━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n"); }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 河南 科技大学 校园 模拟 导游 程序设计 报告
![提示](https://static.bingdoc.com/images/bang_tan.gif)