实验四(必做,设计性实验,6学时)实验题目:校园导游咨询实验目的:掌握图的存储方法和最短路经算法。

实验内容:设计一个校园导游程序,为来访客人提供各种信息查询服务。测试数据根据实际情况指定。提示:一般情况下,校园的道路是双向通行的,可设校园平面图是一个无向图。顶点和边均含有相关信息。

实验要求:   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;

}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值