c语言编写学校导航作业,课内资源

1.设计思想

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

2.系统功能

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

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

主要功能:

遍历所有景点

输出任意景点信息

输出任意两景点的最短路径

输入错误可重新输入功能

能返回上一界面功能

输出学校简介、制作人页面

可以正常结束程序

3.总体设计

功能模块

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

2f01f3975b59be0823d48fcc113fd94e.png

4.详细设计

4.1 详细的设计思路进入导航系统,遍历所有景点及查询两景点间的最短路径都是通过迪杰斯特拉求单源最短路算法来实现,将各景点间的权值存入二维数组map[ ]中,通过迪杰斯特拉算法,每次找距离开始点最近的点,在通过这个点去更新别的边权值,同时将更新的点存储,放入栈中输出即为到终点所走路径。

查询所有景点信息是先将景点信息存储然后输出,景点信息是利用string.h头文件中的strcpy( )函数将各景点名称及信息存入到结构体中。查询那个输出对应下标存储的字符串。

返回主界面直接调用函数。

4.2 算法流程图

3b3f47cf4f63e8f49397f76a4f795ffb.png

5.编码

5.1 数据结构定义

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

structA//定义结构体存储景点信息

{

charname[100];

charjieshao[800];

}q[100];

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

intmap[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;

}

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

intp[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 函数流程图

8b4907f7d07647a9a36d5f6377f40d6c.png

voidDijkstra(intv0,ints)//迪杰斯特拉求最短路径,并输出路线

{

intmin,i,j,u,v;

intp[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]

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=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.程序运行图

开始界面

dac9fd07c81da4e28711679169765f0f.png

主界面

cdb61f59513afd36b26cb23810d5e571.png

运行界面1

5bad2cdd145bd851951b0a86174bab81.png

运行界面2

c6eb37386abdb037441037ea7421543a.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值