C++篮球俱乐部管理系统

news2024/10/7 12:25:02

一、 本系统的设计

篮球俱乐部管理系统是一个用于管理篮球俱乐部日常运营和球队管理的软件系统。它提供了一套功能齐全的工具,帮助篮球俱乐部进行会员管理、训练计划安排、比赛管理、场地预订以及财务记录等方面的工作。

该管理系统的主要特点和功能包括:

会员管理:系统可以记录和管理篮球俱乐部的会员信息,包括个人资料、联系方式、会籍状态等。管理员可以轻松查看和更新会员信息,包括新会员注册、会员卡发行、会籍续费等。

训练计划安排:系统允许管理员创建和安排篮球训练计划。可以设置训练日期、时间、地点以及训练内容等信息。会员可以查看训练计划,并确认参加。管理员可以根据需要调整计划和通知会员。

比赛管理:系统支持篮球俱乐部的比赛管理,包括安排比赛、报名参赛、比赛结果记录等。管理员可以创建比赛信息,发送邀请给其他俱乐部,并记录比赛结果和统计数据。

场地预订:系统提供场地预订功能,允许会员选择合适的时间和场地进行个人或团队训练。管理员可以管理场地信息、预订情况和收费等。

财务记录:系统可以记录篮球俱乐部的财务收支情况,包括会费收入、场地租用费、比赛费用等。管理员可以生成财务报表,方便核算和管理俱乐部的财务状况。

统计和报表:系统提供各种统计和报表功能,如会员统计、训练计划统计、比赛成绩统计等。这些报表可以为俱乐部管理层提供数据支持和决策依据。

1. 本系统的模块

在这里插入图片描述

基类设计
人员基类(抽象类)主要包括显示信息的纯虚函数,把信息保存成文件的纯虚函数,修改信息的纯虚函数。成员主要有姓名,性别,年龄,编号,联系方式。

class Person			//抽象person类
{
public:
	friend class BasketballClubManagement;			//定义篮球俱乐部管理类为该类的友元类
	Person(string& name, string& gender, int& age, int& ID, string& contict);
	virtual void display(void) = 0;			//纯虚函数,显示信息
	virtual void save(void) = 0;			//纯虚函数,保存成文件
	virtual void modify(void) = 0;			//纯虚函数,修改信息

	static int sum;			//统计所有人员总数

protected:
	string name;			//姓名
	string gender;          //性别
	int age;				//年龄
	int ID;					//编号
	string contict;			//联系方式
};

派生类设计
派生类主要有球员类,教练类,职工类。其中每一个类都重载了Person抽象类的纯虚函数,分别是显示信息,保存文件,修改信息。这样做方便用基类指针指向派生类实现多态。派生类的代码如下:
—————————————————————————————————————

class Player : public Person			//球员类
{
public:
	friend class BasketballClubManagement;			//定义篮球俱乐部管理类为该类的友元类
	Player(string& name, string& gender, int& age, int& ID, string& contict, string& speciality, string& clubName, float& uniformNumber);
	void display(void);			//函数重载,显示球员信息
	void save(void);			//函数重载,保存球员信息
	void modify(void);		//函数重载,修改球员信息

protected:
	string position;			//场上位置
	string clubName;			//所属俱乐部
	float uniformNumber;				//球衣号码
};
—————————————————————————————————————
class Coach : public Person			//教练类
{
public:
	friend class BasketballClubManagement;			//定义篮球俱乐部管理类为该类的友元类
	Coach(string& name, string& gender, int& age, int& ID, string& contict, string& characteristic, string& nikcname);
	void display(void);			//函数重载,显示教练信息
	void save(void);			//函数重载,保存教练信息
	void modify(void);		//函数重载,修改教练信息

protected:
	string characteristic;			//教练的专业特点
	string nickName;				//教练绰号};
class Staff : public Person			//职工类
{
public:
	friend class BasketballClubManagement;			//定义篮球俱乐部管理类为该类的友元类
	Staff(string& name, string& gender, int& age, int& ID, string& contict, string& department, string& job, int& salary);
	void display(void);			//函数重载,显示职工信息
	void save(void);			//函数重载,保存职工信息
	void modify(void);		    //函数重载,修改职工信息
protected:
	string department;			//职工部门
	string job;					//职工工作
	int salary;					//职工工资
};

管理类设计
管理类主要有最主要的俱乐部人员管理,以及对所有菜单统一管理的菜单管理类。最后还有一个俱乐部人员管理启动类,主要是为了主函数方便调用。

class BasketballClubManagement			//统一对成员进行管理
{
public:
	BasketballClubManagement(void);			//构造函数
	~BasketballClubManagement(void);			//析构函数

