JUST数据结构课设源代码(计科)

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <fstream>
#include <sstream>
#include <vector>
#include <string>
#include <algorithm>
#include <thread>
#include <mutex>
#include <chrono>

using namespace std;
using namespace std::chrono;

// 参赛队伍信息结构体
struct Team {
	string teamID;  //参赛队编号
	string projectName;  //参赛作品名称
	string school;  // 参赛学校
	string category;  //赛事类别
	string participants;  //参赛者
	string coach;  //指导老师
};

// 二叉排序树节点
struct BSTNode {
	string teamID;   //数据域
	Team teamInfo;  //每个团队
	BSTNode* left;
	BSTNode* right;
};

// 读取参赛队伍信息
vector<Team> readTeamInfo(const string& filename) {  //vector就是一个可以不用再初始化就必须制定大小的边长数组
	vector<Team> teams;  //名为teams,用于存储读取的信息
	ifstream file(filename);
	if (file.is_open()) {
		string line;
		while (getline(file, line)) {
			stringstream ss(line);
			Team team;
			getline(ss, team.teamID, '#');
			getline(ss, team.projectName, '#');
			getline(ss, team.school, '#');
			getline(ss, team.category, '#');
			getline(ss, team.participants, '#');
			getline(ss, team.coach);
			teams.push_back(team);  //使用push_back加入元素,并且这个元素是被加在数组尾部的  告诉编译器为新元素开辟空间、将新元素存入新空间里。
		}
		file.close();
	}
	return teams;
}

// 显示菜单
void displayMenu() {
	printf(" ┌──────────────────────────────────────────────────────┐\n");
	printf(" │ ╭ ═══════════════════════════════════════════════ ╮  │\n");
	printf(" │ ││        欢 迎 使 用 赛 事 管 理 系 统          ││  │\n");
	printf(" │ ╰ ═══════════════════════════════════════════════ ╯  │\n");
	printf(" │                     C H I N A                        │\n");
	printf(" │            中国大学生计算机程序成绩大赛              │\n");
	printf(" │                     菜 单 选 择                      │\n");
	printf(" │  *************************************************** │\n");
	printf(" │  *            1、增加参赛队伍信息                  * │\n");
	printf(" │  *************************************************** │\n");
	printf(" │  *            2、修改参赛队伍信息                  * │\n");
	printf(" │  *************************************************** │\n");
	printf(" │  *            3、删除参赛队伍信息                  * │\n");
	printf(" │  *************************************************** │\n");
	printf(" │  *            4、查找参赛队伍信息                  * │\n");
	printf(" │  *************************************************** │\n");
	printf(" │  *            5、按学校查询参赛团队                * │\n");
	printf(" │  *************************************************** │\n");
	printf(" │  *            6、决赛叫号系统                      * │\n");
	printf(" │  *************************************************** │\n");
	printf(" │  *            7、校园导航系统                      * │\n");
	printf(" │  *************************************************** │\n");
	printf(" │  *            0、退出系统                          * │\n");
	printf(" │  *************************************************** │\n");
	printf(" └──────────────────────────────────────────────────────┘\n");
}

// 构建二叉排序树
BSTNode* buildBST(const vector<Team>& teams) {  //常量指针 
	BSTNode* root = nullptr;
	for (const auto& team : teams)  //只读元素 ,不会进行拷贝和修改teams
	{    
		BSTNode* newNode = new BSTNode;  //创造了一个新的二叉节点
		newNode->teamID = team.teamID;
		newNode->teamInfo = team;
		newNode->left = nullptr;
		newNode->right = nullptr;  //因为已经给他的左右子树分配了内存地址,所以要将他的左右子树指向nullptr
		  //初始化
		if (root == nullptr) {
			root = newNode;
		}
		else {
			BSTNode* current = root;  //当前指针
			while (true) {
				if (team.teamID < current->teamID) {
					if (current->left == nullptr) {
						current->left = newNode;
						break;
					}
					else {
						current = current->left;
					}
				}
				else {
					if (current->right == nullptr) {
						current->right = newNode;
						break;
					}
					else {
						current = current->right;
					}
				}
			}
		}
	}
	return root;
}

