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

相关推荐
ly76894 分钟前
磁盘 I/O 延迟突增:用 iostat、blktrace 与火焰图定位到具体调用栈
java·linux·前端·数据库·iostat·磁盘 i/o·blktrace
程序员-Benothing6 分钟前
Linux查找文件命令:find、locate、which、whereis实战
linux·运维·服务器
泡海椒8 分钟前
jquick-pdf 核心原理解析:基于 HTML 模板动态渲染 PDF 的实现逻辑
java·开发语言·pdf
团子股股东峥哥16 分钟前
day39-RHEL-访问网络附加存储
linux·运维·服务器
Bs_MoneyMagnet16 分钟前
基于springboot+vue的图书馆预约系统的设计与实现 源码+文档
java·vue.js·spring boot·后端·毕业设计·图书管理系统·计算机毕业设计
小蒜学长27 分钟前
基于小程序的绘画作品创作与分享社区系统的设计与实现(代码+数据库+LW)
java·spring boot·后端·绘画作品·创作分享社区
金玉满堂@bj30 分钟前
# Java文件打包成可执行JAR包(两种方式:原生javac\+jar命令 / Maven)
java
事圆则缓38 分钟前
Java 异常、日志与 Android 崩溃定位
java
砍材农夫2 小时前
spring|spring web|拦截器、过滤器、aop
java·spring boot·spring·spring cloud
程序员-Benothing2 小时前
Linux文件查看与编辑:cat、less、tail、vim快速入门
linux·运维·服务器