一、问题定义
设计一款参赛管理系统,实现赛事相关的数据管理及信息服务。
二、问题分析
(1)能够管理各参赛队的基本信息(包含参赛队编号,参赛作品名称,参赛学校,赛事类别,参赛者,指导老师),赛事类别共11项(参见大赛官网jsjds.blcu.edu.cn);包括增加、删除、修改参赛队伍的信息。
(2)从team.txt中读取参赛队伍的基本信息,实现基于二叉排序树的查找。根据提示输入参赛队编号,若查找成功,输出该赛事类别对应的基本信息(参赛作品名称、参赛学校、赛事类别、参赛者和指导老师信息),同时,输出查找成功时的平均查找长度ASL;否则,输出“查找失败!”。
(3)能够提供按参赛学校查询参赛团队(或根据赛事类别查询参赛团队),即,根据提示输入参赛学校名称(赛事类别),若查找成功,输出该学校参赛的(该赛事类别的)所有团队的基本信息,输出的参赛团队按赛事类别有序输出。(排序算法可从选择排序、插入排序、希尔排序、归并排序、堆排序中任意选择,并为选择算法的原因做出说明。)
(4)为省赛现场设计一个决赛叫号系统。所有参赛队按赛事组织文件中的赛事类别分到9个决赛室,决赛室按顺序叫号,被叫号参赛队进场,比赛结束后,下一参赛队才能进赛场。请模拟决赛叫号系统,演示省赛现场各决赛室的参赛队进场情况。(模拟时,要能直观展示叫号顺序与进场秩序一致)
(5)赛事系统为参赛者提供赛地的校园导游程序,为参赛者提供各种路径导航的查询服务。以我校长山校区提供比赛场地为例,(请为参赛者提供不少于10个目标地的导航。可为参赛者提供校园地图中任意目标地(建筑物)相关信息的查询;提供任意两个目标地(建筑物)的导航查询,即查询任意两个目的地(建筑物)之间的一条最短路径。
三、概要设计
- 项目概述
- 可以从二进制文件中读取数据并保存成文本文件,也可以将文本文件保存成二进制文件。
- 数据可以采用3种存储方式:顺序表,链表,查找树存储。
- 顺序表,链表,查找树都具有插入,删除,查找,排序,释放空间,更新文件等功能。
- 插入的条数是根据用户自己输入的。
- 顺序表和链表的删除都是可以选择道路ID,道路名称标识,道路分支数,道路番号,道路名称进行相应的操作;查找树只能输入道路ID进行删除。
- 顺序表查找分为:有序时查找界面和无序时查找界面。无序时:用户可以选择3种查找方式:顺序查找,哈希查找,查找树查找;有序时:用户可以选择4种查找方式:顺序查找,二分查找,插值查找,哈希查找。
- 链表查找分为:有序时查找界面和无序查找界面。无序时:用户可以选择2种查找方式:顺序查找,查找树查找;有序时;用户可以选择一种查找方式:顺序查找。
- 查找树查找:只能根据道路ID查找。
- 顺序表排序:共有八种排序:冒泡排序,选择排序,插入排序,希尔排序,快速排序,归并排序,堆排序,基数排序。
- .链表排序:共有五种排序:冒泡排序,选择排序,插入排序,快速排序,基数排序。
- 查找树排序:中序遍历。
- 空间释放:用户可以手动选择功能键释放,也可以每次切换存储方式,自动释放上存储方式的空间。
- 更新文件,手动更新,将文本文件按原来的二进制文件格式更新回去。
- 项目设计
系统开发平台:IntelliJ IDEA 2020.1 x64
系统开发语言:C++
运行平台:Win10
1主界面:通过用户输入的编号进行相应的方式存储文件中的信息
2 次级界面:共有7中功能供用户选择,用户输入相应编号,执行相应功能
find函数:
这个函数正是对应了课设需求一(查询任一地点的基本信息),这个函数和上面那个打印全部信息的函数多了一个地点比较的部分,实现起来也并不难,给出此函数代码段
//查询任一地点的基本信息
void find(Graph g,string ch){
int i;
for (i = 0; i < g.numVertexes; i++) {
if (ch == g.vexs[i].name) {
cout << "地点名称:" << g.vexs[i].name << endl;
cout << "代号:" << g.vexs[i].ch << endl;
cout << "简介:" << g.vexs[i].str << endl;
cout << endl;
}
}
}
menum函数:
这个函数就是为了显示校园地图系统的菜单,也就是将一堆输出语句封装成一个函数,给出以下代码段
void menum() {
cout << setw(75) << "欢迎来到广东理工学院智能地图查询系统" << endl;
cout << "您可进行以下操作,需要哪种操作请输入相对应的数字!" << endl;
cout << "1、查询广东理工学院所有地点信息" << endl;
cout << "2、查询广东理工学院任一地点的基本信息" << endl;
cout << "3、查询广东理工学院任两个地点间的最短路径和长度" << endl;
cout << "4、退出系统" << endl;
}
function函数:
这个函数将整个校园地图系统所有的操作都封装在这个函数里面,使主函数变得更加简洁,基本原理就是用while循环嵌套switch语句实现一个智能校园地图系统,给出以下代码段
int function(){
Graph g;
Graph *ptr = &g;
createGraph(ptr); //邻接矩阵创建图
int v, e;
char chose;
string str, start, end;
while (true) {
menum();
cout << endl;
cout << "请输入相应的数字编号" << endl;
cin >> chose;
switch (chose) {
case '1':
printGraph(g);
break;
case '2':
cout << "请输入待查地点的名称:";
cin >> str;
if (locates(ptr, str) == -1) {
cout << "查询地点发生错误,请重新操作!!!!" << endl;
break;
}
else {
find(g, str);
}
break;
case '3':
cout << "请输入任意两地的名称,名称之间用空格隔开,以回车结束:" << endl;
cin >> start >> end;
v = locates(ptr, start);
e= locates(ptr, end);
if (v == -1 || e == -1) {
cout << "查询地点发生错误,请重新操作!!!!" << endl;
break;
}
else {
shortestPath(g, v, e);
}
cout << endl;
break;
case '4':
cout << "感谢您的光临!" << endl;
return 0;
default:
cout << "操作数输入错误,请重新操作!" << endl;
break;
}
cin.ignore(100, '\n');
}
}
1.4 顺序表查找有两种界面形式,分无序的查找界面和有序的查找界面
1.4.1顺序表无序的查找界面
说明:无序时,有三种查找可供用户选择:顺序查找,哈希查找,查找树查找
1.4.1.1.1 顺序表顺序查找指定的LinkID,如下图查找LinkID为63539的信息
说明:如果查找的记录条数小于5条就在屏幕上显示,大于五条则保存在相应文件中,如果查找文件中没有的信息,就会提示未查找相关信息。
说明:因为之前将,LinkID为63538的已经删除了,故现在查找就查不到了。
1.4.1.1.2.1 顺序表顺序查找指定的道路名称标识,如下图查找道路名称标识为1的信息,即查找所有有道路名称的信息
说明:如果查找记录条数大于5条就不在屏幕上显示,而是保存在相应文件中。
//地点简介
info vexstr[15] = {
"明德楼是信息技术学院学员的主要活动场所,内置教室数百间,室内硬件配置齐全,当为模范教学楼!",
"学院练车场是与学校共同合作的一个校外商家,致力于为学生提供物美价廉的考驾照之旅,练车场位于校内,十分方便学生全天候练车!",
"美食广场位于广东理工学院东区区域,与春晖苑相邻,其中店家琳琅满目,数不胜数,风格深受学生欢迎,是校园的一处好栖息地!",
"蚕桑丝绸餐厅也被称之为东区食堂,与美食广场共同提供了学生们的日常餐饮生活,相对比与美食广场而言,蚕桑丝绸餐厅的装饰更为古风一些!",
"学校游泳池位于学校的西区区域,泳池是室内的,所以在任何时间段都十分适合学生下水,当然夏日泳池的plmm才是不可多得的一道风景线!",
"西区足球场,与学校游泳池相邻,有着良好的草地质感,给予运动员最舒适最安全的比赛场地,见证了无数广理足星的诞生!",
"船员剧场也被称之为剧场,翔中堂主要作为大型活动的场地,内部有覆盖全场的空调,观众席十分豪华,并且座椅多达两层楼之多!",
"健身房位于剧场的对角处,它是学生健身爱好者的天堂,内部硬件设施完善,安全设施齐全,如果店家可以免费让学生体验,再好不过了!",
"电工房位于校园的中间部分,当学生们宿舍发生电路问题时,都可以求助电工房来进行修理,当然电工一般是十分忙绿的,毕竟只有一所电工房!",
"主田径场是我校的重要场所,其广场里的科技之星雕塑更是我校的标示性建筑,寓意着师生不断创新,追求真理的科技之心!",
"大学生服务中心也被学生们称之为西区超市,因为其建筑和超市并无两样,除此之外,最大的特色就是网红街,试想,一个宁静的夜晚,在满是星星灯下的你和好朋友们畅聊着星辰大海,是多么惬意的事情!",
"船苑餐厅位于西区区域,也称之为西区饭堂,不过其内部的装饰还是店家的款式,都比蚕桑丝绸餐厅要好一些!",
"图书馆位于我校东区食堂对面,正所谓一进门就得以闻其书香气,图书馆是追求知识的天堂,里面有着一群志同道合,向往远方的青年少女,一起为自己的未来而去奋斗!",
"田径场是我校举行校运会的主要场地,有着400米的塑胶跑道,为西区的学生们提供了不可多得的课后锻炼场所!",
"体育馆与田径场相邻,这是我校唯一的室内运动馆,内有一个篮球场和四个羽毛球场,乒乓球场,如果能再多一些室内场地,那将十分深受学生们的欢迎!",
};
//初始化地点名称2
string loadingTwo[22] = {
"学院练车场",
"美食广场",
"蚕桑丝绸餐厅",
"美食广场",
"蚕桑丝绸餐厅",
"学校游泳池",
"西区足球场",
"蚕桑丝绸餐厅",
"船员剧场",
"健身房",
"健身房",
"电工房",
"电工房",
"主田径场",
"大学生服务中心",
"图书馆",
"田径场",
"体育馆",
"田径场",
"船苑餐厅",
"大学生服务中心",
"图书馆"
};
输出结果
- 项目小结
- 我们知道,校园中的道路往往都是双向通行的,所以我们可以将校园的各个地点看做是一个一个顶点,而两地点之间的道路看做是两个顶点之间的边,那么道路的长度就是边的权值
- 由此我们不难得出校园地图的逻辑结构很显然是一个无向网,并且是加权无向网
4、项目源码
#include <iostream>
#include <string>
#include <iomanip>
using namespace std;
#define MAXVEX 15
#define NUMBER 22
#define INF 9999999
typedef string VertexName;
typedef char replace;
typedef string info;
typedef struct {
VertexName name; //地点名称
replace ch; //地点代号
info str;
}Vexs;
typedef int EdgeType;
typedef struct {
Vexs vexs[MAXVEX];
EdgeType arc[MAXVEX][MAXVEX];
int numVertexes, numEdges;
}Graph;
//事先把地图信息存储起来
//地点名称
VertexName vexname[15] = {
"明德楼",
"学院练车场",
"美食广场",
"蚕桑丝绸餐厅",
"学校游泳池",
"西区足球场",
"船员剧场",
"健身房",
"电工房",
"主田径场",
"大学生服务中心",
"船苑餐厅",
"图书馆",
"田径场",
"体育馆"
};
//地点代号
replace vexch[15] = {
'Z','L','M','H','Y','Q','X','J','D','K','S','T','G','C','P'
};
//地点简介
info vexstr[15] = {
"明德楼是信息技术学院学员的主要活动场所,内置教室数百间,室内硬件配置齐全,当为模范教学楼!",
"学院练车场是与学校共同合作的一个校外商家,致力于为学生提供物美价廉的考驾照之旅,练车场位于校内,十分方便学生全天候练车!",
"美食广场位于广东理工学院东区区域,与春晖苑相邻,其中店家琳琅满目,数不胜数,风格深受学生欢迎,是校园的一处好栖息地!",
"蚕桑丝绸餐厅也被称之为东区食堂,与美食广场共同提供了学生们的日常餐饮生活,相对比与美食广场而言,蚕桑丝绸餐厅的装饰更为古风一些!",
"学校游泳池位于学校的西区区域,泳池是室内的,所以在任何时间段都十分适合学生下水,当然夏日泳池的plmm才是不可多得的一道风景线!",
"西区足球场,与学校游泳池相邻,有着良好的草地质感,给予运动员最舒适最安全的比赛场地,见证了无数广理足星的诞生!",
"船员剧场也被称之为剧场,翔中堂主要作为大型活动的场地,内部有覆盖全场的空调,观众席十分豪华,并且座椅多达两层楼之多!",
"健身房位于剧场的对角处,它是学生健身爱好者的天堂,内部硬件设施完善,安全设施齐全,如果店家可以免费让学生体验,再好不过了!",
"电工房位于校园的中间部分,当学生们宿舍发生电路问题时,都可以求助电工房来进行修理,当然电工一般是十分忙绿的,毕竟只有一所电工房!",
"主田径场是我校的重要场所,其广场里的科技之星雕塑更是我校的标示性建筑,寓意着师生不断创新,追求真理的科技之心!",
"大学生服务中心也被学生们称之为西区超市,因为其建筑和超市并无两样,除此之外,最大的特色就是网红街,试想,一个宁静的夜晚,在满是星星灯下的你和好朋友们畅聊着星辰大海,是多么惬意的事情!",
"船苑餐厅位于西区区域,也称之为西区饭堂,不过其内部的装饰还是店家的款式,都比蚕桑丝绸餐厅要好一些!",
"图书馆位于我校东区食堂对面,正所谓一进门就得以闻其书香气,图书馆是追求知识的天堂,里面有着一群志同道合,向往远方的青年少女,一起为自己的未来而去奋斗!",
"田径场是我校举行校运会的主要场地,有着400米的塑胶跑道,为西区的学生们提供了不可多得的课后锻炼场所!",
"体育馆与田径场相邻,这是我校唯一的室内运动馆,内有一个篮球场和四个羽毛球场,乒乓球场,如果能再多一些室内场地,那将十分深受学生们的欢迎!",
};
//初始化地点名称1
string loadingOne[22] = {
"明德楼",
"学院练车场",
"美食广场",
"明德楼",
"明德楼",
"明德楼",
"学校游泳池",
"西区足球场",
"学校游泳池",
"西区足球场",
"船员剧场",
"船员剧场",
"健身房",
"电工房",
"电工房",
"主田径场",
"主田径场",
"田径场",
"图书馆",
"图书馆",
"船苑餐厅",
"生活服务中心"
};
//初始化地点名称2
string loadingTwo[22] = {
"学院练车场",
"美食广场",
"蚕桑丝绸餐厅",
"美食广场",
"蚕桑丝绸餐厅",
"学校游泳池",
"西区足球场",
"蚕桑丝绸餐厅",
"船员剧场",
"健身房",
"健身房",
"电工房",
"电工房",
"主田径场",
"大学生服务中心",
"图书馆",
"田径场",
"体育馆",
"田径场",
"船苑餐厅",
"大学生服务中心",
"图书馆"
};
//初始化地点路程
int loadingNum[22] = {
30,10,5,20,
25,50,5,50,
30,35,7,20,
15,50,100,35,
10,5,10,20,
25,40
};
//定位
int locates(Graph *g, string ch) {
int i = 0;
for (i = 0; i < g->numVertexes; i++) {
if (g->vexs[i].name == ch) {
break;
}
}
if (i >= g->numVertexes) {
return -1;
}
return i;
}
void createGraph(Graph *g) {
int i, j, k, w;
g->numVertexes = MAXVEX;
g->numEdges= NUMBER;
for (i = 0; i < g->numVertexes; i++) {
g->vexs[i].name = vexname[i];
g->vexs[i].ch = vexch[i];
g->vexs[i].str = vexstr[i];
}
//邻接矩阵初始化为每个单元为INF
for (i = 0; i < g->numVertexes; i++) {
for (j = 0; j < g->numVertexes; j++) {
g->arc[i][j] = INF;
}
}
cout << endl;
————————————————
版权声明:本文为CSDN博主「goodball️」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/2301_77210899/article/details/130823730