数据结构课程设计-校园导航
校园导航系统 数据结构课程设计 C++开发

分类号编号华北***大学North China Institute of Water Conservancy andHydroelectric Power课程设计题目校园导航院系信息工程学院专业计算机科学与技术姓名******学号201117000指导教师*****2012年7月6 日目录1.需求分析 (1)1.1问题描述 (1)1.2课程设计目的 (1)1.3设计要求 (1)2.概要设计 (2)2.1任务定义 (2)2.2数据结构 (2)2.3 校园平面图展示 (2)2.4系统功能图 (4)3.详细设计 (4)3.1各个模块名称和功能 (4)3.2具体函数模块详解 (5)3.2.1校园平面图展示 (5)3.2.2任意两点的所有路径 (5)3.2.3校园基础设施介绍 (6)3.2.4指定两点间最短路径 (6)3.2.5单点到其他左右顶点间最短路径 (6)3.2.6华北水利水电学院简介 (7)3.2.7访客留言 (7)3.2.8浏览访客留言 (7)3.3 主要算法思想描述 (7)3.4各函数之间的调用关系示意图 (7)4.测试与分析 (8)4.1测试显示 (8)4.2调试分析 (12)4.2.1调试过程中遇到的问题与解决方案 (12)4.2.2算法的时空复杂度分析 (12)5.用户使用说明 (12)6.实验总结 (14)7.参考文献 (14)8.附件 (15)校园导航系统1.需求分析1.1问题描述我们熟悉一个地方的地形情况通常是借助于一张地图,通常的地图包含的信息十分的有限,而且具体到某一个建筑物,你不能了解到它的进一步的详细的情况。
因此,导航系统就应运而生了。
具体到本系统,作为用户浏览校园时,只拿着学校的地图是能够游遍全校,但是各建筑内部的情况就必须实地考察才能了解,既费时又费力。
有了我们的校园的导航系统,用户可以根据自己的需要,迅速找到所关心的地点,并且可以看到它的详细的信息。
1.2课程设计目的本课程设计的目的就是要达到理论与实际应用相结合,使我们能够根据数据对象的特性,学会数据组织的方法,能把现实世界中的实际问题在计算机内部表示出来,培养程序设计技能如下:(1)了解并掌握数据结构算法的设计方法,具备初步的独立分析和设计能力;(2)初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;(3) 独立完成,提高运用所学的理论知识和方法独立分析和解决问题的能力;1.3设计要求设计一个校园导航系统,为来访的客人提供导航服务,具体要求:(1) 设计学校的平面图,至少包括10个以上的场所,每两个场所间可以有不同的路,且路长也可能不同,找出从任意场所到达另一场所的最佳路径(最短路径)。
数据结构报告 校园导航问题