// 释放二叉排序树的内存
void releaseBST(BSTNode* root) {
	if (root == nullptr) {
		return;
	}
	releaseBST(root->left);
	releaseBST(root->right);
	delete root;
}  //通过release来实现释放二叉树的内存。在释放二叉树的内存时,先释放左右子树,最后释放根结点。

// 计算二叉排序树的节点个数
int countNodes(BSTNode* root) {
	if (root == nullptr) {
		return 0;
	}
	return 1 + countNodes(root->left) + countNodes(root->right);
}

// 查找参赛队伍信息并计算ASL(成功)
BSTNode* searchByTeamID(BSTNode* root, const string& teamID, int& compareCount) {
	BSTNode* current = root;
	compareCount = 0;
	while (current != nullptr) {
		compareCount++;
		if (teamID == current->teamID) {
			cout << "参赛作品名称: " << current->teamInfo.projectName << endl;
			cout << "参赛学校: " << current->teamInfo.school << endl;
			cout << "赛事类别: " << current->teamInfo.category << endl;
			cout << "参赛者: " << current->teamInfo.participants << endl;
			cout << "指导教师: " << current->teamInfo.coach << endl;
			return current;
		}
		else if (teamID < current->teamID) {
			current = current->left;
		}
		else {
			current = current->right;
		}
	}
	return nullptr;
}

// 选择排序算法进行排序
void selectionSort(vector<Team>& teams) {
	int n = teams.size();
	for (int i = 0; i < n - 1; i++) {
		int minIndex = i;  
		for (int j = i + 1; j < n; j++) {
			if (teams[j].teamID < teams[minIndex].teamID) {
				minIndex = j;
			}
		}  //第一轮从下标为 1 到下标为 n-1 的元素中选取最小值,若小于第一个数,则交换; 第二轮从下标为 2 到下标为 n - 1 的元素中选取最小值,若小于第二个数,则交换;依次类推下去……
		if (minIndex != i) {
			swap(teams[i], teams[minIndex]);
		}
	}
}

// 按参赛学校查询参赛团队并按参赛队编号有序输出
void searchBySchool(const vector<Team>& teams, const string& school) {
	vector<Team> matchingTeams;
	for (const auto& team : teams) {
		if (team.school == school) {
			matchingTeams.push_back(team);
		}
	}
	if (matchingTeams.empty()) {
		cout << "未找到该学校的参赛团队!" << endl;
		return;
	}
	selectionSort(matchingTeams);  //直接排序算法
	for (const auto& team : matchingTeams) {
		cout << "参赛队编号: " << team.teamID << endl;
		cout << "参赛作品名称: " << team.projectName << endl;
		cout << "参赛学校: " << team.school << endl;
		cout << "赛事类别: " << team.category << endl;
		cout << "参赛者: " << team.participants << endl;
		cout << "指导教师: " << team.coach << endl;
		cout << "--------------------------" << endl;
	}
}


//决赛叫号系统
mutex mtx;  //互斥量mutex

// 模拟一个决赛室
void simulateFinalRoom(const string& roomName, const vector<string>& teams) {
	for (const auto& team : teams) {
		{
			lock_guard<mutex> lock(mtx);
			cout << "[" << roomName << "] 叫号:" << team << endl;
		}

		// 模拟参赛队进场比赛,等待一段时间
		this_thread::sleep_for(milliseconds(500));  //休眠函数,表示当前线程不与其他线程竞争CPU,睡眠500毫秒,即0.5秒
	}
}

