数据结构课程设计报告师范大学导游图系统.docx
- 文档编号:11564198
- 上传时间:2023-03-19
- 格式:DOCX
- 页数:17
- 大小:239.04KB
数据结构课程设计报告师范大学导游图系统.docx
《数据结构课程设计报告师范大学导游图系统.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计报告师范大学导游图系统.docx(17页珍藏版)》请在冰豆网上搜索。
数据结构课程设计报告师范大学导游图系统
计算机科学与信息工程学院
数据结构课程设计
设计题目XX师范大学校园导游系统
课程名称数据结构
专业计算机科学与技术
班级XXXXXXXX
姓名学号XXXXXXX
目录
1.课程设计题目3
2.人员分工3
3.软硬件运行环境3
4.问题描述1
5.需求分析3
6.算法分析与概要设计4
6.1概要设计4
6.2算法分析5
7.算法的详细设计8
8.测试数据和结果14
9.总结(收获与体会)17
1.课程设计题目
XX师范大学校园导游系统
2.人员分工
内容
负责人
两点间的最短路径
温静训
程序的初始化
郭丹妮
测试文档
孙祖干
景点信息查询和设计文档
李燕双
程序的主函数以及校园导航图的整体图的输出
陈姗姗
3.软硬件运行环境
1)软件:
需要MicrosoftWindows系统。
可以是16位或32位Windows系统环境下运行
2)硬件:
x86处理器,内存大于512M
4.问题描述
我们采用工程思想,将系统共分一下几个模块:
数据结构定义模块、导航图建立模块、求最短路径模块、主菜单;
下面是具体各功能简单的实际应用:
Ø数据结构定义模块:
模块定义了导航图中各个节点的基本结构类型,主要采用邻接矩阵的存储结构来真实反映各节点到其他所有节点的路径长度(权值大小)。
Ø导航图建立模块:
采用上述结构体类型对导航图中每个节点进行赋值。
包括:
各定点的名称(地点名),各个节点到其他所有节点的真实路径长度(赋权值)。
Ø求最短路径模块:
本模块的基本思想是采用迪杰斯特拉算法求最短路径。
次模块是本校园导航系统的核心模块,求两点间的最短路径与求一点到其他所有点最短路径两个子功能均是在最短路径算法模块的基础上进行调用,进而实现导航功能。
Ø预览地图模块:
输入预览小地图。
Ø景点信息查询:
通过输入景点的编号,快速查询景点信息。
Ø主菜单:
主菜单中主要是显示导航图中的所有导航节点,能够快速方便的对各个地点进行导航。
以上程序的几个模块,构成了校园导航系统的基本组成部分,程序运行良好,达到了课程设计的基本要求。
由于所学知识有限,功能各个方面还有欠妥之处,希望得到指出与改正。
5.需求分析
设计一个校园导游程序,为来访的客人提供各种信息查询服务。
1.设计学校的校园平面图,所含景点不少于10个。
以图中顶点表示校内各景点,存放景点称、代号、简介等信息;以边表示路径,存放路径长度等相关信息。
2.为来访客人提供图中任意景点相关信息的查询。
3.提供途中任意景点问路查询,即求任意两个景点间的一条最短的简单路径。
6.算法分析概要设计
6.1概要设计
寻找最短路径是图论中的一个经典问题,对于这个经典问题已经提出了许多不同的解决方案。
用确定的带权边可以表示如下信息,诸如城市之间的距离,确定任务的执行时间段,两地之间信息传输的开销,两地之间物质运输总量等等。
当确定从顶点V到顶点U间的最短路径时,中间顶点W的相关距离信息要记录下来。
这个信息记录了与顶点V相关联的标记,这个路径中,该标记只表示顶点V到顶点W的距离或者从顶点W的前驱顶点到V的距离。
查找最短路径的方法要依据这些标记。
根据这些标记校正的次数,解决最短路径的方法分为两类:
标记设置法和标记校正法。
对于标记设置法,遍历经过的每一个顶点都要被处理,给每一个顶点设置一个值,也就是设置标记,该值一直到运行结束都保持不变。
这样使得此方法只能处理包含正权的图。
第二类型包括标记校正法,在使用该方法时要允许处理过程中对标记进行修改。
这两种方法都能运用于负权的图和含反向循环的图中(反向环是指构成此环的边的权数累加到了一个负值),这两种方法都可以保证,对所有得顶点而言,一旦图处理完成后,当前距离就表示该顶点对于所有顶点的最短路径。
然而大多数标记设置法和标记校正法都可以归纳为同一类,因为他们都可以用来寻找从一个顶点到其他所有顶点间的最短路径
6.2算法设计
#defineMAX_V30//最大顶点个数
typedefchar*VertexData;
typedefchar*OtherInfo;
typedefstruct
{
VertexDatavexs[MAX_V];//顶点向量
OtherInfoinfo[MAX_V];//顶点信息
intarcs[MAX_V][MAX_V];//邻接矩阵
intvexnum,arcnum;//图的当前顶点数和弧数
}AdjMatrix;
1.创建导航图函数:
intCreateUDN(AdjMatrix&G)
函数描述:
主要将每个节点进行命名、每个顶点到其他所有定点的路径值用邻接矩阵进行存储。
例:
G.vexs[0]="西门";
作用:
使0号定点命名为“西门”;
G.arcs[0][1]=G.arcs[1][0]=275;
作用:
使0号节点到1号节点的路径赋值为275,应为是无向图,所以1号节点到0号节点的路径长度也应赋值为275;
2.最短路径导航函数:
voidShortPath(AdjMatrix&G,intv0,intp[MAX_V][MAX_V],intd[])
函数描述:
用Dijkstra算法求无向网G的V0定点到其余定点V的最短路径P[v]及其带权长度D[v]。
若P[v][w]为True,则w是从V0到V当前求得最短路径上的顶点。
Final[v]为True当且仅当V∈S,即已经求得从V0到V的最短路径。
3.导航菜单函数声明
voidmenu()
函数描述:
输出各个节点的编号,方便导航。
4.预览地图函数
voidPreview()
函数描述:
输出预览地图,方便了解校园路径。
以下为迪杰斯特拉算法流程图:
7.算法的详细设计
#include
#include
#defineMAX_V30//最大顶点个数
#defineINFINITY32767//最大值
typedefchar*VertexData;
typedefchar*OtherInfo;
typedefstruct
{
VertexDatavexs[MAX_V];//顶点向量
OtherInfoinfo[MAX_V];//顶点信息
intarcs[MAX_V][MAX_V];//邻接矩阵
intvexnum,arcnum;//图的当前顶点数和弧数
}AdjMatrix;
//创建无向图
intCreateUDN(AdjMatrix&G)
{//采用数组(邻接矩阵)表示法,构造无向网G.
inti=0,j=0;
G.vexnum=10;
G.arcnum=11;
G.vexs[0]="西门";G.vexs[1]="图书馆";G.vexs[2]="北门";
G.vexs[3]="计信学院";G.vexs[4]="校医院";G.vexs[5]="档案馆";
G.vexs[6]="东苑食堂";G.vexs[7]="学术报告厅";G.vexs[8]="南门";
G.vexs[9]="露天影场";
for(i=0;i for(j=0;j { if(i==j) G.arcs[i][j]=0; else G.arcs[i][j]=INFINITY; } //为每一条边赋权 G.arcs[0][1]=275; G.arcs[1][0]=275; G.arcs[1][2]=200; G.arcs[2][1]=200; G.arcs[1][3]=20; G.arcs[3][1]=20; G.arcs[3][5]=200; G.arcs[5][3]=200; G.arcs[5][6]=175; G.arcs[6][5]=175; G.arcs[6][7]=175; G.arcs[7][6]=175; G.arcs[7][8]=325; G.arcs[8][7]=325; G.arcs[5][8]=450; G.arcs[8][5]=450; G.arcs[4][8]=300; G.arcs[8][4]=300; G.arcs[3][4]=150; G.arcs[4][3]=150; G.arcs[4][9]=200; G.arcs[9][4]=200; G.info[0]="师范大学的西大门,也是学校正大门"; G.info[1]="XX师范大学图书馆创立于1932年,是XX壮族自治区历史最长、藏书最丰富的高校图书馆之一,其前身是1932年成立的XX省立师范专科学校图书馆。 "; G.info[2]="即XX师范大学的北大门"; G.info[3]="计信学院是XX师范大学唯一的纯工科学院。 学院设有计算机科学系、信息与管理科学系、公共计算机教学部、计算机实验教学中心,计算机应用和自动化2个校级研究所。 "; G.info[4]="位于大田径场北面,创立于1932年,属于学校直属建制单位,主要方便学生和教职工看病体检等"; G.info[5]="XX师范大学档案馆成立于2002年3月,是学校直属独立建制的业务单位,主要负责包括人事档案、学生档案在内的全校各类档案的归档和管理服务工作,组织开展校史、年鉴的编撰出版和校史陈列室的管理服务等"; G.info[6]="位于东面的学生食堂,共2个食堂,靠近第一、二、三、四宿舍楼,方便学生用餐"; G.info[7]="XX师范大学学术报告,是主要用于较大会议、报告会、演讲等等的阶梯报告厅"; G.info[8]="即XX师范大学南大门"; G.info[9]="露天的较大型的舞台会场,舞台在中间,四周环绕观众席阶梯,通常用于校园内较大型晚会等"; return1; } voidPreview() { cout<<""<<"北门"< cout<<""<<"|"< cout<<""<<"|"< cout<<""<<"|"< cout<<""<<"|"< cout<<""<<"|"< cout<<""<<"|"< cout<<""<<"|"< cout<<"西门-----------图书馆--计信学院--------档案馆-------东苑食堂"< cout<<""<<"|"<<""<<"|"<<""<<"|"< cout<<""<<"|"<<""<<"|"<<""<<"|"< cout<<""<<"|"<<""<<"|"<<""<<"|"< cout<<""<<"|"<<""<<"|"<<""<<"|"< cout<<""<<"露天影场--------校医院"<<""<<"|"<<""<<"学术报告厅"< cout<<""<<"\\"<<""<<"|"<<""<<"|"< cout<<""<<"\\"<<""<<"|"<<""<<"|"< cout<<""<<"\\"<<""<<"|"<<""<<"|"< cout<<""<<"\\"<<""<<"|"<<""<<"|"< cout<<""<<"\\"<<""<<"|"<<""<<"|"< cout<<""<<"南门"<<"-------------"< } //采用迪杰斯特拉算法,求最短路径 externhave[30]; voidShortPath(AdjMatrix&G,intv0,intp[MAX_V][MAX_V],intd[]) {//迪杰斯特拉发求最短路径 intv,w,i,j,min; intfinal[MAX_V]; intk=1; for(v=0;v {//初始化 final[v]=0; d[v]=G.arcs[v0][v]; for(w=0;w p[v][w]=0; if(d[v] { p[v][v0]=1; p[v][v]=1; } } d[v0]=0; final[v0]=1; have[0]=v0; for(i=1;i {//其余的vexnum-1个顶点 min=INFINITY; for(w=0;w if(! final[w]) if(d[w] { v=w; min=d[w]; } final[v]=1; have[k]=v; k++; for(w=0;w if(! final[w]&&(min+G.arcs[v][w] { d[w]=min+G.arcs[v][w]; for(j=0;j p[w][j]=p[v][j]; p[w][w]=1; } } } //菜单界面 voidmenu() { cout<<"0.西门"<<""<<"1.图书馆"<<""<<"2.北门"< cout<<"3.计信学院"<<""<<"4.校医院"<<""<<"5.档案馆"< cout<<"6.东苑食堂"<<""<<"7.学术报告厅"<<""<<"8.南门"< cout<<"9.露天影场"< cout<<""<<"------------------菜单------------------"< cout<<""<<"1.菜单"< cout<<""<<"2.预览地图"< cout<<""<<"3.查询景点信息"< cout<<""<<"4.两个地点最小路径"< cout<<""<<"5.某景点到每个景点的最小路径"< cout<<""<<"0.退出"< cout<<""<<"----------------------------------------"< cout<<"请选择功能! "< } inthave[30]; voidmain() { AdjMatrixG; intv0,i,end,j; intP[MAX_V][MAX_V]; intD[MAX_V]; intchoice,choice1; cout<<"≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈"< cout<<"≈≈欢迎光临XX师范大学,祝你旅程愉快! ≈≈"< cout<<"≈≈XX师范大学校园导游系统为你服务! ≈≈"< cout<<"≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈"< CreateUDN(G); while (1) { menu(); cin>>choice; switch(choice) { case1: menu();break; case2: { while (1) { Preview(); cout<<"本次导航结束"< cin>>choice1; if(choice1==2) break; } }break; case3: { cout<<"请输入查询地点的编号! "< cin>>v0; cout< cout<<"本次导航结束"< cin>>choice1; if(choice1==2) break; }break; case4: { while (1) { cout<<"分别输入起点和终点代号以空格分开"< cin>>v0>>end; ShortPath(G,v0,P,D); cout<<"最短路径: "< for(i=0;i { if(P[end][have[i]]==1) cout<<"-->"< } cout< "< cout<<"本次导航结束"< cin>>choice1; if(choice1==2) break; } } break; case5: { while (1) { cout<<"请输入出发点: "< cin>>v0; ShortPath(G,v0,P,D); cout< "< for(i=0;i { for(j=0;j if(P[i][have[j]]==1) cout<<"-->"< cout< "< } cout<<"本次导航结束"< cin>>choice1; if(choice1==2) break; } } break; case0: break; default: cout<<"选择错误,请重新输入! "< } if(choice==0) { cout<<"欢迎再次使用校园导航系统,回车键退出。 "< break; } } } 8.测试数据和结果分析 很高兴,这次我们设计的校园导航系统能够按照预先的设想正常运行,经过反复的调试和优化程序,使得程序的源代码更规范且易于理解,程序的输出界面更为友好,操作更简便易行。 测试结果如下: 程序功能界面: 预览地图: 查询景点信息: 两点地点最小路径: 某景点到每个景点的最小路径: 9.总结(收获和体会) 在这次完成设计的过程中,由于我们对数据结构知识掌握得不是很好,所以进度要比其他组的慢一些,最终还是完成了。 有一个师兄曾提醒我们,导游程序在实际执行时,需要根据用户的临时输入求最短路径。 因此,迪杰特拉斯算法的时间复杂度比佛洛伊德算法低,但没球一条最短路径都必须重新搜索一遍,在频繁查询时会导致查询效率降低,而佛洛伊德算法只要计算一次,即可求出每一对顶点之间的最短路径,虽然时间复杂度O(n*n),但是以后每次查询都只要查表即可,极大的提高了查询效率,而且,佛洛伊德算法还支持带负权的图的最短路径的计算。 这让我们明白了在选择算法时,不能单纯的只考虑算法的渐近时间复杂度,有时还必须综合考虑各种因素。 但是由于我们小组成员对佛洛伊德算法都知道要如何实现,加上时间紧迫,我们最后仍是选择了迪杰特拉斯算法。 通过对校园导游咨询程序的分析与解答,我们对数据结构又有了进一步的了解与掌握,尤其是对图论部分的知识又有了深刻的理解,使得对知识有的到进一步的加深。 使求最短路径的算法有了更深一个层次的掌握,更进一步的把握,但是在我们完成的过程中,我们也遇到了一些问题,比如说 希望将来可以用来解决更加切合实际的问题,从而达到学以致用的目的。 。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程设计 报告 师范大学 导游 系统