Microsoft Visual C++ 6.0设计一个校园导游程序,为来访的客人提供各种信息查询服务。
为来访客人提供图中任意景点相关信息的查询。
为来访客人提供图中任意景点相关信息的查询。
用户只需要按照页面的提示输入需要操作的序号,然后按回车确认即可。
当用户输入所要查询的地点序号,并且回车后,屏幕自动生成所查询路径的最短路线和距离。
当用户进入最短距离查询界面后,输入起始地点序号 1 (江苏大学校大门)和终点序号后5 (药学院),屏幕上自动生成这两条路径之间的最短距离519 米,和最短路径江苏大学校大门→ 图书馆→药学院。
当用户输入起始地点序号7(三江楼) 和终点序号后13(女生一区),屏幕上自动生成这两条路径之间的最短距离1305 米,和最短路径为三江楼→三山楼→ 东山操场→女生一区。
结构体的定义:typedef struct VertexType{int number;char *sight;}VertexType;typedef struct{VertexType vex[NUM];int arcs[NUM][NUM];int vexnum;}MGraph;常量的定义:#define Max 32767#define NUM 1各个函数的定义:void CreateMGraph(int v) //创建图的函数,其中v 表示图中的顶点数void Map() //地图展示函数,用于输出西安科技大学的平面简略图char Menu() //主菜单显示于操作界面void Info() //资料介绍函数,用于当用户选择查询地点资料时输出地点的资料信息void Dijkstra(int num) //迪杰斯特拉函数void Display(int sight1,int sight2) //地图展示函数void main() //主函数的定义求最短路径算法流程图:#define Max 32767 //用Max 来表示权值为此时的两点间直接不可达#define NUM 15 //选取了学校的十七个地点用数组存储,其中数组第一个元素不存储地点以方便操作typedef struct VertexType{int number;char *sight;}VertexType; //定义顶点的结构体类型, number 表示顶点编号,字符数组表示顶点的名称typedef struct{VertexType vex[NUM];int arcs[NUM][NUM];int vexnum;}MGraph; //定义图的结构体类型, vex[NUM]数组存储顶点, arcsp[NUM][NUM]矩阵存储边的权值, vexnum 表示顶点的个数MGraph G;{生成G 表示结构体变量MGraph}int P[NUM][NUM]; //定义全局变量P[NUM][NUM]存储点之间的最短路径long int D[NUM]; //定义全局变量D[NUM]存储点之间最短路径的权值void Dijkstra(int num) //通过迪杰斯特拉算法求 num 点到其余点的最短路径,并将最短路径保存在数组 P[NUM][NUM]中,将最短路径的权值保存在数组D[NUM]中{int v,w,i,t;int final[NUM];int min;for(v=1;v<NUM;v++){final[v]=0; //置空最短路径终点集D[v]=G.arcs[num][v]; //置初始的最短路径长度for(w=1;w<NUM;w++)P[v][w]=0; //置空最短路径if(D[v]<32767){P[v][num]=1;P[v][v]=1;}}D[num]=0;final[num]=1; //初始化 num 顶点属于 S 集for(i=1;i<NUM;++i) //开始循环,每次求得num 到某个顶点的最短路径,并添加到 S 集{min=Max; //min 为当前所知的 num 到顶点的最短距离for(w=1;w<NUM;++w)if(!final[w]) //w 顶点在 V-S 集中if(D[w]<min){v=w;min=D[w];}final[v]=1; //与 num 相距最近的顶点并入 S 集for(w=1;w<NUM;++w) //更新最短路径//修改 D[w]和if(!final[w]&&((min+G.arcs[v][w])<D[w]))P[w],w 在 V-S 集中{D[w]=min+G.arcs[v][w];for(t=0;t<NUM;t++)P[w][t]=P[v][t];P[w][w]=1;}}}char Menu() //主菜单显示于操作界面从而让用户选择查询路径功能或者查询地点信息功能char c;int flag; //定义标志 flag 确定循环条件do{flag=1;Map();printf("\t\t 1.查询地点路径 \n");printf("\t\t 2.地点信息简介\n");printf("\t\t e.退出 \n");printf("\t ***********************江苏大学*************************\n");printf("\t\t\t 请输入您的选择: ");scanf("%c",&c);if(c=='1' | |c=='2' | |c=='e')flag=0;}while(flag);return c;}void Display(int sight1,int sight2) //输出函数用于通过数组 P[NUM][NUM]提取出从点 sight1 到点 sight2 的最短路径,从 D[NUM]中输出点 sight1 到点 sight2 的最短路径的权值{int a,b,c,d,q=0;a=sight2;if(a!=sight1){printf("\n\t 从%s 到%s 的最短路径是",G.vex[sight1].sight,G.vex[sight2].sight);printf("\t(最短距离为 %dm.)\n\n\t",D[a]); 到 sight2 的最短距离的权值输出printf("\t%s",G.vex[sight1].sight);d=sight1;for(c=0;c<NUM;++c){P[a][sight1]=0;for(b=0;b<NUM;b++){if(G.arcs[d][b]<32767&&P[a][b]){printf("-->%s",G.vex[b].sight); sight1 到 sight2 的最短路径q=q+1;P[a][b]=0;d=b;if(q%8==0) printf("\n");}}}}}void main() //主函数{int v0,v1;char e;char ck; //从 D[NUM]中提取出 sight1 //通过 P[NUM][NUM]确定CreateMGraph(NUM);Do //用 do while 循环确保循环至少进行一次{system("cls"); //用 system("cls")清屏使屏幕简洁ck=Menu();switch(ck) //用 switch 语句确定用户选择功能{case '1':gate: //门函数使程序退回到 gate 位置system("cls");Map();do{printf("\n\n\t\t\t 请选择出发地序号(1~14):");scanf("%d",&v0);if(v0<1| |v0>17)printf("\n\n\t\t\t\t 输入错误!\n");}while(v0<1| |v0>17);do{printf("\t\t\t 请选择目的地序号(1~14):");scanf("%d",&v1);if(v1<1| |v1>14| |v1==v0)printf("\n\n\t\t\t\t 输入错误!\n");}while(v1<1| |v1>14| |v1==v0);Dijkstra(v0);Display(v0,v1);printf("\n\n\t\t\t\t 请按任意键继续,按 e 退回首页\n");getchar();scanf("%c",&e);if(e=='e'){当标识符 e 等于 e 时跳出语句}break;goto gate;case'2':system("cls");Info();printf("\n\n\t\t\t\t 请按回车键退回首页...\n");getchar();getchar();break;};}while(ck!='e'); //当标识符 ck 不等于 e 时继续循环}打开程序所显示的界面。
数据结构校园导航系统课程设计报告

