基于C语言实现的(控制台)校园导航系统

基于C语言的校园导航系统

1.设计思想

利用迪杰斯特拉求单源最短路算法,设计出郑州升达经贸管理学院的校园导航,求出学校一个景点到另一个景点的最短距离及路线。

2.系统功能

将校园设计为平面图,将学校各代表景点构成一个抽象的无向带权图,顶点为景点,边的权值代表了景点间路径的长度。设计出能够帮助人们快速找到从一个景点到达另一景点的最短路径及路线;以及能够显示任意景点信息的程序。

将学校各代表景点信息及名称运用结构体进行存储,各景点之间的权值存入二维数组map[ ]中,查询景点信息直接运用printf输出函数%s输出存储好的信息;利用迪杰斯特拉算法求出单源最短路,及输出路径。

主要功能

  • 遍历所有景点
  • 输出任意景点信息
  • 输出任意两景点的最短路径
  • 输入错误可重新输入功能
  • 能返回上一界面功能
  • 输出学校简介、制作人页面
  • 可以正常结束程序

3.总体设计

功能模块

通过主界面选择是进入导航系统、查看学校简介、查看制作人还是退出程序;导航系统要能实现遍历所有景点、查询任意景点信息、查询任意两景点间最短路径及返回至主界面功能。

4.详细设计

4.1 详细的设计思路

  • 进入导航系统,遍历所有景点及查询两景点间的最短路径都是通过迪杰斯特拉求单源最短路算法来实现,将各景点间的权值存入二维数组map[ ]中,通过迪杰斯特拉算法,每次找距离开始点最近的点,在通过这个点去更新别的边权值,同时将更新的点存储,放入栈中输出即为到终点所走路径。
  • 查询所有景点信息是先将景点信息存储然后输出,景点信息是利用string.h头文件中的strcpy( )函数将各景点名称及信息存入到结构体中。查询那个输出对应下标存储的字符串。
  • 返回主界面直接调用函数。

4.2 算法流程图

5.编码

5.1 数据结构定义

定义结构体顺序存储景点名称及景点信息。

cpp 复制代码
struct A		//定义结构体存储景点信息 
{
char name[100];
char jieshao[800];
}q[100];

定义二维数组存储建立无向带权图。

cpp 复制代码
int map[110][110];
for(i=1;i<=28;i++)
    for(j=1;j<=28;j++)
    {
        if(i==j)
            map[i][j]=0;
        else
            map[i][j]=inf;
    }

定义数组作为栈顺序结构存储所走过的路径。

cpp 复制代码
int p[110],l[110];
i=1;
while(p[v]!=v0)			//将路线存入栈中,正序输出 
{
    l[i++]=p[v];
    v=p[v];
}

5.2 功能函数设计

  • void cuntu() 初始化存图函数
  • void zhujiemian() 输出欢迎界面函数
  • void daohanglan() 主界面函数
  • void kaishidaohang() 开始导航函数
  • void liebiao() 景点列表函数
  • int chaxunfangshi(int x) 查询方式函数
  • int bianhao(char s[]) 查询景点下标函数
  • void Dijkstra(int v0,int s) 迪杰斯特拉求最短路径函数

5.3 函数流程图

cpp 复制代码
void Dijkstra(int v0,int s)		//迪杰斯特拉求最短路径,并输出路线 
{
    int min,i,j,u,v;
    int p[110],l[110];
    memset(p,-1,sizeof(p));
    memset(l,0,sizeof(l));
    memset(book,0,sizeof(book));
    for(i=1;i<=26;i++)
        {
            dis[i]=map[v0][i];
            if(dis[i]<inf)			//v0能直接到达,即上一站点为v0 
                p[i]=v0;
        }

    book[v0]=1;

    for(i=1;i<26;i++)
        {
            min=inf;
            for(j=1;j<=26;j++)			//每次找出距离v0最近点 
                {
                    if(book[j]==0&&dis[j]<min)
                    {
                        min=dis[j];
                        u=j;
                    }
                }
            book[u]=1;			//标记该点 
            for(v=1;v<=26;v++)
                {
                    if(book[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("路线为:\n");
    printf("%s--->",q[v0].name);
    for(i=u;i>=1;i--)
        printf("%s--->",q[l[i]].name); 
    printf("%s\n",q[s].name);
    printf("最短路径长度为:%d 米\n",dis[s]);
}

6.程序运行图

开始界面

主界面

运行界面1

运行界面2

相关推荐
蘑菇丁16 分钟前
ansible 批量按用户名创建kerberos主体,并分发到远程主机
大数据·服务器·ansible
蘑菇丁19 分钟前
ansible批量生产kerberos票据,并批量分发到所有其他主机脚本
java·ide·eclipse
幻想编织者20 分钟前
Ubuntu实时核编译安装与NVIDIA驱动安装教程(ubuntu 22.04,20.04)
linux·服务器·ubuntu·nvidia
利刃大大1 小时前
【Linux入门】2w字详解yum、vim、gcc/g++、gdb、makefile以及进度条小程序
linux·c语言·vim·makefile·gdb·gcc
呼啦啦啦啦啦啦啦啦1 小时前
【Redis】持久化机制
java·redis·mybatis
C嘎嘎嵌入式开发1 小时前
什么是僵尸进程
服务器·数据库·c++
我想学LINUX2 小时前
【2024年华为OD机试】 (A卷,100分)- 微服务的集成测试(JavaScript&Java & Python&C/C++)
java·c语言·javascript·python·华为od·微服务·集成测试
雁于飞2 小时前
c语言贪吃蛇(极简版,基本能玩)
c语言·开发语言·笔记·学习·其他·课程设计·大作业
乙己4077 小时前
计算机网络——网络层
运维·服务器·计算机网络