一、 本系统的设计
篮球俱乐部管理系统是一个用于管理篮球俱乐部日常运营和球队管理的软件系统。它提供了一套功能齐全的工具,帮助篮球俱乐部进行会员管理、训练计划安排、比赛管理、场地预订以及财务记录等方面的工作。
该管理系统的主要特点和功能包括:
会员管理:系统可以记录和管理篮球俱乐部的会员信息,包括个人资料、联系方式、会籍状态等。管理员可以轻松查看和更新会员信息,包括新会员注册、会员卡发行、会籍续费等。
训练计划安排:系统允许管理员创建和安排篮球训练计划。可以设置训练日期、时间、地点以及训练内容等信息。会员可以查看训练计划,并确认参加。管理员可以根据需要调整计划和通知会员。
比赛管理:系统支持篮球俱乐部的比赛管理,包括安排比赛、报名参赛、比赛结果记录等。管理员可以创建比赛信息,发送邀请给其他俱乐部,并记录比赛结果和统计数据。
场地预订:系统提供场地预订功能,允许会员选择合适的时间和场地进行个人或团队训练。管理员可以管理场地信息、预订情况和收费等。
财务记录:系统可以记录篮球俱乐部的财务收支情况,包括会费收入、场地租用费、比赛费用等。管理员可以生成财务报表,方便核算和管理俱乐部的财务状况。
统计和报表:系统提供各种统计和报表功能,如会员统计、训练计划统计、比赛成绩统计等。这些报表可以为俱乐部管理层提供数据支持和决策依据。
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. 各模块的功能
球员类成员函数:
- 对球员类成员进行初始化
- 显示球员信息(函数重载)
- 保存球员信息(函数重载)
- 修改球员信息(函数重载)
教练类成员函数:
- 对教练类成员进行初始化
- 显示教练信息(函数重载)
- 保存教练信息(函数重载)
- 修改教练信息(函数重载)
职工类函数实现:
- 对职工类成员进行初始化
- 显示职工信息(函数重载)
- 保存职工信息(函数重载)
- 修改职工信息(函数重载)
人员管理类成员函数实现:
- 构造函数
- 析构函数
- 查找人员函数
人员信息管理类(BasketballClubManagement):
一、 球员信息管理功能
- 创建或添加球员信息
- 导入球员信息
- 显示所有球员信息
- 保存所有球员信息
- 查找球员信息
- 修改球员信息
- 删除球员信息
- 清空球员信息
二、 教练信息管理功能
- 创建或添加教练信息
- 导入教练信息
- 显示所有教练信息
- 保存所有教练信息
- 查找教练信息
- 修改教练信息
- 删除教练信息
- 清空教练信息
三、 职工信息管理功能
-
创建或添加职工信息
-
导入职工信息
-
显示所有职工信息
-
保存所有职工信息
-
查找职工信息
-
修改职工信息
-
删除职工信息
-
清空职工信息
菜单管理类(MenuManagement):
一、 显示各个子菜单 -
显示添加人员信息子菜单
-
显示显示人员信息子菜单
-
显示保存人员信息子菜单
-
显示查找人员信息子菜单
-
显示修改人员信息子菜单
-
显示删除人员信息子菜单
-
显示清空人员信息子菜单
二、响应各个子菜单 -
响应添加人员子菜单
-
响应显示人员信息子菜单
-
响应保存人员信息子菜单
-
响应查找人员信息子菜单
-
响应修改人员信息子菜单
-
响应删除人员信息子菜单
-
响应清空人员信息子菜单
俱乐部人员启动类(BasketballClubfManagementLaunch): -
显示主菜单
-
响应主菜单
3. 使用的数据结构
-
基类
Person类, 用来描述人员的基本信息,如姓名,性别,年龄,编号(用于查找),联系方式。包括显示信息,保存文件,修改信息等函数。 -
派生类
Player类,Coach类,Staff类为Person类的派生类,进行公有继承。
Player类用来描述球员的基本信息,除Person类中的基本信息外,还包括场上位置,所属俱乐部,和球衣号码和显示球员信息,保存球员信息,修改球员信的息函数重载。
Coach类中用来描述教练的基本信息,除Person类中的基本信息外,还包括教练专业特点,教练绰号和显示教练信息,保存教练信息,修改教练信息的函数重载。
Staff类中用描述职工的基本信息,除Person类中的基本信息外,还包括职工部门,职工工资,职工工作和显示显示职工信息,保存职工信息,修改职工信息的函数重载。 -
管理类
主要用来管理俱乐部人员信息,实现对人员信息的添加、查找、删除、显示、保存等功能。使用基对象指针进行操作。 -
类之间的关系
4. 本系统的基本架构以及流程图
- 添加成员信息模块
- 2.修改成员信息模块
-
删除成员信息模块
-
查找成员信息模块
5.清空成员信息模块
6.保存成员信息模块:
7.显示函数成员信息模块
- 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;
}
- 显示并统计所有成员信息
分为显示并统计所有球员信息,所有教练信息,所有职工信息,以及俱乐部所有人员的信息。
只需要调用每一个球员类对象的显示信息函数,循环显示出即可。
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 完整文档、代码、程序资源