实验内容:设计一个校园导游程序,为来访客人提供各种信息查询服务。测试数据根据实际情况指定。提示:一般情况下,校园的道路是双向通行的,可设校园平面图是一个无向图。顶点和边均含有相关信息。
实验要求: 1、设计所在学校的校园平面图,所含景点不少于10个。以图中顶点表示校内各景点,存放景点名称、代号、简介等信息;以边表示路径,存放路径长度等相关信息。 2、为来访客人提供图中任意景点相关信息的查询。 3、为来访客人提供图中任意景点的纹路查询,即查询任意两个景点之间的一条最短的简单路径。
实验内容和实验步骤:
1.构建存储景点信息的结构体
2.对邻接矩阵和路径矩阵初始化
3.输入景点信息和矩阵的信息
4.利用弗洛伊德算法求出最短路径,并用path数组存储中间节点
5.书写功能菜单
6.实现第一个功能查询节点信息
7.实现第二个功能查询两个景点的最短路径
代码如下:#include<stdio.h>
#include<string.h>
#define N 10
struct scene {
char name[20]={};
int num=0;
char information[200] = {};
};
void origin(int array[N][N] )
{
for(int i=0;i<N;i++)
for (int j = 0; j < N; j++)
{
array[i][j] = 10000;
}
}
void nodecreat(scene node[N],int num = 0,const char name[20]={}, const char information[200]={})
{
int i = 0;
node[num - 1].num = num;
while (name[i] != NULL) { node[num - 1].name[i] = name[i]; i++; }
i = 0;
while (information[i] != NULL) { node[num - 1].information[i] = information[i]; i++; }
}
void waycreat(int frist, int last, int way,int array[N][N]) {
array[frist][last] = way;
array[last][frist] = way;
}
void nodedistance(int array[N][N], int path[N][N])
{
for(int k=0;k<N;k++)
for(int i=0;i<N;i++)
for (int j = 0; j < N; j++)
{
if (array[i][j] > array[i][k] + array[k][j]) {
array[i][j] = array[i][k] + array[k][j];
array[j][i] = array[i][j];
path[i][j] = k;
path[j][i] = k;
}
}
}
void nodeinformation(scene node[N])
{
int select = 1;
for (int i = 0; i < N; i++)
{
printf("%d.%s\n", node[i].num, node[i].name);
}
printf("请输入要查询得到点的代号(输入0退出查询):");
while (select) {
scanf_s("%d",&select);
if(select)
printf("%d.%s:\n%s\n", node[select - 1].num, node[select - 1].name, node[select - 1].information);
}
}
void distance(int array[N][N],int path[N][N],scene node[N])
{
int frist = 1,last=0,zj=0,t=0;
int path1[N]; for (int i = 0; i < N; i++) { path1[i] = 10000; }
for (int i = 0; i < N; i++)
{
printf("%d.%s\n", node[i].num, node[i].name);
}
printf("请输入要查寻路径的起始点和终点的代号(输入0退出查询),");
while (frist) {
t = 0;
printf("起始点:\n");
scanf_s("%d",&frist);
if (frist) {
printf("终点:\n");
scanf_s("%d",&last);
zj = path[frist-1][last-1];
path1[t] = zj;
t++;
while (zj != 10000) {
zj = path[frist - 1][path1[t-1]];
path1[t] = zj;
t++;
}
printf("路径为:%d.%s->",frist,node[frist-1].name);
int i = 0;
for (t=t-2; t >= 0; t--)
{
int j = path1[t] + 1;
printf("%d.%s->", j, node[path1[t]].name);
}
printf("%d.%s\n", last, node[last - 1].name);
}
}
}
int main()
{
int array[N][N],path[N][N];
scene node[N];
int select = 5;
origin(array);//初始化数组
origin(path);
nodecreat(node,1, "图书馆", "这里是学校的图书馆");
nodecreat( node,2, "一食堂", "这里是学校的一食堂");
nodecreat( node,3, "二食堂", "这里是学校的二食堂");
nodecreat( node,4, "东区操场", "这里是学校的东区操场");
nodecreat( node,5, "教学楼2", "这里是学校的教学楼2");
nodecreat( node,6, "教学楼3", "这里是学校的教学楼3");
nodecreat( node,7, "教学楼4", "这里是学校的教学楼4");
nodecreat( node,8, "二五广场", "这里是学校的二五广场");
nodecreat( node,9, "北区宿舍", "这里是学校的北区宿舍");
nodecreat( node,10, "东区宿舍", "这里是学校的东区宿舍");
waycreat(0, 1, 600,array);
waycreat(0, 3, 500, array);
waycreat(0, 6, 500, array);
waycreat(0, 7, 400, array);
waycreat(0, 8, 900, array);
waycreat(1, 2, 30, array);
waycreat(1, 6, 100, array);
waycreat(1, 8, 50, array);
waycreat(2, 7, 210, array);
waycreat(2, 6, 100, array);
waycreat(2, 8, 40, array);
waycreat(3, 6, 80, array);
waycreat(3, 8, 150, array);
waycreat(3, 9, 150, array);
waycreat(4, 5, 50, array);
waycreat(4, 6, 100, array);
waycreat(4, 7, 10, array);
waycreat(5, 6, 50, array);
waycreat(5, 8, 150, array);
waycreat(6, 8, 300, array);
waycreat(7, 8, 250, array);
waycreat(8, 9, 100, array);
waycreat(7, 9, 200, array);
nodedistance(array, path);
while (select != 3) {
printf("\n\t请选择你要使用的功能\n\t\t1.查询各个景点的信息\n\t\t2.查询两个景点之间的路线\n\t\t3.退出服务\n");
scanf_s("%d", &select);
switch (select)
{
case 1:nodeinformation(node); break;
case 2:distance(array, path, node); break;
}
}
return 0;
}