#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;
}
JUST数据结构课设源代码(计科)
于 2023-06-08 14:50:08 首次发布