代码下载链接最底下也有源码。
一、功能:
本程序使用c语言,实现了河北大学本部的校园导航系统。具体功能有:
- 河北大学本部景点以及路径的表示。
- 登录程序,区分游客和管理员以提供不同的功能,实现密码的文件读取。
- 为游人提供任意景点相关信息查询。
- 游人提供任意景点的问路查询,即任意两个景点之间的最短路径。
- 为管理员提供图的编辑功能:增删景点;增删道路;修改已有信息等。
本程序使用的地图
二、结构:
开启管理员需要有“mima.txt”文件。
1.景点信息:
用邻接矩阵存储。
typedef struct Node *List;//节点
struct Node{
??? char name[25];//名字
??? char jianjie[120];//简介
??? int x,y;
};
List L[100];//地点
int LX[100][100];//路径
int n;//个数
2.登陆函数:
??? 实现登录功能,退出返回0,游客返回1,管理员返回2。
??? int denglu();
3.欢迎函数:
??? 根据id,输出对应欢迎信息。
??? void huanying();
4.录入函数:
??? 录入所有节点和边的信息。
??? void luru();
5.菜单函数:
??? 根据id输出对应菜单。
??? void caidan();
?
6.查找函数:
?????? 提供序号和名称的查找,输出找到的景点,根据x提供不同的功能1全部功能,其他不提供列出全部景点功能。返回-2退出,-1错误,其他数字都为查找到的序号。
??? int chazhao(int x);
?
7.查询函数:
??? 循环调用具有全部功能的查找函数实现查询。
??? void chaxun();
8.导航函数:
??? 用Floyd算法,求出所有顶点间最短路径,再通过查找函数得到需要查找的两个顶点。
??? void daohang();
9.修改函数:
??? 修改、增删景点、边,以及重置所有信息。管理员专用。
??? void xiugai();
10.清屏功能
??? system("CLS");
三、代码:
ps:一定记着再同一目录下放置mima.txt文件,才能开始管理员。
? ? ? 本部去的少,不太了解,想帮忙写简介的可以私信或者我,谢谢。
#include<stdio.h>
#include<math.h>
//在同一目录下放置“mima.txt"文件,内容为123456789,开始管理员
typedef struct Node *List;//节点
struct Node{
char name[25];//名字
char jianjie[120];//简介
int x,y;
};
int id=0;//身份
List L[100];//地点
int LX[100][100];//路径
int n;//个数
int denglu()
{
int i;
FILE *f;
printf("\n-=欢迎进入校园导航管理系统=-\n\n");
while(i)
{
printf("1.游客\t2.管理员\n0.退出\n");
printf("请选择:");
scanf("%d",&i);
switch(i)
{
case 0:
return 0;
case 1:
return 1;
case 2:
if ((f = fopen("mima.txt", "r")) == NULL)
{
printf("文件错误,请返回选择游客登陆。");
break;
}
char x[21],y[21];
fgets(x,20,f);
printf("请输入密码:");
scanf("%s",y);
if(!strcmp(x,y))
{
return 2;
}
printf("密码错误。\n");
break;
default:
i=1;
printf("无效输入,请重新选择。\n");
}
}
}
void huanying()
{
if(id==0)
exit(0);
else if(id==1)
printf("欢迎游客登录\n");
else if(id==2)
printf("欢迎管理员登录\n");
}
void caidan()
{
printf("\n\n--------=校园导航菜单=---------\n\n");
printf("1.查询功能\n");
printf("2.导航功能\n");
if(id==2)
{
printf("3.编辑功能\n");
}
printf("9.清屏功能\n");
printf("0.退出功能\n");
printf("请选择功能:");
}
void luru()
{
List l;
int i,j;
for(i=0;i<100;i++)
{
l=(List)malloc(sizeof(struct Node));
L[i]=l;
}
n=31;
strcpy(L[0]->name,"校医院");
strcpy(L[0]->jianjie,"无");
strcpy(L[1]->name,"生科院");
strcpy(L[1]->jianjie,"无");
strcpy(L[2]->name,"建工学院");
strcpy(L[2]->jianjie,"无");
strcpy(L[3]->name,"理化中心");
strcpy(L[3]->jianjie,"无");
strcpy(L[4]->name,"逸夫楼");
strcpy(L[4]->jianjie,"无");
strcpy(L[5]->name,"宿舍梅园6号");
strcpy(L[5]->jianjie,"无");
strcpy(L[6]->name,"宿舍梅园3、4、5号");
strcpy(L[6]->jianjie,"无");
strcpy(L[7]->name,"宿舍梅园2号");
strcpy(L[7]->jianjie,"无");
strcpy(L[8]->name,"北院餐厅");
strcpy(L[8]->jianjie,"无");
strcpy(L[9]->name,"篮球场,网球场");
strcpy(L[9]->jianjie,"无");
strcpy(L[10]->name,"操场");
strcpy(L[10]->jianjie,"无");
strcpy(L[11]->name,"学生宿舍梅园1号");
strcpy(L[11]->jianjie,"无");
strcpy(L[12]->name,"化学学院");
strcpy(L[12]->jianjie,"无");
strcpy(L[13]->name,"电信学院");
strcpy(L[13]->jianjie,"无");
strcpy(L[14]->name,"物理学院");
strcpy(L[14]->jianjie,"无");
strcpy(L[15]->name,"竟学楼");
strcpy(L[15]->jianjie,"无");
strcpy(L[16]->name,"南2门口");
strcpy(L[16]->jianjie,"无");
strcpy(L[17]->name,"南1门口");
strcpy(L[17]->jianjie,"无");
strcpy(L[18]->name,"北1门口");
strcpy(L[18]->jianjie,"无");
strcpy(L[19]->name,"北2门口");
strcpy(L[19]->jianjie,"无");
strcpy(L[20]->name,"文苑楼");
strcpy(L[20]->jianjie,"无");
strcpy(L[21]->name,"南院餐厅");
strcpy(L[21]->jianjie,"无");
strcpy(L[22]->name,"第八教学楼");
strcpy(L[22]->jianjie,"无");
strcpy(L[23]->name,"第七教学楼");
strcpy(L[23]->jianjie,"无");
strcpy(L[24]->name,"综合教学楼");
strcpy(L[24]->jianjie,"无");
strcpy(L[25]->name,"图书馆");
strcpy(L[25]->jianjie,"无");
strcpy(L[26]->name,"多功能馆");
strcpy(L[26]->jianjie,"无");
strcpy(L[27]->name,"第九教学楼");
strcpy(L[27]->jianjie,"无");
strcpy(L[28]->name,"主楼");
strcpy(L[28]->jianjie,"无");
strcpy(L[29]->name,"毓秀园");
strcpy(L[29]->jianjie,"无");
strcpy(L[30]->name,"国际交流学院");
strcpy(L[30]->jianjie,"无");
for(i=0;i<100;i++)
{
for(j=0;j<100;j++)
{
LX[i][j]=108000000;
}
}
LX[0][1]=LX[1][0]=82;
LX[1][2]=LX[2][1]=111;
LX[1][4]=LX[4][1]=92;
LX[2][3]=LX[3][2]=80;
LX[2][8]=LX[8][2]=84;
LX[2][12]=LX[12][2]=91;
LX[3][4]=LX[4][3]=105;
LX[4][12]=LX[12][4]=178;
LX[4][16]=LX[16][4]=93;
LX[5][6]=LX[6][5]=92;
LX[5][9]=LX[9][5]=49;
LX[5][8]=LX[8][5]=44;
LX[6][7]=LX[7][6]=20;
LX[6][9]=LX[9][6]=20;
LX[7][10]=LX[10][7]=10;
LX[7][11]=LX[11][7]=134;
LX[8][9]=LX[9][8]=25;
LX[8][12]=LX[12][8]=114;
LX[8][13]=LX[13][8]=102;
LX[9][10]=LX[10][9]=5;
LX[9][13]=LX[13][9]=15;
LX[10][11]=LX[11][10]=10;
LX[10][13]=LX[13][10]=70;
LX[12][13]=LX[13][12]=108;
LX[12][14]=LX[14][12]=57;
LX[13][15]=LX[15][13]=115;
LX[14][15]=LX[15][14]=53;
LX[14][16]=LX[16][14]=179;
LX[14][17]=LX[17][14]=59;
LX[15][17]=LX[17][15]=56;
LX[16][17]=LX[17][16]=202;
LX[16][18]=LX[18][16]=37;
LX[17][19]=LX[19][17]=39;
LX[18][19]=LX[19][18]=210;
LX[18][20]=LX[20][18]=60;
LX[18][25]=LX[25][18]=134;
LX[19][25]=LX[25][19]=77;
LX[19][26]=LX[26][19]=96;
LX[19][28]=LX[28][19]=114;
LX[20][21]=LX[21][20]=93;
LX[20][22]=LX[22][20]=44;
LX[21][22]=LX[22][21]=75;
LX[21][23]=LX[23][21]=150;
LX[21][24]=LX[24][21]=110;
LX[22][24]=LX[24][22]=42;
LX[22][27]=LX[27][22]=87;
LX[23][24]=LX[24][23]=144;
LX[24][27]=LX[27][24]=73;
LX[24][30]=LX[30][24]=169;
LX[25][27]=LX[27][25]=78;
LX[26][28]=LX[28][26]=91;
LX[27][28]=LX[28][27]=190;
LX[27][29]=LX[29][27]=20;
LX[27][30]=LX[30][27]=167;
LX[28][29]=LX[29][28]=20;
LX[29][30]=LX[30][29]=139;
}
void chaxun()//查询,大功能
{
int c=1;
printf("\n\n---------=查询功能=----------\n");
while(c!=-2)
{
c=chazhao(1);
}
}
int chazhao(int x)//查找,子功能,退出-2,其他-1,返回找到的序号。
{
int c=1;
int i,j;
char s[25];
printf("\n1.序号查询\n2.名称查询\n");
if(x==1)
printf("3.所有景点\n");
printf("0.退出\n");
printf("请选择查询方式:");
scanf("%d",&c);
switch(c)
{
case 0:
return -2;
break;
case 1:
printf("请输入序号:");
scanf("%d",&c);
if(c>=n||c<0)
{
printf("序号为%d的景点不存在\n",c);
return -1;
}
printf("\n序号\t\t 名称\t\t简介\n");
printf("%02d\t%17s\t%s\n",c,L[c]->name,L[c]->jianjie);
printf("相邻景点序号:");
for(i=0;i<n;i++)
{
if(i!=c&&LX[c][i]<100000)
{
printf(" %02d ",i);
}
}
printf("\n");
return c;
case 2:
c=-1;
printf("请输入名称:");
scanf("%s",s);
for(i=0;i<n;i++)
{
if(strcmp(L[i]->name,s)==0)
{
c=i;
break;
}
}
if(c==-1)
{
printf("名称为“%s”的景点不存在\n",s);
return -1;
}
printf("\n序号\t\t 名称\t\t简介\n");
printf("%02d\t%17s\t%s\n",c,L[c]->name,L[c]->jianjie);
printf("相邻景点序号:");
for(i=0;i<n;i++)
{
if(i!=c&&LX[c][i]<100000)
{
printf(" %02d ",i);
}
}
printf("\n");
return c;
break;
case 3:
if(x==1)
{
printf("\n序号\t\t 名称\t\t简介\n");
for(c=0;c<n;c++)
{
printf("%02d\t%17s\t%s",c,L[c]->name,L[c]->jianjie);
printf("\t\t\t相邻景点序号:");
for(i=0;i<n;i++)
{
if(i!=c&&LX[c][i]<100000)
{
printf(" %02d ",i);
}
}
printf("\n");
}
return 1;
break;
}
default:
printf("无效选择。\n");
if(x==1)
return 1;
return -1;
}
}
void daohang()
{
printf("\n\n---------=导航功能=----------\n\n");
int c=1,i,j,k,tmp,path[n+5][n+5],dist[n+5][n+5];
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
dist[i][j]=LX[i][j];
path[i][j]=j;
}
}
for(k=0;k<n;k++)
{
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
tmp=dist[i][k]+dist[k][j];
if(dist[i][j]>tmp)
{
dist[i][j]=tmp;
path[i][j]=k;
}
}
}
}
while(c)
{
printf("\n1.开始导航:\n0.退出\n");
printf("请选择功能:");
scanf("%d",&c);
switch(c)
{
case 0:
break;
case 1:
printf("\n第一个节点:");
i=chazhao(0);
if(i<0)
break;
printf("\n第二个节点:");
j=chazhao(0);
if(j<0)
break;
if(i==j)
{
printf("只缘身在此山中,你已经在要到的景点了。");
break;
}
printf("(%02d):[%s]到(%02d):[%s]的最短路径长度为:%d\n",
i,L[i]->name,j,L[j]->name,dist[i][j]);
if(dist[i][j]>100000)
{
printf("\n这么远去那里是要西天取经?\n");
break;
}
c=i;i=j;j=c;
printf("路径为: %02d ",j);
if(path[i][j]==j)
printf(" %02d \n",i);
else
{
k=j;
while(path[i][k]!=k)
{
k=path[i][k];
printf(" %02d ",k);
}
printf(" %02d \n",i);
}
c=1;
break;
default:
printf("无效选择。\n");
break;
}
}
}
void xiugai()
{
int c=1,i,j;
char s[25];
printf("\n\n---------=修改功能=----------\n\n");
while(c)
{
printf("\n修改功能:\n1.增删景点\n2.增删道路\n3.修改景点信息\n4.重置信息\n0.退出\n");
printf("请选择功能:");
scanf("%d",&c);
switch(c)
{
case 1:
while(c)
{
printf("\n增删景点:\n");
printf("1.增加景点\n2.删除景点\n0.退出\n");
scanf("%d",&c);
switch(c)
{
case 0:
break;
case 1:
printf("\n请输入要创建景点名:");
scanf("%s",s);
c=-1;
for(i=0;i<n;i++)
{
if(strcmp(L[i]->name,s)==0)
{
c=i;
break;
}
}
if(c!=-1)
{
printf("“%d”号景点与该景点名重复\n",c);
break;
}
List l=(List)malloc(sizeof(struct Node));
strcpy(l->name,s);
printf("请输入简介:");
scanf("%s",l->jianjie);
printf("\n序号\t\t 名称\t\t简介\n");
printf("\n%02d\t%17s\t%s",n,l->name,l->jianjie);
printf("\n输入1确定创建该景点:");
scanf("%d",&i);
if(i==1)
{
L[n]=l;
n++;
printf("景点已创建\n");
}
else
free(l);
c=1;
break;
case 2:
printf("\n查询景点:");
c=chazhao(0);
if(c<0)
break;
printf("输入1确定删除('%02d')景点:",c);
scanf("%d",&i);
if(i==1)
{
n--;
for(i=c;i<=n;i++)
{
L[i]=L[i+1];
for(j=0;j<=n;j++)
{
LX[i][j]=LX[i+1][j];
}
}
for(i=0;i<=n;i++)
for(j=c;j<=n;j++)
{
LX[i][j]=LX[i][j+1];
}
}
c=1;
break;
default:
printf("无效选择。\n");
break;
}
}
c=1;
break;
case 2:
while(c)
{
printf("\n增删道路:\n");
printf("1.增加、修改道路\n2.删除道路\n0.退出\n");
scanf("%d",&c);
switch(c)
{
case 0:
break;
case 1:
printf("第一个节点:");
i=chazhao(0);
if(i<0)
break;
printf("第二个节点:");
j=chazhao(0);
if(j<0)
break;
if(i==j)
{
printf("不能改变景点到自己的距离\n");
break;
}
printf("\n输入距离:");
scanf("%d",&c);
if(c<0||c>100000)
{
printf("道路长度有误(过长|过短)\n");
c=1;
break;
}
LX[i][j]==c;
printf("道路已创建。(过长的道路不认为生效)\n");
c=1;
break;
case 2:
printf("\n第一个节点:");
i=chazhao(0);
if(i<0)
break;
printf("\n第二个节点:");
j=chazhao(0);
if(j<0)
break;
if(i==j)
{
printf("不能改变景点到自己的距离\n");
break;
}
if(LX[i][j]>10000)
{
printf("两景点之间已经%d米了\n",LX[i][j]);
break;
}
printf("输入1确定删除从%02d->%02d的道路%d米:",i,j,LX[i][j]);
scanf("%d",&c);
if(c==1)
{
LX[i][j]=LX[j][i]=108000000;
printf("%02d->%02d现在距离%d米\n",i,j,LX[i][j]);
}
c=1;
break;
default:
printf("无效选择。\n");
break;
}
}
c=1;
break;
case 3:
j=1;
while(j)
{
printf("\n修改信息:\n");
printf("\n查询景点:");
c=chazhao(0);
if(c==-2)
break;
if(c==-1)
continue;
printf("1.修改名称\n2.修改简介\n0.退出\n");
scanf("%d",&j);
switch(j)
{
case 0:
break;
case 1:
printf("输入新名称:");
scanf("%s",s);
j=-1;
for(i=0;i<n;i++)
{
if(strcmp(L[i]->name,s)==0)
{
j=i;
break;
}
}
if(j!=-1)
{
printf("“%d”号景点与该景点名重复\n",j);
break;
}
printf("输入1确定修改('%02d')[%s]景点:",c,L[c]->name);
scanf("%d",&i);
if(i==1)
{
strcpy(L[c]->name,s);
printf("('%02d')[%s]景点名已修改",c,L[c]->name);
}
j=1;
break;
case 2:
printf("输入新简介:");
scanf("%s",L[c]->jianjie);
printf("('%02d')[%s]景点简介:“%s”已修改",c,L[c]->name,L[c]->jianjie);
j=1;
break;
default:
printf("无效选择。\n");
j=1;
break;
}
}
c=1;
break;
case 4:
luru();
printf("已重置\n");
c=1;
break;
default:
printf("无效选择。\n");
break;
}
}
}
int main()
{
id=denglu();//登录返回1游客,2管理员。
huanying();//欢迎语句。
luru();
int x;
while(x)
{
caidan();
scanf("%d",&x);
switch(x)
{
case 0:
printf("再次输入0确定退出,否则返回。\n输入:");
scanf("%d",&x);
break;
case 1:
chaxun();
break;
case 2:
daohang();
break;
case 3:
if(id==1)
{
printf("%d是无效功能。\n",x);
break;
}
xiugai();
break;
case 9:
system("CLS");
break;
default:
printf("%d是无效功能。\n",x);
break;
}
}
return 0;
}
|