数据结构课设

一、问题定义

设计一款参赛管理系统,实现赛事相关的数据管理及信息服务。

二、问题分析

(1)能够管理各参赛队的基本信息(包含参赛队编号,参赛作品名称,参赛学校,赛事类别,参赛者,指导老师),赛事类别共11项(参见大赛官网jsjds.blcu.edu.cn);包括增加、删除、修改参赛队伍的信息。

(2)从team.txt中读取参赛队伍的基本信息,实现基于二叉排序树的查找。根据提示输入参赛队编号,若查找成功,输出该赛事类别对应的基本信息(参赛作品名称、参赛学校、赛事类别、参赛者和指导老师信息),同时,输出查找成功时的平均查找长度ASL;否则,输出“查找失败!”。
(3)能够提供按参赛学校查询参赛团队(或根据赛事类别查询参赛团队),即,根据提示输入参赛学校名称(赛事类别),若查找成功,输出该学校参赛的(该赛事类别的)所有团队的基本信息,输出的参赛团队按赛事类别有序输出。(排序算法可从选择排序、插入排序、希尔排序、归并排序、堆排序中任意选择,并为选择算法的原因做出说明。)

(4)为省赛现场设计一个决赛叫号系统。所有参赛队按赛事组织文件中的赛事类别分到9个决赛室,决赛室按顺序叫号,被叫号参赛队进场,比赛结束后,下一参赛队才能进赛场。请模拟决赛叫号系统,演示省赛现场各决赛室的参赛队进场情况。(模拟时,要能直观展示叫号顺序与进场秩序一致)

(5)赛事系统为参赛者提供赛地的校园导游程序,为参赛者提供各种路径导航的查询服务。以我校长山校区提供比赛场地为例,(请为参赛者提供不少于10个目标地的导航。可为参赛者提供校园地图中任意目标地(建筑物)相关信息的查询;提供任意两个目标地(建筑物)的导航查询,即查询任意两个目的地(建筑物)之间的一条最短路径。

三、概要设计

  1. 项目概述
  1. 可以从二进制文件中读取数据并保存成文本文件,也可以将文本文件保存成二进制文件。
  2.  数据可以采用3种存储方式:顺序表,链表,查找树存储。
  3.  顺序表,链表,查找树都具有插入,删除,查找,排序,释放空间,更新文件等功能。
  4.  插入的条数是根据用户自己输入的。
  5.  顺序表和链表的删除都是可以选择道路ID,道路名称标识,道路分支数,道路番号,道路名称进行相应的操作;查找树只能输入道路ID进行删除。
  6.  顺序表查找分为:有序时查找界面和无序时查找界面。无序时:用户可以选择3种查找方式:顺序查找,哈希查找,查找树查找;有序时:用户可以选择4种查找方式:顺序查找,二分查找,插值查找,哈希查找。
  7.  链表查找分为:有序时查找界面和无序查找界面。无序时:用户可以选择2种查找方式:顺序查找,查找树查找;有序时;用户可以选择一种查找方式:顺序查找。
  8.  查找树查找:只能根据道路ID查找。
  9.  顺序表排序:共有八种排序:冒泡排序,选择排序,插入排序,希尔排序,快速排序,归并排序,堆排序,基数排序。
  10.  .链表排序:共有五种排序:冒泡排序,选择排序,插入排序,快速排序,基数排序。
  11.  查找树排序:中序遍历。
  12. 空间释放:用户可以手动选择功能键释放,也可以每次切换存储方式,自动释放上存储方式的空间。
  13. 更新文件,手动更新,将文本文件按原来的二进制文件格式更新回去。

  1. 项目设计

系统开发平台: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] = {

"学院练车场",

"美食广场",

"蚕桑丝绸餐厅",

"美食广场",

"蚕桑丝绸餐厅",

"学校游泳池",

"西区足球场",

"蚕桑丝绸餐厅",

"船员剧场",

"健身房",

"健身房",

"电工房",

"电工房",

"主田径场",

"大学生服务中心",

"图书馆",

"田径场",

"体育馆",

"田径场",

"船苑餐厅",

"大学生服务中心",

"图书馆"

};

输出结果

  1. 项目小结
  • 我们知道,校园中的道路往往都是双向通行的,所以我们可以将校园的各个地点看做是一个一个顶点,而两地点之间的道路看做是两个顶点之间的边,那么道路的长度就是边的权值
  • 由此我们不难得出校园地图的逻辑结构很显然是一个无向网,并且是加权无向网

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值