校园导航系统不是很难,因为最短路径已经有了Dijkstra算法,这就可以直接用。
我们需要的只是往这个算法里面加参数还有对界面的创作,这些都很简单。不过用算法还得需要了解算法,所以建议大家还是去理解一下这个算法的内涵。实际运行可能和我的运行结果有出入,应该只是显示的问题。
前期准备:
呈现结果:
文章来源:https://www.toymoban.com/news/detail-788054.html
代码如下:文章来源地址https://www.toymoban.com/news/detail-788054.html
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<algorithm>//导入头文件
#define MaxLen 1000//define可以定义一个标识符为一个常量,此处将MaxLen定义为无穷大方便后续算法之中使用
#define Max 100//定义最大容量为100
void InitDis();//初始化map数组里面的各种距离信息
void Dijkstra(int v0,int s);//Dijkstra最短路径算法
void MapList();//地图界面
void Welcome();//欢迎界面
void Menu();//菜单界面
void BuildList();//景点信息界面
void Quit();//退出界面
void MenuSystem();//菜单逻辑
int map[Max][Max],Flag[Max],Dis[Max];
char name[37][50]={"","西门","西二门","孝武综合楼","天工/天成楼","湛林体育馆","南三门","湖西路","平桥","校医院","拱桥","西区宿舍","孔子广场","南二门","经法/外语楼",
"樱花林","体育楼","格物楼","西苑/西霞餐厅","校史馆","教六","北门","图书馆","教一","明德楼","喷泉广场","计科楼","南大门","音乐/美术楼","三里餐厅",
"三里宿舍","湖东路","东苑餐厅","东区宿舍","广播台","人文广场","东门"};
//此处可以使用结构体也可以使用像我一样的二维数组,但是注意我的二维数组的第一个是空的,以便后续输出的时候序号和建筑物一对一。
void InitDis()//初始化距离信息
{
int i,j;
for(i=1;i<=36;i++)//初始化map,使得景点自己和自己的距离为0,剩下的距离为无穷大。
for(j=1;j<=36;j++)
{
if(i==j)
map[i][j]=0;
else
map[i][j]=MaxLen;
}
//此处存储各个景点之间的距离。注意一定要按顺序来,例如不可以先map[2][5]再[2][3],因为后面的for循环会覆盖掉
map[1][5]=100;
map[2][3]=105;map[2][5]=128;map[2][7]=150;map[2][8]=200;
map[3][6]=50;
map[4][5]=40;map[4][7]=70;
map[5][7]=50;
map[6][9]=30;
map[7][10]=120;map[7][14]=450;map[7][15]=400;
map[8][11]=47;
map[9][12]=120;
map[10][17]=60;
map[11][12]=50;map[11][18]=50;
map[12][13]=50;map[12][20]=50;
map[14][15]=120;map[14][22]=158;
map[15][22]=40;
map[16][17]=30;map[16][18]=120;map[16][23]=150;map[16][31]=300;
map[17][18]=100;
map[18][19]=57;
map[19][20]=200;map[19][23]=40;map[19][24]=34;
map[20][24]=212;
map[21][35]=50;
map[22][35]=50;map[22][28]=106;
map[23][24]=73;map[23][31]=200;map[23][32]=150;map[23][33]=120;
map[24][25]=80;map[24][33]=100;
map[25][26]=30;map[25][27]=100;map[25][34]=40;
map[28][29]=100;map[28][35]=70;map[28][31]=230;
map[29][30]=50;map[29][31]=200;
map[30][31]=200;
map[31][32]=200;
map[32][33]=100;map[32][36]=250;
map[33][34]=170;
for(i=1;i<=36;i++)
{
for(j=1;j<=36;j++)
{
map[j][i]=map[i][j];
}
}
}
void Dijkstra(int v0,int s) //v0是起点,s是终点。迪杰斯特拉求最短路径,并输出路线
{
int min,i,j,u,v;
//初始化各个数据
int p[Max],l[Max];//这里尽可能的定义把数组定义大为了防止出现不够存的现象,坏处就是占用内存。
memset(p,-1,sizeof(p));//将p的前sizeof(p)个长度的数值都改成unsigned(-1)。unsigned(-1)就是最大数,此处要温习反码补码知识。
memset(l,0,sizeof(l));//将l的所有长度的数值都改成unsigned(0)也就是0。
memset(Flag,0,sizeof(Flag));//memset(*,0,sizeof(*))这个函数常常用来清空数组。
//以下正式开始Djikstra算法,建议先去理解算法的含义再来理解代码。
for(i=1;i<=36;i++)
{
Dis[i]=map[v0][i];
if(Dis[i]<MaxLen)
{
p[i]=v0;
}
}
Flag[v0]=1;//标记
for(i=1;i<36;i++)
{
min=MaxLen;
for(j=1;j<=36;j++)
{
if(Flag[j]==0&&Dis[j]<min)
{
min=Dis[j];
u=j;
}
}
Flag[u]=1;
for(v=1;v<=36;v++)
{
if(Flag[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("为您规划的最短路线为:");
printf("%s--->",name[v0]);
for(i=u;i>=1;i--)
printf("%s--->",name[l[i]]);
printf("%s\n",name[s]);
printf("全程%d米",Dis[s]);
printf(" 用时%d分钟\n",Dis[s]/60+1);
}
void MapList() //地图界面
{
printf(" ┏━━━━━━━━┓ ┏━━━━━━━━━━━━━━━━━━━━━━ 北门━━━━━━┓\n");
printf(" ┃ ┃ ┃ 人文广场 ┃\n");
printf(" 【湖北工程学院】┃ ┃ ┃ o经法/外语楼 o ┗━━┓\n");
printf(" 【本院地图】 ┃ ┃ ┃ o ┃音乐/美术楼\n");
printf(" ┃ ┃ ┃ 樱花林 图书馆 ┗━━━┓\n");
printf(" ┃ ┃ ┃ o o o┃三里餐厅\n");
printf(" ┏━━━━━━━━━━━━━━━┛ ┃ ┃ ┃\n");
printf(" ┃ ┃ ┃ ┗━━━━━━┓\n");
printf(" ┃ 天工/天成楼 ┗━━┛ ┃\n");
printf(" ┃ o 【春晖湖】 o ┃\n");
printf(" ┃ o湖东路 三里宿舍┃ \n");
printf(" ┃ 拱桥 ┃ \n");
printf(" 西门 湛林 湖西路 o ┃ \n");
printf(" ┃ 体育馆 o o体育楼 ┗━━━━━━━┓ \n");
printf(" ┃ o o格物楼 o东苑餐厅 ┃ \n");
printf(" ┃ o教一 东门 \n");
printf(" ┃ o西苑/西霞餐厅 ┃ \n");
printf("西二门 o平桥 o o校史馆 o东区宿舍 ┃ \n");
printf(" ┗┓ 西区宿舍 o明德楼 ┃ \n");
printf(" ┃o孝武综合楼 o o教六 ┃ \n");
printf(" ┗━┓ o 孔子广场 喷泉广场 广播台 ┏━━━━━━━━━━━━┛ \n");
printf(" ┗━━ 南三门━━━━━━━━━ 南二门━━━━━━━━━━━━━━━┓ o o┏━━━━━━━┛\n");
printf(" 校医院 ┃ ┏━━┛ \n");
printf(" ┃计科楼 ┏━━━━┛ \n");
printf(" ┃ o ┃ \n");
printf(" ┗━━ 南大门━┛ \n\n");
}
void Welcome()//欢迎界面
{
printf("——————————————————————————————————\n\n");
printf(" 【湖工校园导航系统】\n\n");
printf(" 欢迎使用湖工校园导航系统\n");
printf(" (导航数据仅供参考,并不代表实际)\n\n");
printf("——————————————————————————————————\n\n");
system("pause");
system("cls");
}
void BuildList()//建筑物一览图
{
printf("——————————————————————————————————\n\n");
printf(" 【湖工校园导航系统】\n");
printf(" 校园一览图\n\n");
printf("(1)西门 (2)西二门 (3)孝武综合楼 (4)天工/天成楼 (5)湛林体育馆\n\n");
printf("(6)南三门 (7)湖西路 (8)平桥 (9)校医院 (10)拱桥\n\n");
printf("(11)西区宿舍 (12)孔子广场 (13)南二门 (14)经法/外语楼(15)樱花林\n\n");
printf("(16)体育楼 (17)格物楼 (18)西苑/霞餐厅(19)校史馆 (20)教六\n\n");
printf("(21)北门 (22)图书馆 (23)教一 (24)明德楼 (25)喷泉广场\n\n");
printf("(26)计科楼 (27)南大门 (28)音乐/美术楼(29)三里餐厅 (30)三里宿舍\n\n");
printf("(31)湖东路 (32)东苑餐厅 (33)东区宿舍 (34)广播台 (35)人文广场\n\n");
printf("(36)东门\n\n");
printf("——————————————————————————————————\n\n");
}
void Menu()//菜单界面
{
system("cls");
printf("——————————————————————————————————\n\n");
printf(" 【湖工校园导航系统】\n\n");
printf(" (1) 查看地图\n\n");
printf(" (2) 查看校园一览图\n\n");
printf(" (3) 进入导航\n\n");
printf(" (4) 退出导航系统\n\n\n");
printf("——————————————————————————————————\n\n");
}
void Quit()//退出界面
{
system("cls");
printf("——————————————————————————————————\n\n");
printf(" 【湖工校园导航系统】\n\n");
printf(" 感谢您使用湖工导航系统!\n\n");
printf(" 作者:20541班 李小澈\n\n");
printf("——————————————————————————————————\n\n");
}
void MenuSystem()//菜单逻辑
{
int n,i;
while(1)
{
int v0=0,s=0;
Menu();
printf("请输入您要进行的操作:");
scanf("%d",&n);
switch(n)
{
case 1:
{
system("cls");
MapList();
printf("返回主菜单");
system("pause");
}break;
case 2:
{
system("cls");
BuildList();
printf("返回主菜单");
system("pause");
}break;
case 3:
{
system("cls");
BuildList();
while(v0<1||v0>36)
{
printf("请输入您的起始地:");
scanf("%d",&v0);
if(v0<1||v0>36)
{
printf("输入有误!请重新输入。\n");
}
}
while(s<1||s>36)
{
printf("请输入您的目的地:");
scanf("%d",&s);
if(s<1||s>36)
{
printf("输入有误!请重新输入。\n");
}
}
system("cls");
MapList();
Dijkstra(v0,s);
printf("返回主菜单");
system("pause");
}break;
case 4:
{
Quit();
exit(-1);
}break;
default:
{
printf("输入错误!请重新输入。\n");
printf("返回主菜单");
system("pause");
}break;
}
}
}
int main()//主函数
{
InitDis();
Welcome();
MenuSystem();
}
到了这里,关于数据结构课设(C语言)——校园导航系统的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!