C语言校园导航系统文档格式.docx
- 文档编号:22969910
- 上传时间:2023-02-06
- 格式:DOCX
- 页数:21
- 大小:189.42KB
C语言校园导航系统文档格式.docx
《C语言校园导航系统文档格式.docx》由会员分享,可在线阅读,更多相关《C语言校园导航系统文档格式.docx(21页珍藏版)》请在冰豆网上搜索。
输入2,选择查看各地点信息
输入3,选择查找两地点间最短路径
输入4,退出程序
总流程图:
开始
执行Menu函数
输入选择i
i=4?
Y
N
i=?
13
2
求最短路径模块
地点信息查询模块
平面图模块
结束
平面图模块流程图:
输出校园平面图
地点信息查询模块流程图:
输出各地点编号
输入查询地点编号
执行Query()函数
输出地点信息
求最短路径模块流程图:
输入起点地点编号
输入终点地点编号
运用Floyd算法求出最短路径
输出最短路径和路程
实现过程:
从学校的平面图中选取出12个比较重要的地点,将其抽象成无向带权网并用邻接矩阵来表示。
以图中的顶点代表地点,存放地点名称、编号、简介等信息,权值代表两地之间的距离。
最短路径用Floyd算法求出。
地点间距离用地图软件测出。
将得到的信息绘制成无向网:
1.体育馆
2.北区宿舍
3.图书馆
4.樱花广场
5.三教
6.东门
7.青春广场
8.西区食堂
9.西区宿舍
10.南区食堂
11.南区宿舍
12.南门
1
170
2
200
3
150
6
30300
4
5
30500
7.
8
160
100
570
160
9
11
10
12
180
10020
程序用到的函数:
MGraphInitGraph(MGraph&
G)//构造校园图
voidMenu()//初始菜单
voidMap()//校园平面图
VoidNumber()//输出地点编号,在其他操作中会用到
voidQuery(MGraphG)//查找函数,可以输出地点名称和介绍
voidfloyd(MGraphG)//floyd算法
voidshortestPath_Floyd(MGraph&
G)//求最短路径
voidmain();
//主函数
(1)图的存储结构:
typedefstruct
{
charname[30];
//地点名称
intnum;
//地点编号
charintroduction[200];
//地点介绍
}VertexType;
typedefstruct{
VertexTypevexs[MAX];
//地点
intarcs[MAX][MAX];
//存储图的邻接矩阵
intvexNum,arcNum;
//地点数,路径数
}MGraph;
(2)构造校园图:
MGraphInitGraph(MGraph&
G)//构造校园图
inti,j;
G.vexNum=12;
G.arcNum=16;
for(i=1;
i<
=G.vexNum;
i++)
G.vexs[i].num=i;
strcpy(G.vexs[1].name,"
体育馆"
);
strcpy(G.vexs[1].introduction,"
有田径场及各种体育活动场馆"
strcpy(G.vexs[2].name,"
北区宿舍"
strcpy(G.vexs[2].introduction,"
学校北区的宿舍"
strcpy(G.vexs[3].name,"
图书馆"
strcpy(G.vexs[3].introduction,"
有着丰富的藏书,是学习、自习的好地方"
strcpy(G.vexs[4].name,"
樱花广场"
strcpy(G.vexs[4].introduction,"
有很多樱花树,适合早读"
strcpy(G.vexs[5].name,"
三教"
strcpy(G.vexs[5].introduction,"
学校的教学区"
strcpy(G.vexs[6].name,"
东门"
strcpy(G.vexs[6].introduction,"
学校的正门"
strcpy(G.vexs[7].name,"
青春广场"
strcpy(G.vexs[7].introduction,"
经常有各种各样的社团活动"
strcpy(G.vexs[8].name,"
西区食堂"
strcpy(G.vexs[8].introduction,"
西区的食堂,饭菜很好吃"
strcpy(G.vexs[9].name,"
西区宿舍"
strcpy(G.vexs[9].introduction,"
学校西区的宿舍,既有男生宿舍也有女生宿舍"
strcpy(G.vexs[10].name,"
南区食堂"
strcpy(G.vexs[10].introduction,"
南区食堂,饭菜很好吃"
strcpy(G.vexs[11].name,"
南区宿舍"
strcpy(G.vexs[11].introduction,"
学校南区的宿舍,全是男生宿舍"
strcpy(G.vexs[12].name,"
南门"
strcpy(G.vexs[12].introduction,"
学校的南门,比较小"
for(i=0;
G.vexNum;
for(j=0;
j<
j++){
G.arcs[i][j]=INFINITY;
//不存在的路径长度设为无穷大
G.arcs[0][1]=170;
G.arcs[1][2]=200;
G.arcs[1][4]=150;
G.arcs[2][3]=30;
G.arcs[2][4]=150;
G.arcs[2][5]=300;
G.arcs[3][4]=30;
G.arcs[4][6]=170;
G.arcs[4][7]=160;
G.arcs[5][6]=500;
G.arcs[5][10]=570;
G.arcs[6][7]=100;
G.arcs[7][8]=160;
G.arcs[8][9]=180;
G.arcs[9][10]=100;
G.arcs[10][11]=20;
}
i++)//无向网的邻接矩阵关于对角线对称
j++)
G.arcs[j][i]=G.arcs[i][j];
returnG;
}
(3)菜单模块:
voidMenu()//初始菜单
printf("
\n\n东华理工大学校园导游系统\n"
┏━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n"
┃编号┃功能┃\n"
┣━━╋━━━━━━━━━━━━━━━━━━━━━━━━━━┫\n"
┃1┃查看学校平面图┃\n"
┃2┃查看地点信息┃\n"
┃3┃查找两地点间最短路径┃\n"
┃4┃退出┃\n"
┗━━┻━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n"
输入你的选择:
"
(4)平面图模块:
voidMap()//校园平面图
{
\n"
┏━━━━━━━┓\n"
┃┃\n"
┃1.体育馆┃\n"
┃┃\n"
┗━━━┳━━━┛\n"
┃\n"
┏━━━┻━━━┓\n"
┏━━━━━━━━━┳━━━┫2.北区宿舍┣━━━┓\n"
┃┃┃┃┃\n"
┃┃┗━━━━━━━┛┃\n"
┃┏━━━━━━━┓┃┃\n"
┃┃┃┃┃\n"
┏━━┓┃┃┃┃┣┓\n"
┃┣╋┫3.图书馆┣┫┃┃6.\n"
┃4.┃┃┃┃┃┃┃东\n"
┃樱┃┃┃┃┣━━━━━━━━━━━━━━━┫┃门\n"
┃花┃┃┗━━━━━━━┛┃┃┃\n"
┃广┃┃┏━━━━━━━┓┃┃┃\n"
┃场┃┃┃┃┃┣┛\n"
┃┃┃┃┃┃┃\n"
┃┣┻┫5.三教┣┫┃\n"
┗━━┛┃┃┃┃\n"
┃┃┃┃\n"
┗━━━━━━━┛┣━━━━┳━━━━━━━━━━┫\n"
┃┏━━━┻━━━┓┃\n"
┏━━━━━━━┓┃┃┃┃\n"
┃┃┃┃┃┃\n"
┃┃┃┃7.青春广场┃┃\n"
┃8.西区食堂┣╋┫┃┃\n"
┗━━━━━━━┛┃┗━━━━━━━┛┃\n"
┏━━━━━━━┓┃┃\n"
┃9.┃┃┃\n"
┃西┃┃┃\n"
┃区┣┫┃\n"
┃宿┃┃┃\n"
┃舍┃┃┃\n"
┗━━━━━━━┛┃┃\n"
┃┏━━━━━━━━━━━┓┃\n"
┃┃┃┃┃┏┻┓\n"
┃10.南区食堂┣┻┫11.南区宿舍┣━┫┃\n"
┃┃┃┃┗━┛\n"
┃┃┃┃12.南门\n"
┗━━━━━━━┛┃┃\n"
┗━━━━━━━━━━━┛\n"
printf("
请按任意键继续!
getch();
(5)地点编号函数:
VoidNumber()//输出地点编号,在其他操作中会用到
intv;
\n\n┏━━┳━━━━━━┓\n"
┃编号┃地点名称┃\n"
for(v=1;
v<
v++){
printf("
┃%-4d┃%-12s┃\n"
G.vexs[v].num,G.vexs[v].name);
┗━━┻━━━━━━┛\n"
(6)地点信息查询模块:
intk,i=1;
Number();
while(i)
{
请输入要查询的地点编号,输入0退出:
scanf("
%d"
&
k);
if(k<
0||k>
G.vexNum)
{
printf("
地点编号不存在!
请重新输入地点编号:
scanf("
}
%d.%s%-62s\n\n"
G.vexs[k].num,G.vexs[k].name,G.vexs[k].introduction);
if(k==0)
i=0;
(7)Floyd算法求最短路径:
intD[MAX][MAX],Path[MAX][MAX];
voidfloyd(MGraphG)//Floyd算法
inti,j,k;
for(j=0;
j++){
D[i][j]=G.arcs[i][j];
if(i!
=j&
&
G.arcs[i][j]<
INFINITY)Path[i][j]=i;
elsePath[i][j]=-1;
for(k=0;
k<
k++)
for(i=0;
for(j=0;
if(D[i][k]+D[k][j]<
D[i][j]){
D[i][j]=D[i][k]+D[k][j];
Path[i][j]=Path[k][j];
}
G)//求最短路径
inti,j,p,m,k;
intb[100];
floyd(G);
do{
请输入起点编号:
i);
请输入终点编号:
j);
if(i==j)
起点和终点一样,请重新输入\n"
elseif(i>
12||i<
0||j>
12||j<
0)
输入错误,请重新输入\n"
}while(i==j||i>
0);
i=i-1;
j=j-1;
=j){
printf("
起点:
%s,终点:
%s\n最短路径:
G.vexs[i+1].name,G.vexs[j+1].name);
p=Path[i][j];
if(p==-1)printf("
empty\n"
else{
m=0;
b[m++]=j;
while(p!
=i){b[m++]=p;
p=Path[i][p];
b[m]=i;
for(k=m;
k>
0;
k--)printf("
%s->
G.vexs[b[k]+1].name);
%s,路程为%d米\n"
G.vexs[b[0]+1].name,D[i][j]);
}
}
\n\n按任意键继续\n\n"
getch();
(8)主函数:
voidmain()//主函数
InitGraph(G);
inti;
Menu(G);
scanf("
//输入选择
while(i!
=4)//输入4,则退出
switch(i)
{//每次选择后会调用清屏函数,使界面美观
case1:
system("
CLS"
Map();
Menu(G);
break;
//若输入1,则输出平面图
case2:
Query(G);
//若输入2,则查找并输出地点名称和介绍
case3:
shortestPath_Floyd(G);
//若输入3,则找出最短路径
case4:
;
default:
输入错误,清重新输入\n"
scanf("
运行结果:
图1:
初始菜单,输入1查看学校平面图,输入2查看地点信息,输入3查找两地点间最短路径,输入4退出。
图2:
查看地点信息
输入要查询的地点编号,输入错误则出现错误提示,并重新输入。
输入0则返回初始菜单。
图3:
查看学校平面图
图4.1:
查找两地间最短路径
输入起点和终点编号,则会计算出最短路径和路程
图4.2:
若输入的起点或终点编号错误,则出现错误提示,并重新输入。
实验总结:
程序能满足实验要求,较好的实现的了各个功能,做到了实用方便,但仍有很多不足之处,主要是以下几点:
1.按要求将校园平面图信息抽象为无向网用邻接矩阵存储,能较好的表现校园各地点信息,并能方便地使用Floyd算法查找最短路径,但邻接矩阵不适用与两顶点之间有多条边的情况,所以对于有道路直接相连的两地点,只取路程最短的路,虽然对于各功能没有影响,但平面图的信息并没有全部存储。
2.同时由于地点本身有长度和面积,并不能完全抽象为一个顶点,对于没有道路直接相连的地点,因为中间要经过其他地点,而经过的地点的长度并未算在路程内,所以计算出的路程长度要比实际长度略短。
3.对于输出校园平面图的功能,只简单的用printf()函数输出,用一个个符号组成平面图,这个方法费时费力,但还没有找到更好的方法。
心得体会:
通过完成这次课程设计,我学会了综合运用所学的数据结构知识解决一个具体的问题,尤其是熟悉了对图的相关内容的应用,更加深入的了解了求最短路径算法的原理,使得能进一步熟悉掌握数据结构的基础知识,并在编写程序的过程中,掌握了很多编程技巧,学会了使用一些新的功能函数,进一步提升了自己的解决问题和编程调试的能力。
并且意识到编程要有条理和规划。
对于一个项目,要先分析需求,再将不同需求划分成各个模块。
编程过程中要注意代码格式,要添加必要的注释,这样可以减少很多不必要的麻烦。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 校园 导航系统
![提示](https://static.bdocx.com/images/bang_tan.gif)