	void createPlayer(void);			//创建或添加球员信息
	void importPlayer(void);			//导入内部球员信息
	void showPlayer(void);				//显示并统计球员信息
	void savePlayer(void);				//保存球员信息
	void seekPlayer(void);				//查找球员信息
	void modifyPlayer(void);			//修改球员信息
	void removePlayer(void);			//删除球员信息
	void emptyPlayer(void);			//清空球员信息

	void createCoach(void);			//创建或添加教练信息
	void importCoach(void);			//创建或添加教练信息
	void showCoach(void);				//显示并统计教练信息
	void saveCoach(void);				//保存教练信息
	void seekCoach(void);				//查找教练信息
	void modifyCoach(void);			//修改教练信息
	void removeCoach(void);			//删除教练信息
	void emptyCoach(void);			//清空教练信息

	void createStaff(void);			//创建或添加职工信息
	void importStaff(void);			//创建或添加职工信息
	void showStaff(void);			//显示并统计职工信息
	void saveStaff(void);			//保存职工信息
	void seekStaff(void);			//查找职工信息
	void modifyStaff(void);			//修改职工信息
	void removeStaff(void);			//删除职工信息
	void emptyStaff(void);			//清空职工信息

	void seekPerson(void);				//在俱乐部所有人员中查找信息

private:
	//查找该数据的位置,4个参数分别是返回查找到的数据的地址,查找的数据类型(按名字查找还是编号),
	//要查找的数据,要查找的俱乐部人员类型(默认在俱乐部所有人员中查找)
	void findPerson(int* plocation, const string& findType, const string& lookedData, const string& personType = "allPerson");

	Person* p[3][MAX];			//基类对象指针

	int playerNumber;			//球员人数
	int coachNumber;			//教练人数
	int staffNumber;			//职工人数
};
 class MenuManagement			//菜单管理类
{
public:
	//显示菜单
	void showMenu_MainMenu(void);				//显示主菜单
	void showMenu_addPerson(void);		//显示添加人员信息子菜单
	void showMenu_showPerson(void);		//显示显示人员信息子菜单
	void showMenu_savePerson(void);		//显示保存人员信息子菜单
	void showMenu_seekPerson(void);		//显示查找人员信息子菜单
	void showMenu_modifyPerson(void);	//显示修改人员信息子菜单
	void showMenu_removePerson(void);	//显示删除人员信息子菜单
	void showMenu_emptyPerson(void);	//显示清空人员信息子菜单

	//响应菜单
	void respondMenu_addPerson(void);		//响应添加人员信息子菜单
	void respondMenu_showPerson(void);		//响应显示人员信息子菜单
	void respondMenu_savePerson(void);		//响应保存人员信息子菜单
	void respondMenu_seekPerson(void);		//响应查找人员信息子菜单
	void respondMenu_modifyPerson(void);	//响应修改人员信息子菜单
	void respondMenu_removePerson(void);	//响应删除人员信息子菜单
	void respondMenu_emptyPerson(void);	//响应清空人员信息子菜单

private:
	int choice;			//菜单选项
	BasketballClubManagement club;			//创建球员管理对象
};



class BasketballClubfManagementLaunch			//成员管理启动类
{
public:
	void showMainMenu(void);			//显示主菜单
	void respondMenu(void);				//响应菜单

private:
	int choice;			//菜单选项
	MenuManagement menu;			//创建显示菜单对象	
};

2. 各模块的功能

球员类成员函数:

  1. 对球员类成员进行初始化
  2. 显示球员信息(函数重载)
  3. 保存球员信息(函数重载)
  4. 修改球员信息(函数重载)

教练类成员函数:

  1. 对教练类成员进行初始化
  2. 显示教练信息(函数重载)
  3. 保存教练信息(函数重载)
  4. 修改教练信息(函数重载)

职工类函数实现:

  1. 对职工类成员进行初始化
  2. 显示职工信息(函数重载)
  3. 保存职工信息(函数重载)
  4. 修改职工信息(函数重载)

人员管理类成员函数实现:

  1. 构造函数
  2. 析构函数
  3. 查找人员函数

人员信息管理类(BasketballClubManagement):
一、 球员信息管理功能

  1. 创建或添加球员信息
  2. 导入球员信息
  3. 显示所有球员信息
  4. 保存所有球员信息
  5. 查找球员信息
  6. 修改球员信息
  7. 删除球员信息
  8. 清空球员信息

二、 教练信息管理功能

