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

相关推荐
敲代码的小王!1 小时前
MD5加密算法和BCrypt密码加密算法
java·算法·安全
罗政6 小时前
冒险岛079 V8 整合版源码搭建教程+IDEA启动
java·ide·intellij-idea
架构默片7 小时前
【JAVA工程师从0开始学AI】,第五步:Python类的“七十二变“——当Java的铠甲遇见Python的液态金属
java·开发语言·python
不只会拍照的程序猿7 小时前
从插入排序到希尔排序
java·开发语言·数据结构·算法·排序算法
陈译8 小时前
Grafana——如何迁移Grafana到一台新服务器
运维·服务器·grafana
wangjun51598 小时前
linux redis ipv6、ipv4 只接收本地访问、接收本地和远程访问
linux·运维·服务器
x66ccff8 小时前
【nvidia】NCCL禁用P2P后果权衡
服务器·网络协议·p2p
信阳农夫8 小时前
linux中yum是干啥的?
linux·运维·服务器
YH_DevJourney8 小时前
Linux-C/C++《C/7、字符串处理》(字符串输入/输出、C 库中提供的字符串处理函数、正则表达式等)
linux·c语言·c++
就爱学编程8 小时前
C语言预编译
c语言·开发语言