第1章 概述
1.1 课程设计目的
《数据结构》是一门实践性较强的专业基础课程,必须在掌握理论知识的同时,加强上机实践。
本课程设计的目的:
(1)巩固和加深对数据结构基本知识的理解,提高综合运用课程知识的能力。
(2)掌握算法分析与设计的基本内容,培养规范化程序设计的习惯。
(3)学会使用种计算机资料和有关参考资,提高程序设计的基本能力。
1.2 设计任务与要求
1.设计任务
设计一个校园导游程序,为来访的客人提供各种信息查询服务。
(1)设计学校的校园平面图,所含景点不少于 10 个,以图中顶点表示校内各景点,存放景点名称、代号、简介等信息,以边表示路径,存放路径长度等相关信息。
(2)为来访客人提供图中任意景点相关信息的查询。
(3)为来访客人提供景点的问路查询,即已知一个景点,查询到某景点之间的一条最短路径及长度。
2.设计要求
(1)对系统进行功能模块分析、控制模块分析。
(2)系统设计要能完成题目所要求的功能。
(3)编程简练,可用,尽可能地使系统的功能更加完善和全面
(4)说明书、流程图要清楚。
(5)提高学生的文档写作能力
(6)特别要求自已独立完成。
3.创新要求
在基本要求达到后,可进行创新设计,如改善算法性能、友好的人机界面。
4.其他要求
(1)要按照规范完成课程设计报告的编辑与排版。
(2)设计报告包括目录、正文、总结、参考文献、附录等
(3)课程设计报告装订按学校的统一要求完成。
1.3 进度计划
第1天:构思及收集资料,理解并掌握系统构建所需的各项技术,进行系统的需求分析、系统的功能模块划分,确定系统的体系架构,确定系统开发采用的技术,并对相关技术进行详细了解和学习。
第2-4天:系统的详细设计,确定各功能模块的实现方法及算法,编程实现系统各项功能及测试。
第5天:撰写课程设计报告。
第2章 需求分析
校园导游系统旨在为来访客人提供便捷的信息查询服务,提高校园导览的效率和准确性。系统需要实现以下功能:
详细需求如下:
(1)设计学校的校园面图。选取校园内11个有代表性的景点,以图中顶点表示景点,边表示路径,存放路径长度等信息。
(2)存放景点代号、名称、简介等信息供用户查询。
(3)提供图中任意景点相关信息的查询。
(4)提供图中任意景点之间的问路查询。
(5)更改校园平面图的信息,提供为校园平面图增加、删除景点或边,修改边上的权值等功能。
图1 课程设计路线图
第3章 概要设计
为了实现以上功能,可以从主界面、系统功能、存储结构 3 方面设计。
3.1 主界面设计
为了实现校园导游系统各功能的管理,首先设计一个含有多个菜单项的主控菜单子程序以链接系统的各项子功能,方便用户使用本系统。系统主控菜单运行界面如图2所示。
图2 主控菜单界面
3.2 系统功能设计
本系统除了要完成图的初始化功能外还设置了 8 个子功能菜单。其功能图如图3所示。依次读入的图的顶点个数和边的个数,分别初始化图结构中图的顶点数组和图的邻接矩阵。
图3 系统功能模块设计
7个子功能的设计描述如下。
(1)学校景点介绍:当用户选择该功能,系统即能输出学校全部景点的信息,包括景点编号、景点名称及景点简介。
(2)查看浏览路线:该功能采用迪杰斯特拉(Dijkstra)算法实现。当用户选择该功能,系统能根据用户输人的起始景点编号,求出从该景点到其他景点的最短路径线路及距离。
(3)查看两景点间最短路径:该功能采用弗洛伊德(Floyd)算法实现。当用户选择该功能,系统能根据用户输人的起始景点及目的地景点编号,查询任意两个景点之间的最短路径线路及距离。
(4)景点信息查询:该功能根据用户输入的景点编号输出该景点的相关信息,例如,景点编号、名称等。
(5)更改图的信息:更改图的信息可以实现图的基本操作,例如,增加新的景点,删除边,重建图等。
(6)打印邻接矩阵:该功能即输出图的邻接矩阵。
(7)退出:即退出校园导游系统。
3.3 存储结构设计
本系统采用 MGraph 图类存储抽象校园图的信息。其中各地点间的邻接关系用图的邻接阵来存储;地点(图的顶点)存储在数组之中,其中每个数组元素是一个 MGraph类的实例,包含3个字段域:景点编号、景点名称、景点介绍。图的顶点个数及边的个数由变量 vexNum、arcNum表示,它们是整型数据。
第4章 详细设计
4.1校园图设计与抽象
本设计以山西财经大学主要景点为例,其地图如图4所示。
图4 山西财经大学校园地图
4.2 校园图操作定义
在抽象的校园图MGraph类中添加以下成员方法,描述有关图、图的顶点和边的操作。
// 定义景点结构体,存储景点编号、名称和简介信息
typedef struct Spot {
int number;
char name[MAXSIZE];
char introduce[MAXSIZE];
} Spot;
// 定义图结构
typedef struct MGraph {
Spot vexs[MAXSIZE]; // 存放顶点
int arcs[MAXSIZE][MAXSIZE]; // 邻接矩阵
int vexnum, arcnum;
} MGraph;
// 开始录入景点信息
MGraph Creat(MGraph mg) {
mg.vexnum = 11;
mg.arcnum = 15;
for (int i = 1; i <= mg.vexnum; i++) {
mg.vexs[i].number = i;
}
// 开始初始化道路
for (int j = 1; j <= mg.vexnum; j++) {
for (int k = 1; k <= mg.vexnum; k++) {
mg.arcs[j][k] = INT_MAX;
}
}
// 开始根据实际情况输入有道路的两个顶点
mg.arcs[1][2] = mg.arcs[2][1] = 100;
mg.arcs[2][3] = mg.arcs[3][2] = 200;
mg.arcs[2][4] = mg.arcs[4][2] = 150;
mg.arcs[2][6] = mg.arcs[6][2] = 200;
mg.arcs[3][4] = mg.arcs[4][3] = 100;
mg.arcs[4][7] = mg.arcs[7][4] = 200;
mg.arcs[4][5] = mg.arcs[5][4] = 250;
mg.arcs[5][8] = mg.arcs[8][5] = 300;
mg.arcs[5][6] = mg.arcs[6][5] = 100;
mg.arcs[7][8] = mg.arcs[8][7] = 250;
mg.arcs[7][9] = mg.arcs[9][7] = 350;
mg.arcs[7][10] = mg.arcs[10][7] = 450;
mg.arcs[8][9] = mg.arcs[9][8] = 100;
mg.arcs[9][10] = mg.arcs[10][9] = 200;
mg.arcs[10][11] = mg.arcs[11][10] = 300;
// 开始输入景点的名称和简介
strcpy(mg.vexs[1].name, "北门");
strcpy(mg.vexs[1].introduce, "学校最大的门");
strcpy(mg.vexs[2].name, "修德楼");
strcpy(mg.vexs[2].introduce, "研究生等上课的地方");
strcpy(mg.vexs[3].name, "体育馆");
strcpy(mg.vexs[3].introduce, "室内体育课的场所");
strcpy(mg.vexs[4].name, "操场");
strcpy(mg.vexs[4].introduce, "上体育课和运动的地方");
strcpy(mg.vexs[5].name, "校医院");
strcpy(mg.vexs[5].introduce, "校医院");
strcpy(mg.vexs[6].name, "超市");
strcpy(mg.vexs[6].introduce, "商品多种多样");
strcpy(mg.vexs[7].name, "学生活动中心");
strcpy(mg.vexs[7].introduce, "举办活动的地方");
strcpy(mg.vexs[8].name, "图书馆");
strcpy(mg.vexs[8].introduce, "分为两个区域,分别为西馆和东馆");
strcpy(mg.vexs[9].name, "博学楼");
strcpy(mg.vexs[9].introduce, "里面有一些娱乐机构");
strcpy(mg.vexs[10].name, "菜鸟驿站");
strcpy(mg.vexs[10].introduce, "取快递");