C语言校园导航系统.docx

上传人:b****8 文档编号:10519875 上传时间:2023-02-17 格式:DOCX 页数:22 大小:266.73KB
下载 相关 举报
C语言校园导航系统.docx_第1页
第1页 / 共22页
C语言校园导航系统.docx_第2页
第2页 / 共22页
C语言校园导航系统.docx_第3页
第3页 / 共22页
C语言校园导航系统.docx_第4页
第4页 / 共22页
C语言校园导航系统.docx_第5页
第5页 / 共22页
点击查看更多>>
下载资源
资源描述

C语言校园导航系统.docx

《C语言校园导航系统.docx》由会员分享,可在线阅读,更多相关《C语言校园导航系统.docx(22页珍藏版)》请在冰豆网上搜索。

C语言校园导航系统.docx

C语言校园导航系统

 

课程设计报告

 

课程设计题目:

校园导航

专业:

计算机科学与技术

班级:

1230701

学号:

************

*******

*******

 

2014年6月19日

实验题目:

校园导航系统

 

实验时间:

2014/6/16-2014/6/19

 

实验地点:

软件楼402

 

实验目的:

综合运用所学的数据结构知识解决一个关于学校导航系统的问题,侧重对图的相关内容特别是求最短路径的应用,使得能进一步熟悉掌握数据结构的基础知识,进一步提升自己的解决问题和编程调试能力,为后续专业课程的学习打下基础。

 

实验要求:

设计学校的平面图,至少包括10个以上的场所,每两个场所间可以有不同的路,且路长也可能不同,找出从某个场所到达另一场所的最佳路径。

求最短路径用Dijkstra或Floryd算法实现。

 

实现思路:

先分析需求,本程序的主要目的是提供本学校地点的路径查询,并提供其他各种信息查询服务。

需求:

1、提供校园平面图,使得能直观的了解学校。

2、提供地点信息查询,为各地点提供简短的介绍。

3、提供任意两地点间最短路径查询,并计算总路程。

根据要求,先将校园平面图信息抽象为无向网,用邻接矩阵存储。

需求1:

定义map()函数,功能是输出校园的平面图。

可简单的通过printf()函数实现。

需求2:

定义Query()函数,功能是查询输出地点信息。

可直接输出无向网中的顶点信息。

需求3:

根据输入的起点和终点,运用Floryd算法,求出最短路径,计算路径长度并输出。

 

考虑到使用者并不一定需要使用所有的功能,所以开始时需要一个选择菜单。

定义Menu()函数,功能是提供功能选择。

输入1,选择查看学校平面图

输入2,选择查看各地点信息

输入3,选择查找两地点间最短路径

输入4,退出程序

 

总流程图:

 

Y

 

N

 

13

 

2

 

平面图模块流程图:

 

地点信息查询模块流程图:

 

求最短路径模块流程图:

 

 

实现过程:

从学校的平面图中选取出12个比较重要的地点,将其抽象成无向带权网并用邻接矩阵来表示。

以图中的顶点代表地点,存放地点名称、编号、简介等信息,权值代表两地之间的距离。

最短路径用Floyd算法求出。

地点间距离用地图软件测出。

将得到的信息绘制成无向网:

 

170

200

150

30300

150

30500

170

160

100

570

160

 

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;i

for(j=0;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;

}

