基于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

相关推荐
渣哥9 小时前
原来 Java 里线程安全集合有这么多种
java
间彧9 小时前
Spring Boot集成Spring Security完整指南
java
间彧10 小时前
Spring Secutiy基本原理及工作流程
java
Java水解11 小时前
JAVA经典面试题附答案(持续更新版)
java·后端·面试
洛小豆13 小时前
在Java中,Integer.parseInt和Integer.valueOf有什么区别
java·后端·面试
前端小张同学13 小时前
服务器上如何搭建jenkins 服务CI/CD😎😎
java·后端
ytadpole13 小时前
Spring Cloud Gateway:一次不规范 URL 引发的路由转发404问题排查
java·后端
华仔啊14 小时前
基于 RuoYi-Vue 轻松实现单用户登录功能,亲测有效
java·vue.js·后端
程序员鱼皮14 小时前
刚刚 Java 25 炸裂发布!让 Java 再次伟大
java·javascript·计算机·程序员·编程·开发·代码