int jiaohao() {
	ifstream file("team.txt");  //打开“team.txt”并创建ifstream的对象file
	if (!file) {
		cerr << "无法打开文件 team.txt" << endl;
		return 1;  
	}

	vector<vector<string>> finalRooms;  //创建名为finalRooms的二维字符串向量,用于存储读取的信息
	string line;
	while (getline(file, line)) {  //创建名为line的字符串向量,用于存储从文件中读取的每一行内容:使用getline函数逐行读取文件内容,直到文件末尾

		vector<string> teamInfo;  //创建名为teamInfo的字符串向量,用于存储每个团队的信息
		size_t pos = 0;  //创建名为pos的size_t类型变量,用于存储字符串中字符的位置:
		string token;
		while ((pos = line.find("#")) != string::npos) {  //使用find函数查找行中的"#"字符的位置,如果找到则进入循环:
			token = line.substr(0, pos);  //使用substr函数从行中提取从位置0到pos的子字符串,并将其存储在token变量中
			teamInfo.push_back(token);  //将token添加到teamInfo向量中
			line.erase(0, pos + 1);  //行中删除已提取的部分,包括"#"字符
		}
		if (!line.empty()) {  //如果行不为空
			teamInfo.push_back(line);  //将剩余的部分作为一个独立的字符串添加到teamInfo向量中
		}
		finalRooms.push_back(teamInfo);  //将teamInfo向量添加到finalRooms向量中,表示一个团队的完整信息已经读取完毕
	}

	vector<thread> threads;  //创建名为threads的线程向量,用于存储模拟各个决赛室叫号系统的线程

	// 创建线程来模拟各个决赛室的叫号系统
	for (int i = 0; i < finalRooms.size(); ++i) {  //使用for循环遍历finalRooms向量中的每个元素,表示每个决赛室
		if (finalRooms[i].size() > 1) {  //检查当前决赛室中团队的数量是否大于1
			threads.push_back(thread(simulateFinalRoom, finalRooms[i][2], vector<string>{ finalRooms[i][0] }));  //如果是则创建一个线程来模拟该决赛室的叫号系统

		}
	}

	// 等待所有线程完成
	for (auto& t : threads) {
		t.join();
	}

	return 0;
}