《校园导航系统》课程设计报告姓名:蒋小文学号:110236100123 班级:1班专业:网络工程指导教师:唐轶媛蒋荣萍时间:2012年7月5日信息科学与工程学院目录摘要 (1)1.目的 (2)2.要求 (2)3.题目 (2)4.任务 (2)1).需求分析 (3)2).概要设计 (4)3).详细设计 (5)4).调试分析 (8)5.课设总结 (18)6.附录源代码 (19)1.目的数据结构是计算机专业的核心课程,是一门实践性很强的课程。
课程设计是加强学生实践能力的一个强有力手段,要求学生掌握数据结构的应用、算法的编写、类C语言的算法转换成C (C++)程序并上机调试的基本方法,还要求学生在完成程序设计的同时能够写出比较规范的设计报告。
2.要求2.1 课程设计时间为2周;2.2 设计语言C(C++)不限;2.3 课余时间完成源程序和课程设计报告等文档书写工作,上机时间只能做调试工作。
上机时带上源程序、数据结构教材、C语言教材。
2.4 上机任务(1)选择并定义合适的数据结构;(2)根据程序所要完成的基本要求,设计出完整的算法;(3)设计出主程序(main函数),使其成为完整的程序。
2.5 上机时间:上午8:30--11:30,下午3:00--5:303.题目题目:校园导航系统设计一个校园导游程序,后台操作:3.1、操作员信息管理如修改密码等3.2、能根据学校的规模进行添加景点信息、修改景点信息等功能,3.3、若临时有交通管制,能进行交通管制的设置和撤销(如某某时间段那条路进行那个方向的交通管制等)3.4、前台为来访的客人提供各种信息查询服务:3.4.1、设计学校的校园平面图,所含景点不少于10个。
以图中顶点表示校内各景点,存放景点名称、代号、简介等信息;以边表示路径,存放路径长度等相关信息。
3.4.2、为来访客人提供图中任意景点相关信息的查询。
3.4.3、提供途中任意景点问路查询,即求任意两个景点间的一条最短的简单路径。
数据结构课程设计实例探讨之校园导航设计