for(i=0;i

for(j=0;j

G.arcs[j][i]=G.arcs[i][j];

returnG;

}

(3)菜单模块:

voidMenu()//初始菜单

{

printf("\n\n东华理工大学校园导游系统\n");

printf("┏━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n");

printf("┃编号┃功能┃\n");

printf("┣━━╋━━━━━━━━━━━━━━━━━━━━━━━━━━┫\n");

printf("┃1┃查看学校平面图┃\n");

printf("┃2┃查看地点信息┃\n");

printf("┃3┃查找两地点间最短路径┃\n");

printf("┃4┃退出┃\n");

printf("┗━━┻━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n");

printf("输入你的选择:

");

}

 

(4)平面图模块:

voidMap()//校园平面图

{

printf("\n");

printf("┏━━━━━━━┓\n");

printf("┃┃\n");

printf("┃1.体育馆┃\n");

printf("┃┃\n");

printf("┗━━━┳━━━┛\n");

printf("┃\n");

printf("┏━━━┻━━━┓\n");

printf("┃┃\n");

printf("┏━━━━━━━━━┳━━━┫2.北区宿舍┣━━━┓\n");

printf("┃┃┃┃┃\n");

printf("┃┃┗━━━━━━━┛┃\n");

printf("┃┏━━━━━━━┓┃┃\n");

printf("┃┃┃┃┃\n");

printf("┏━━┓┃┃┃┃┣┓\n");

printf("┃┣╋┫3.图书馆┣┫┃┃6.\n");

printf("┃4.┃┃┃┃┃┃┃东\n");

printf("┃樱┃┃┃┃┣━━━━━━━━━━━━━━━┫┃门\n");

printf("┃花┃┃┗━━━━━━━┛┃┃┃\n");

printf("┃广┃┃┏━━━━━━━┓┃┃┃\n");

printf("┃场┃┃┃┃┃┣┛\n");

printf("┃┃┃┃┃┃┃\n");

printf("┃┣┻┫5.三教┣┫┃\n");

printf("┗━━┛┃┃┃┃\n");

printf("┃┃┃┃\n");

printf("┗━━━━━━━┛┣━━━━┳━━━━━━━━━━┫\n");

printf("┃┏━━━┻━━━┓┃\n");

printf("┏━━━━━━━┓┃┃┃┃\n");

printf("┃┃┃┃┃┃\n");

printf("┃┃┃┃7.青春广场┃┃\n");

printf("┃8.西区食堂┣╋┫┃┃\n");

printf("┃┃┃┃┃┃\n");

printf("┃┃┃┃┃┃\n");

printf("┗━━━━━━━┛┃┗━━━━━━━┛┃\n");

printf("┃┃\n");

printf("┏━━━━━━━┓┃┃\n");

printf("┃┃┃┃\n");

printf("┃┃┃┃\n");

printf("┃9.┃┃┃\n");

printf("┃西┃┃┃\n");

printf("┃区┣┫┃\n");

printf("┃宿┃┃┃\n");

printf("┃舍┃┃┃\n");

printf("┃┃┃┃\n");

printf("┃┃┃┃\n");

printf("┃┃┃┃\n");

printf("┗━━━━━━━┛┃┃\n");

printf("┃┃\n");

printf("┃┏━━━━━━━━━━━┓┃\n");

printf("┏━━━━━━━┓┃┃┃┃\n");

printf("┃┃┃┃┃┃\n");

printf("┃┃┃┃┃┏┻┓\n");

printf("┃10.南区食堂┣┻┫11.南区宿舍┣━┫┃\n");

printf("┃┃┃┃┗━┛\n");

printf("┃┃┃┃12.南门\n");

printf("┗━━━━━━━┛┃┃\n");

printf("┗━━━━━━━━━━━┛\n");

printf("请按任意键继续!

");

getch();

}

 

(5)地点编号函数:

VoidNumber()//输出地点编号,在其他操作中会用到

{

intv;

printf("\n\n┏━━┳━━━━━━┓\n");

printf("┃编号┃地点名称┃\n");

for(v=1;v<=G.vexNum;v++){

printf("┃%-4d┃%-12s┃\n",G.vexs[v].num,G.vexs[v].name);

}

printf("┗━━┻━━━━━━┛\n");

}

 

(6)地点信息查询模块:

voidQuery(MGraphG)//查找函数,可以输出地点名称和介绍

{

intk,i=1;

Number();

while(i)

{

printf("请输入要查询的地点编号,输入0退出:

");

scanf("%d",&k);

if(k<0||k>G.vexNum)

{

printf("地点编号不存在!

请重新输入地点编号:

");

scanf("%d",&k);

}

printf("%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(i=0;i

for(j=0;j

D[i][j]=G.arcs[i][j];

if(i!

=j&&G.arcs[i][j]

elsePath[i][j]=-1;

}

for(k=0;k

for(i=0;i

for(j=0;j

if(D[i][k]+D[k][j]

D[i][j]=D[i][k]+D[k][j];

Path[i][j]=Path[k][j];

}

}

voidshortestPath_Floyd(MGraph&G)//求最短路径

{

inti,j,p,m,k;

intb[100];

floyd(G);

Number();

do{

printf("请输入起点编号:

");

scanf("%d",&i);

printf("请输入终点编号:

");

scanf("%d",&j);

if(i==j)

printf("起点和终点一样,请重新输入\n");

elseif(i>12||i<0||j>12||j<0)

printf("输入错误,请重新输入\n");

}while(i==j||i>12||i<0||j>12||j<0);

i=i-1;j=j-1;

if(i!

=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);

printf("%s,路程为%d米\n",G.vexs[b[0]+1].name,D[i][j]);

}

}

printf("\n\n按任意键继续\n\n");

getch();

}

(8)主函数:

voidmain()//主函数

{

InitGraph(G);

inti;

Menu(G);

scanf("%d",&i);//输入选择

while(i!

=4)//输入4,则退出

{

switch(i)

{//每次选择后会调用清屏函数,使界面美观

case1:

system("CLS");Map();Menu(G);break;//若输入1,则输出平面图

case2:

system("CLS");Query(G);Menu(G);break;//若输入2,则查找并输出地点名称和介绍

case3:

system("CLS");shortestPath_Floyd(G);Menu(G);break;//若输入3,则找出最短路径

case4:

;break;

default:

printf("输入错误,清重新输入\n");

}

scanf("%d",&i);

}

}

运行结果:

图1:

初始菜单,输入1查看学校平面图,输入2查看地点信息,输入3查找两地点间最短路径,输入4退出。

图2:

查看地点信息

输入要查询的地点编号,输入错误则出现错误提示,并重新输入。

输入0则返回初始菜单。

图3:

查看学校平面图

图4.1:

查找两地间最短路径

输入起点和终点编号,则会计算出最短路径和路程

 

图4.2:

若输入的起点或终点编号错误,则出现错误提示,并重新输入。

实验总结:

程序能满足实验要求,较好的实现的了各个功能,做到了实用方便,但仍有很多不足之处,主要是以下几点:

1.按要求将校园平面图信息抽象为无向网用邻接矩阵存储,能较好的表现校园各地点信息,并能方便地使用Floyd算法查找最短路径,但邻接矩阵不适用与两顶点之间有多条边的情况,所以对于有道路直接相连的两地点,只取路程最短的路,虽然对于各功能没有影响,但平面图的信息并没有全部存储。

2.同时由于地点本身有长度和面积,并不能完全抽象为一个顶点,对于没有道路直接相连的地点,因为中间要经过其他地点,而经过的地点的长度并未算在路程内,所以计算出的路程长度要比实际长度略短。

3.对于输出校园平面图的功能,只简单的用printf()函数输出,用一个个符号组成平面图,这个方法费时费力,但还没有找到更好的方法。

 

心得体会:

通过完成这次课程设计,我学会了综合运用所学的数据结构知识解决一个具体的问题,尤其是熟悉了对图的相关内容的应用,更加深入的了解了求最短路径算法的原理,使得能进一步熟悉掌握数据结构的基础知识,并在编写程序的过程中,掌握了很多编程技巧,学会了使用一些新的功能函数,进一步提升了自己的解决问题和编程调试的能力。

并且意识到编程要有条理和规划。

对于一个项目,要先分析需求,再将不同需求划分成各个模块。

编程过程中要注意代码格式,要添加必要的注释,这样可以减少很多不必要的麻烦。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 幼儿教育 > 唐诗宋词

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1