简单校园导游实验报告的设计与实现.docx
- 文档编号:6770467
- 上传时间:2023-01-10
- 格式:DOCX
- 页数:25
- 大小:351.18KB
简单校园导游实验报告的设计与实现.docx
《简单校园导游实验报告的设计与实现.docx》由会员分享,可在线阅读,更多相关《简单校园导游实验报告的设计与实现.docx(25页珍藏版)》请在冰豆网上搜索。
简单校园导游实验报告的设计与实现
简单校园导游实验报告的设计与实现
本实验的目的是通过对“校园导游”程序的设计与实现来熟练掌握图形结构在实际问题中的应用。
一、问题描述
当人们到一个陌生的地方去旅游时,可能会找一个导游为自己在游玩的过程中提供帮助。
导游可以提供很多服务,如介绍参观景点的历史背景等相关消息,推经到下一个景点的最佳路径,解答旅游者所提出的关于旅游经典的相关问询等。
对于刚刚来到校园的新生,对校园环境不熟悉的情况也是如此,一般都是高年级的学生充当“校园导游”的角色。
如果能够提供一个程序让新生或来访的客人自主地通过与机器的“对话”来获得相关的信息的话,将会节省大量的的人力和时间,并且所提供的信息应做到尽可能的准确、详尽。
一个成功的校园导游程序可以代替现实生活中这些“校园导游”,更方便大家查询校园的信息。
二、数据结构设计
由于各场所通过校园中的道路相连,各个场所和连接它们的道路构成整个校园的地理环境,所以使用图这种数据结构对它们进行描述。
以图中的顶点表示校园内各个场所,应包含场所名称、代号、描述等信息;以边表示连接各个场所的道路,包含道路的长度信息。
图的定义:
typedefstruct{
intvex[n];
intcost[n][n];/*边的值*/
}MGraph;
MGraphG;
三、功能设计
1、构建邻接矩阵,将边地信息存入矩阵中,存入边长,若两点间无邻接边,则存一个极大值MAX。
函数原型如下:
MGraphCreatMGraph(MGraph&G){//构建邻接矩阵,将边信息存入矩阵中
inti,j;
for(i=0;i G.vex[i]=i; for(j=0;j G.cost[i][j]=MAX; } G.cost[0][1]=G.cost[1][0]=400; G.cost[0][2]=G.cost[2][0]=500; G.cost[0][3]=G.cost[3][0]=700; G.cost[0][4]=G.cost[4][0]=100; G.cost[0][5]=G.cost[5][0]=200; G.cost[0][9]=G.cost[9][0]=800; G.cost[1][5]=G.cost[5][1]=250; G.cost[2][4]=G.cost[4][2]=200; G.cost[3][7]=G.cost[7][3]=150; G.cost[3][9]=G.cost[9][3]=150; G.cost[4][5]=G.cost[5][4]=150; G.cost[4][6]=G.cost[6][4]=150; G.cost[5][6]=G.cost[6][5]=200; G.cost[7][8]=G.cost[8][7]=50; G.cost[7][9]=G.cost[9][7]=100; G.cost[8][9]=G.cost[9][8]=200; returnG; } 2、景点介绍,函数原型如下: voidintroduce() {/*景点介绍*/ inta; cout<<"您想查询哪个景点的详细信息? 请输入景点代码: "; cin>>a; getchar(); switch(a) { case0: cout<<"0: 学校大门\n\n学校的正门,“河北大学”字样在蓝天的衬托下显得气势恢宏。 \n\n";break; case1: cout<<"1: 多功能馆\n\n许多文艺节目在这里举行\n\n";break; case2: cout<<"2: 八教\n\n同学们上课与自习的地方,尤其到了期末复习时一般座无虚席\n\n";break; case3: cout<<"3: 北院食堂\n\n共有三层,种类较多,味道一般\n\n";break; case4: cout<<"4: 图书馆\n\n知识的海洋,各种书册种类丰富\n\n";break; case5: cout<<"5: 主楼\n\n河大的标志性建筑之一,很有气势\n\n";break; case6: cout<<"6: 毓秀园\n\n绿树成荫,大学的爱情生活从这里开始\n\n";break; case7: cout<<"7: 熙园\n\n男生宿舍\n\n";break; case8: cout<<"8: 超市\n\n没饭吃的时候,学生的最爱\n\n\n";break; case9: cout<<"9: 沁园\n\n女生宿舍,每天晚上各种情侣在宿舍门口各种亲昵\n\n";break; default: cout<<"景点编号输入错误! 请输入->10的数字编号! \n\n";break; } }/*introduce*/ 3、用Floyd算法求最短路径,并存入shortest[n][n];/*两点间的最短距离*/中,函数原型如下: voidFloyd(MGraphG) {/*用Floyd算法求两个景点的最短路径*/ inti,j,k; for(i=0;i for(j=0;j { shortest[i][j]=G.cost[i][j]; if(shortest[i][j] path[i][j]=i; else{ if(i! =j) path[i][j]=-2; else path[i][j]=-1; } } for(k=0;k for(i=0;i for(j=0;j if(shortest[i][j]>(shortest[i][k]+shortest[k][j])) {/*用path[][]记录从i到j的最短路径上点j的前驱景点的序号*/ shortest[i][j]=shortest[i][k]+shortest[k][j]; path[i][j]=k; path[j][i]=k; } } } } for(i=0;i path[i][i]=-1; } 4、求最短路径,函数原型为: intshortestdistance(MGraphG) {/*要查找的两景点的最短距离*/ inti,j; cout<<"请输入要查询的两个景点的编号(0->9的数字编号): "; cin>>i; cin>>j; if(i>n||i<0||j>n||j<0) { cout<<"输入信息错误! \n\n"; cout<<"请输入要查询的两个景点的编号(0->9的数字编号): \n"; cin>>i; cin>>j; } else { Floyd(G); display(i,j); } return1; }/*shortestdistance*/ voiddisplay(inti,intj) {/*打印两个景点的路径及最短距离*/ inta,b; if(i>j) { intc; c=i; i=j; j=c; } a=i; b=j; cout< cout<<"您要查询的两景点间最短路径是: \n\n"; if(shortest[i][j] =j) { cout< while(i { cout<<"->"< j=path[i][j]; } cout< cout<<"最短路径长度为: "< replace(); } else cout<<"输入错误! 不存在此路! \n\n"; }/*display*/ 5、推荐路径算法就是将Floyd算法的第一个参数定为0,然后加循环既可,函数原型: voidadvice() { Floyd(G); for(intj=1;j display(0,j); } 四、界面设计 本程序为方便用户所设计,由于用户大多对校园的情况并不熟悉,所以在图中给出的任何提示信息一定要准确,尽量避免歧义。 五、编码实现 #include"stdafx.h" #include usingnamespacestd; /*定义符号常量*/ #defineMAX1000000 #definen10 /*定义全局变量*/ intshortest[n][n];/*两点间的最短距离*/ intpath[n][n];/*经过的景点*/ typedefstruct{ intvex[n]; intcost[n][n];/*边的值*/ }MGraph; MGraphG; /*自定义函数原型说明*/ voidintroduce(); voidreplace(); intshortestdistance(MGraphG); voidFloyd(MGraphG); voiddisplay(inti,intj); voidadvice(); MGraphCreatMGraph(MGraph&G){//构建邻接矩阵,将边信息存入矩阵中 inti,j; for(i=0;i G.vex[i]=i; for(j=0;j G.cost[i][j]=MAX; } G.cost[0][1]=G.cost[1][0]=400; G.cost[0][2]=G.cost[2][0]=500; G.cost[0][3]=G.cost[3][0]=700; G.cost[0][4]=G.cost[4][0]=100; G.cost[0][5]=G.cost[5][0]=200; G.cost[0][9]=G.cost[9][0]=800; G.cost[1][5]=G.cost[5][1]=250; G.cost[2][4]=G.cost[4][2]=200; G.cost[3][7]=G.cost[7][3]=150; G.cost[3][9]=G.cost[9][3]=150; G.cost[4][5]=G.cost[5][4]=150; G.cost[4][6]=G.cost[6][4]=150; G.cost[5][6]=G.cost[6][5]=200; G.cost[7][8]=G.cost[8][7]=50; G.cost[7][9]=G.cost[9][7]=100; G.cost[8][9]=G.cost[9][8]=200; returnG; } voidmain() {/*主函数*/ CreatMGraph(G); while (1) { cout<<"\n\n----------------欢迎使用河北大学校园导游系统---------\n"; cout<<"\n\t1.景点信息查询………请按i键\n\n"; cout<<"\t2.景点最短路径查询…请按s键\n\n"; cout<<"\t3.推荐路径……………请按a键\n\n"; cout<<"\t4.退出系统……………请按e键\n\n"; cout<<"\n\t学校景点代码及名称(代码: 景点名称)列表: \n\n"; cout<<"\t0: 学校大门"; cout<<"1: 多功能馆"; cout<<"2: 八教"; cout<<"3: 北院食堂"; cout<<"4: 图书馆\n\n"; cout<<"\t5: 主楼"; cout<<"6: 毓秀园"; cout<<"7: 熙园"; cout<<"8: 超市"; cout<<"9: 沁园\n\n"; cout<<"\t请选择服务: "; chark; cin>>k; switch(k) { case'i': cout<<"\t进入景点信息查询: \n"; introduce(); break; case'a': cout<<"推荐路径为: "< advice(); break; case's': cout<<"\t进入最短路径查询: "; shortestdistance(G); break; case'e': exit(0); default: cout<<"输入信息错误! \n请输入字母i或s或e.\n"; break; } } }/*main*/ voidintroduce() {/*景点介绍*/ inta; cout<<"您想查询哪个景点的详细信息? 请输入景点代码: "; cin>>a; getchar(); switch(a) { case0: cout<<"0: 学校大门\n\n学校的正门,“河北大学”字样在蓝天的衬托下显得气势恢宏。 \n\n";break; case1: cout<<"1: 多功能馆\n\n许多文艺节目在这里举行\n\n";break; case2: cout<<"2: 八教\n\n同学们上课与自习的地方,尤其到了期末复习时一般座无虚席\n\n";break; case3: cout<<"3: 北院食堂\n\n共有三层,种类较多,味道一般\n\n";break; case4: cout<<"4: 图书馆\n\n知识的海洋,各种书册种类丰富\n\n";break; case5: cout<<"5: 主楼\n\n河大的标志性建筑之一,很有气势\n\n";break; case6: cout<<"6: 毓秀园\n\n绿树成荫,大学的爱情生活从这里开始\n\n";break; case7: cout<<"7: 熙园\n\n男生宿舍\n\n";break; case8: cout<<"8: 超市\n\n没饭吃的时候,学生的最爱\n\n\n";break; case9: cout<<"9: 沁园\n\n女生宿舍,每天晚上各种情侣在宿舍门口各种亲昵\n\n";break; default: cout<<"景点编号输入错误! 请输入->10的数字编号! \n\n";break; } }/*introduce*/ voidFloyd(MGraphG) {/*用Floyd算法求两个景点的最短路径*/ inti,j,k; for(i=0;i for(j=0;j { shortest[i][j]=G.cost[i][j]; if(shortest[i][j] path[i][j]=i; else{ if(i! =j) path[i][j]=-2; else path[i][j]=-1; } } for(k=0;k for(i=0;i for(j=0;j if(shortest[i][j]>(shortest[i][k]+shortest[k][j])) {/*用path[][]记录从i到j的最短路径上点j的前驱景点的序号*/ shortest[i][j]=shortest[i][k]+shortest[k][j]; path[i][j]=k; path[j][i]=k; } } } } for(i=0;i path[i][i]=-1; } intshortestdistance(MGraphG) {/*要查找的两景点的最短距离*/ inti,j; cout<<"请输入要查询的两个景点的编号(0->9的数字编号): "; cin>>i; cin>>j; if(i>n||i<0||j>n||j<0) { cout<<"输入信息错误! \n\n"; cout<<"请输入要查询的两个景点的编号(0->9的数字编号): \n"; cin>>i; cin>>j; } else { Floyd(G); display(i,j); } return1; }/*shortestdistance*/ voiddisplay(inti,intj) {/*打印两个景点的路径及最短距离*/ inta,b; if(i>j) { intc; c=i; i=j; j=c; } a=i; b=j; cout< cout<<"您要查询的两景点间最短路径是: \n\n"; if(shortest[i][j] =j) { cout< while(i { cout<<"->"< j=path[i][j]; } cout< cout<<"最短路径长度为: "< replace(); } else cout<<"输入错误! 不存在此路! \n\n"; }/*display*/ voidadvice() { Floyd(G); for(intj=1;j display(0,j); } voidreplace() { cout<<"学校名称用如下数字代替,请自行核对: "< cout<<"\t0: 学校大门"; cout<<"1: 多功能馆"; cout<<"2: 八教"; cout<<"3: 北院食堂"; cout<<"4: 图书馆\n\n"; cout<<"\t5: 主楼"; cout<<"6: 毓秀园"; cout<<"7: 熙园"; cout<<"8: 超市"; cout<<"9: 沁园\n\n"; } 六、运行于测试 1、景点信息查询 2、推荐路径查询 3、查询两点间的最短距离 正输反输均可: 4、若在输入过程中出现错误,会让从新输入 5、景点查询输入错误,也会从新输入 6、最短路径错误,提示从新输入 七、实验总结 通过对校园导游图的设计,我更加深刻的理解了邻接矩阵的存储与最短路径的求解方法。 在设计途中,因为自己的粗心,使邻接矩阵没有在主函数中运行,使矩阵中存储信息错误,浪费了很多时间。 但是从这件事中,我也明白了一个道理,编程需要耐心更需要细心,万万马虎不得!
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 简单 校园 导游 实验 报告 设计 实现
![提示](https://static.bdocx.com/images/bang_tan.gif)