SIC &T HOoY CNE E NLG E C
数 据 结 构 课 程 设 计 实例 探 讨 之 校 园导 航 设 计
周李 涌 高鹭 ( 内蒙 古科技 大学信 息工程 学院 内蒙古包 头
0 0 ) 1 1 4 0
摘 要 : 据结构课 程设计是 数据蛄构课 程 中的 重要 教 学环 节, 数 本次设计 其 实就是 教据结 构 中圉奏的同题 。 将校 园建 筑作 为圈的顶点 , 将 建 筑 问的路径 作 为圈的边 , 路径 噩 离作 为边 的权 值 。 样 , 两建 筑 间最短路 径 的 问题 就抽 象成 了求 圈中一 顶点 到另一 顶点 的问题 。 这 求 关键 词 : 数据 结构 图 路径 距 离 中 图分 类 号 : 4 3 G 2 文献 标 识 码 : A 文章 编 号 : 6 2 3 9 ( 0 9 1 () 0 0 — 1 1 7 — 7 I 2 0 )0 a 一 2 9 0 数 据 结 构 课 程 设 计 是 数据 结 构 课 程 中 的 重 要 教 学 环 节 , 锻 炼 学 生 理 论 联 系 实 是 际 的 重 要 手 段 。 过 数 据 结 构 课 程 设 计 要 通 求学生掌握 数据结构与算 法的设计方 法 , 具 备 初 步 的 独 立 分 析 和 设 计 能 力 ; 步 掌 初 握 软 件 开 发 过 程 的 问题 分 析 、 系统 设 计 、 程 序 编码 试 等 基 本 方法 和 技 能 ; 高综 合 测 提 运 用 所 学 的 理 论 知 识 和 方 法独 立 分 析 和 解 决 问题 的 能 力 , 练 用 系 统 的 观 点 和 软 件 训 开 发 一 般 规 范 进 行 软 件 开 发 , 养 软 件 工 培 作者所应具 备的科学的工作方法和作风 。 的 子 任 务 , 分 解 出 许 多 子 功 能 模 块 进 行 即 设 计 。 程 序 经 过 分 析 可 划 分 出 9 子 模 本 个 块 :1建 立 图的 信 息 : 邻 接表 存 储 输 入 图 () 按 的 信 息 。2从 文 件 中读 取 图的 信 息 : 文件 () 把 中的原 有 信 息 读 入 , 程 序使 用 。3输入 并 为 () 保 存 景 点 简 介 信 息 : 新 输 入 图 的 景 点 或 重 是 建 筑 信 息 并 保 存 到 文件 中 。4读 取 并 查 () 找 简 介信 息 : 文 件 中读 入 信 息 , 找 指 定 在 查 建筑 的 简 介 信 息 。5输 出 图邻 接 表 : 出 图 () 输 的 邻接 表 信 息 。6 按 广 度优 先 遍 历 图 : 广 () 按 度 优 先 规 则 遍 历 并 输 出遍 历结 果 。7输 出 () 结 点 间 的 距 离 : 入 一 个 节 点 输 出 所 有 节 输 点到 它 的 距 离 。8 输 出结 点 间的 路 径 : 入 () 输 个 节 点 输 出所 有 节 点 到 它 的 距 离 及 其 具 体 路 径 。9 书 写 文 件信 息 : 写有 关 文 件信 () 书 息 。 : 点 或 是 建 筑 简 介 、 的 邻 接 表 信 如 景 图 息、 码。 密
课程设计—校园导航问题

课程设计报告书专业:计算机科学与技术课程设计名称:《数据结构课程设计》题目:校园导航问题班级:学号:姓名:同组人员:指导老师:完成时间:摘要校园导航要求每两个场所间可以有不同的路,且路长也可能不同,找出从任意场所到达另一场所的最佳路径(最短路径)。
要用“邻接矩阵”来存储各点间的距离,然后用floyd算法求出最短路径。
所以采用工程思想,将系统共分以下五个模块:节点数据结构类型、创建导航图函数、最短路径导航函数、查询函数声明、主菜单。
关键词:数据结构;算法设计目录目录第一章开发环境和开发工具 (1)1.1 C语言简介 .......................................................................................................... . (1)1.2 开发背景 (2)1.3 开发环境 (2)第二章算法思想 (3)2.1 系统需求分析 (3)2.2 系统总体设计 (4)2.2.1 系统设计目标 (4)2.2.2 开发设计思想 (4)2.2.3 系统功能模块设计 (4)2.3 算法思想描述 (4)第三章算法实现 (6)3.1 数据结构 (6)3.2 程序模块 (8)3.3 各模块之间的调用关系 (9)3.4 源程序代码 (10)第四章测试与分析 (16)4.1 测试数据选择 (16)4.2 测试结果分析 (20)总结 (21)心得体会 (21)参考文献 (22)第一章开发环境和开发工具1.1 C/C++简介计算机诞生初期,人们要使用计算机必须用机器语言或汇编语言编写程序。世界上第一种计算机高级语言诞生于1954年,它是FORTRAN语言。先后出现了多种计算机高级语言。其中使用最广泛、影响最大的当推BASIC语言和C语言。它是一种使用非常广泛的计算机编程语言。
C++是一种静态数据类型检查的、支持多重编程范式的通用程序设计语言。
数据结构课程设计-校园导航