//校园导航
#define Infinity 65535	//表示无穷大
#define MaxNumber 23	//用于邻接矩阵
#define vertex 12	//顶点个数
typedef struct side//边的权值
{
	int wet;//权值
}side, wetmatrix[MaxNumber][MaxNumber];//边的邻接矩阵类型
typedef struct vetinf//顶点信息
{
	int number;//顶点编号
	char name[64];//顶点名称
	char intro[256];//顶点介绍
}vetinf;
typedef struct mapstr//图结构信息
{
	vetinf vets[MaxNumber];//顶点数组
	wetmatrix mat;//邻接矩阵
	int vetnum, sidenum;
}mapstr;
//全局变量
mapstr campus;//图结构变量(学校校园)
int d[30];
int visited[50];
int shortest[MaxNumber][MaxNumber];//定义全局变量存储最小路径 
int pathh[MaxNumber][MaxNumber];//定义存储路径
//1.图的初始化
mapstr initmap()
{
	mapstr m;//构件图m
	int i = 0, j = 0;
	m.vetnum = 12;//定义顶点个数
	m.sidenum = 17;//定义边的条数
	for (i = 1; i <= vertex; i++)//依次设置顶点信息
		m.vets[i].number = i;
	//输入顶点信息
	strcpy(m.vets[1].name, "行政楼"); strcpy(m.vets[1].intro, "学校处理行政事务的场所");
	strcpy(m.vets[2].name, "海韵胡"); strcpy(m.vets[2].intro, "校标志性景点,在这里可以欣赏到学校的一处优美的景色");
	strcpy(m.vets[3].name, "图书馆"); strcpy(m.vets[3].intro, "学生学习、阅读的场所");
	strcpy(m.vets[4].name, "东食堂"); strcpy(m.vets[4].intro, "为东区学生提供就餐场所");
	strcpy(m.vets[5].name, "东操场"); strcpy(m.vets[5].intro, "位于学校最东端,为学生踢球场所");
	strcpy(m.vets[6].name, "南门"); strcpy(m.vets[6].intro, "学校最南端的大门");
	strcpy(m.vets[7].name, "文体中心"); strcpy(m.vets[7].intro, "学校举办文体活动的场所");
	strcpy(m.vets[8].name, "西操场"); strcpy(m.vets[8].intro, "西区学生运动场所");
	strcpy(m.vets[9].name, "经世楼"); strcpy(m.vets[9].intro, "学校的教学楼之一");
	strcpy(m.vets[10].name, "文理大楼"); strcpy(m.vets[10].intro, "学校最高的楼,学生的教学场所");
	strcpy(m.vets[11].name, "西食堂"); strcpy(m.vets[11].intro, "为西区学生提供就餐场所");
	strcpy(m.vets[12].name, "西区宿舍"); strcpy(m.vets[12].intro, "位于学校最西端,学生住宿场所");
	for (i = 1; i <= vertex; i++)
		for (j = 1; j <= vertex; j++)
			m.mat[i][j].wet = Infinity;//初始化图的邻接矩阵
	m.mat[1][2].wet = 300; m.mat[1][10].wet = 700; m.mat[2][3].wet = 600; m.mat[3][4].wet = 100; m.mat[3][8].wet = 550;
	m.mat[3][10].wet = 400; m.mat[4][5].wet = 100; m.mat[4][7].wet = 550; m.mat[5][6].wet = 250; m.mat[6][7].wet = 250;
	m.mat[6][12].wet = 700; m.mat[7][8].wet = 100; m.mat[7][11].wet = 300; m.mat[8][9].wet = 100; m.mat[8][11].wet = 250;
	m.mat[9][10].wet = 100; m.mat[11][12].wet = 200;
	for (i = 1; i <= vertex; i++)//无向带权图是对称矩阵,给其另一半赋值
		for (j = 1; j <= vertex; j++)
			m.mat[j][i].wet = m.mat[i][j].wet;
	return m;
}
//2.查询景点在图中的序号
int locatevet(mapstr m, int v)
{
	int i;
	for (i = 0; i <= m.vetnum; i++)
		if (v == m.vets[i].number) return i;//找到返回顶点i
	return -1;//未找到
}
//3.查询输入序号l,n间的长度不超过10个景点的路径
void path(mapstr m, int l, int n, int k)
{
	int s, t = k + 1; int length = 0;//t用于存储路径上下一顶点对应的d[]数组元素的下标
	if (d[k] == n && k < 8)//若d[k]是终点且景点个数<8,则输出该路径
	{
		for (s = 0; s < k; s++)
		{
			length = length + m.mat[d[s]][d[s + 1]].wet;
		}
		if (length < 800)//打印路径小于800(定长)的路径
		{
			for (s = 0; s < k; s++)//输出该路径,s=0时为起点m
			{
				printf("%d%s--->", d[s], m.vets[d[s]].name);
			}
			printf("%d%s  ", d[s], m.vets[d[s]].name);//输出最后一个顶点
			printf("总路线长为%d米\n\n", length);
		}
	}
	else
	{
		s = 1;
		while (s <= m.vetnum)//从第m个顶点,访问所有顶点是否有路径
		{
			if ((m.mat[d[k]][s].wet < Infinity) && (visited[s] == 0))//顶点有边且未被访问
			{
				visited[s] = 1;
				d[k + 1] = s;//存储顶点编号
				path(m, l, n, t);
				visited[s] = 0;//将找到的路径上的顶点的访问标志重新设置为0,便于探究新的路径
			}
			s++;//试验下一顶点s开始是否有到终点的路径;
		}
	}
}