  1. 创建或添加教练信息
  2. 导入教练信息
  3. 显示所有教练信息
  4. 保存所有教练信息
  5. 查找教练信息
  6. 修改教练信息
  7. 删除教练信息
  8. 清空教练信息

三、 职工信息管理功能

  1. 创建或添加职工信息

  2. 导入职工信息

  3. 显示所有职工信息

  4. 保存所有职工信息

  5. 查找职工信息

  6. 修改职工信息

  7. 删除职工信息

  8. 清空职工信息
    菜单管理类(MenuManagement):
    一、 显示各个子菜单

  9. 显示添加人员信息子菜单

  10. 显示显示人员信息子菜单

  11. 显示保存人员信息子菜单

  12. 显示查找人员信息子菜单

  13. 显示修改人员信息子菜单

  14. 显示删除人员信息子菜单

  15. 显示清空人员信息子菜单
    二、响应各个子菜单

  16. 响应添加人员子菜单

  17. 响应显示人员信息子菜单

  18. 响应保存人员信息子菜单

  19. 响应查找人员信息子菜单

  20. 响应修改人员信息子菜单

  21. 响应删除人员信息子菜单

  22. 响应清空人员信息子菜单
    俱乐部人员启动类(BasketballClubfManagementLaunch):

  23. 显示主菜单

  24. 响应主菜单

3. 使用的数据结构

  1. 基类
    Person类, 用来描述人员的基本信息,如姓名,性别,年龄,编号(用于查找),联系方式。包括显示信息,保存文件,修改信息等函数。

  2. 派生类
    Player类,Coach类,Staff类为Person类的派生类,进行公有继承。
    Player类用来描述球员的基本信息,除Person类中的基本信息外,还包括场上位置,所属俱乐部,和球衣号码和显示球员信息,保存球员信息,修改球员信的息函数重载。
    Coach类中用来描述教练的基本信息,除Person类中的基本信息外,还包括教练专业特点,教练绰号和显示教练信息,保存教练信息,修改教练信息的函数重载。
    Staff类中用描述职工的基本信息,除Person类中的基本信息外,还包括职工部门,职工工资,职工工作和显示显示职工信息,保存职工信息,修改职工信息的函数重载。

  3. 管理类
    主要用来管理俱乐部人员信息,实现对人员信息的添加、查找、删除、显示、保存等功能。使用基对象指针进行操作。

  4. 类之间的关系

    在这里插入图片描述

4. 本系统的基本架构以及流程图

在这里插入图片描述

  1. 添加成员信息模块

在这里插入图片描述

  1. 2.修改成员信息模块

在这里插入图片描述

  1. 删除成员信息模块
    在这里插入图片描述

  2. 查找成员信息模块

在这里插入图片描述

5.清空成员信息模块

在这里插入图片描述

6.保存成员信息模块:

在这里插入图片描述

7.显示函数成员信息模块

在这里插入图片描述