课程设计报告课程名称数据结构课程设计题目校园导航指导教师设计起始日期学院计算机学院系别计算机科学与工程学生姓名班级/学号成绩一、需求分析本次实验设计的任务是实现一个简易的北京信息科技大学的校园导航平面图。
设计要包括下列要求:设计你的学校的平面图,至少包括10个以上的场所,每两个场所间可以有不同的路,且路长也可能不同,找出从任意场所到达另一场所的最佳路径(最短路径)。
本课题实现校园多个场所(至少10个)的最短路径求解。
(1)输入的形式和输入值的范围:本系统主要数据类型为字符型char及整形int,char型主要包括单位编号,单位名称,单位简介,功能编号;输入功能编号与单位编号进行操作。
(2 ) 输出的形式:输出则通过已有的信息数据,通过相关的操作输出相应信息。
(3) 程序所能达到的功能:本程序可供任何人使用,主要功能 1.浏览各单位及简介;2.查看所有游览路线;3.选择出发点和目的地求出最佳路径;4.查看某一单位信息。
(4)测试数据:包括正确的输入及其输出结果和含有错误的输入及其输出结果。
a.首先看到的是校园导航系统的菜单:b.查看浏览路线等待输入起始景点:C.选择出发点与目的地等待输入起始景点与目的地编号:d.参看景点信息等待输入景点编号:二、概要设计本系统包含一个文件。
设计分有菜单,显示信息,弗洛伊德算法,迪杰斯特拉算法,查找景点信息等程序段。
主程序为整系统的入口处,菜单主要实现显示系统功能,显示信息主要实现显示景点信息,弗洛伊德算法主要实现求两景点之间最短路径,迪杰斯特拉算法实现求两景点之间最短路径,查找景点信息主要实现显示某一景点信息。
系统首先通过主程序调用void main( );进入系统主菜单函数,根据用户的选择可分别进入:1.浏览各景点及简介;2.查看所有游览路线;3.选择出发点和目的地求出最佳路径;4.查看景点信息;5.退出系统。
选择“浏览各景点及简介”项,显示十个景点的有关信息,包括景点编号,景点名称,景点简介。
数据结构课程设计--校园导航图