//4.迪杰斯特拉算法求单元最短路径
void shortestpath(mapstr m)
{
	int v0, v, w, k = 1, min, t, p;
	int final[MaxNumber];//final[w]=1表示已经求得顶点V0到Vw的的最短路径
	int Pathside[MaxNumber];//用于存储最短路径下标的数组
	int ShortPathwet[MaxNumber];//用于存储到各点最短路径的权值和
	printf("\n请输入起始景点的编号:");
	scanf("%d", &v0);
	printf("\n\n");
	while (v0<0 || v0>vertex)//判断是否输入正确
	{
		printf("\n您输入的景点编号不存在\n");
		printf("请重新输入:");
		scanf("%d", &v0);
	}
	for (v = 1; v <= m.vetnum; v++)//数组初始化
	{
		final[v] = 0;//全部顶点初始化为未找到路径
		ShortPathwet[v] = m.mat[v0][v].wet;//将与v0有连线的路径加上权值
		Pathside[v] = 0;//初始化路径数组为0
	}
	ShortPathwet[v0] = 0;
	final[v0] = 1;
	//Dijkstr算法主体
	for (v = 1; v <= m.vetnum; v++)
	{
		min = Infinity;
		for (w = 1; w <= m.vetnum; w++)//找出离当前指向顶点最近的点
		{
			if (!final[w] && ShortPathwet[w] < min)//未被访问且存在边
			{
				k = w;
				min = ShortPathwet[w];
			}
		}
		final[k] = 1;//将找到的离当前顶点最近的置1
		//修正
		for (w = 1; w <= m.vetnum; w++)
		{
			if (!final[w] && (min + m.mat[k][w].wet < ShortPathwet[w]))
			{
				ShortPathwet[w] = min + m.mat[k][w].wet;//修改当前最优路径长度
				Pathside[w] = k;//存放前驱结点
			}
		}
	}
	printf("打印P数组:");	 //打印p数组(路径)
	for (t = 1; t <= m.vetnum; t++)
	{
		printf("%d ", Pathside[t]);
	}
	printf("\n\n");
	printf("打印S数组:");	 //打印s数组(顶点)
	for (t = 1; t <= m.vetnum; t++)
	{
		printf("%d ", ShortPathwet[t]);
	}
	printf("\n\n");
	//打印最短路径
	for (t = 1; t <= m.vetnum; t++)
	{
		p = t;
		if (t != v0)
		{
			printf("%d%s", t, m.vets[t].name);
			for (w = 1; w <= m.vetnum; w++)
			{
				if (Pathside[p] != 0)
				{
					printf("<--%d%s", Pathside[p], m.vets[p].name);
					p = Pathside[p];
				}
			}
			printf("<--%d%s", v0, m.vets[v0].name);
			printf("\n总路线长为%d米\n\n", ShortPathwet[t]);
		}
	}
}
//5.主页
void menu()
{
	printf(" ┌──────────────────────────────────────────────────────┐\n");
	printf(" │ ╭ ═══════════════════════════════════════════════ ╮  │\n");
	printf(" │ ││        欢 迎 使 用 校 园 导 游 系 统          ││  │\n");
	printf(" │ ╰ ═══════════════════════════════════════════════ ╯  │\n");
	printf(" │                      欢迎来到                        │\n");
	printf(" │                    江苏科技大学                      │\n");
	printf(" │                     菜 单 选 择                      │\n");
	printf(" │  *************************************************** │\n");
	printf(" │  *  1.主页                **   2.目的地导航查询    * │\n");
	printf(" │  *************************************************** │\n");
	printf(" │  *  3.查询景点间最短路径  **   4.校园景点介绍*       │\n");
	printf(" │  *************************************************** │\n");
	printf(" │  *  5.学校地图            **   0.退出              * │\n");
	printf(" │  *************************************************** │\n");
	printf(" └──────────────────────────────────────────────────────┘\n");
}

