数据结构课程设计校园导航系统.docx
《数据结构课程设计校园导航系统.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计校园导航系统.docx(31页珍藏版)》请在冰豆网上搜索。
![数据结构课程设计校园导航系统.docx](https://file1.bdocx.com/fileroot1/2023-1/3/9ccf550e-3c42-4da9-a5f5-1f44a856851f/9ccf550e-3c42-4da9-a5f5-1f44a856851f1.gif)
数据结构课程设计校园导航系统
软件学院
课程设计报告书
课程名称数据结构
设计题目校园导航系统
专业班级软件11-04班
学号**********
姓名张鸿雷
指导教师刘亮
2013年1月
1设计时间
2013年1月20日至2013年1月23日
2设计目的
数据结构是计算机专业的核心课程,是计算机科学的算法理论基础和软件设计的技术基础。
数据结构是实践性很强的课程。
课程设计是加强学生实践能力的一个强有力手段。
[2]
3设计任务
要求学生掌握数据结构的应用、算法的编写、类C语言的算法转换成C程序并上机调试的基本方法。
课程设计要求学生在完成程序设计的同时能够写出比较规范的设计报告。
严格实施课程设计这一环节,对于学生基本程序设计素养的培养和软件工作者工作作风的训练,将起到显著的促进作用。
[1]
4设计内容
题目:
校园导航系统
设计任务:
给出校园各主要建筑的名称信息及有线路联通的建筑之间的距离,利用校园导航系统计算出给定的起点到终点之间的最近距离及线路。
设计要求:
1、输入各建筑信息及线路信息,构建图。
2、计算给定起点到终点之间最近距离的进行线路。
3、输出线路及总距离。
4.1需求分析
1.程序所能达到的功能;
(1)CreateDN(MGraph*G)——创建有向网G,储存学校的各个景点。
(2)ShortPath(MGraphG,intv0,intp[MAX_V][MAX_V],intd[])——求的有向网G中某个顶点到其余顶点的最短路径及其带权长度。
(3)menu()——目录函数,按照要求选择相应的功能。
2、输入的形式和输入值的范围
首先输入导航功能号,只能在x至y之间进行选择;要实现两点之间最短路径导航,需输入起点和终点号,输入的起点和终点号在所给景点号里选择;要实现某点到其他点的最短路径,需输入这个顶点号,顶点号也是在所给的景点号里选择。
3、输出的形式
学校的所有景点,某个景点到其他景点的最短路径,或者两个景点之间的最短路径
4、测试数据:
输入导航功能x输入起始点和终点号0和16,输出正确的最短路径和路径长度;重新选择导航功能。
选择导航功能y,输入,出发点2,输出景点2的简介。
选择导航功能3,退出导航系统。
若要实现导航功能x时输入错误,输出时就无路经。
重新输入起始点,结束点。
若要实现功能2时输入错误,就会提示不存在这个地方。
4.2总体设计
1、说明本程序中用到的所有抽象数据类型的定义[2]
ADTGraph{
数据对象V:
V是具有相同特性的数据元素的集合,称为顶点集.
数据关系R:
R={VR}
VR={(v,w)|v,w∈V且P(v,w),表示从v到w的弧,谓词P(v,w)定义了弧的意义和信息}[3]
基本操作P:
IntCreateDN(MGraph*G)
操作结果:
创造有向网G。
}
voidShortpath(MGraphG,intv0,intp[MAX_V][MAX_V],intd[])
初始条件:
有向网G已创建。
操作结果:
有向网G的V0定点到其余定点V的最短路径P[v]及其带权长度D[v]。
若P[v][w]为True,则w是从V0到V当前求得最短路径上的顶点。
Final[v]为True当且仅当V∈S,即已经求得从V0到V的最短路径。
voidmenu()
初始条件:
有向网G已创建。
操作结果:
选择相应的功能。
2、说明主程序的流程
图4.2-2主程序流程图
3.各程序模块之间的层次(调用)关系
4.3详细设计
从流程图中可以看出来,主函数读取用户指令,根据指令调用函数,最终得到用户想要查询的信息。
[1]
1.采用邻接表存储结构,定义的抽象数据类型:
1)typedefstructArCell存放构造图的权值
{
intadj;
}ArCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
2)typedefstruct图中顶点表示主要景点,存放景点的编号、名称、简介等信息,{
charname[30];
intnum;
charintroduction[100];
}infotype;
3)typedefstruct
{
infotypevexs[MAX_VERTEX_NUM];
AdjMatrixarcs;
intvexnum,arcnum;
}MGraph;
MGraphb;
2.主程序以及主要函数[2]
1)主函数
voidmain(void)
{
system("color5f");/*修改控制台的颜色信息,改为白字蓝底的模式*/
system("modecon:
cols=140lines=130");/*设置批处理运行时窗口大小的*/
cmd();
}
2)cmd函数通过这个函数实现选择服务项目的内容
voidcmd(void)
{
chark;
b=InitGraph();
show1();
Menu();
while
(1)
{
scanf("\n%c",&k);
switch(k)
{
case'x':
system("cls");
show1();
Menu();
list();
ShortestPath_DIJ(&b);
printf("---------------------------------欢迎您的使用--------------------------------\n");
printf("\n请您继续选择服务:
");
break;
case'y':
system("cls");
Menu();
list();
Search(&b);
printf("---------------------------------欢迎您的使用--------------------------------\n");
printf("\n请您继续选择服务:
");
break;
case'z':
system("cls");
printf("┏━━━━━━━━━━━━━━━━━━━━┓\n");
printf("┃感谢使用┃\n");
printf("┃辽宁工程技术大学┃\n");
printf("┃智能导航系统┃\n");
printf("┗━━━━━━━━━━━━━━━━━━━━┛\n");
exit(0);
default:
printf("输入信息错误!
\n请输入x或y或z.\n");
break;}}
}
3)计算最短路径的迪杰斯特拉算法实现[1]
voidShortestPath_DIJ(MGraph*G)
{
intv,w,i,min,t=0,x,flag=1,v0,v1,have[100],k;
intfinal[20],D[20],p[23][23];
while(flag)
{
printf("请输入起始景点编号:
\n");
scanf("%d",&v0);
if(v0<0||v0>G->vexnum)
printf("景点编号不存在!
");
printf("请输入终止景点编号:
\n");
scanf("%d",&v1);
if(v1<0||v1>G->vexnum)
printf("景点编号不存在!
");
if(v0>=0&&v0vexnum&&v1>=0&&v1vexnum)
flag=0;
}
for(v=0;vvexnum;++v)
{
final[v]=0;
D[v]=G->arcs[v0][v].adj;
for(w=0;wvexnum;++w)
p[v][w]=INFINITY;
if(D[v]{
p[v][v0]=1;
p[v][v]=1;
}
}
D[v0]=0;
final[v0]=1;
have[0]=v0;
for(i=1;ivexnum;++i)
{
min=INFINITY;
for(w=0;wvexnum;++w)
if(!
final[w])
if(D[w]{
v=w;
min=D[w];
}
final[v]=1;
have[k]=v;
k++;
for(w=0;wvexnum;++w)
if(!
final[w]&&((min+(G->arcs[v][w].adj)){
D[w]=min+G->arcs[v][w].adj;
for(x=0;xvexnum;x++)
p[w][x]=p[v][x];
p[w][w]=1;
}
}
for(i=0;ivexnum;i++)
{
if(p[v1][have[i]]==1){
printf("-->%s",G->vexs[have[i]].name);}
}
if((v1-v0)==1)printf("\n路径长度:
%d\n",G->arcs[v0][v1]);
elseprintf("\n路径长度:
%d\n",D[v1]);
}//ShortestPath_DIJend
4)查找函数的建立实现用户对景点查找的实现:
voidSearch(MGraph*G)
{
intk,flag=1;
while(flag)
{
printf("请输入要查询的景点编号:
");
scanf("%d",&k);
if(k<0||k>G->vexnum)
{
printf("景点编号不存在!
请重新输入景点编号:
");
scanf("%d",&k);
}
if(k>=0&&kvexnum)
flag=0;
}
printf("┏━━┳━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n");
printf("┃编号┃景点名称┃简介┃\n");
printf("┃%-4d┃%-16s┃%-58s┃\n",G->vexs[k].num,G->vexs[k].name,G->vexs[k].introduction);
printf("┗━━┻━━━━━━━━┻━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n");
}//Searchend
5)对要进行浏览的地区的平面图输出
voidshow1()
{printf("\t\t★★欢迎使用辽宁工程技术大学智能导航系统★★\n");
printf("\t\t\t辽宁工程技术大学葫芦岛校区平面图\n\n");
printf("\t学校北门\n");
printf("\t┃\n");
printf("\t┏━━行政楼━━━━━━━━━静远楼\n");
printf("\t┃┃\n");
printf("\t┃耘慧楼\n");
printf("\t┃┃\n");
printf("\t┃┃\n");
printf("\t体育场尔雅楼\n");
printf("\t┃┃\n");
printf("\t二食堂┃\n");
printf("\t┃┃\n");
printf("\tD楼┃\n");
printf("\tE楼━┃┃\n");
printf("\tC楼┃\n");
printf("\t┃┃\n");
printf("\t小体育场,篮球场━━综合楼━━━━━━━小拱桥\n");
printf("\t┃┃┃\n");
printf("\t┃一食堂┃\n");
printf("\t浴池━━━━B楼━━A楼━━━━━━\n");
}
6)用户根据显示的学校景点序号,查询景点信息:
voidlist()
{
printf("学校景点列表:
\n");
printf("0:
学校南门");
printf("1:
静远楼");
printf("2:
耘慧楼");
printf("3:
尔雅楼");
printf("4:
小拱桥\n");
printf("5:
A楼");
printf("6:
B楼");
printf("7:
一食堂");
printf("8:
综合楼\n");
printf("9:
行政楼");
printf("10:
体育场");
printf("11:
二食堂");
printf("12:
D楼");
printf("13:
E楼\n");
printf("14:
C楼");
printf("15:
浴池");
printf("16:
篮球场、足球场\n\n");
}
7)目录函数对本系统提供的服务进行提示,以便用户使用:
voidMenu()
{
printf("\n辽宁工程技术大学葫芦岛校区导游图\n");
printf("┏━━━━━━━━━━━━━━━━━━━━┓\n");
printf("┃x.选择出发点和目的地┃\n");
printf("┃y.查看景点信息┃\n");
printf("┃z.退出系统┃\n");
printf("┗━━━━━━━━━━━━━━━━━━━━┛\n");
printf("请选择服务");
}
8)对无向网的构建以便于实现本系统的功能
MGraphInitGraph(void)
{
MGraphG;
inti,j;
G.vexnum=17;//顶点是17个
G.arcnum=25;//弧线有25个
for(i=0;iG.vexs[i].num=i;
strcpy(G.vexs[0].name,"学校北门");
strcpy(G.vexs[0].introduction,"学校的正门,行政楼高高耸立,气势宏伟");
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,"A楼");
strcpy(G.vexs[5].introduction,"男生宿舍");
strcpy(G.vexs[6].name,"B楼");
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,"D楼");
strcpy(G.vexs[12].introduction,"男生宿舍");
strcpy(G.vexs[13].name,"E楼");
strcpy(G.vexs[13].introduction,"男生宿舍");
strcpy(G.vexs[14].name,"C楼");
strcpy(G.vexs[14].introduction,"女生宿舍");
strcpy(G.vexs[15].name,"浴池");
strcpy(G.vexs[15].introduction,"学生洗澡的地方");
strcpy(G.vexs[16].name,"篮球场、足球场");
strcpy(G.vexs[16].introduction,"比赛以及学生运动的地方");
for(i=0;ifor(j=0;jG.arcs[i][j].adj=INFINITY;
G.arcs[0][1].adj=50;
G.arcs[1][2].adj=15;
G.arcs[1][3].adj=40;
G.arcs[2][3].adj=30;
G.arcs[0][3].adj=90;
G.arcs[3][4].adj=30;
G.arcs[4][9].adj=1000;
G.arcs[4][5].adj=20;
G.arcs[5][6].adj=10;
G.arcs[6][7].adj=8;
G.arcs[6][8].adj=12;
G.arcs[7][8].adj=7;
G.arcs[0][9].adj=30;
G.arcs[9][10].adj=500;
G.arcs[10][11].adj=25;
G.arcs[11][12].adj=8;
G.arcs[12][13].adj=5;
G.arcs[13][14].adj=10;
G.arcs[12][14].adj=10;
G.arcs[14][15].adj=150;
G.arcs[15][16].adj=3;
G.arcs[5][15].adj=150;
G.arcs[4][15].adj=30;
G.arcs[1][11].adj=300;
G.arcs[8][14].adj=40;
for(i=0;ifor(j=0;jG.arcs[j][i].adj=G.arcs[i][j].adj;
returnG;
}//InitGraphend
3.函数的调用关系图。
[3]
、
图4.3-3函数的调用关系图
1、
4.4测试与分析
4.4.1测试
输入导航功能x
输入起始点和终点号0和16,输出正确的最短路径和路径长度;重新选择导航功能。
选择导航功能y,输入,出发点2,输出景点2的简介。
选择导航功能3,退出导航系统。
若要实现导航功能x时输入错误,输出时就无路经。
重新输入起始点,结束点。
若要实现功能2时输入错误,就会提示不存在这个地方。
4.4.2分析
1.调试过程中遇到的问题是如何解决的以及对设计与实现的回顾讨论和分析;
在调试的过程中发现在导航功能2中缺少判断语句,使得输入错误顶点时,没有提示出现错误的运行结果,在进行导航功能2之前加一个判断语句就可以了。
这次的程序设计主要是设计求最短路径的算法,这个算法比较复杂,我根据书上算法一步步地进行分析,并通过请教同学和上网查相关程序,花费了很长时间在使得这个算法能正常运行。
4.5附录[1][2][3]
#defineINFINITY10000
#defineMAX_VERTEX_NUM40
#defineMAX40
#include
#include
#include
#include
typedefstructArCell
{
intadj;/*路径长度*/
}ArCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
typedefstruct/*图中顶点表示主要景点,存放景点的编号、名称、简介等信息,*/
{
charname[30];
intnum;
charintroduction[100];/*简介*/
}infotype;
typedefstruct
{
infotypevexs[MAX_VERTEX_NUM];
AdjMatrixarcs;
intvexnum,arcnum;
}MGraph;
MGraphb;
voidcmd(void);
MGraphInitGraph(void);
voidshow1();
voidlist();
voidMenu(void);
voidShortestPath_DIJ(MGraph*G);
voidSearch(MGraph*G);
intLocateVex(MGraph*G,char*v);
/**********主函数************************/
voidmain(void)
{
system("color5f");/*修改控制台的颜色信息,改为白字蓝底的模式*/
system("modecon:
cols=140lines=130");/*设置批处理运行时窗口大小的*/
cmd();
}
/********自定义函数***************/
/*cmd函数(根据目录选择要进行的项目)*/
voidcmd(void)
{
chark;
b=InitGraph();
show1();
Menu();
while
(1)
{
scanf("\n%c",&k);
switch(k)
{
case'x':
system("cls");
show1();
Menu();
list();
ShortestPath_DIJ(&b);
printf("---------------------------------欢迎您的使用-----