数据结构课程设计—校园导航报告

更新时间:2024-03-03 05:06:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

课 程 设 计 报 告

学院、系: 专 业: 班 级: 课程设计科目 学生姓名: 指导教师: 完成时间:

吉林大学计算机科学与技术系

软件工程

数据结构

校园导航系统设计报告

一、设计任务与目标

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

本系统是一个涉及吉林大学珠海学院相关景点和场所查询系统,是为了方便人们能够更快更准地获得学校各个景点和场所的详细信息。

本系统为用户提供以下功能:

(一)、查询了解学校概况,为导游参观者提供关于学校的相关信息。 (二)、查询校园各个场所和景点信息;

(三)、为导游者或外来人员参观人员提供校园交通信息,方便用户走访学

校。

校园导航查询系统的开发方法总结如下:

(1) 调查,了解学校各个场所与 场所或者是各个景点与景点之间的信息,

路径和距离,从外来人员或者参观者和走访者的角度出发,该如何设计才能满足用户需求。

(2) 分析,对调查得到的数据进行分析,根据其要求实现的功能分析系统

结构和界面将实现的基本功能。

(3) 设计与开发,设计系统界面并编辑实现其各个功能的代码。

(4) 调试,在设计完成后,调试系统运行的状况,修改完善系统,然后进行

测试。

二、方案设计与论证

校园旅游模型是由各个景点和景点以及场所和场所之间的路径组成的,所以这完全可以用数据结构中的图来模拟。用图的结点代表景点或场所,用图的

边代表景点或场所之间的路径。所以首先应创建图的存储结构。结点值代表景点信息,边的权值代表景点间的距离。结点值及边的权值采用图存储。本系统需要查询景点信息和求一个景点到另一个景点的最短路径长度及路线,为方便操作,所以给每个景点一个代码,用结构体类型实现。计算路径长度,最短路线和最佳路径时可分别用迪杰斯特拉(Dijkastra)算法和哈密而顿回路算法实现。最后用switch选择语句选择执行浏览景点信息或查询最短路径和距离。

搭建程序框架图,其图如下所示: 选择相应数字 2、主菜单 查询学校简介,导航参观路线和各个景点与场所之间的距离 1、打开导航 在屏幕显示输出学校各个景点场所 回车返 回主菜 选择屏幕所设菜单 单 进入子菜单 选择相应数字 3、子菜单 退出系统

4、退出导航 选择景点与场所,查询了解景点与场所信息,及景点与场所之间的最短路径 三、算法说明

(一)设计功能的实现

接下来根据以上搭建的程序框架完成各个模块的算法 1、

首先是抽象数据类型的定义:

