校园导游系统.docx
《校园导游系统.docx》由会员分享,可在线阅读,更多相关《校园导游系统.docx(13页珍藏版)》请在冰豆网上搜索。
校园导游系统
南昌师范学院
课程设计报告
课程名称:
数据结构与算法
题目名称:
校园导游系统
学生学院:
数学与计算机科学系
专业班级:
2016级计算机科学与技术本科班
小组组长:
王明
小组成员:
王明郑双凤吕运发
指导老师:
熊小颖老师
2017年10月15日
一、设计目的3
二、问题描述3
三、基本要求3
四、概要设计3
五、主程序4
六、测试数据13
6.1调试程序所用数据13
6.2程序的调试结果
七、总结
一、设计目的
随着现代社会生活节奏的加快,人们外出旅行以寻求放松的时间越来越多。
考虑到游客不可能对所有景点都有所了解,因此可能无法找到游玩景点最省时,最高效的路径,而人工导游成本又过高,故使用C语言,基于《数据结构》中图的相关算法开发了“南昌师范学院导游系统”。
开发本系统目的在于为来访我校的游客提供一条最短游览路径,本系统从实际出发,通过对校园平面图的分析,将其转化为数据并保存在系统中,因此系统提供的路径具有较大的可信性。
二、问题描述
设计校园导游程序,为来访的客人提供服务,为来访我校的游客提供一条在游客当前位置到目的地的最短游览路径,找到游玩景点最省时,最高效的路径。
三、基本要求
1.假设有一所校园的平面图,所含景点不小于10个,请选择适当的坐标来表示出该图上的各个景点。
2.为来访的客人提供从当前位置到其他景点的最短路径的咨询;
3.必须具有校园平面图的修改和扩充功能(即某些景点坐标的修改和景点个数的增加)。
四、概要设计
算法思路
本设计的重难点在于问题二的解决。
利用了弗洛伊德算法函数设计Floyd() 本算法在设计时参考了《数据结构C语言版》一书中有关Floyd算法的介绍,同时借鉴了如今网上流行的设计方式。
之所以选择本算法来实现计算最短路径,原因在于本算法容易理解,可以算出任意两个节点之间的最短距离,代码编写简单。
但是,本算法缺点在于时间复杂度过高,不适合用于计算大量数据。
Floyd算法首先将两景点间路径长度数据存储于数组D[v][w]中,而后使用一个三维数组用于存放最短路径所经过的顶点,接下来使用三重循环判断两景点之间直接路径是否大于间接路径,若大于,则将三维数组中存放的顶点信息更改为简介路径所经过的顶点信息。
以上部分完成后,当用于标记输入数据是否合法的flag=1时,输出错误信息,提示用户重新输入,当输入数据合法时,输出以上程序得到结果。
五、主程序
#include
#include
#defineMAX_VERTEX_NUM100//最大顶点数
#defineMAX_INT10000//无穷大
typedefintAdjType;
typedefstruct{
intpi[MAX_VERTEX_NUM];//存放v到vi的一条最短路径
intend;
}PathType;
typedefcharVType;//设顶点为字符类型
typedefstruct{
VTypeV[MAX_VERTEX_NUM];//顶点存储空间
AdjTypeA[MAX_VERTEX_NUM][MAX_VERTEX_NUM];//邻接矩阵
}MGraph;//邻接矩阵表示的图
//Floyd算法
//求网G(用邻接矩阵表示)中任意两点间最短路径
//D[][]是最短路径长度矩阵,path[][]最短路径标志矩阵
voidshortdistance(MGraph*G,intpath[][MAX_VERTEX_NUM],intD[][MAX_VERTEX_NUM],intn){
inti,j,k;
for(i=0;ifor(j=0;jif(G->A[i][j]path[i][j]=j;
}else{
path[i][j]=-1;
}
D[i][j]=G->A[i][j];
}
}
for(k=0;kfor(i=0;ifor(j=0;jif(D[i][j]>D[i][k]+D[k][j]){
D[i][j]=D[i][k]+D[k][j];//取小者
path[i][j]=path[i][k];//改Vi的后继
}
}
}
}
for(i=0;ifor(j=0;jprintf("V%d到V%d的最短长度:
",i,j);
printf("%d\t",D[i][j]);//输出Vi到Vj的最短路径长度
k=path[i][j];//取路径上Vi的后续Vk
if(k==-1){
printf("ThereisnopathbetweenV%dandV%d\n",i,j);//路径不存在
}else{
printf("最短路径为:
");
printf("(V%d",i);//输出Vi的序号i
while(k!
=j){//k不等于路径终点j时
printf(",V%d",k);//输出k
k=path[k][j];//求路径上下一顶点序号
}
printf(",V%d)\n",j);//输出路径终点序号
}
printf("\n");
}
}
}
intintroduce(charscenery)
{
getchar();
printf("请输入景点对应的大写字母\n");
scanf("%c",&scenery);
switch(scenery)
{
default:
printf("没有该景点\n");
case'A':
printf("图书馆,距离南大门100米\n");
break;
case'B':
printf("实验楼,距离南大门200米\n");
break;
case'C':
printf("理科楼,理科类学生上课地点\n");
break;
case'D':
printf("女宿舍楼,南昌师范学院的女孩子的家\n");
break;
case'E':
printf("男宿舍楼,南昌师范学院的男孩子的家\n");
break;
case'F':
printf("大学生活动中心,大学生活动休闲场所\n");
break;
case'G':
printf("田径场,运动会举办场地\n");
break;
case'H':
printf("逸夫大礼堂,各种活动举办场所\n");
break;
case'I':
printf("体育馆,正在建设中\n");
break;
case'J':
printf("综合楼,领导办公处\n");
break;
case'K':
printf("北大门,学校出口\n");
break;
}
return0;
}
intmain()
{
charkk;
charscenery;
inti,j,k,v='A',m=11;//v为起点,n为顶点个数
MGraphG;
intpath[MAX_VERTEX_NUM][MAX_VERTEX_NUM];//v到各顶点的最短路径向量
intD[MAX_VERTEX_NUM][MAX_VERTEX_NUM];//v到各顶点最短路径长度向量
charV[MAX_VERTEX_NUM]={'A','B','C','D','E','F','G','H','I','J','K'};
inta[MAX_VERTEX_NUM][MAX_VERTEX_NUM]={//初始化
{0,50,200,100,MAX_INT,MAX_INT,MAX_INT,MAX_INT,MAX_INT,MAX_INT,MAX_INT},
{50,0,100,MAX_INT,MAX_INT,MAX_INT,MAX_INT,MAX_INT,MAX_INT,MAX_INT,MAX_INT},
{200,100,0,MAX_INT,MAX_INT,100,50,MAX_INT,MAX_INT,MAX_INT,MAX_INT},
{100,MAX_INT,MAX_INT,0,500,200,MAX_INT,MAX_INT,MAX_INT,MAX_INT,MAX_INT},
{MAX_INT,MAX_INT,MAX_INT,500,0,300,MAX_INT,300,MAX_INT,300,500},
{MAX_INT,MAX_INT,100,200,300,0,400,200,100,MAX_INT,MAX_INT},
{MAX_INT,MAX_INT,MAX_INT,MAX_INT,MAX_INT,400,0,100,300,MAX_INT,MAX_INT},
{MAX_INT,MAX_INT,MAX_INT,MAX_INT,200,200,100,0,MAX_INT,400,MAX_INT},
{MAX_INT,MAX_INT,50,MAX_INT,MAX_INT,100,300,MAX_INT,0,MAX_INT,MAX_INT},
{MAX_INT,MAX_INT,MAX_INT,MAX_INT,300,MAX_INT,MAX_INT,400,MAX_INT,0,300},
{MAX_INT,MAX_INT,MAX_INT,MAX_INT,500,MAX_INT,MAX_INT,MAX_INT,MAX_INT,300,0}
};
for(i=0;ifor(j=0;jG.A[i][j]=a[i][j];
}
}
printf("****************************************\n");
printf("**\n");
printf("**\n");
printf("*欢迎使用南昌师范学院校园咨询系统!
*\n");
printf("**\n");
printf("**\n");
printf("****************************************\n");
printf("\n");
while
(1)
{
printf("1.景点信息查询请按“1”键:
\n");
printf("2.景点最短路径查询(弗洛伊德算法)请按“2”键:
\n");
printf("3.景点最短路径查询(迪杰斯特拉算法)请按“3”键:
\n");
printf("4.校内景点地图查询请按“4”键:
\n");
printf("5.退出系统请按“5”键:
\n");
printf("请选择:
\n");
scanf("%c",&kk);
switch(k)
{
case'1':
printf("景点介绍查询\n");
introduce(scenery);break;
case'2':
printf("景点最短路径查询(弗洛伊德算法)\n");
shortdistance(&G,path,D,11);break;
case'5':
printf("谢谢使用!
\n");exit(0);
}
}
return0;
}
六、测试数据
6.1调试程序所用数据
6.2程序的调试结果
七、总结
经过小组同学的努力,我们终于结束了这次的课程设计,虽然我们尽了很大的努力,但是其中仍显现出许多的不足。
其中在处理查询两景点最短路径这一问题时:
一开始对于题目的阅读不够仔细,将随机的当前位置当成了,一进校门的位置作为与其他建筑物的路径距离。
浪费了一些时间,之后与重新思考思路。
所以由此发现对于需求的正确分析确实很重要。
另外经过这次课程设计,我对程序中算法的概念理解的更加透彻。
算法是程序中必不可少的部分,它是指解题方案的准确而完整的描
述,是一系列解决问题的清晰指令,算法代表着用系统的方法描
述解决问题的策略机制。
不同的算法可能用不同的时间、空间或效率来完成同样的任务。
同时,在选择算法时必须考虑算法的时间复杂度和空间复杂度,这样才能让程序正常,高效的运行。
程.在计算机科学中,数据结构不仅是一般程序设计(特别是非数值计算的程序设计)的基础,而且是设计和实现编译程序、操作系统、数据库系统及其它系统程序和大型应用程序的重要基础。
以上就是我们课程设计的全部内容