2-6 校园导航 (50分)
校园导航问题@
【问题描述】
以我校为例,设计一个校园导航系统,主要为来访的客人提供信息查询。系统有两类登陆账号,一类是游客,使用该系统方便校内路线查询;一类是管理员,可以使用该系统查询校内路线,可对校园景点路线可编辑。
【需求分析】
设计学校的平面图,至少包括10个以上景点(场所),每两个景点间可以有不同道路,且路长也可能不同,找出在游人所在景点到其他景点的最短路径,或游人输入的任意两个景点的最短路径。
要求:
(1) 以图中顶点表示校园内各景点,存放景点名称、代号、简介等信息;以边表示路径,路径权重为路径长度。
(2) 为游人提供任意景点相关信息查询。
(3)为游人提供任意景点的问路查询,即任意两个景点之间的最短路径。
地图中共有12个顶点,20条边
实现提示:
一般情况下,校园道路是双向通行的,可设计校园平面图是一个无向图。顶点和边均含有相关信息。
选做内容:
(1)提供图的编辑功能:增删景点;增删道路;修改已有信息等。
(2)校园导游图的仿真界面。
解题报告
【概要设计】
抽象数据类型定义:
(1)景点 顶点名称 代号 顶点信息简介
#define MaxVerNum 100 //最大景点数
typedef struct {
int num;//代号
char name[MaxVerNum];//景点名字
char features[1000];//景点信息
} VertexType;
(2)图的存储结构:
//图的存储结构
typedef struct {
VertexType vexs[MaxVerNum];//每一个景点的信息
int edges[MaxVerNum][MaxVerNum];//每一个景点的邻接边的权值
int v, e;//顶点数和边数
} MGraph;
static MGraph map;
2 主要功能模块
(1)创建图的邻接矩阵存储结构 create()
(2) 浏览图中任一景点介绍
(3) 修改景点信息
(4) 增加景点信息
(5) 删除景点信息
(6) 增加道路
(7) 删除道路
(8) 查找某一景点到其他景点的最短路径
(9) 查找任一两个景点之间的最短路径。
3 主模块流程
管理员登陆,可实现(1)-(9)功能操作
游客登陆,在(1)基础实现基础之上,可实现 (2)(8)(9)功能操作
【详细设计】
用C语言定义相关数据类型
写出各模块伪代码算法
画出函数间的调用关系图
【调试分析】
调试中遇到的问题及对问题的解决方法
算法时间复杂度和空间复杂度
【使用书说明及测试结果】
叨叨我刚开始的想法
菜单
这是我原来想要的菜单界面,我真的挺喜欢的!!!这么好看。
但是后来发现一个问题,当删除和修改景点节点的时候,我的界面不会的自动对齐,就是那种错位,很不美观。
所以最好下定决心,舍去吧!!!
第一次版本
void Listmenu() {
system("cls");
printf("\n");
printf("\t * * * * * * * * * * * * * * ** * * * * * * * * * * * * * * *\n");
printf("\t * * *河大景点列表* * *\n");
printf("\t * ****************************************************** * *\n");
printf("\t * * * *\n");
printf("\t * * <1>体检中心 <2>操场 <3>校门北口 * *\n");
printf("\t * * * *\n");
printf("\t * * <4>银杏景观 <5>邯郸音乐厅 <6>图书馆 * *\n");
printf("\t * * * *\n");
printf("\t * * <7>信息学部 <8>花园景观 <9>校门东口 * *\n");
printf("\t * * * *\n");
printf("\t * * <10>网计学院 <11>校门南口 <12>餐厅 * *\n");
printf("\t * * * *\n");
printf("\t * ****************************************************** * *\n");
printf("\t * * * * * * * * * * * * * * ** * * * * * * * * * * * * * * *\n");
}
改进版本【同样不可用】
//河大景点列表
void Listmenu() {
system("cls");
printf("\n");
printf("\t * * * * * * * * * * * * * * ** * * * * * * * * * * * * * * *\n");
printf("\t * * *河大景点列表* * *\n");
printf("\t * ****************************************************** * *\n");
printf("\t * * * *\n");
printf("\t * * <1>%s <2>%s <3>%s * *\n",map.vexs[0].name,map.vexs[1].name,map.vexs[2].name);
printf("\t * * * *\n");
printf("\t * * <4>%s <5>%s <6>%s * *\n",map.vexs[3].name,map.vexs[4].name,map.vexs[5].name);
printf("\t * * * *\n");
printf("\t * * <7>%s <8>%s <9>%s * *\n",map.vexs[6].name,map.vexs[7].name,map.vexs[8].name);
printf("\t * * * *\n");
printf("\t * * <10>%s <11>%s <12>%s * *\n",map.vexs[9].name,map.vexs[10].name,map.vexs[11].name);
printf("\t * * * *\n");
printf("\t * ****************************************************** * *\n");
printf("\t * * * * * * * * * * * * * * ** * * * * * * * * * * * * * * *\n");
}
管理员界面
游客界面
现在的:
修改和增删景点
刚开始的时候,我以为简单的很,和修改景点差不多的样子,但是后来发现,不是那么回事啊?!
- 修改的时候,我就在想,是只改名字呢,还是名字和介绍一块改呢?最后选择了后者。因为不会真的有人闲的没事天天给同一块地方改名字,而不该介绍吧?呵呵,至少您的介绍里,最少要加一句:于xx年xx月xx日由xx名改为xx名。【我闲的慌,别理我,每次写大作业,都在打心理战】
- 增加景点的时候,还有加入它与其他景点的路径,这就要输入它的相邻景点了【PS:检查前后是不是输入了重复相邻的景点】
- 同样的,删除的时候,也要删除所有与该景点直接相连的道路【数组记得同样的删除该景点的位置啊】
- 还有一点,呃。。。不是很重要。对界面美观或者有强迫的孩子们,可以考虑一下,那就是展示景点的顺序。一般我都默认插入到数组的最后面,这样的话,循环输出,最后插入的景点自然而然的在最下面。但是,如果新加的景点会给学校带来好处或者收益,还是放在C位比较合适啊。毕竟像咱们的图书馆等标志的建筑,一般宣传都会是在最上面的。呃呃,我就算了吧,因为我,目前还没有这意识【算了,其实是没有实力】。
增删路径
- 增加路径还好了,先看一共有多少景点,0或1个景点就不要进行操作了,直接输出提示并返回;然后判断一下你要加入的那个路径是不是已经存在了,如果是,就没有什么必要再添加了;然后正常添加就行。
- 删除路径也是,先看一共有多少景点,0或1个景点就不要进行操作了,直接输出提示并返回;然后判断一下你要删除的路径存不存在,如果不,提示错误,接着输入。
查找最短路径
这里有两种算法。
我想了好久,Floyd算法在我的程序上运行不出来,之后干脆算了,使用大概率相同的代码,完成了两种功能【只有部分的输出需要更改】,很不地道。
但是我还是想着都写出来比较好,之后再好好的研究研究。
密码
这个最好还是用文件操作比较好,这样可以记录每一次的密码,但是我的时间来不及了,直接给了一个默认的密码1234
,你可以更改密码,但是关闭程序之后,还是恢复我的默认密码。
…
这次就算了,毕竟只是一个小系统,实现一个功能,以后有机会参加什么大型的项目,一定要认真找bug
说到bug,再说一点,如果scanf时,用的int型的%d,这是一个(小)大问题,1和01和001都是系统认为都是一样的,都正确,所以啊,,,最好还是用char型,比较两个字符串是否相等,对了,我那样子写的,输入1.1只有带.的,会错的啊。哈哈哈哈哈哈,我不改了,这是后来发现的。
代码
/*
同学你好,欢迎检测校园导航系统,本系统的管理员默认密码是1234。
你可以进行后期的更改,祝你体验愉快!
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
#define MaxVerNum 100 //最大景点数
#define INF 99999//表示无穷 即没有路径
char PASSWORD[20]="1234";//默认密码
typedef struct {
//int num;//代号这个变量本来我也是有的 后来发现没什么用 舍弃了
char name[MaxVerNum];//景点名字
char features[1000];//景点信息
} VertexType;
//图的存储结构
typedef struct {
VertexType vexs[MaxVerNum];//每一个景点的信息
int edges[MaxVerNum][MaxVerNum];//每一个景点的邻接边的权值
int v, e;//顶点数和边数
} MGraph;
static MGraph map;
void menu1();//管理员菜单
void menu2();//游客菜单
void ListSpots();//河大景点列表
void create();//创建邻接链表
void Introduce();//景点介绍函数
void ChangeVexs();//修改景点
void IncreaseVexs();//增加景点
void DeleteVexs();//删除景点
void IncreaseEdges();//增加道路
void DeleteEdges();//删除道路
void Dijkstra();//查找当前景点到其他景点的最短路径
void Floyd();//查找任一两个景点之间的最短路径
void Exit();//退出系统的函数
void changepassword();
//主函数
int main() {
while(1) {
create();
printf("\n\n");
system("cls");
printf("\t欢迎光临河北大学新校区!\n\n");
printf("\t请输入代号选择您相应的身份:\n\n");
printf("\t<1>管理员\n\n");
printf("\t<2>游客\n\n");
printf("\t<3>退出系统!\n\n");
int n;
scanf("%d",&n);
if(n==1) {
printf("请输入管理员密码:\n");
char pw[20];
scanf("%s",pw);
getchar();
while(strcmp(pw,PASSWORD)!=0) {
printf("密码错误,请重新输入:\n");
scanf("%s",pw);
}
if(strcmp(pw,PASSWORD)==0)
menu1();
} else if(n==2) {
menu2();
} else if(n==3) {
Exit();
} else {
printf("您的输入有误,请重新输入!\n");
system("pause");
}
}
return 0;
}
//管理员菜单
void menu1() {
while(1) {
int n;
system("cls");
printf("\t当前为管理员操作界面\n\n");
printf("\t请选择您要进行的操作:\n\n");
printf("\t<1>查看景点介绍\t");
printf("\t<2>修改景点\t");
printf("\t<3>增加景点\n\n");
printf("\t<4>删除景点\t");
printf("\t<5>增加道路\t");
printf("\t<6>删除道路\n\n");
printf("\t<7>查找当前景点到其他景点的最短路径\n\n");
printf("\t<8>查找任一两个景点之间的最短路径\n\n");
printf("\t<9>退出系统!\t");
printf("\t<0>修改密码!\n\n");
scanf("%d",&n);
if(n==1) {
Introduce();
} else if(n==2) {
ChangeVexs();
} else if(n==3) {
IncreaseVexs();
} else if(n==4) {
DeleteVexs();
} else if(n==5) {
IncreaseEdges();
} else if(n==6) {
DeleteEdges();
} else if(n==7) {
Dijkstra();
} else if(n==8) {
Floyd();
} else if(n==9) {
Exit();
} else if(n==0) {
changepassword();
} else {
printf("您的输入有误,请重新输入!\n");
system("pause");
}
}
}
//游客菜单
void menu2() {
while(1) {
system("cls");
printf("\t当前为游客操作界面\n\n");
printf("\t<1>查看景点介绍\n\n");
printf("\t<2>查找当前景点到其他景点的最短路径\n\n");
printf("\t<3>查找任一两个景点之间的最短路径\n\n");
printf("\t<4>退出系统!\n\n");
int n;
scanf("%d",&n);
if(n==1) {
Introduce();
} else if(n==2) {
Dijkstra();
} else if(n==3) {
Floyd();
} else if(n==4) {
Exit();
} else {
printf("您的输入有误,请重新输入!\n");
system("pause");
}
}
}
//景点介绍函数
void Introduce() {
system("cls");
if(map.v==0) {
printf("该地图暂时没有景点!\n\n");
system("pause");
return ;
}
ListSpots();
printf("\n请输入你要查看的景点代号:\n");
int n;
while(1) {
scanf("%d",&n);
if(n<1||n>map.v) {
printf("您的输入有误,请重新输入!\n");
} else
break;
}
printf("%s:",map.vexs[n-1].name);
printf("%s\n",map.vexs[n-1].features);
int flag;
printf("\n再次查询请按1,退出查询请按任意键\n");
scanf("%d",&flag);
if(flag==1)
Introduce();
}
//修改景点
void ChangeVexs() {
system("cls");
if(map.v<=0) {
printf("地图中没有任何景点,无法操作!!!\n");
system("pause");
return ;
}
ListSpots();
int n;
printf("请输入您要修改的景点代号:\n");
scanf("%d",&n);
while(n<=0||n>map.v) {
printf("您的输入有误,请重新输入!\n");
scanf("%d",&n);
}
char newName[200];
char newFeatures[1000];
printf("该景点当前的名字是:\n\n【%s】\n\n请输入更改后的名字:\n",map.vexs[n-1].name);
scanf("%s",newName);
getchar();
printf("该景点当前的介绍为:\n\n%s\n\n请输入更改后新的景点介绍:\n",map.vexs[n-1].features);
scanf("%s",newFeatures);
getchar();
strcpy(map.vexs[n-1].name,newName);
strcpy(map.vexs[n-1].features,newFeatures);
printf("\n景点信息修改成功!\n");
system("pause");
}
//增加景点
void IncreaseVexs() {
system("cls");
if(map.v>MaxVerNum) {
printf("景点已到达最大限度,当前无法添加景点!\n");
system("pause");
return ;
}
char newName[200];
char newFeatures[1000];
printf("请输入您要添加的景点名:\n");
scanf("%s",newName);
getchar();
printf("请输入【%s】景点的介绍,最多可输入200字:\n",newName);
scanf("%s",newFeatures);
getchar();
int m=0;
int i;
ListSpots();
printf("请输入新增景点的相邻景点个数:\n");
scanf("%d",&m);
while(m<0||m>map.v) {
printf("您的输入有误,请重新输入!\n");
scanf("%d",&m);
}
for(i=0; i<m; i++) {
int a,d;
printf("请输入第%d个相邻景点的代号:\n",i+1);
scanf("%d",&a);
while(a<=0||a>map.v||map.edges[a-1][map.v]!=INF) {
if(a<=0||a>map.v)
printf("您的输入有误,请重新输入!范围在1~%d之间。\n",map.v);
if(map.edges[a-1][map.v]!=INF)
printf("请不要输入重复的相邻景点,重新输入:\n");
scanf("%d",&a);
}
printf("请输入【%s】与【%s】之间的距离:\n",newName,map.vexs[a-1].name);
scanf("%d",&d);
while(d<=0||d>=INF) {
printf("您输入的距离有误!请重新输入:\n");
scanf("%d",&d);
}
map.edges[a-1][map.v]=map.edges[map.v][a-1]=d;
}
strcpy(map.vexs[map.v].name,newName);
strcpy(map.vexs[map.v].features,newFeatures);
map.v++;//景点数加1
map.e=map.e+m;//边数加m
printf("景点添加成功!\n");
system("pause");
}
//删除景点
void DeleteVexs() {
system("cls");
if(map.v<1) {
printf("地图中没有任何景点,无法删除!\n");
system("pause");
return ;
}
ListSpots();
printf("请输入您要删除的景点编号:\n");
int a;
scanf("%d",&a);
while(a<1||a>map.v) {
printf("您的输入有误,请重新输入!范围在1~%d之间。\n",map.v);
scanf("%d",&a);
}
printf("您要删除的景点为:【%s】\n确认删除请按1,退出删除请按任意键\n",map.vexs[a-1].name);
int flag;
scanf("%d",&flag);
if(flag==1) {
int i,j;
int cnt=0;
for(i=0; i<map.v; i++) {
if(map.edges[a-1][i]!=INF)
cnt++;//记录于a景点直接相连的路径有几条
}
//删除节点 整个VertexType类型的结构体赋值
for(i=a-1; i<map.v; i++) {
map.vexs[i]=map.vexs[i+1];
}
//删除该节点在二维数组中所对应的列
for(i=0; i<map.v; i++) {
for(j=a-1; j<map.v; j++)
map.edges[i][j]=map.edges[i][j+1];
}
//删除该节点在二维数组中所对应的行
for(i=0; i<map.v; i++) {
for(j=a-1; j<map.v; j++)
map.edges[j][i]=map.edges[j+1][i];
}
map.v--;//节点数减1
map.e-=cnt;//边数减cnt
} else
return ;
printf("景点删除成功!\n");
system("pause");
}
//增加道路
void IncreaseEdges() {
system("cls");
if(map.v<=0) {
printf("地图中没有景点,无法添加道路!\n");
system("pause");
return ;
}
if(map.v==1) {
printf("地图中只有一个景点,无法添加道路!\n");
system("pause");
return ;
}
ListSpots();
if(map.e==0)
printf("当前地图中没有道路!\n");
else
printf("当前地图中含有%d条道路!\n",map.e);
printf("请输入您要添加道路的两个景点代号:\n");
int a,b;
scanf("%d %d",&a,&b);
while(a<1||a>map.v||b<1||b>map.v||a==b) {
if(a==b)
printf("您输入的景点代号相同,请重新输入!\n");
else
printf("您的输入有误,请重新输入!范围在1~%d之间。\n",map.v);
scanf("%d %d",&a,&b);
}
if(map.edges[a-1][b-1]!=INF) {
printf("【%s】与【%s】之间已经存在一条道路,无需再次添加!\n",map.vexs[a-1].name,map.vexs[b-1].name);
} else {
int d;
printf("请输入【%s】和【%s】之间道路的长度:\n",map.vexs[a-1].name,map.vexs[b-1].name);
scanf("%d",&d);
while(d<=0||d>=INF) {
printf("您输入的长度有误,请重新输入!\n");
scanf("%d",&d);
}
map.edges[a-1][b-1]=map.edges[b-1][a-1]=d;
map.e++;
printf("道路添加成功!\n");
}
system("pause");
}
//删除道路
void DeleteEdges() {
system("cls");
if(map.v<=0) {
printf("地图中没有景点,无法删除道路!\n");
}
if(map.e<=0) {
printf("地图中没有道路,无法删除!\n");
}
ListSpots();
printf("当前地图中一共有%d条道路\n",map.e);
printf("请输入您要删除的道路对应的两个景点代号,中间使用空格隔开:\n");
int a,b;
scanf("%d %d",&a,&b);
while(a<1||a>map.v||b<1||b>map.v||a==b) {
if(a==b)
printf("您输入的景点代号相同,请重新输入!\n");
else
printf("您的输入有误,请重新输入!范围在1~%d之间。\n",map.v);
scanf("%d %d",&a,&b);
}
if(map.edges[a-1][b-1]>=INF) {
printf("%s与%s之间没有道路,无法删除!\n",map.vexs[a-1].name,map.vexs[b-1].name);
} else {
printf("您确定要删除【%s】与【%s】之间的道路吗?\n",map.vexs[a-1].name,map.vexs[b-1].name);
printf("按1确认删除,按任意键退出!\n");
int flag;
scanf("%d",&flag);
if(flag==1) {
map.edges[a-1][b-1]=map.edges[b-1][a-1]=INF;
map.e--;
} else
return ;
printf("道路删除成功!\n");
}
system("pause");
}
//查找当前景点到其他景点的最短路径
void Dijkstra() {
system("cls");
if(map.v<=0) {
printf("地图中没有景点,无法查询最短路径!\n");
system("pause");
return ;
}
if(map.v==1) {
printf("地图中只有一个景点,无法查询最短路径!\n");
system("pause");
return ;
}
if(map.e<=0) {
printf("地图中没有道路,无法查询最短路径!\n");
system("pause");
return ;
}
ListSpots();
int a;
printf("请输入您所在景点位置的代号:\n");
scanf("%d",&a);
while(a<1||a>map.v) {
printf("您的输入有误,请重新输入!范围在1~%d之间。\n",map.v);
scanf("%d",&a);
}
int s[MaxVerNum];//存放源点和已生成的终点
int dist[MaxVerNum];//存放最短路径的长度
int path[MaxVerNum];//存放上一个路径的位置
int i,j,k,min,pre;
s[a-1]=1;
//初始化
for(i=0; i<map.v; i++) {
dist[i]=map.edges[a-1][i];
path[i]=a-1;
s[i]=0;//这个看网上的答案是没有的 我自己加上去的,这样就正确了
}
//对当前位置进行信息更改
dist[a-1]=0;
s[a-1]=1;
path[a-1]=-1;
for(i=0; i<map.v; i++) {
min=INF+1;
for(k=1; k<map.v; k++) {
if(s[k]==0&&dist[k]<min) {
j=k;
min=dist[k];
}
}
s[j]=1;
for(k=0; k<map.v; k++) {
if(s[k]==0&&(dist[j]+map.edges[j][k]<dist[k])) {
dist[k]=dist[j]+map.edges[j][k];
path[k]=j;
}
}
}
int flag=1;
for(i=0; i<map.v; i++) {
if(i!=a-1) {
if(dist[i]!=INF) {
flag=0;
printf("%d米: %s",dist[i],map.vexs[i].name);
pre=path[i];
while(pre>=0) {
printf(" <-%s",map.vexs[pre].name);
pre=path[pre];
}
printf("\n");
}
}
}
if(flag)
printf("【%s】与任何景点之间都没有可通道路!\n",map.vexs[a-1].name);
system("pause");
}
//查找任一两个景点之间的最短路径
void Floyd() {
system("cls");
if(map.v<=0) {
printf("地图中没有景点,无法查询最短路径!\n");
system("pause");
return ;
}
if(map.v==1) {
printf("地图中只有一个景点,无法查询最短路径!\n");
system("pause");
return ;
}
if(map.e<=0) {
printf("地图中没有道路,无法查询最短路径!\n");
system("pause");
return ;
}
ListSpots();
int a,b;
printf("请输入您要查询距离的两个景点代号,中间用空格隔开:\n");
scanf("%d %d",&a,&b);
while(a<1||a>map.v||b<1||b>map.v) {
printf("您的输入有误,请重新输入!范围在1~%d之间。\n",map.v);
scanf("%d %d",&a,&b);
}
int s[MaxVerNum];//存放源点和已生成的终点
int dist[MaxVerNum];//存放最短路径的长度
int path[MaxVerNum];//存放上一个路径的位置
int i,j,k,min,pre;
s[a-1]=1;
//初始化
for(i=0; i<map.v; i++) {
dist[i]=map.edges[a-1][i];
path[i]=a-1;
s[i]=0;//这个看网上的答案是没有的 我自己加上去的,这样就正确了
}
//对当前位置进行信息更改
dist[a-1]=0;
s[a-1]=1;
path[a-1]=-1;
for(i=0; i<map.v; i++) {
min=INF+1;
for(k=1; k<map.v; k++) {
if(s[k]==0&&dist[k]<min) {
j=k;
min=dist[k];
}
}
s[j]=1;
for(k=0; k<map.v; k++) {
if(s[k]==0&&(dist[j]+map.edges[j][k]<dist[k])) {
dist[k]=dist[j]+map.edges[j][k];
path[k]=j;
}
}
}
if(dist[b-1]==INF)
printf("【%s】与【%s】任何景点之间都没有可通道路!\n",map.vexs[a-1].name,map.vexs[b-1].name);
else {
printf("【%s】->【%s】的最短距离是%d米。 \n",map.vexs[b-1].name,map.vexs[a-1].name,dist[b-1]);
pre=path[b-1];
printf("路径为:%s",map.vexs[b-1].name);
while(pre>=0) {
printf("-> %s",map.vexs[pre].name);
pre=path[pre];
}
}
printf("\n");
system("pause");
}
//河大景点列表
void ListSpots() {
if(map.v==0) {
printf("当前地图中没有景点!\n\n");
system("pause");
return ;
}
if(map.v>0)
printf("河北大学有当前景点:\n\n");
int i;
for(i=0; i<map.v; i++) {
printf("\t<%d>%s\n",i+1,map.vexs[i].name);
}
}
//创建邻接链表
void create() {
map.v=12;
map.e=20;
int i,j,k;
for(i=0; i<MaxVerNum; i++) {
for(j=0; j<MaxVerNum; j++) {
map.edges[i][j]=INF;
}
}
//顶点的名字 介绍赋值
strcpy(map.vexs[0].name, "体检中心");
strcpy(map.vexs[0].features, "这是个什么地方,我从来没去过!!!");
strcpy(map.vexs[1].name, "操场");
strcpy(map.vexs[1].features, "大一大二的体育课在这里上,春秋早晚跑步的同学超多的。");
strcpy(map.vexs[2].name, "校门北口");
strcpy(map.vexs[2].features, "疫情期间的唯一开放通道,老北街原址附近,现在已经增加了可移动的红绿灯。");
strcpy(map.vexs[3].name, "银杏景观");
strcpy(map.vexs[3].features, "河大新区专属的标志,秋季拍照打卡的圣地,附近的居民也超爱的。");
strcpy(map.vexs[4].name, "邯郸音乐厅");
strcpy(map.vexs[4].features, "河北大学举办音乐活动的场所,场馆可容纳1500名学生,进去过一次。");
strcpy(map.vexs[5].name, "图书馆");
strcpy(map.vexs[5].features, "河大新区的标志性建筑,环境优美,冬暖夏凉,入馆体验超级棒,期末前夕人爆满。");
strcpy(map.vexs[6].name, "信息学部");
strcpy(map.vexs[6].features, "河北大学工商学院唯一的理工科学部,成立于2001年。");
strcpy(map.vexs[7].name, "花园景观");
strcpy(map.vexs[7].features, "图书馆前面的风景,我猜着:应该是为了凸显图书馆的存在,欣赏不来。");
strcpy(map.vexs[8].name, "校门东口");
strcpy(map.vexs[8].features, "疫情期间封闭门,请假可出行,问一句,什么时候可以开放啊?");
strcpy(map.vexs[9].name, "网计学院");
strcpy(map.vexs[9].features, "2017年9月正式更名为河北大学网络空间安全与计算机学院,很荣幸来到贵院!");
strcpy(map.vexs[10].name, "校园南口");
strcpy(map.vexs[10].features, "教学区大门,公交站点,紧邻省道,方便师生的出行。");
strcpy(map.vexs[11].name, "餐厅");
strcpy(map.vexs[11].features, "网红餐厅,环境优美,好吃,部分有点小贵;服务态度好,超级建议错峰就餐,人超多。");
//边的权重赋值
map.edges[0][1]=map.edges[1][0]=350;
map.edges[0][4]=map.edges[4][0]=200;
map.edges[1][2]=map.edges[2][1]=200;
map.edges[1][4]=map.edges[4][1]=480;
map.edges[1][5]=map.edges[5][1]=280;
map.edges[2][3]=map.edges[3][2]=100;
map.edges[2][11]=map.edges[11][2]=100;
map.edges[3][11]=map.edges[11][3]=100;
map.edges[4][5]=map.edges[5][4]=400;
map.edges[4][6]=map.edges[6][4]=500;
map.edges[4][9]=map.edges[9][4]=500;
map.edges[5][7]=map.edges[7][5]=160;
map.edges[5][8]=map.edges[8][5]=300;
map.edges[6][7]=map.edges[7][6]=150;
map.edges[6][10]=map.edges[10][6]=400;
map.edges[7][8]=map.edges[8][7]=200;
map.edges[8][10]=map.edges[10][8]=600;
map.edges[8][11]=map.edges[11][8]=100;
map.edges[9][10]=map.edges[10][9]=400;
map.edges[10][7]=map.edges[7][10]=500;
}
void Exit() {
printf("\n【警告】:\n退出系统之后,当前的所有操作将会恢复默认值。\n");
printf("确认退出请按1,按任意键停止当前退出操作。\n");
int flag;
scanf("%d",&flag);
if(flag==1) {
system("cls");
exit(0);
}
}
void changepassword() {
printf("请输入新密码:\n");
char newword[20];
scanf("%s",newword);
strcpy(PASSWORD,newword);
printf("密码修改成功!请记住您的新密码。\n");
printf("【注意】:新密码会在您下一次进入该程序时失效并恢复系统默认密码!\n");
system("pause");
}