图的抽象数据类型的 定义: ADT Mgragh{

数据对象V: V是具有相同特征的数据元素的 集合,称为定点集 数据关系R={VR}

VR={ | V, W∈V, 表示从V到W的边 }

2、 基本操作:

CreateUDN(&G,V,VR); // 创建图

初始条件:V是图的顶点集,VR是图中边的 集合。 操作结果:按V和VR的定义构造图 G。 (二)主要算法设计及相关算法补充

先创建图存储学校各个景点或场所,以图的顶点表示景点或场所,以边表示路径,再利用迪杰斯特拉(DijkStra)算法求出校园各个地方的最短路径,然后根据需要进行补充相关算法。

四、全部源程序清单

#include \

#include \ #include \ #include \ #include \

#define Num 11 //最多顶点个数 #define uplimit 100000 //定义一个无穷大的值 struct intt{ int value; };

intt Edge[Num][Num]; //Edge为带权邻接矩阵

intt dist[Num]; //dist为最短路程 intt path[Num]; //path为最短路径上

该顶点的前一顶点的顶点号

intt S[Num]; //S为已求得的在最短路径上的顶点号 intt D[Num];

/**

* 生成地图,输入地图的基本信息 *

**/

void BuildMap(){

int i,j;

/* 初始化平面图矩阵 */ for ( i=0;i<11;i++){

for ( j=0;j<11;j++){

Edge[0][0].value=0 , Edge[0][2].value=25 ;

Edge[0][3].value=90, Edge[0][5].value=uplimit ;

Edge[0][6].value=10 , Edge[0][8].value=uplimit;

Edge[0][9].value=uplimit, Edge[0][10].value=uplimit;

Edge[1][0].value=25 , Edge[1][2].value=10 ;

Edge[1][3].value=32, Edge[1][5].value=uplimit ;

Edge[1][6].value=10 , Edge[1][8].value=21;

Edge[1][9].value=16, Edge[1][10].value=uplimit;

Edge[2][0].value=25 , Edge[2][2].value=0 ; Edge[2][3].value=uplimit, Edge[2][5].value=uplimit ; Edge[2][6].value=uplimit,

Edge[2][8].value=uplimit;

Edge[2][9].value=uplimit, Edge[2][10].value=uplimit;

Edge[3][0].value=90 , Edge[3][2].value=uplimit ;

Edge[3][3].value=0 , Edge[3][5].value=uplimit ;

Edge[0][1].value=25 , Edge[0][4].value=uplimit, Edge[0][7].value=uplimit , Edge[1][1].value=0 , Edge[1][4].value=uplimit, Edge[1][7].value=uplimit , Edge[2][1].value=10 ,

Edge[2][4].value=uplimit, Edge[2][7].value=uplimit

,

Edge[3][1].value=32 , Edge[3][4].value=uplimit,

Edge[3][6].value=uplimit, Edge[3][7].value=uplimit ,

Edge[3][8].value=26;

Edge[3][9].value=uplimit, Edge[3][10].value=uplimit; Edge[4][0].value=uplimit, Edge[4][2].value=uplimit ; Edge[4][3].value=uplimit, Edge[4][5].value=9 ; Edge[4][6].value=uplimit,

Edge[4][7].value=uplimit

,

Edge[4][1].value=uplimit

,

Edge[4][4].value=0,

Edge[4][8].value=uplimit;

Edge[4][9].value=uplimit, Edge[4][10].value=60;

Edge[5][0].value=uplimit Edge[5][2].value=uplimit ; Edge[5][3].value=uplimit, Edge[5][5].value=0 ; Edge[5][6].value=uplimit

Edge[5][8].value=50;

Edge[5][9].value=14, Edge[5][10].value=uplimit;

Edge[6][0].value=10 , Edge[6][2].value=uplimit; Edge[6][3].value=uplimit, Edge[6][5].value=uplimit ;

Edge[6][6].value=0 , Edge[6][8].value=uplimit;

Edge[6][9].value=30, Edge[6][10].value=uplimit;

Edge[7][0].value=uplimit Edge[7][2].value=uplimit ; Edge[7][3].value=uplimit, Edge[7][5].value=15 ;

Edge[7][6].value=35 , Edge[7][8].value=uplimit;

Edge[7][9].value=13, Edge[7][10].value=uplimit; Edge[8][0].value=uplimit

Edge[8][2].value=uplimit ;

Edge[8][3].value=26, Edge[8][5].value=50 ; Edge[8][6].value=uplimit Edge[8][8].value=0;

Edge[8][9].value=22, Edge[8][10].value=10;

, Edge[5][1].value=uplimit ,

Edge[5][4].value=9,

,

Edge[5][7].value=15

,

Edge[6][1].value=10 ,

Edge[6][4].value=uplimit,

Edge[6][7].value=35 , , Edge[7][1].value=uplimit ,

Edge[7][4].value=uplimit,

Edge[7][7].value=0 , ,

Edge[8][1].value=21

,

Edge[8][4].value=uplimit; ,

Edge[8][7].value=uplimit

,

Edge[9][0].value=uplimit Edge[9][2].value=uplimit ; Edge[9][3].value=uplimit, Edge[9][5].value=14 ;

,

Edge[9][1].value=16 ,

Edge[9][4].value=uplimit,

Edge[9][6].value=30 , Edge[9][7].value=13 , Edge[9][8].value=22;

Edge[9][9].value=0, Edge[9][10].value=uplimit; Edge[10][0].value=uplimit Edge[10][2].value=uplimit; Edge[10][3].value=uplimit, Edge[10][5].value=uplimit ; Edge[10][6].value=uplimit

, ,

Edge[10][1].value=uplimit

,

Edge[10][4].value=60;

,

Edge[10][7].value=uplimit

Edge[10][8].value=10;

Edge[10][9].value=uplimit, Edge[10][10].value=0; } } }

/* 找出场所间的最短距离--迪杰斯特拉算法 */

void ShortestDist(int s){

for ( int i=0;i<11;i++){ //dist和path数组初始化 dist[i].value=Edge[s][i].value; //邻接矩阵第s行元素赋值到dist中 S[i].value=0; //已求出最短路径的顶点集合初始化 if(i!=s && dist[i].value

else path[i].value=-1; //路径存放数组初始化 }

S[s].value=1; //顶点s加入顶点集合

dist[s].value=0; /* 循环计算该场所与邻接场所之间的最短距离 */

for (i=0;i<11-1;i++){ //从顶点s确定n-1条路径 float min=uplimit; int u=s;

for (int j=0;j<11;j++){ //选择当前不在集合S中具有最短路径的顶点u

/* 如果有路径比目前的最小值还小,则替换这个最小值 */ if (!S[j].value && dist[j].value

u=j;

min=dist[j].value; } }

S[u].value=1; //将顶点u加入集合S,表示它已在最短路径上

for (int w=0;w<11;w++){ //修改 if (!S[w].value && Edge[u][w].value

void bh() //显示场所名称 {

cout<<\女生公寓 1.图书馆 2.体育馆\ cout<<\校东门 4.一教学楼 5.教师公寓\ cout<<\食堂 7.体育场 8.校南门\ cout<<\大学生活动中心 10.实验楼\}

/*将顶点序列号转换成场所名称*/

void Outpath(int c) { switch(c) {

case 0: cout<<\女生公寓\ case 1: cout<< \图书馆\ case 2: cout<< \体育馆\ case 3: cout<< \校东门\ case 4: cout<< \一教学楼\

case 5: cout<< \教师公寓\ case 6: cout<< \食堂\ case 7: cout<< \体育场\ case 8: cout<< \校南门\

&&

case 9: cout<< \大学生活动中心\ case 10:cout<<\实验楼\ }

}

/* 输出两个场所之间的最短距离,和最短路径 */ void getdata(int s,int e){ D[0].value=e;

int k;

for (k=0;D[k].value!=s;k++){ D[k+1].value=path[D[k].value].value; }

if(S[e].value){

cout<<\场所\之间的最短距离\

cout<<\场所\之间的最短路径是:\ for(; k!=-1;k--){ Outpath(D[k].value); if (k!=0){ cout<<\ } } } else

cout<<\场所\到场所\之间没有路径!\ }

void Begin(){ int flag=1; int s,e; while ( flag ){

bh();

cout<<\请输入起始场所号与目的场所号:\ cin>>s>>e;

cout<

if(s<11 && s>=0 && e<11 && e>=0){ flag=0; } else

cout<<\场所号非法,请重新输入!\ }

ShortestDist(s); getdata(s,e);

是: }

/*显示场所的具体信息*/

void info(int c) //c为场所对应的数字号 {

switch(c) {

case 0:

cout<<\▲ 女生公寓,具体指桂园七栋,住宿条件较好。

\

break; case 1:

cout<<\▲ 图书馆,内部藏有丰富的书籍,供同学们学习参

考,也可以自习。\ break; case 2: \

cout<<\▲ 体育馆,供同学们进行体育活动以及上体育课。 break;

case 3: cout<<\▲ 校东门,吉林大学珠海学院的正门。\

break;

case 4: cout<<\▲ 一教学楼,供同学们上课和自习使用。\ break; case 5:

cout<<\▲ 教师公寓,提供给单身的老师们居住。\

break; case 6:

cout<<\▲ 食堂,有两层楼,是同学们用餐的地方。\

break; case 7:

cout<<\▲ 体育场,是同学们开运动会和进行体育赛事的地

方。\ break; case 8:

cout<<\▲ 校南门,这是同学,老师比较集中的地方。晚上的时候这里最热闹。;\ cout<<\另一边是小店的集中地,相当于一个小型商业街。

\

break; case 9:

cout<<\▲ 大学生活动中心,这栋楼是办公楼也是活动中

心,主要供各系的同学办活动使用 ;\

cout<<\这栋楼的后面就是高尔夫球场,主要供旅游系的

同学上课使用。\ break;

case 10: cout<<\▲ 实验楼,是同学们计算机上机,各系做实验的地方。\ }

void num(){

cout<<\ cout<<\校园导航系统 *****\ cout<<\ cout<<\女生公寓\

cout<<\图书馆\ cout<<\体育馆\

cout<<\校东门\ cout<<\一教学楼\ cout<<\教师公寓\ cout<<\食堂\

cout<<\体育场\ cout<<\校南门\

cout<<\大学生活动中心\ cout<<\实验楼\}

void main(){

break; case 11:

system(\

break; default: }

cout<<\输入不合法,请重新输入!\ break;

int c;

char option='0';

cout<<\ cout<<\ cout<<\ cout<<\ cout<<\ cout<<\cout<<\ cout<

cout<<\ cout<<\欢迎光临吉林大学珠海学院\

cout<<\ cout<

<<\———————————————————————————\

cout<<\显示场所的编号\ cout<<\查看场所的具体信息\

cout<<\找出最短路径及计算路径长度\ cout<<\退出\

cout<<\———————————————————————————\

cout<>option;

while (option!='0'){ switch(option)

{

case '1': num();

cout<

<<\

cout<<\显示场所的编号\

cout<<\查看场所的具体信息\

cout<<\找出最短路径及计算路径长度\ cout<<\退出\

cout<<\ cout<<\请输入选择:\ cin>>option;

system(\清屏

break;

case '2': //具体信息

cout<

cout<

cout<<\请从0~10中选择任意字母,查看所对应场所的具体信息:\

cout<<\选择11则退出该命令\bh(); //显示所有场所 cin>>c; info(c); if(c==11){

cout<

<<\

cout<<\显示场所的编号\

cout<<\查看场所的具体信息\

cout<<\找出最短路径及计算路径长度\ cout<<\退出\

cout<<\

cout<<\请输入选择:\ cin>>option;

}

break;

case '3': //查询

BuildMap();

Begin();

cout<

<<\

cout<<\显示场所的编号\ cout<<\查看场所的具体信息\

cout<<\找出最短路径及计算路径长度\

cout<<\退出\

cout<<\ cout<<\请输入选择:\

cin>>option;

system(\ break;

case'4': //退出 cout<<\cout<<\ cout<<\ cout<<\ cout<<\ cout<<\ cout<<\ } }

getch();

exit(0); break;

}

五、程序运行的测试与分析

六、结论与心得

随着计算机软硬件的不断发展,导航系统在客户需求中的应用已成必然。 本系统在开发中也是严格按照学校的实际情况进行开发的,在开发中,查阅了很多相关的算法资料,巩固了数据结构、C语言和C++方面的知识,同时也学习了新的算法知识。最重要的是在开发过程中,通过不断地学习,不断提高自己编程能力和实际应用能力,还有助于改善自己的逻辑思维能力,这对自己以后对软件的开发提供很大的帮助。另外通过此次课程的设计使我认识到对知识的掌握不全面,即在学习专业知识的同时还需要再加强其他方面知识的学习,因为软件的开发有时候涉及到其他方面的知识,只有了解了其他方面的知识才能收集资料,然后用于软件开发。

七、参考资料

1、数据结构及应用算法教程 严蔚敏 陈文博著 2、数据结构与算法实用教程 刘玉龙主编 3、面向21世纪课程教材 数据结构与算法 许卓群 杨冬青 唐世渭 张铭 编著

4、数据结构教程 李春葆编著 5、数据结构实验指导 李春葆编著

本文来源:https://www.bwwdw.com/article/2b2a.html

Top