数据结构课程设计校园导航.docx
《数据结构课程设计校园导航.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计校园导航.docx(21页珍藏版)》请在冰豆网上搜索。
数据结构课程设计校园导航
课程设计报告
课程名称数据结构课程设计
题目校园导航
指导教师
设计起始日期
学院计算机学院
系别计算机科学与工程
学生姓名
班级/学号
成绩
一、需求分析
本次实验设计的任务是实现一个简易的北京信息科技大学的校园导航平面图。
设计要包括下列要求:
设计你的学校的平面图,至少包括10个以上的场所,每两个场所间可以有不同的路,且路长也可能不同,找出从任意场所到达另一场所的最佳路径(最短路径)。
本课题实现校园多个场所(至少10个)的最短路径求解。
(1)输入的形式和输入值的范围:
本系统主要数据类型为字符型char及整形int,char型主要包括单位编号,单位名称,单位简介,功能编号;输入功能编号与单位编号进行操作。
(2)输出的形式:
输出则通过已有的信息数据,通过相关的操作输出相应信息。
(3)程序所能达到的功能:
本程序可供任何人使用,主要功能1.浏览各单位及简介;2.查看所有游览路线;3.选择出发点和目的地求出最佳路径;4.查看某一单位信息。
(4)测试数据:
包括正确的输入及其输出结果和含有错误的输入及其输出结果。
a.首先看到的是校园导航系统的菜单:
b.查看浏览路线等待输入起始景点:
C.选择出发点与目的地等待输入起始景点与目的地编号:
d.参看景点信息等待输入景点编号:
二、概要设计
本系统包含一个文件。
设计分有菜单,显示信息,弗洛伊德算法,迪杰斯特拉算法,查找景点信息等程序段。
主程序为整系统的入口处,菜单主要实现显示系统功能,显示信息主要实现显示景点信息,弗洛伊德算法主要实现求两景点之间最短路径,迪杰斯特拉算法实现求两景点之间最短路径,查找景点信息主要实现显示某一景点信息。
系统首先通过主程序调用voidmain();进入系统主菜单函数,根据用户的选择可分别进入:
1.浏览各景点及简介;2.查看所有游览路线;3.选择出发点和目的地求出最佳路径;4.查看景点信息;5.退出系统。
选择“浏览各景点及简介”项,显示十个景点的有关信息,包括景点编号,景点名称,景点简介。
选择“查看所有游览路线”项,会进入输入起始景点编号的界面,输入正确编号后会显示起始景点到其余九个景点的最短路线的方案。
选择“选择出发点和目的地”项,会进入输入起始景点与目的景点的界面,输入起始景
点与目的景点,并有空格隔开就得到两景点之间的最佳路径。
选择“查看景点信息”项,会进入输入要查看的景点的界面,如入后会显示该景点的有关信息。
选择“退出系统”项,就会退出程序。
三、详细设计
(1)十三个单位的图
0:
前门
1:
图书馆
2:
教二楼
3:
实验楼
4:
操场
5:
教一楼
6:
食堂
7:
水房
8:
学一公寓
9:
学二公寓
10:
学三公寓
11:
学四公寓
12:
后门
(2)主程序流程图:
(3)弗洛伊德的算法:
voidFloyd(MGraph*G)
{
intv,u,i,w,k,j,flag=1,p[10][10][10],D[10][10];//定义参数
for(v=0;vvexnum;v++)
for(w=0;wvexnum;w++)
{
D[v][w]=G->arcs[v][w].adj;
for(u=0;uvexnum;u++)
p[v][w][u]=0;
if(D[v][w]{
p[v][w][v]=1;p[v][w][w]=1;
}
}
for(u=0;uvexnum;u++)
for(v=0;vvexnum;v++)
for(w=0;wvexnum;w++)
if(D[v][u]+D[u][w]{
D[v][w]=D[v][u]+D[u][w];
for(i=0;ivexnum;i++)
p[v][w][i]=p[v][u][i]||p[u][w][i];
}
while(flag)
{
cout<<"请输入出发点和目的地的编号(用空格隔开):
";
cin>>k>>j;
if(k<0||k>G->vexnum||j<0||j>G->vexnum)//判断输入的景点编号正确与否
{
cout<<"景点编号不存在!
请重新输入出发点和目的地的编号:
";
cin>>k>>j;
}
if(k>=0&&kvexnum&&j>=0&&jvexnum)
flag=0;
}
cout<vexs[k].name;//输出景点名称
for(u=0;uvexnum;u++)
if(p[k][j][u]&&k!
=u&&j!
=u)//输出路线
cout<<"-->"<vexs[u].name;
cout<<"-->"<vexs[j].name;
cout<<"总路线长"<}
四、调试分析
(1)在程序设计中遇到了输出景点信息的表不整齐,用setw()解决了;默认的界面太小,不能完整的看到输出信息,用了system("modecon:
cols=100lines=40")命令语句设置了行数和列数。
(2)经验和体会
经过一段时间来的努力,终于初步实现系统功能,但肯定还存在不少漏洞。
这是我们第三次做课程设计,也是第三次编写一个比较完整和具有一定功能的的系统代码,第二次几个人合作制作系统,制作过程中存在储多的不足,遇到过许多的困难,曾经灰心丧气过,但是最终还是坚持了下来,虽然做得不怎么样,但我们已经努力地去做了,由于基础也不怎么扎实,所以困难会比其它组更多更艰巨。
刚开始做系统缺乏全局观念,分工也不是很合理,做得很零碎,所以在组合的时候也出现了很多问题。
五、使用说明和测试结果
打开系统,首先会进入系统的主菜单:
1.浏览各景点及简介
2.查看所有游览路线
3.选择出发点和目的地
4.查看景点信息
5.退出系统
用户可以进行如下操作:
1、如果你想浏览各景点及简介的话,请输入“1”,并回车。
此时界面上将显示出各景点的编号、名称及其简介。
2、如果你想查看某一景点的所有游览路线,可选择2操作。
输入“2”,并回车。
此时,系统会提示你输入某景点的编号。
输入编号后,回车,便可以看到该景点的所有游览路线。
若输入的景点编号错误就会有提示重新输入。
3、如果你想查看两个景点之间的最短路线的,可选择3操作。
输入“3”,并回车。
此时,系统会提示你要输入起始景点与终点的编号。
输入编号后,回车,此时,便可以见到这两个景点之间的最短路径。
4、如果你想查看具体某些景点的简介及信息,可以选择4操作。
输入“4”,并回车。
此时,系统会提示全部景点的对应的编号,选择你要查看的景点信息,输入其编号,回车,此时,屏幕上将会显示出该景点的各种信息。
若输入的景点编号错误就会有提示重新输入。
5、在主菜单键入“5”,退出程序。
测试结果
1、菜单界面
2、进入“浏览各景点及简介”后,输出景点信息的界面。
3、进入“查看所有游览路线”,显示输出景点编号为0的景点到其余九个景点的最佳路线。
4、进入“选择出发点和目的地”,输入出发点1和目的点9后输出的的最佳路线的界面。
5、进入“查看景点信息”,输入要查看的景点编号,输出景点信息的界面。
6、输入要查询的景点编号错误,提示重新输入。
7、退出程序界面。
六、心得体会
做一个系统之前还应该做好全面的安排,对一个系统的整个流程及功能实现有一个很好的统筹,几个人合作的功能可拆才拆,不可则由一个人主要负责,其它人帮忙思考,出意见,做系统之前几个人必须先做对系统做一次较详细的探讨研究,然后才开始分工,一个阶段后组员应互相交流情况,以达到一致。
另在遇到困难时组员不能解决,应查资料或问其它懂的同学,参考一下意见,再结合自己的想法,最后实现自己想实现的功能。
七、附录
#defineINFINITY10000/*无穷大*/
#defineMAX_VERTEX_NUM40
#defineMAX40
#include
#include
#include
usingnamespacestd;
#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;
MGraphInitGraph(void);
voidMenu(void);
voidBrowser(MGraph*G);
voidShortestPath_DIJ(MGraph*G);
voidFloyd(MGraph*G);
voidSearch(MGraph*G);
/***********************主函数*******************************/
voidmain(void)
{
system("color1f");
system("modecon:
cols=100lines=40");
inti;
b=InitGraph();
Menu();
cin>>i;
while(i!
=5)
{
switch(i)
{
case1:
system("cls");Browser(&b);Menu();break;
case2:
system("cls");ShortestPath_DIJ(&b);Menu();break;
case3:
system("cls");Floyd(&b);Menu();break;
case4:
system("cls");Search(&b);Menu();break;
case5:
exit
(1);break;
default:
break;
}
cin>>i;
}
}
/*************************************************************/
/*************************定义景点编号,名称及简介************/
MGraphInitGraph(void)
{
MGraphG;
inti,j;
G.vexnum=10;//十个景点
G.arcnum=14;//邻接矩阵
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,"教一楼");
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;ifor(j=0;jG.arcs[i][j].adj=INFINITY;
//各景点之间的距离,没有的均为无穷大
G.arcs[0][1].adj=50;
G.arcs[0][2].adj=100;
G.arcs[1][5].adj=20;
G.arcs[1][6].adj=75;
G.arcs[2][3].adj=10;
G.arcs[2][5].adj=60;
G.arcs[3][4].adj=20;
G.arcs[4][11].adj=30;
G.arcs[5][6].adj=30;
G.arcs[6][7].adj=10;
G.arcs[7][8].adj=20;
G.arcs[8][9].adj=10;
G.arcs[9][10].adj=20;
G.arcs[10][12].adj=120;
G.arcs[11][12].adj=150;
for(i=0;ifor(j=0;jG.arcs[j][i].adj=G.arcs[i][j].adj;
returnG;
}
/*******************************************************************************************/
/********************************主菜单(显示输入提示)****************************************/
voidMenu()
{
cout<<"北京信息科技大学大学导游图"<cout<<"┏━━━━━━━━━━━━━━━━━━━━┓"<cout<<"┃1.浏览各景点及简介┃"<cout<<"┃2.查看所有游览路线┃"<cout<<"┃3.选择出发点和目的地┃"<cout<<"┃4.查看景点信息┃"<cout<<"┃5.退出系统┃"<cout<<"┗━━━━━━━━━━━━━━━━━━━━┛"<cout<<"Option-:
";
}
/************************************显示景点编号、名称、简介****************************************/
voidBrowser(MGraph*G)
{
intv;
cout<<"┏━━┳━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓"<cout<<"┃编号┃景点名称┃简介┃"<for(v=0;vvexnum;v++)
cout<<"┃"<vexs[v].num<vexs[v].name<vexs[v].introduction<cout<<"┗━━┻━━━━━━━━┻━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛"<}
/********************迪杰斯特拉算法来计算出起点到各个顶点之间的最短路径,v0为起点***********************/
voidShortestPath_DIJ(MGraph*G)
{
intv,w,i,min,t=0,x,flag=1,v0;
intfinal[20],D[20],p[20][20];
cout<<"┏━━┳━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓"<cout<<"┃编号┃景点名称┃简介┃"<for(v=0;vvexnum;v++)
cout<<"┃"<vexs[v].num<vexs[v].name<vexs[v].introduction<cout<<"┗━━┻━━━━━━━━┻━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛"<while(flag)
{
cout<<"请输入一个起始景点编号:
";
cin>>v0;
if(v0<0||v0>G->vexnum)
{
cout<<"景点编号不存在!
请重新输入景点编号:
";
cin>>v0;
}
if(v0>=0&&v0vexnum)
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]=0;
if(D[v]{
p[v][v0]=1;p[v][v]=1;
}
}
D[v0]=0;final[v0]=1;
for(i=1;ivexnum;i++)
{
min=INFINITY;
for(w=0;wvexnum;w++)
if(!
final[w])
if(D[w]final[v]=1;
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(v=0;vvexnum;v++)
{
if(v0!
=v)cout<vexs[v0].name;
for(w=0;wvexnum;w++)
{
if(p[v][w]&&w!
=v0)cout<<"-->"<vexs[w].name;
t++;
}
if(t>G->vexnum-1&&v0!
=v)cout<<"总路线长"<}
}
/*********************************Floyd函数***************************************/
voidFloyd(MGraph*G)
{
intv,u,i,w,k,j,flag=1,p[10][10][10],D[10][10];
cout<<"┏━━┳━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓"<cout<<"┃编号┃景点名称┃简介┃"<for(v=0;vvexnum;v++)
cout<<"┃"<vexs[v].num<vexs[v].name<vexs[v].introduction<cout<<"┗━━┻━━━━━━━━┻━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛"<for(v=0;vvexnum;v++)
for(w=0;wvexnum;w++)
{
D[v][w]=G->arcs[v][w].adj;
for(u=0;uvexnum;u++)
p[v][w][u]=0;
if(D[v][w]{
p[v][w][v]=1;p[v][w][w]=1;
}
}
for(u=0;uvexnum;u++)
for(v=0;vvexnum;v++)
for(w=0;wvexnum;w++)
if(D[v][u]+D[u][w]{
D[v][w]=D[v][u]+D[u][w];
for(i=0;ivexnum;i++)
p[v][w][i]=p[v][u][i]||p[u][w][i];
}
while(flag)
{
cout<<"请输入出发点和目的地的编号(用空格隔开):
";
cin>>k>>j;
if(k<0||k>G->vexnum||j<0||j>G->vexnum)
{
cout<<"景点编号不存在!
请重新输入出发点和目的地的编号:
";
cin>>k>>j;
}
if(k>=0&&kvexnum&&j>=0&&jvexnum)
flag=0;
}
cout<vexs[k].name;
for(u=0;uvexnum;u++)
if(p[k][j][u]&&k!
=u&&j!
=u)
cout<<"-->"<vexs[u].name;
cout<<"-->"