//6.输出图的邻接矩阵的值
void printmapstr(mapstr m)
{
	int i, j, k = 0;
	for (i = 1; i <= vertex; i++)
	{
		if (m.vets[i].number != -1)
			printf("%6d", i);
	}
	printf("\n");
	for (i = 1; i <= m.vetnum; i++)
	{
		for (j = 1; j <= m.vetnum; j++)
		{
			if (m.mat[i][j].wet == Infinity)
				printf(" **** ");
			else
				printf("%6d", m.mat[i][j].wet);
			k++;
			if (k % m.vetnum == 0)
				printf("\n");
		}
	}
}
//7.弗洛伊德算法
void floyd(mapstr m)
{
	int i, j, k;
	for (i = 1; i <= vertex; i++)//将图的邻接矩阵赋值给 shortest二维数组,将矩阵pathh全部初始化为-1 
	{
		for (j = 1; j <= vertex; j++)
		{
			shortest[i][j] = m.mat[i][j].wet;
			pathh[i][j] = j;
		}
	}
	int ii, jj, k1 = 0;
	for (ii = 1; ii <= vertex; ii++)
		printf("%6d", ii);//横着标号1到11
	printf("\n");
	for (ii = 1; ii <= vertex; ii++)
	{
		printf("%d", ii);
		for (jj = 1; jj <= vertex; jj++)
		{
			printf("%6d", pathh[ii][jj]);
			k1++;
			if (k1 % vertex == 0)
				printf("\n");
		}
	}
	printf("\n\n\n");
	for (k = 1; k <= vertex; k++)//核心操作,完成了以k为中间点对所有的顶点对(i,j)进行检测和修改 
	{
		for (i = 1; i <= vertex; i++)
		{
			for (j = 1; j <= vertex; j++)
			{
				if (shortest[i][j] > shortest[i][k] + shortest[k][j])
				{
					shortest[i][j] = shortest[i][k] + shortest[k][j];
					pathh[i][j] = pathh[i][k];//记录一下所走的路 //P数组用来存放前驱顶点  
				}
			}
		}
	}
}
//8.输出数组
void printarray()
{
	int i, j, k = 0;
	for (i = 1; i <= vertex; i++)
		printf("%6d", i);//横着标号0-11
	printf("\n");
	for (i = 0; i <= vertex; i++)
	{
		printf("%d", i);//竖着标号0-11
		for (j = 1; j <= vertex; j++)
		{
			printf("%6d", pathh[i][j]);
			k++;
			if (k % vertex == 0)
				printf("\n");
		}
	}
	printf("\n\n\n");
}
//9.输出最短路径
void display(mapstr m, int i, int j)
{
	int a, b;
	a = i, b = j;
	printf("您要查询的两景点间最短路径:\n\n");
	printf("%d%s", a, m.vets[a].name);
	while (pathh[i][j] != b)
	{
		printf("-->%d%s", pathh[i][j], m.vets[pathh[i][j]].name);
		i = pathh[i][j];
	}
	printf("-->%d%s\n\n", b, m.vets[b].name);
	printf("%s-->%s的最短路径是:%d米\n\n", m.vets[a].name, m.vets[b].name, shortest[a][b]);
}
//10.任意两点间距离(16-19)
int shortdistance(mapstr m)
{
	int i, j;
	printf("请输入要查询的两个景点的数字编号(用空格隔开)\n");
	scanf("%d %d", &i, &j);
	if (i<0 || i>vertex || j<0 || j>vertex)
	{
		printf("输入信息有误!\n\n");
		printf("请输入要查询的两个景点的数字编号(用空格隔开)\n");
		scanf("%d %d", &i, &j);
	}
	else
	{
		floyd(m);
		printarray();
		display(m, i, j);
	}
	return 1;
}
//11.显示所有景点信息
void compusinfor(mapstr m)
{
	int i;
	int choice;
	printf(" \n\n编号     目的地(建筑物)名称                                   简介\n");
	printf("*************************************************************************\n");
	for (i = 1; i <= vertex; i++)
	{
		if (m.vets[i].number != -1)
			printf("%-10d%-25s%-70s\n", m.vets[i].number, m.vets[i].name, m.vets[i].intro);
	}
	printf("*************************************************************************\n");
	printf("请输入选择的目的地编号:");
	scanf("%d", &choice);
	switch (choice)
	{
	case 1:cout << "编号1" << "   " << "建筑名称:行政楼" << "   " << "简介:学校处理行政事务的场所" << endl;
		cout << "此操作结束后将返回上一级操作" << endl; break;
	case 2:cout << "编号2" << "   " << "建筑名称:海韵胡" << "   " << "简介:校标志性景点,在这里可以欣赏到学校的一处优美的景色" << endl;
		cout << "此操作结束后将返回上一级操作" << endl; break;
	case 3:cout << "编号3" << "   " << "建筑名称:图书馆" << "   " << "简介:学生学习、阅读的场所" << endl;
		cout << "此操作结束后将返回上一级操作" << endl; break;
	case 4:cout << "编号4" << "   " << "建筑名称:东食堂" << "   " << "简介:为东区学生提供就餐场所" << endl;
		cout << "此操作结束后将返回上一级操作" << endl; break;
	case 5:cout << "编号5" << "   " << "建筑名称:东操场" << "   " << "简介:位于学校最东端,为学生踢球场所" << endl;
		cout << "此操作结束后将返回上一级操作" << endl; break;
	case 6:cout << "编号6" << "   " << "建筑名称:南门" << "   " << "简介:学校最南端的大门" << endl;
		cout << "此操作结束后将返回上一级操作" << endl; break;
	case 7:cout << "编号7" << "   " << "建筑名称:文体中心" << "   " << "简介:学校举办文体活动的场所" << endl;
		cout << "此操作结束后将返回上一级操作" << endl; break;
	case 8:cout << "编号8" << "   " << "建筑名称:西操场" << "   " << "简介:西区学生运动场所" << endl;
		cout << "此操作结束后将返回上一级操作" << endl; break;
	case 9:cout << "编号9" << "  " << "建筑名称:经世楼" << "   " << "简介:学校的教学楼之一" << endl;
		cout << "此操作结束后将返回上一级操作" << endl; break;
	case 10:cout << "编号10" << "   " << "建筑名称:文理大楼" << "   " << "简介:学校最高的楼,学生的教学场所" << endl;
		cout << "此操作结束后将返回上一级操作" << endl; break;
	case 11:cout << "编号11" << "   " << "建筑名称:西食堂" << "   " << "简介:为西区学生提供就餐场所" << endl;
		cout << "此操作结束后将返回上一级操作" << endl; break;
	case 12:cout << "编号12" << "   " << "建筑名称:西区宿舍" << "   " << "简介:位于学校最西端,学生住宿场所" << endl;
		cout << "此操作结束后将返回上一级操作" << endl; break;
	}
}
//12.江苏科技大学地图
void schoolmap()
{
	printf(" ---------------------------------江苏科技大学地图----------------------------------------\n");
	printf("````````````````````````````````````````````行政楼````````````````````````````````````````\n");
	printf("`````````````````````````````````````````````````````````````海韵胡```````````````````````\n");
	printf("``````````````````````````````````````````````````````````````````````````````````````````\n");
	printf("`````````````````````````文理大楼`````````````````````````````````````````````````````````\n");
	printf("``````````````````````````````````````````````````````````````````````````````````````````\n");
	printf("``````````````````````````````````````````````````````````````````````图书馆``````````````\n");
	printf("``````````````````````````````````````````````````````````````````````````````````````````\n");
	printf("````````````````经世楼````````````````````````````````````````````````````````````````````\n");
	printf("`````````````````````````````````````````````````````````````````````````````````东食堂```\n");
	printf("````````````````````````````````西操场````````````````````````````````````````````````````\n");
	printf("``````````````````````````````````````````````````````````````````````````````````````````\n");
	printf("`````````````````````````````````````````````````````````````````````东操场```````````````\n");
	printf("```````````````````````````````````````````````文体中心```````````````````````````````````\n");
	printf("`````````````西食堂```````````````````````````````````````````````````````````````````````\n");
	printf("``````````````````````````````````````````````````````````````````````````````````````````\n");
	printf("``````````````````````````````````````````````````````````````````````````````````````````\n");
	printf("````西区宿舍``````````````````````````````````````````````````````````````````````````````\n");
	printf("```````````````````````````````````````````````````````````南门```````````````````````````\n");
	printf("\n\n");
	printf("\n 																		西<---|--->东     \n");
}
//13.用户界面
void mainwork()
{
	menu();
	int choice;
	campus = initmap();
	do
	{
		printf("请输入你的选择:");
		scanf("%d", &choice);
		switch (choice)
		{
		case 1:system("cls"); menu(); break;  //主页
		case 2:system("cls"); shortestpath(campus); break;  //目的地导航查询
		case 3:system("cls"); shortdistance(campus); break;  //两景点之间的最短路径
		case 4:system("cls"); compusinfor(campus); break;  //校园景点的介绍
		case 5:system("cls"); schoolmap(); break;  //学校地图
		case 0:system("cls"); printf("谢谢使用\n"); break;  //退出
		default:printf("未找到该功能,请输入有效选项!\n"); break;
		}
	} while (choice);
}