extern void Ppath(int path[],int i,int v);
void Point(MGraph p)
{
int x,y;
printf("请输入您所在的位置及目的地\n");
{8,32767,32767,8,32767,32767,6,32767,32767}};
p.n=M;p.e=N;
int i,j;
for(i=1;i<=M;i++)
for(j=1;j<=M;j++)
p.edges[i][j]=a[i][j];
for(i=1;i<=M;i++)
p.vexs[i].no=i;
typedef struct mgraph
{ int edges[MAXV][MAXV];
int n,e;//元素总个数边数
VertexType vexs[MAXV];
}MGraph;
extern void Check();
extern void Order(MGraph);
extern void Point(MGraph);
extern void Out(int x);
void Order(MGraph p)
{
int a[M+1][M+1];
a[M+1][M+1]={{0,1,2,3,4,5,6,7,8},
{1,0,5,32767,32767,32767,32767,32767,32767},
{2,5,0,10,8,32767,32767,32767,32767},
数据结构校园导航问题

课程设计报告课程名称:数据结构设计题目:校园导航问题院系:信息技术学院班级:设计者:学号:指导教师:设计时间:目录一、设计目的 0二、设计要求和设计指标 0三、设计内容 03.1需求分析 03.1.1程序所能达到的功能 03.1.2输入的形式和输入值的范围 03.1.3输出的形式 (1)3.1.4测试数据和输出结果 (1)3.2总体设计 (1)3.2.1抽象数据类型定义 (1)3.2.2主程序模块的整体流程 (2)3.2.3各模块调用关系如下 (2)3.3详细设计 (2)3.3.1有向网节点结构体类型定义 (2)3.3.2 主程序和其它主要函数伪码算法 (3)3.3.3 函数的调用关系 (10)3.4测试与分析 (10)3.4.1测试 (10)3.4.2分析 (12)四、总结 (13)五、参考文献 (13)六、附录 (13)课程设计(大作业)报告一、设计目的1.加深对《数据结构》这一课程所学内容的进一步理解与巩固2.通过完成课程设计,逐渐培养自己的编程能力;3.培养给出题目后,构建框架,用计算机解决的能力;4.通过调试程序积累调试C程序设计的经验;二、设计要求和设计指标设计你的学校的平面图,至少包括10个以上的场所,每两个场所间可以有不同的路,且路长也可能不同,找出从任意场所到达另一场所的最佳路径(最短路径)三、设计内容3.1需求分析3.1.1程序所能达到的功能(1) map——输出辽宁工程技术大学平面图。
(2) init()——按相应编号输入各个节点内容,对相应路径赋值的函数。
(3) menu()——菜单函数(4) information()——输出简介的函数(5) way()——最短路径的输出函数(6) shortestpath()——调用弗洛伊德和最短路径输出的函数(7) main()——主函数3.1.2输入的形式和输入值的范围输入数字和字母:字母:以s查询最短路径;以i查询信息;以e退出程序。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据结构课程设计-校园导航-CAL-FENGHAI-(2020YEAR-YICAI)_JINGBIAN课程设计报告课程名称数据结构课程设计题目校园导航指导教师设计起始日期 5.9~5.16学院计算机学院系别计算机科学与工程学生姓名班级/学号成绩一、需求分析本次实验设计的任务是实现一个简易的北京信息科技大学的校园导航平面图。
设计要包括下列要求:设计你的学校的平面图,至少包括10个以上的场所,每两个场所间可以有不同的路,且路长也可能不同,找出从任意场所到达另一场所的最佳路径(最短路径)。
本课题实现校园多个场所(至少10个)的最短路径求解。
(1)输入的形式和输入值的范围:本系统主要数据类型为字符型char及整形int,char型主要包括单位编号,单位名称,单位简介,功能编号;输入功能编号与单位编号进行操作。
(2 ) 输出的形式:输出则通过已有的信息数据,通过相关的操作输出相应信息。
(3) 程序所能达到的功能:本程序可供任何人使用,主要功能1.浏览各单位及简介;2.查看所有游览路线;3.选择出发点和目的地求出最佳路径;4.查看某一单位信息。
(4)测试数据:包括正确的输入及其输出结果和含有错误的输入及其输出结果。
a.首先看到的是校园导航系统的菜单:b.查看浏览路线等待输入起始景点:C.选择出发点与目的地等待输入起始景点与目的地编号:d.参看景点信息等待输入景点编号:二、概要设计本系统包含一个文件。
设计分有菜单,显示信息,弗洛伊德算法,迪杰斯特拉算法,查找景点信息等程序段。
主程序为整系统的入口处,菜单主要实现显示系统功能,显示信息主要实现显示景点信息,弗洛伊德算法主要实现求两景点之间最短路径,迪杰斯特拉算法实现求两景点之间最短路径,查找景点信息主要实现显示某一景点信息。
系统首先通过主程序调用void main( );进入系统主菜单函数,根据用户的选择可分别进入:1.浏览各景点及简介;2.查看所有游览路线;3.选择出发点和目的地求出最佳路径;4.查看景点信息;5.退出系统。
选择“浏览各景点及简介”项,显示十个景点的有关信息,包括景点编号,景点名称,景点简介。
选择“查看所有游览路线”项,会进入输入起始景点编号的界面,输入正确编号后会显示起始景点到其余九个景点的最短路线的方案。
选择“选择出发点和目的地”项,会进入输入起始景点与目的景点的界面,输入起始景点与目的景点,并有空格隔开就得到两景点之间的最佳路径。
选择“查看景点信息”项,会进入输入要查看的景点的界面,如入后会显示该景点的有关信息。
选择“退出系统”项,就会退出程序。
三、详细设计(1)十三个单位的图0:前门1:图书馆2:教二楼3:实验楼4:操场5:教一楼6:食堂7:水房8:学一公寓9:学二公寓10:学三公寓11:学四公寓12:后门(2)主程序流程图:(3)弗洛伊德的算法:void Floyd(MGraph *G){int v,u,i,w,k,j,flag=1,p[10][10][10],D[10][10];//定义参数for(v=0;v<G->vexnum;v++)for(w=0;w<G->vexnum;w++){D[v][w]=G->arcs[v][w].adj;for(u=0;u<G->vexnum;u++)p[v][w][u]=0;if(D[v][w]<INFINITY){p[v][w][v]=1;p[v][w][w]=1;}}for(u=0;u<G->vexnum;u++)for(v=0;v<G->vexnum;v++)for(w=0;w<G->vexnum;w++)if(D[v][u]+D[u][w]<D[v][w]){D[v][w]=D[v][u]+D[u][w];for(i=0;i<G->vexnum;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&&k<G->vexnum&&j>=0&&j<G->vexnum)flag=0;}cout<<G->vexs[k].name; //输出景点名称for(u=0;u<G->vexnum;u++)if(p[k][j][u]&&k!=u&&j!=u) //输出路线cout<<"-->"<<G->vexs[u].name;cout<<"-->"<<G->vexs[j].name;cout<<" 总路线长"<<D[k][j]<<endl; //输出总路线长度}四、调试分析(1)在程序设计中遇到了输出景点信息的表不整齐,用setw()解决了;默认的界面太小,不能完整的看到输出信息,用了system("mode con: cols=100 lines=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、退出程序界面。
六、心得体会做一个系统之前还应该做好全面的安排,对一个系统的整个流程及功能实现有一个很好的统筹,几个人合作的功能可拆才拆,不可则由一个人主要负责,其它人帮忙思考,出意见,做系统之前几个人必须先做对系统做一次较详细的探讨研究,然后才开始分工,一个阶段后组员应互相交流情况,以达到一致。
另在遇到困难时组员不能解决,应查资料或问其它懂的同学,参考一下意见,再结合自己的想法,最后实现自己想实现的功能。
七、附录#define INFINITY 10000 /*无穷大*/#define MAX_VERTEX_NUM 40#define MAX 40#include<stdlib.h>#include<string.h>#include<iostream>using namespace std;#include<iomanip>typedef struct ArCell{int adj; //路径长度}ArCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];typedef struct//图中顶点表示主要景点,存放景点的编号、名称、简介等信息,{char name[30];int num;char introduction[100];//简介}infotype;typedef struct{infotype vexs[MAX_VERTEX_NUM];AdjMatrix arcs;int vexnum,arcnum;}MGraph;MGraph b;MGraph InitGraph(void);void Menu(void);void Browser(MGraph *G);void ShortestPath_DIJ(MGraph * G);void Floyd(MGraph *G);void Search(MGraph *G);/***********************主函数*******************************/ void main(void){system("color 1f");system("mode con: cols=100 lines=40");int i;b=InitGraph();Menu();cin>>i;while(i!=5){switch(i){case 1:system("cls");Browser(&b);Menu();break;case 2:system("cls");ShortestPath_DIJ(&b);Menu();break;case 3:system("cls");Floyd(&b);Menu();break;case 4:system("cls");Search(&b);Menu();break;case 5:exit(1);break;default:break;}cin>>i;}}/*************************************************************//*************************定义景点编号,名称及简介************/MGraph InitGraph(void){MGraph G;int i,j;G.vexnum=10; //十个景点G.arcnum=14; //邻接矩阵for(i=0;i<G.vexnum;i++)G.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;i<G.vexnum;i++)for(j=0;j<G.vexnum;j++)G.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;i<G.vexnum;i++)for(j=0;j<G.vexnum;j++)G.arcs[j][i].adj=G.arcs[i][j].adj;return G;}/******************************************************************************************* //********************************主菜单(显示输入提示)****************************************/void Menu(){cout<<" 北京信息科技大学大学导游图 "<<endl;cout<<" ┏━━━━━━━━━━━━━━━━━━━━┓"<<endl;cout<<" ┃ 1.浏览各景点及简介┃"<<endl;cout<<" ┃ 2.查看所有游览路线┃"<<endl;cout<<" ┃ 3.选择出发点和目的地┃"<<endl;cout<<" ┃ 4.查看景点信息┃"<<endl;cout<<" ┃ 5.退出系统┃"<<endl;cout<<" ┗━━━━━━━━━━━━━━━━━━━━┛"<<endl;cout<<"Option-:";}/************************************显示景点编号、名称、简介****************************************/void Browser(MGraph *G){int v;cout<<"┏━━┳━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓"<<endl;cout<<"┃编号┃景点名称┃简介┃"<<endl;for(v=0;v<G->vexnum;v++)cout<<"┃"<<G->vexs[v].num<<setw(5)<<"┃"<<G->vexs[v].name<<setw(10)<<"┃"<<G->vexs[v].introduction<<setw(3)<<"┃"<<endl;cout<<"┗━━┻━━━━━━━━┻━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛"<<endl;}/********************迪杰斯特拉算法来计算出起点到各个顶点之间的最短路径,v0为起点***********************/void ShortestPath_DIJ(MGraph * G){int v,w,i,min,t=0,x,flag=1,v0;int final[20], D[20], p[20][20];cout<<"┏━━┳━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓"<<endl;cout<<"┃编号┃景点名称┃简介┃"<<endl;for(v=0;v<G->vexnum;v++)cout<<"┃"<<G->vexs[v].num<<setw(5)<<"┃"<<G->vexs[v].name<<setw(10)<<"┃"<<G->vexs[v].introduction<<setw(3)<<"┃"<<endl;cout<<"┗━━┻━━━━━━━━┻━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛"<<endl;while(flag){cout<<"请输入一个起始景点编号:";cin>>v0;if(v0<0||v0>G->vexnum){cout<<"景点编号不存在!请重新输入景点编号:";cin>>v0;}if(v0>=0&&v0<G->vexnum)flag=0;}for(v=0;v<G->vexnum;v++){final[v]=0;D[v]=G->arcs[v0][v].adj;for(w=0;w<G->vexnum;w++)p[v][w]=0;if(D[v]<INFINITY){p[v][v0]=1;p[v][v]=1;}}D[v0]=0;final[v0]=1;for(i=1;i<G->vexnum;i++){min=INFINITY;for(w=0;w<G->vexnum;w++)if(!final[w])if(D[w]<min){v=w;min=D[w];}final[v]=1;for(w=0;w<G->vexnum;w++)if(!final[w]&&(min+G->arcs[v][w].adj<D[w])){D[w]=min+G->arcs[v][w].adj;for(x=0;x<G->vexnum;x++)p[w][x]=p[v][x];p[w][w]=1;}}for(v=0;v<G->vexnum;v++){if(v0!=v) cout<<G->vexs[v0].name;for(w=0;w<G->vexnum;w++){if(p[v][w]&&w!=v0) cout<<"-->"<<G->vexs[w].name;t++;}if(t>G->vexnum-1&&v0!=v) cout<<" 总路线长"<<D[v]<<endl;}}/*********************************Floyd函数***************************************/void Floyd(MGraph *G){int v,u,i,w,k,j,flag=1,p[10][10][10],D[10][10];cout<<"┏━━┳━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓"<<endl;cout<<"┃编号┃景点名称┃简介┃"<<endl;for(v=0;v<G->vexnum;v++)cout<<"┃"<<G->vexs[v].num<<setw(5)<<"┃"<<G->vexs[v].name<<setw(10)<<"┃"<<G->vexs[v].introduction<<setw(3)<<"┃"<<endl;cout<<"┗━━┻━━━━━━━━┻━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛"<<endl;for(v=0;v<G->vexnum;v++)for(w=0;w<G->vexnum;w++){D[v][w]=G->arcs[v][w].adj;for(u=0;u<G->vexnum;u++)p[v][w][u]=0;if(D[v][w]<INFINITY){p[v][w][v]=1;p[v][w][w]=1;}}for(u=0;u<G->vexnum;u++)for(v=0;v<G->vexnum;v++)for(w=0;w<G->vexnum;w++)if(D[v][u]+D[u][w]<D[v][w]){D[v][w]=D[v][u]+D[u][w];for(i=0;i<G->vexnum;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&&k<G->vexnum&&j>=0&&j<G->vexnum)flag=0;}cout<<G->vexs[k].name;for(u=0;u<G->vexnum;u++)if(p[k][j][u]&&k!=u&&j!=u)cout<<"-->"<<G->vexs[u].name;cout<<"-->"<<G->vexs[j].name;cout<<" 总路线长"<<D[k][j]<<endl;}//Floyd end/************************************查找景点*******************************************************/ void Search(MGraph *G){int k,v,flag=1;cout<<"┏━━┳━━━━━━━━┓"<<endl;cout<<"┃编号┃景点名称┃"<<endl;for(v=0;v<G->vexnum;v++)cout<<"┃"<<G->vexs[v].num<<setw(5)<<"┃"<<G->vexs[v].name<<setw(10)<<"┃"<<endl;cout<<"┗━━┻━━━━━━━━┛"<<endl;while(flag){cout<<"请输入要查询的景点编号:";cin>>k;if(k<0||k>G->vexnum){cout<<"景点编号不存在!请重新输入景点编号:";cin>>k;}if(k>=0&&k<G->vexnum)flag=0;}cout<<"┏━━┳━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓"<<endl;cout<<"┃编号┃景点名称┃简介┃"<<endl;cout<<"┃"<<G->vexs[k].num<<setw(5)<<"┃"<<G->vexs[k].name<<setw(10)<<"┃"<<G->vexs[k].introduction<<setw(3)<<"┃"<<endl;cout<<"┗━━┻━━━━━━━━┻━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛"<<endl;}//Search end。