1、设计目的
应用所学的数据结构与算法知识完成一个具有一定实际意义的应用程序的设计、编码与调试,锻炼实践动手能力,提高编程水平。
2、设计内容
课题名称:校园导航系统
问题描述:校园导航系统用无向网表示你所在学校的校园景点平面图,至少包括15个以上的场所,图中顶点表示主要景点,存放景点的名称、简介等信息,图中的边表示景点间的道路,存放路径长度等信息,提供有关景点介绍、游览路径等功能。
功能要求:
(1)查询各景点的相关信息;
(2)查询图中任意两个景点间的最短路径;
(3)建立菜单与用户进行交互。
(4)其它扩展系统功能。
3、综合课程设计报告内容要求
1. 绪论:系统开发的意义和开发环境。
2. 系统设计:
(1)系统概要设计:系统所采用的数据结构,功能模块介绍等。
(2)系统详细设计:各功能模块的实现方法描述(可以采用文字和图的形式描述,描述过程中可以穿插少量关键代码,但不要贴大段的代码)。
3. 系统实现: 展示各种功能的运行情况(采用运行截图+文字描述的形式)。
4、开发意义
大学校园通常具有面积大、开放性强、建筑布局分散、各类设施复杂等特点。校园地理信息相对来说比较复杂,各类校园信息越来越难在纸质地图上进行详细的表示。各高校每年都会招收一批新生,而且随着校园的扩建以及对外交流的增多,越来越多的校外人员来到高校校园内参观。这些人对校园不是很熟悉,他们需要花时间去熟悉校园内部构造。随着互联网技术的发展,网络资源利用率得到大幅提升,GPS导航系统的使用也越发广泛。像百度地图、高德地图,打破了传统纸质地图的限制,存储的信息量比传统的纸地图要大得多,查询起来更快速直观,而且也符合时代的发展趋势。所以,开发校园导航系统已经成为必然,其能够降低工作量,大大提高查询效率,有助于高校学生及来访人员快速、完整、形象地了解校园地理布局及主要信息。
5、系统概要设计
5.1系统所采用的数据结构
该系统采用迪杰斯特拉求单源最短路算法,设计出重庆电子工程职业学院的校园导航,该导航系统,遍历所有景点及查询两景点间的最短路径都是通过迪杰斯特拉求单源最短路算法来实现,将各景点间的权值存入二维数组map[ ]中,通过迪杰斯特拉算法,每次找距离开始点最近的点,在通过这个点去更新别的边权值,同时将更新的点存储,放入栈中输出即为到终点所走路径,最后求出学校一个景点到另一个景点的最短距离和路线。
5.2学校地图
5.3邻接矩阵
邻接矩阵的逻辑结构分为两部分:V和E集合。把重庆电子工程职业学院的各给个景点用一个一维数组存放图中所有顶点数据;用一个二维数组存放顶点间关系的数据。
5.4邻接表
邻接表是一种数组与链表相结合的存储方式,把重庆电子工程职业学院的所有景点存放在邻接表中方便查询。
6、功能模块介绍
1.学校简介
在此菜单下,用户可以查看学校的简介。
2.查询所有路径
在此菜单下,用户输入当前位置的景点编号或者景点名称,该系统就会返回当前位置到其余所有景点的路径和距离。
3.查询景点信息
在此菜单下,用户输入想了解的景点编号或者景点名称,就可以查看到对应景点的详细信息。
4.查询最短路径
在此菜单下,用户输入景点开始位置的编号和景点终点位置的编号或者用户输入景点开始位置的名称和景点终点位置的名称就可以查看,两个景点之间的路径和距离。
5.退出
当用户输入 4就可以退出校园导航系统。
7、源码
1.创建NavigateGraph.cpp文件
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<algorithm>
#define inf 99999999
using namespace std;
void SystemMenu();//系统菜单
void BeginMenu();//开始菜单
int map[900][900],book[900],dis[900];
struct A //定义结构体存储景点信息
{
char name[100];
char DetailMeg[800];
}q[100];
void cuntu()
{
int i,j;
strcpy(q[1].name,"南门");strcpy(q[1].DetailMeg,"学校南门附近有个公交站,可以乘坐公交车去熙街、u城天街玩,还可以去大学城轻轨站。南门附近有很多的大学,从南门出发可以去重庆师范大学、重庆医科大学。");
strcpy(q[2].name,"博远厅");strcpy(q[2].DetailMeg,"博远厅教室大,有超大的LED显示屏、装饰品和各种设备,是一个开展活动很好的选择场所,所以学校的各种活动、各种讲座和会议都在博远厅举办。");
strcpy(q[3].name,"西门");strcpy(q[3].DetailMeg,"西门附近有很多景区,可以去木鱼石公园、濯清园, 中和园、百草园、崖香坡、素问园、成德广场、CCAT美术馆、重庆市人类生命与健康博物馆玩。");
strcpy(q[4].name,"12-15栋教学楼");strcpy(q[4].DetailMeg,"12-15栋教学楼各种教学设备齐全,环境优美。主要是人工智能与大数据学院和电子与物联网学院学生上课的场所,老师办公的场所。");
strcpy(q[5].name,"7栋教学楼");strcpy(q[5].DetailMeg,"7栋教学楼各种教学设备齐全,教室宽大明亮,所以学校的各种考试都会在7栋进行,并且团日活动和各种学生会的活动也会在这里举办。");
strcpy(q[6].name,"学子广场");strcpy(q[6].DetailMeg,"学校的大型活动通知一般都会帖在学子广场,每天晚上都会有帅哥美女在这里唱歌跳舞,也可以在这里给对象表白,还可以卖鲜花。");
strcpy(q[7].name,"篮球场");strcpy(q[7].DetailMeg,"篮球场非常的宽大,同学们不仅可以在这里打篮球,而且学校的大型活动也会在这里举办,比如校园歌手大赛、开学典礼等活动。");
strcpy(q[8].name,"足球场");strcpy(q[8].DetailMeg,"足球场非常宽敞、宏伟、各种体育设备齐全,同学们不仅可以在这里踢足球,而且还可以在这里锻炼身体,每天晚上,会有很多人在这里跑步。");
strcpy(q[9].name,"南区宿舍");strcpy(q[9].DetailMeg,"南区宿舍包含1栋宿舍楼到8栋宿舍楼和19栋宿舍楼,宿舍里面坏境优美、舒适,宿舍里的各种生活用品齐全,是一个休息的好地方。");
strcpy(q[10].name,"南区食堂");strcpy(q[10].DetailMeg,"食堂包含三层楼,每一层楼都有二十几家店,里面菜品丰富、美味可口、价格便宜、环境舒适,还有各种各样的小吃和水果店、蛋糕店。");
strcpy(q[11].name,"医务室");strcpy(q[11].DetailMeg,"学校医务室宽大,医生的医术水平高,价格便宜,学生生病了就可以去医务室看病,有了医务室学生看病就更加的方便。");
strcpy(q[12].name,"北区食堂");strcpy(q[12].DetailMeg,"食堂外观大气,宏伟,包含三层楼,每一层楼都有十几家店,里面菜品丰富、美味可口、价格便宜、环境舒适,还有各种各样的小吃和水果店。");
strcpy(q[13].name,"8-11栋教学楼");strcpy(q[13].DetailMeg,"8-11栋教学楼是一个四合院,里面各种教学设备齐全,主要是健康管理学院和经济管理学校学生上课的地方和辅导员办公的地方。");
strcpy(q[14].name,"图书馆");strcpy(q[14].DetailMeg,"学校的图书馆里面有各种各样的书,里面有桌椅、空调、绿色植物等。总之图书馆坏境优美、舒适是一个看书的好地方。");
strcpy(q[15].name,"东门");strcpy(q[15].DetailMeg,"东门外面有一条好吃街,街上有各种各样的小吃,还有理发店,学生都会选择去东门理发,购物,还有重庆建筑工程职业学院也在东门对边。");
for(i=1;i<=15;i++)
for(j=1;j<=15;j++)
{
if(i==j)
map[i][j]=0;
else
map[i][j]=inf;
}
//**************存储图各边信息***************
map[1][2]=200;map[1][3]=400;map[1][4]=200;map[1][7]=400;
map[2][1]=200;map[2][3]=200;;map[2][4]=100;
map[3][1]=400;map[3][2]=200;map[3][4]=600;map[3][6]=700;
map[4][1]=200;map[4][2]=100;map[4][4]=600;map[4][6]=700;
map[5][4]=100;map[5][6]=100;
map[6][3]=700;map[6][4]=100;map[6][5]=100;map[6][8]=300;map[6][9]=200;map[6][10]=100;map[6][11]=300;
map[7][1]=400;map[7][8]=200;
map[8][6]=300;map[8][9]=100;map[8][10]=200;map[8][12]=1100;
map[9][8]=100;map[9][10]=100;map[9][11]=200;map[9][12]=700;
map[10][6]=100;map[10][8]=200;
map[11][6]=300;map[11][9]=200;map[11][10]=100;map[11][12]=900;map[11][15]=1600;
map[12][8]=1100;map[12][9]=700;map[12][100]=900;map[12][12]=900;map[12][15]=600;
map[13][12]=100;map[13][14]=100;map[13][15]=600;
map[14][13]=100;
map[15][11]=160;map[15][12]=600;map[15][13]=600;
for(i=1;i<=15;i++)
for(j=1;j<=15;j++)
map[j][i]=map[i][j];
}
2.创建NavigateSystem.cpp文件
#include "NavigateGraph.cpp"
//**********景点列表**************
void PlaceList()
{
system("cls");//清屏
printf("\n\n\n");
printf("\t\t\t\t\t * * * * * * * * * * * * * * ** * * * * * * * * * * * * * *\n");
printf("\t\t\t\t\t * * *景点列表* * *\n");
printf("\t\t\t\t\t * ****************************************************** *\n");
printf("\t\t\t\t\t * * * *\n");
printf("\t\t\t\t\t * * <1>南门 <2>博远厅 <3>西门 * *\n");
printf("\t\t\t\t\t * * * *\n");
printf("\t\t\t\t\t * * <4>12-15栋教学楼 <5>7栋教学楼 <6>学子广场 * *\n");
printf("\t\t\t\t\t * * * *\n");
printf("\t\t\t\t\t * * <7>篮球场 <8>足球场 <9>南区宿舍 * *\n");
printf("\t\t\t\t\t * * * *\n");
printf("\t\t\t\t\t * * <10>南区食堂 <11>医务室 <12>北区食堂 * *\n");
printf("\t\t\t\t\t * * * *\n");
printf("\t\t\t\t\t * * <13>8-11栋教学楼 <14>图书馆 <15>东门 * *\n");
printf("\t\t\t\t\t * * * *\n");
printf("\t\t\t\t\t * ****************************************************** *\n");
printf("\t\t\t\t\t * * * * * * * * * * * * * * ** * * * * * * * * * * * * * *\n");
printf("\n\n\n");
}
//***********查询方式*************
int FindMethods(int x)
{
int i;
system("cls");//清屏
printf("\n");
printf("\t\t\t\t\t* * * * * * * * * * * * * * ** * * * * * * * * * * * * * *\n");
printf("\t\t\t\t\t* * 查询方式 * *\n");
printf("\t\t\t\t\t* * * * * * * * * * * * * * ** * * * * * * * * * * * * * *\n");
printf("\t\t\t\t\t* * * * * * * * * * * * * * ** * * * * * * * * * * * * * *\n");
printf("\t\t\t\t\t* * 1、按景点编号查询 * *\n");
printf("\t\t\t\t\t* * 2、按景点名称查询 * *\n");
printf("\t\t\t\t\t* * 0、返回 * *\n");
printf("\t\t\t\t\t* * * * * * * * * * * * * * ** * * * * * * * * * * * * * *\n");
printf("请输入您的选择:");
scanf("%d",&i);
return i;
}
//*************查询景点编号 ***************8
int ByFindNumber(char s[])
{
int f=0,i;
for(i=1;i<=15;i++)
{
if(strcmp(q[i].name,s)==0)
return i;
}
return -1;
}
//*************迪杰斯特拉求最短路径,并输出路线*********
void Dijkstra(int v0,int s)
{
int min,i,j,u,v;
int p[110],l[110];
memset(p,-1,sizeof(p));
memset(l,0,sizeof(l));
memset(book,0,sizeof(book));
for(i=1;i<=15;i++)
{
dis[i]=map[v0][i];
if(dis[i]<inf)//v0能直接到达,即上一站点为v0
p[i]=v0;
}
book[v0]=1;
for(i=1;i<15;i++)
{
min=inf;
for(j=1;j<=15;j++)//每次找出距离v0最近点
{
if(book[j]==0&&dis[j]<min)
{
min=dis[j];
u=j;
}
}
book[u]=1;//标记该点
for(v=1;v<=15;v++)
{
if(book[v]==0&&dis[v]>dis[u]+map[u][v])//通过最近点更新其他边
{
p[v]=u; //存储更新的边,即为路线
dis[v]=dis[u]+map[u][v];
}
}
}
v=s;
i=1;
while(p[v]!=v0) //将路线存入栈中,正序输出
{
l[i++]=p[v];
v=p[v];
}
printf("\n");
u=i-1;
printf("路线为:\n");
printf("%s--->",q[v0].name);
for(i=u;i>=1;i--)
printf("%s--->",q[l[i]].name);
printf("%s\n",q[s].name);
printf("最短路径长度为:%d 米\n",dis[s]);
}
//**********系统菜单 ******************
void SystemMenu()
{
int x,m,n,u,v,i,j;
char c[100];
system("cls"); //清屏
printf("\n\n\n");
printf("\t\t\t\t\t **********************************************************\n");
printf("\t\t\t\t\t ** **\n");
printf("\t\t\t\t\t ** 重庆电子工程职业学院导航系统 **\n");
printf("\t\t\t\t\t ** **\n");
printf("\t\t\t\t\t **********************************************************\n");
printf("\t\t\t\t\t **********************************************************\n");
printf("\t\t\t\t\t *****************************菜单*************************\n");
printf("\t\t\t\t\t ** 1、查询所有路径 2、查询景点信息 **\n");
printf("\t\t\t\t\t ** 3、查询最短路径 4、返回 **\n");
printf("\t\t\t\t\t **********************************************************\n");
printf("\n\n\n");
printf("请输入您选择服务菜单的编号:");
while(1)//实现输入错误可重新输入
{
scanf("%d",&x);
//**查询所有路径**
if(x==1)
{
v=FindMethods(x);//调用查询方式的方法
while(1)
{
if(v==1)//按编号查询
{
PlaceList();//调用景点列表方法
printf("请输入当前所在景点编号:\n");
scanf("%d",&n);
while(1)
{
if(n>=1&&n<=15)
{
for(i=1;i<=15;i++)
{
if(i!=n)
Dijkstra(n,i);
}
printf("\n\n按回车键返回至导航系统界面\n\n");
getchar();getchar();
SystemMenu();//调用系统菜单方法
break;
}
else
{
printf("\n该景点不存在!请重新输入景点编号:\n");
scanf("%d",&n);
}
}
break;
}
else if(v==2)//按名称查询
{
PlaceList();//调用景点列表方法
printf("请输入当前所在景点名称:\n");
scanf("%s",c);
n=ByFindNumber(c);
while(1)
{
if(n>=1&&n<=15)
{
for(i=1;i<=15;i++)
{
if(i!=n)
Dijkstra(n,i);
}
printf("\n\n按回车键返回至导航系统界面\n\n");
getchar();getchar();
SystemMenu();//调用系统菜单方法
break;
}
else
{
printf("\n该景点不存在!请重新输入景点名称:\n");
scanf("%s",c);
n=ByFindNumber(c);
}
}
break;
}
else if(v==0)//返回
{
SystemMenu();//调用系统菜单方法
break;
}
else
{
printf("\n\n输入错误请重新输入!\n\n");
scanf("%d",&v);
}
}
break;
}
//**查询景点信息**
else if(x==2)
{
v=FindMethods(x);//调用查询方式的方法
while(1)
{
if(v==1)//按编号查询
{
PlaceList();//调用景点列表方法
printf("请输入景点编号:\n");
scanf("%d",&n);
while(1)
{
if(n>=1&&n<=15)
{
printf("\n\n%s\n\n%s\n\n",q[n].name,q[n].DetailMeg);
printf("按回车键返回至导航系统界面\n\n");
getchar();getchar();
SystemMenu();//调用系统菜单方法
break;
}
else
{
printf("\n该景点不存在!请重新输入景点编号:\n");
scanf("%d",&n);
}
}
break;
}
else if(v==2)//按名称查询
{
PlaceList();//调用景点列表方法
printf("请输入景点名称:\n");
scanf("%s",c);
n=ByFindNumber(c);
while(1)
{
if(n>=1&&n<=15)
{
printf("\n\n%s\n\n%s\n\n",q[n].name,q[n].DetailMeg);
printf("按回车键返回至导航系统界面\n\n");
getchar();getchar();
SystemMenu();//调用系统菜单方法
break;
}
else
{
printf("\n该景点不存在!请重新输入景点名称:\n");
scanf("%s",c);
n=ByFindNumber(c);
}
}
break;
}
else if(v==0)//返回
{
SystemMenu();//调用系统菜单方法
break;
}
else
{
printf("\n\n输入错误请重新输入!\n\n");
scanf("%d",&v);
}
}
break;
}
//**查询最短路径**
else if(x==3)//查询最短路径
{
v=FindMethods(x);//调用查询方式的方法
while(1)
{
if(v==1)//按编号查询
{
PlaceList();//调用景点列表方法
printf("请输入起点景点编号:\n");
scanf("%d",&n);
printf("\n请输入终点景点编号:\n");
scanf("%d",&m);
while(1)
{
if(n>=1&&n<=15&&m>=1&&m<=15&&n!=m)
{
Dijkstra(n,m);
printf("\n\n按回车键返回至导航系统界面\n\n");
getchar();getchar();
SystemMenu();//调用系统菜单方法
break;
}
else
{
printf("\n输入不合法!请重新输入!\n\n");
printf("请输入起点景点编号:\n");
scanf("%d",&n);
printf("\n请输入终点景点编号:\n");
scanf("%d",&m);
}
}
break;
}
else if(v==2)//按名称查询
{
PlaceList();//调用景点列表方法
printf("请输入起点景点名称:\n");
scanf("%s",c);
n=ByFindNumber(c);
printf("\n请输入终点景点名称:\n");
scanf("%s",c);
m=ByFindNumber(c);
while(1)
{
if(n>=1&&n<=15&&m>=1&&m<=15&&n!=m)
{
Dijkstra(n,m);
printf("\n\n按回车键返回至导航系统界面\n\n");
getchar();getchar();
SystemMenu();//调用系统菜单方法
break;
}
else
{
printf("\n输入不合法!请重新输入!\n\n");
printf("请输入起点景点名称:\n");
scanf("%s",c);
n=ByFindNumber(c);
printf("\n请输入终点景点名称:\n");
scanf("%s",c);
m=ByFindNumber(c);
}
}
break;
}
else if(v==0)//返回
{
SystemMenu();//调用系统菜单方法
break;
}
else
{
printf("\n\n输入错误请重新输入!\n\n");
scanf("%d",&v);
}
}
break;
}
else if(x==4)//返回
{
BeginMenu();//调用开始菜单方法
break;
}
else
{
printf("\n\n输入错误!请重新输入!\n");
}
}
}
//**************开始菜单************
void BeginMenu()
{
system("cls"); //清屏
int m;
printf("\n\n\n\n\n");
printf("\t\t\t ******************************************************\n");
printf("\t\t\t *---------------------Welcome!-----------------------*\n");
printf("\t\t\t *----------------------------------------------------*\n");
printf("\t\t\t *-------------重庆电子工程职业学院导航系统-----------*\n");
printf("\t\t\t *----------------------------------------------------*\n");
printf("\t\t\t *--------------------1、进入导航系统-----------------*\n");
printf("\t\t\t *----------------------------------------------------*\n");
printf("\t\t\t *--------------------2、学校简介---------------------*\n");
printf("\t\t\t *----------------------------------------------------*\n");
printf("\t\t\t *--------------------3、退出系统---------------------*\n");
printf("\t\t\t *----------------------------------------------------*\n");
printf("\t\t\t ******************************************************\n");
printf("请输入您选择服务的编号:");
scanf("%d",&m);
while(1)
{
if(m==1)// 进入导航系统
{
SystemMenu();//调用系统菜单方法
break;
}
else if(m==2)//学校简介
{
system("cls");
printf("\n\n\n\n\n");
printf("\t\t\t\t\t ***********************************************************\n");
printf("\t\t\t\t\t **************************学校简介*************************\n");
printf("\t\t\t\t\t ***********************************************************\n");
printf("\t\t\t\t\t ***********************************************************\n");
printf("\t\t\t\t\t * *\n");
printf("\t\t\t\t\t * 重庆电子工程职业学院,建于1965年,占地2606亩,位于 *\n");
printf("\t\t\t\t\t * *\n");
printf("\t\t\t\t\t * 重庆市沙坪坝区大学城,重庆电子工程职业学院简称“重电”,*\n");
printf("\t\t\t\t\t * *\n");
printf("\t\t\t\t\t * 由重庆市教育委员会和重庆市经济和信息化委员会共建高校, *\n");
printf("\t\t\t\t\t * *\n");
printf("\t\t\t\t\t * 是国家示范性高等职业院校、教育部现代学徒制试点高校。 *\n");
printf("\t\t\t\t\t * *\n");
printf("\t\t\t\t\t ***********************************************************\n");
printf("\n\n\n\n\n");
printf("按回车键返回\n");
getchar();getchar();
SystemMenu();//调用系统菜单方法
break;
}
else if(m==3)//退出系统
{
system("cls");
printf("\n\n\n\n\n");
printf("\t\t\t\t\t∴∵∴∵∴∵∴∵∴∵∴∵∴∵∴\n");
printf("\t\t\t\t\t∴∵ ∴∵\n");
printf("\t\t\t\t\t∴∵ 欢 迎 使 用 ∴∵\n");
printf("\t\t\t\t\t∴∵ ∴∵\n");
printf("\t\t\t\t\t∴∵∴∵∴∵∴∵∴∵∴∵∴∵∴\n");
printf("\n\n\n");
break;
}
else//输入错误
{
printf("\n\n\n\t\t输入错误请重新输入!\n\n\n\n");
scanf("%d",&m);
}
}
}
int main(void)
{
system("mode con cols=150 lines=200");//改变运行窗口大小
cuntu();
BeginMenu();//调用开始菜单方法
return 0;
}
8、运行效果
9、实验总结
通过数据结构与算法课程,我学会了如何写一个精简、健壮的程序。一个好的程序应该是一个所占空间小、运行时间短的程序。要做出一个好的程序则应该通过对算法与数据结构的时间复杂度和空间复杂度进行实现。本次实训培养了我独立思考的能力,提高了我的动手操作水平。在具体设计操作中,我巩固了本学期所学的数据结构与算法的理论知识,进一步提高了自己的编程能力。同时我意识到自己在今后的学习生活中,一定要勤于思考,扎实掌握理论知识,灵活运用课上所学的东西。总之,通过本次实训,让我学会了很多知识。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)