  1. UML图

在这里插入图片描述
在这里插入图片描述

二、本系统的实现过程

基类的实现

int sum = 0;			//静态成员初始化

Person::Person(string& name, string& gender, int& age, int& ID, string& contict)			//初始化
{
	this->name = name;
	this->gender = gender;
	this->age = age;
	this->ID = ID;
	this->contict = contict;
}

void Person::display(void)			//显示人员基本信息
{
	cout << "姓名:" << name << endl;
	cout << "性别:" << gender << endl;
	cout << "年龄:" << age << endl;
	cout << "编号:" << ID << endl;
	cout << "联系电话:" << contict << endl;
}

派生类的实现
以球员类为例(教练类和员工类同理),使用ofstream来保存球员信息,生成txt文件,使用cerr输出保存失败信息(cerr为输出到标准错误的ostream对象,不经过缓冲直接输出)。
使用cin.sync()函数来清除输入缓冲区的内容,cin.clear()修改cin的状态标识符来防止输入错误信息而进入死循环,可以重新进行输入,若输入错误则显示错误信息。
使用system(“cls”)来清屏,使界面美观。
球员类代码如下:

Player::Player(string& name, string& gender, int& age, int& ID, string& contict, string& position, string& clubName, float& uniformNumber) : Person(name, gender, age, ID, contict)
{
	this->position = position;
	this->clubName = clubName;
	this->uniformNumber = uniformNumber;
}

void Player::display(void)			//显示球员信息
{
	Person::display();
	cout << "球员场上位置:" << position << endl;
	cout << "球员所属俱乐部:" << clubName << endl;
	cout << "球员球衣号码:" << uniformNumber << endl;
}

void Player::save(void)			//保存球员信息(函数重载)
{
	ofstream savefile;

	savefile.open("球员信息.txt", ios::app);
	if (savefile.fail())
	{
		cerr << "球员信息保存失败。" << endl;
		return;
	}

	savefile << "姓名:" << name << endl;
	savefile << "性别:" << gender << endl;
	savefile << "年龄:" << age << endl;
	savefile << "编号:" << ID << endl;
	savefile << "联系电话:" << contict << endl;
	savefile << "球员场上位置:" << position << endl;
	savefile << "球员所属俱乐部:" << clubName << endl;
	savefile << "球员球衣号码:" << uniformNumber << endl << endl;

	savefile.close();			//关闭文件
}

void Player::modify(void)			//修改球员信息(函数重载)
{
	int choice = -1;

	while (1)
	{
		system("cls");			//清屏

		cout << "该球员原信息为:" << endl;			//显示要修改的球员原信息
		Person::display();
		cout << "球员场上位置:" << position << endl;
		cout << "球员所属俱乐部:" << clubName << endl;
		cout << "球员球衣号码:" << uniformNumber << endl;

		cout << endl;
		cout << "请输入要修改的内容:(姓名,性别,编号不可修改)" << endl;
		cout << "1. 年龄	2. 联系电话	   3. 球员场上位置" << endl;
		cout << "4. 球员所属俱乐部	5. 球员球衣号码	6. 返回" << endl;

		cin.sync();   //清空输入缓冲区的内容  
		cin.clear();
		cin >> choice;		//输入选择

		switch (choice)
		{
		case 1:		//修改球员年龄
			cout << "请输入该球员的年龄:";
			cin >> age;
			cout << "修改成功!";
			break;

		case 2:		//修改球员联系电话
			cout << "请输入该球员的联系电话:";
			cin >> contict;
			cout << "修改成功!";
			break;

		case 3:		//修改球员专业
			cout << "请输入该球员场上的位置:";
			cin >> position;
			cout << "修改成功!";
			break;

		case 4:		//修改球员班级
			cout << "请输入该球员的俱乐部:";
			cin >> clubName;
			cout << "修改成功!";
			break;

		case 5:		//修改球员成绩
			cout << "请输入该球员的球衣号码:";
			cin >> uniformNumber;
			cout << "修改成功!";
			break;

		case 6:		//退出
			return;

		default:
			cout << "菜单选择错误。" << endl;
		}

		cout << endl;
		system("pause");			//暂停屏幕
	}
}

管理类的实现

1.创建或添加成员
首先判断之前是否有成员,提示是否继续添加信息(没有成员就直接创建,有就提示是否继续添加)。然后就输入添加人员数量(同时判断数据正确性),之后循环添加成员,然后完成添加操作,并更新人数。
用二维基类指针指向派生类对象,用二维基类指针数组实现多态性,其中二维指针数据第一个参数代表是哪一种类对象(球员/教练/职工),第二个参数代表这类人的第几个人。

void BasketballClubManagement::createPlayer(void)			//创建或添加球员信息
{
	string name, gender, position, contict, clubName;			//姓名,性别,场上位置,联系电话,所属俱乐部
	int age, ID;		float uniformNumber;			//年龄,球员编号,球衣号码
	char ch = NULL;
	int addNumber;			//添加的人数
	int i = 0;

	if (p[0][0])			//判断是否存在球员信息
	{
		cout << "球员信息已经创建,继续操作将添加球员信息,是否取消?(按‘Y’或‘y’键取消添加)" << endl;
		cin >> ch;
		if (ch == 'Y' || ch == 'y')
		{
			cout << "已经取消添加!" << endl;
			return;
		}
		else
		{
			cout << "请输入要添加的球员数量:(不超过" << MAX - playerNumber << "个)" << endl;
		}
	}
	else
		cout << "请输入要创建的球员数量:(不超过" << MAX << "个)" << endl;
	cin >> addNumber;
	if (addNumber < 1 || addNumber > MAX - playerNumber)			//安全性检查
	{
		cout << "输入错误,添加失败。" << endl;
		return;
	}

	for (i = 0; i < addNumber; i++)
	{
		cout << endl;
		cout << "请输入第 " << i + 1 << " 个球员姓名:";		cin >> name;
		cout << "请输入第 " << i + 1 << " 个球员性别:";		cin >> gender;
		cout << "请输入第 " << i + 1 << " 个球员年龄:";		cin >> age;
		cout << "请输入第 " << i + 1 << " 个球员编号:";		cin >> ID;
		cout << "请输入第 " << i + 1 << " 个球员联系电话:";		cin >> contict;
		cout << "请输入第 " << i + 1 << " 个球员场上位置:";		cin >> position;
		cout << "请输入第 " << i + 1 << " 个球员所属俱乐部:";		cin >> clubName;
		cout << "请输入第 " << i + 1 << " 个球员球衣号码:";		cin >> uniformNumber;
		cout << endl;

		p[0][playerNumber + i] = new Player(name, gender, age, ID, contict, position, clubName, uniformNumber);			//用基类指针指向派生类对象实现多态
	}

	playerNumber += addNumber;			//计算球员总数
	sum += addNumber;			//计算总人员个数

	cout << "球员信息输入成功。" << endl;
}
  1. 显示并统计所有成员信息
    分为显示并统计所有球员信息,所有教练信息,所有职工信息,以及俱乐部所有人员的信息。
    只需要调用每一个球员类对象的显示信息函数,循环显示出即可。
void BasketballClubManagement::showPlayer(void)			//显示所有球员信息
{
	for (int i = 0; i < playerNumber; i++)
	{
		cout << endl;
		p[0][i]->display();
	}

	cout << endl << "一共有 " << playerNumber << " 个球员" << endl;			//统计球员个数
}

3.保存人员信息
分为保存所有球员信息,所有教练信息,所有职工信息,以及俱乐部所有人员的信息。
在每一个类对象里保存信息是用的追加,因此要先以写方式打开文件再关闭这样就清空了原内容,然后再循环调用每一个类对象的保存函数,最后再将人员个数保存进文件。
代码如下:

void BasketballClubManagement::savePlayer(void)			//保存所有球员信息
{
	ofstream savefile;

	savefile.open("球员信息.txt", ios::out);				//打开文件
	if (savefile.fail())
	{
		cerr << "球员信息保存失败。" << endl;
		return;
	}

	savefile.close();			//打开文件之后关闭文件,清空原文件上次内容

	for (int i = 0; i < playerNumber; i++)
	{
		p[0][i]->save();				//利用了多态实现,基类指针指向派生类
	}

	savefile.open("球员信息.txt", ios::app);				//打开文件
	if (savefile.fail())
	{
		cerr << "球员信息保存失败。" << endl;
		return;
	}

	savefile << "一共有 " << playerNumber << " 个球员" << endl;			//将球员总数保存到文件

	cout << "球员信息已经保存在 《球员信息.txt》 文件中,请查看!" << endl;

	savefile.close();			//关闭文件
}

5.修改人员信息。
因为每个派生类对象都有对基类显示信息的函数,保存信息的函数,修改信息函数的重载,因此修改人员信息也可以像显示功能和保存功能一样,首先调用findPerson查找子函数找到该成员,然后调用该派生类类对象的修改函数。
代码如下:

void BasketballClubManagement::modifyPlayer(void)			//修改球员信息
{
	if (playerNumber <= 0)
	{
		cout << "没有任何球员信息!" << endl;
		return;
	}

	string name;
	string ID;			//用字符串保存球员编号
	int choice = -1;
	int location[2] = { -1,-1 };
	int* plocation = location;

	while (1)
	{
		system("cls");			//清屏

		cout << "修改球员信息:" << endl;
		cout << "1. 按姓名找到要修改的球员	2. 按编号找到要修改的球员	3. 返回" << endl;

		cin.sync();   //清空输入缓冲区的内容  
		cin.clear();
		cin >> choice;		//输入选择

		switch (choice)
		{
		case 1:		//按姓名找到要修改的球员
			cout << "请输入要修改的球员姓名:";
			cin >> name;

			findPerson(plocation, "name", name, "player");		//调用查找子函数获得该人员的信息

			if (location[0] == 0 && location[1] >= 0)				//找到了该数据
				p[location[0]][location[1]]->modify();			//修改该球员信息
			else
				cout << "未找到该球员信息。" << endl;
			break;

		case 2:		//按编号找到要修改的球员
			cout << "请输入要修改的球员编号:";
			cin >> ID;

			findPerson(location, "ID", ID, "player");		//调用查找子函数获得该人员的信息

			if (location[0] == 0 && location[1] >= 0)				//找到了该数据
				p[location[0]][location[1]]->modify();			//修改该球员信息
			else
				cout << "未找到该球员信息。" << endl;
			break;

		case 3:		//退出
			return;

		default:
			cout << "菜单选择错误。" << endl;
		}

		cout << endl;
		system("pause");			//暂停
	}
}

6.删除人员信息。
以删除球员信息为例:
首先调用查找子函数findPerson,找到该成员,显示该成员提示是否确认删除,然后释放该指针指向的内存区域(防止内存泄漏),循环依次使该指针之后每一个指针依次指向下一位置,最后一个指向对象的指针清空即可。最后更新人员个数。
代码如下:

void BasketballClubManagement::removePlayer(void)			//删除球员信息
{
	if (playerNumber <= 0)
	{
		cout << "没有任何球员信息!" << endl;
		return;
	}

	string name;
	string ID;			//用字符串保存球员编号
	int choice = -1;
	int location[2] = { -1,-1 };
	int* plocation = location;
	char ch = NULL;

	while (1)
	{
		system("cls");			//清屏

		cout << "删除球员信息:" << endl;
		cout << "1. 按姓名找到要删除的球员	2. 按编号找到要删除的球员	3. 返回" << endl;

		cin.sync();   //清空输入缓冲区的内容  
		cin.clear();
		cin >> choice;		//输入选择

		switch (choice)
		{
		case 1:		//按姓名找到要删除的球员
			cout << "请输入要删除的球员姓名:";
			cin >> name;

			findPerson(plocation, "name", name, "player");		//调用查找子函数获得该人员的信息

			if (location[0] == 0 && location[1] >= 0)				//找到了该数据
			{
				p[location[0]][location[1]]->display();			//显示出该球员信息
				cout << endl;

				cout << "是否删除该球员信息?(按‘Y’或‘y’键确定删除,否则取消。)" << endl;			//提示是否删除该球员
				cin >> ch;
				if (ch == 'Y' || ch == 'y')
				{
					//删除该球员信息
					delete p[0][location[1]];

					for (int i = location[1]; i < playerNumber - 1; i++)
						p[0][i] = p[0][i + 1];

					p[0][playerNumber - 1] = NULL;

					playerNumber--;
					sum--;

					cout << "该球员已经成功被删除!" << endl;
				}
				else
				{
					cout << "已经取消删除!" << endl;
					break;
				}
			}
			else
				cout << "未找到该球员信息。" << endl;
			break;

		case 2:		//按编号找到要删除的球员
			cout << "请输入要删除的球员编号:";
			cin >> ID;

			findPerson(location, "ID", ID, "player");		//调用查找子函数获得该人员的信息

			if (location[0] == 0 && location[1] >= 0)				//找到了该数据
			{
				p[location[0]][location[1]]->display();			//显示出该球员信息
				cout << endl;

				cout << "是否删除该球员信息?(按‘Y’或‘y’键确定删除,否则取消。)" << endl;			//提示是否删除该球员
				cin >> ch;
				if (ch == 'Y' || ch == 'y')
				{
					//删除该球员信息
					delete p[0][location[1]];

					for (int i = location[1]; i < playerNumber - 1; i++)
						p[0][i] = p[0][i + 1];

					p[0][playerNumber - 1] = NULL;

					playerNumber--;
					sum--;

					cout << "该球员已经成功被删除!" << endl;
				}
				else
				{
					cout << "已经取消删除!" << endl;
					break;
				}
			}
			else
				cout << "未找到该球员信息。" << endl;
			break;

		case 3:		//退出
			return;

		default:
			cout << "菜单选择错误。" << endl;
		}

		cout << endl;
		system("pause");			//暂停
	}
}

7.清空人员信息
分为清空所有球员信息,所有教练信息,所有职工信息,以及俱乐部所有人员的信息。
以清空球员信息为例,循环释放有指向内存的指针即可,然后更新人数。
代码如下:

void BasketballClubManagement::emptyPlayer(void)			//清空球员信息
{
	if (playerNumber == 0 && p[0][0] == NULL)
	{
		cout << "球员信息已经是空的!" << endl;
		return;
	}

	for (int i = 0; i < MAX; i++)
	{
		if (p[0][i])
			delete p[0][i];
		p[0][i] = NULL;
	}

	sum -= playerNumber;			//计算总人员个数
	playerNumber = 0;

	cout << "清空球员信息成功!" << endl;
}
主函数的实现
	调用俱乐部人员管理启动类的成员函数。
int main(void)
{
	system("color f0");		//背景白底

	BasketballClubfManagementLaunch ClubLaunch;			//篮球俱乐部人员管理启动类对象

	while (1)
	{
		system("cls");			//清屏
		ClubLaunch.showMainMenu();			//显示菜单
		ClubLaunch.respondMenu();			//响应菜单
		cout << endl;
		system("pause");
	}

	return 0;
}

三、本系统的运行结果
(一)、创建或添加俱乐部人员:
(1)、首先进入界面
信息模块选择界面
在这里插入图片描述

(2)、选择创建或添加俱乐部人员信息
进入第二层选择模块界面
在这一部分将内部信息导入,选择4
在这里插入图片描述

(1)、
在这里插入图片描述

(2)、选择4,查找俱乐部人员信息后选择1
在这里插入图片描述

(3)、选择1,之前导入了球员信息
在这里插入图片描述

三、交流与联系

q:969060742 完整文档、代码、程序资源

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1059908.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

fcpx插件:82种复古电影胶卷框架和效果mFilm Matte

无论您是在制作音乐剪辑、私人假期视频还是大型广告活动&#xff0c;这个专业的插件都将帮助您为您的镜头赋予真正的电影角色。 复古效果在任何视频中都能立即识别出来&#xff0c;增添了感伤的复古氛围&#xff0c;并使镜头更具说服力。使用 mFilm Matte 轻松实现这些特征&…

通过人才测评系统,对程序员岗位进行招聘测评

一、 程序员的基本工作内容 1、 负责项目组内的代码维护和更新迭代&#xff0c;保证研发效率&#xff0c;对于运营产品提出的需求应积极沟通并实现。 2、 规范相关开发文档等相关资料&#xff0c;对于有变更的代码和功能需求&#xff0c;要对开发文档做出相应的变更。 3、 作为…

从0开始深入理解并发、线程与等待通知机制(上)含大厂面试题

目录 一&#xff0c;基础概念 进程与线程 进程&#xff08;就是一代代码的执行程序&#xff0c;程序的实例&#xff09; 线程 大厂面试题&#xff1a;进程间的通信 CPU 核心数和线程数的关系 上下文切换&#xff08;Context switch&#xff09; 并行和并发 二&#xff0c;认识…

SwiftUI 4.0:两种方式实现子视图导航功能

0. 概览 从 SwiftUI 4.0 开始&#xff0c;觉悟了的苹果毅然抛弃了已“药石无效”的 NavigationView&#xff0c;改为使用全新的 NavigationStack 视图。 诚然&#xff0c;NavigationStack 从先进性来说比 NavigationView 有不小的提升&#xff0c;若要如数家珍得单开洋洋洒洒…

Leetcode---114双周赛

题目列表 2869. 收集元素的最少操作次数 2870. 使数组为空的最少操作次数 2871. 将数组分割成最多数目的子数组 2872. 可以被 K 整除连通块的最大数目 一、收集元素的最小操作次数 直接模拟&#xff0c;倒序遍历即可&#xff0c;代码如下 class Solution { public:int mi…

ROS(5)PX4仿真安装及运行

1、配置&#xff0c;提升下载速度 启动 $ cd clash-for-linux$ sudo bash start.sh$ source /etc/profile.d/clash.sh$ proxy_on 关闭 $ cd clash-for-linux$ sudo bash shutdown.sh$ proxy_off 2、安装PX4开源无人机 git clone https://github.com/PX4/PX4-Autopilot.git…

全栈开发笔记1:首个项目的收获

本文为编程导航实战项目学习笔记。 文章目录 7.跨域问题解决 2023.10.26.项目部署 2023.10.15.统一处理返回值 2023.10.14.开发注册和用户管理 2023.09303.开发登陆注册接口 2023.09.172.数据库设计1.前后端初始化 2023.9.16 7.跨域问题解决 2023.10.2 三种方式&#xff1a; …

ps插件:alpaca增效工具 (完美替代AI创成式填充) 2.8.1 中文版

Alpaca是一个Photoshop插件&#xff0c;提供了多种功能&#xff0c;帮助用户更高效地进行图像处理和设计。可以进行模型训练并无缝地融入图像中。同时还提供文本到图像的生成、图像到图像的变化、涂色、放大、深度图创建等功能&#xff0c;极大地提升了设计和艺术创作的效率和创…

Go,从命名开始!Go的关键字和标识符全列表手册和代码示例!

目录 一、Go的关键字列表和分类介绍关键字在Go中的定位语言的基石简洁与高效可扩展性和灵活性 关键字分类声明各种代码元素组合类型的字面表示基本流程控制语法协程和延迟函数调用 二、Go的关键字全代码示例关键字全代码示例 三、Go的标识符定义基础定义特殊规定关键字与标识符…

【Aseprite像素画】如何取巧做到各种画面效果(小工具的各种技巧)

文章目录 参考链接&#xff1a;具体如下1、水中倒影2、参考图片3多个帧添加动画物品4多个帧删除动画物品5六毛钱受击效果6添加标签7导出特定标志的gif图8忽略标志帧&#xff0c;然后播放9轮廓线10多个图层轮廓线11洋葱皮12替换多个不同帧的色块簇13连接细胞14快速连续删除15冻结…

战火使命兑换码最新,战火使命礼包码

战火使命手游是一款二次元卡牌游戏&#xff0c;玩家可以通过使用兑换码来获取礼包奖励。如果你还不知道如何获取兑换码&#xff0c;下面为你提供最新的礼包码合集。 关注【娱乐天梯】&#xff0c;获取内部福利号 战火使命兑换码最新&#xff1a; 1、兑换码&#xff1a;ZHSM0421…

安装matplotlib_

安装pip 安装matplotlib 安装完毕 导入出现bug......

C++算法 —— 动态规划(10)二维费用背包

文章目录 1、动规思路简介2、一和零3、盈利计划 背包问题需要读者先明白动态规划是什么&#xff0c;理解动规的思路&#xff0c;并不能给刚接触动规的人学习。所以最好是看了之前的动规博客&#xff0c;以及两个背包博客&#xff0c;或者你本人就已经懂得动规了。 1、动规思路简…

弧度、圆弧上的点、圆的半径(r)、弧长(s)之间的关系

要计算弧度和圆弧上的点&#xff0c;需要知道以下几个要素&#xff1a; 圆的半径&#xff08;r&#xff09;&#xff1a;即圆的中心到圆周上任意一点的距离。 弧长&#xff08;s&#xff09;&#xff1a;从圆周上的一个点到另一个点所经过的弧长。 弧度&#xff08;θ&#x…

为什么Spring不建议使用基于字段的依赖注入

在我们通过IDEA编写Spring的代码的时候&#xff0c;假如我们编写了如下代码&#xff1a; IDEA会给我们一个warning警告&#xff1a; 翻阅官方文档&#xff1b;我们会发现&#xff1a; 大意就是强制依赖使用构造器注入&#xff0c;可选依赖使用setter注入那么这是为什么呢&am…

App测试时常用的adb命令你都掌握了哪些呢?

adb 全称为 Android Debug Bridge&#xff08;Android 调试桥&#xff09;&#xff0c;是 Android SDK 中提供的用于管理 Android 模拟器或真机的工具。 adb 是一种功能强大的命令行工具&#xff0c;可让 PC 端与 Android 设备进行通信。adb 命令可执行各种设备操作&#xff0…

【服务器】在 Linux CLI 下安装 Anaconda

【服务器】在 Linux CLI 下安装 Anaconda 1 系统环境2 下载安装包3 安装 1 系统环境 查看系统信息 cat /etc/os-release2. 查看架构 uname -a # output # Linux localhost.localdomain 4.18.0-193.28.1.el8_2.x86_64 #1 SMP Thu Oct 22 00:20:22 UTC 2020 x86_64 x86_64 x86…

4.Tensors For Beginners-Vector Definition

在上一节&#xff0c;已经了解了前向和后向转换。 什么是向量&#xff1f; 定义1&#xff1a;向量是一个数字列表 这很简洁&#xff0c;也通俗易懂。 现有两个向量&#xff1a; 如果要把这两个向量给加起来&#xff0c;只需把对应位置的元素(组件)给加起来。 而要缩放向量&…

angularjs开发环境搭建

Angularjs是一个前端页面应用开发框架&#xff0c;其使用TypeScript作为开发语言&#xff0c;Angularjs的特性包括&#xff0c;使用组件、模板以及依赖注入的开发框架构建可扩展的web应用&#xff0c;使用易于集成的类库支持页面路由、页面表单、前后端接口交互等各种不同特性&…

MySQL5.7版本与8.0版本在CentOS系统安装

目录 前置要求 1. MySQL5.7版本在CentOS系统安装 1.1 安装 1.1.1 配置yum仓库 1.1.2 使用yum安装MySQL 1.1.3 安装完成后&#xff0c;启动MySQL并配置开机自启动 1.1.4 检查MySQL的运行状态 1.2 配置 1.2.1 获取MySQL的初始密码 1.2.2 登陆MySQL数据库系统 …