int main() {
	vector<Team> teams = readTeamInfo("team.txt");
	BSTNode* bstRoot = buildBST(teams);

	int choice;
	while (true) {
		displayMenu();
		cout << "请输入选项序号:";
		cin >> choice;
		cin.ignore();  // 忽略上一次输入后的换行符

		switch (choice) {
		case 1: {
			// 增加参赛队伍信息
			Team newTeam;
			cout << "请输入参赛队编号:";
			getline(cin, newTeam.teamID);
			cout << "请输入参赛作品名称:";
			getline(cin, newTeam.projectName);
			cout << "请输入参赛学校:";
			getline(cin, newTeam.school);
			cout << "请输入赛事类别:";
			getline(cin, newTeam.category);
			cout << "请输入参赛者:";
			getline(cin, newTeam.participants);
			cout << "请输入指导教师:";
			getline(cin, newTeam.coach);

			// 添加新队伍到 teams 向量中
			teams.push_back(newTeam);

			// 重新构建二叉排序树
			releaseBST(bstRoot);
			bstRoot = buildBST(teams);

			cout << "参赛队伍信息添加成功!" << endl;
			break;
		}
		case 2: {
			// 修改参赛队伍信息
			string modifyTeamID;
			cout << "请输入要修改的参赛队编号:";
			getline(cin, modifyTeamID);

			// 在 teams 向量中查找要修改的队伍
			auto it = find_if(teams.begin(), teams.end(), [modifyTeamID](const Team& team) {
				return team.teamID == modifyTeamID;
				});

			if (it != teams.end()) {
				// 修改队伍信息
				Team& modifiedTeam = *it;
				cout << "请输入新的参赛作品名称(原名称:" << modifiedTeam.projectName << "):";
				getline(cin, modifiedTeam.projectName);
				cout << "请输入新的参赛学校(原学校:" << modifiedTeam.school << "):";
				getline(cin, modifiedTeam.school);
				cout << "请输入新的赛事类别(原类别:" << modifiedTeam.category << "):";
				getline(cin, modifiedTeam.category);
				cout << "请输入新的参赛者(原参赛者:" << modifiedTeam.participants << "):";
				getline(cin, modifiedTeam.participants);
				cout << "请输入新的指导教师(原指导教师:" << modifiedTeam.coach << "):";
				getline(cin, modifiedTeam.coach);

				cout << "参赛队伍信息修改成功!" << endl;
			}
			else {
				cout << "未找到要修改的参赛队伍!" << endl;
			}

			break;
		}
			 
		case 3: {
			// 删除参赛队伍信息
			string deleteTeamID;
			cout << "请输入要删除的参赛队编号:";
			getline(cin, deleteTeamID);

			// 在 teams 向量中查找要删除的队伍
			auto it = find_if(teams.begin(), teams.end(), [deleteTeamID](const Team& team) {
				return team.teamID == deleteTeamID;
				});

			if (it != teams.end()) {
				// 删除队伍
				teams.erase(it);

				// 重新构建二叉排序树
				releaseBST(bstRoot);
				bstRoot = buildBST(teams);

				cout << "参赛队伍信息删除成功!" << endl;
			}
			else {
				cout << "未找到要删除的参赛队伍!" << endl;
			}

			break;
		}

		case 4: {
			// 查找参赛队伍信息
			string teamID;
			cout << "请输入要查找的参赛队编号:";
			getline(cin, teamID);

			int compareCount;  //比较次数
			BSTNode* foundNode = searchByTeamID(bstRoot, teamID, compareCount);
			if (foundNode != nullptr) {
				double ASL = static_cast<double>(compareCount) / countNodes(bstRoot);  //所有节点的平均查找长度累加除以节点个数398(节点平均查找长度=该节点深度×该层节点个数)
				cout << "查找成功!ASL(成功):" << ASL << endl;  //ASL=10.90703515879397
			}
			else {
				cout << "查找失败!" << endl;
			}
			break;
		}
		case 5: {
			// 按学校查询参赛团队
			string school;
			cout << "请输入要查询的参赛学校名称:";
			getline(cin, school);

			searchBySchool(teams, school);
			break;
		}
		case 6: {
			jiaohao();
			break;
		}
		case 7: {
			mainwork();
			break;
		}
		case 0: {
			// 退出系统
			releaseBST(bstRoot);
			cout << "感谢使用赛事管理系统,再见!" << endl;
			return 0;
		}
		default: {
			cout << "无效的选项,请重新输入!" << endl;
			break;
		}
		}
	}

	return 0;
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值