建立一个简单的运动会管理系统,包括田赛和径赛的管理。需要完成如下功能: 1、建立一个基类SportEvent,它的属性有比赛名称name、比赛地点location,参赛的运动员athlete;还要给SportEvent类定义合适的成员函数,其中包括虚函数show_info (),用于输出比赛项目的基本信息。 2、建立一个田赛类FieldEvent和一个径赛类TrackEvent,它们均由SportEvent类公有继承而来。 3、田赛类FieldEvent有新增数据成员:运动员跳的距离distance,给田赛类重定义show_info ()函数以输出其相关信息。田赛类还应该具有修改距离等功能和比较运动员的成绩。 4、径赛类TrackEvent有新增数据成员:运动员跑的时间time,给径赛类重定义show_info ()函数以输出其相关信息。径赛类还应该具有修改时间和比较运动员的成绩等功能。 5、重载>>,实现用cin为田赛类和径赛类的对象取得值。 6、为每个类写构造函数。田赛对象和径赛对象的信息都能够保存到文件。 7、编写main()主函数,测试上述功能。
时间: 2023-06-17 21:05:39 浏览: 123
以下是一个简单的运动会管理系统的实现:
```cpp
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
using namespace std;
// 运动会比赛基类
class SportEvent {
protected:
string name; // 比赛名称
string location; // 比赛地点
vector<string> athletes; // 参赛运动员名单
public:
SportEvent(string n, string l) : name(n), location(l) {}
// 显示比赛基本信息
virtual void show_info() {
cout << "比赛名称:" << name << endl;
cout << "比赛地点:" << location << endl;
cout << "参赛运动员:" << endl;
for (int i = 0; i < athletes.size(); i++) {
cout << athletes[i] << endl;
}
}
// 添加运动员
void add_athlete(string athlete) {
athletes.push_back(athlete);
}
// 获取比赛名称
string get_name() {
return name;
}
// 获取比赛地点
string get_location() {
return location;
}
// 获取参赛运动员名单
vector<string> get_athletes() {
return athletes;
}
};
// 田赛类
class FieldEvent : public SportEvent {
private:
vector<double> distances; // 参赛运动员跳的距离
public:
FieldEvent(string n, string l) : SportEvent(n, l) {}
// 重定义show_info()函数
void show_info() {
SportEvent::show_info();
cout << "跳远成绩:" << endl;
for (int i = 0; i < distances.size(); i++) {
cout << athletes[i] << ":" << distances[i] << "米" << endl;
}
}
// 添加距离
void add_distance(string athlete, double distance) {
for (int i = 0; i < athletes.size(); i++) {
if (athletes[i] == athlete) {
distances[i] = distance;
break;
}
}
}
// 比较成绩
void compare_distance() {
int n = athletes.size();
for (int i = 0; i < n; i++) {
for (int j = i + 1; j < n; j++) {
if (distances[i] < distances[j]) {
// 交换运动员名次
double temp = distances[i];
distances[i] = distances[j];
distances[j] = temp;
string temp_name = athletes[i];
athletes[i] = athletes[j];
athletes[j] = temp_name;
}
}
}
}
// 重载输入运算符>>
friend istream& operator>>(istream& in, FieldEvent& event) {
in >> event.name >> event.location;
string athlete;
double distance;
while (in >> athlete >> distance) {
event.add_athlete(athlete);
event.distances.push_back(distance);
}
return in;
}
// 保存到文件
void save_to_file() {
ofstream out(name + ".txt");
out << "比赛名称:" << name << endl;
out << "比赛地点:" << location << endl;
out << "参赛运动员:" << endl;
for (int i = 0; i < athletes.size(); i++) {
out << athletes[i] << endl;
}
out << "跳远成绩:" << endl;
for (int i = 0; i < distances.size(); i++) {
out << athletes[i] << ":" << distances[i] << "米" << endl;
}
out.close();
}
};
// 径赛类
class TrackEvent : public SportEvent {
private:
vector<double> times; // 参赛运动员跑的时间
public:
TrackEvent(string n, string l) : SportEvent(n, l) {}
// 重定义show_info()函数
void show_info() {
SportEvent::show_info();
cout << "100米成绩:" << endl;
for (int i = 0; i < times.size(); i++) {
cout << athletes[i] << ":" << times[i] << "秒" << endl;
}
}
// 添加时间
void add_time(string athlete, double time) {
for (int i = 0; i < athletes.size(); i++) {
if (athletes[i] == athlete) {
times[i] = time;
break;
}
}
}
// 比较成绩
void compare_time() {
int n = athletes.size();
for (int i = 0; i < n; i++) {
for (int j = i + 1; j < n; j++) {
if (times[i] > times[j]) {
// 交换运动员名次
double temp = times[i];
times[i] = times[j];
times[j] = temp;
string temp_name = athletes[i];
athletes[i] = athletes[j];
athletes[j] = temp_name;
}
}
}
}
// 重载输入运算符>>
friend istream& operator>>(istream& in, TrackEvent& event) {
in >> event.name >> event.location;
string athlete;
double time;
while (in >> athlete >> time) {
event.add_athlete(athlete);
event.times.push_back(time);
}
return in;
}
// 保存到文件
void save_to_file() {
ofstream out(name + ".txt");
out << "比赛名称:" << name << endl;
out << "比赛地点:" << location << endl;
out << "参赛运动员:" << endl;
for (int i = 0; i < athletes.size(); i++) {
out << athletes[i] << endl;
}
out << "100米成绩:" << endl;
for (int i = 0; i < times.size(); i++) {
out << athletes[i] << ":" << times[i] << "秒" << endl;
}
out.close();
}
};
int main() {
// 创建田赛对象和径赛对象
FieldEvent field_event("跳远比赛", "体育场");
TrackEvent track_event("100米比赛", "田径场");
// 从用户输入中读取田赛对象和径赛对象的信息
cout << "请输入跳远比赛的信息(比赛名称,比赛地点,运动员名字和跳远成绩):" << endl;
cin >> field_event;
cout << "请输入100米比赛的信息(比赛名称,比赛地点,运动员名字和100米成绩):" << endl;
cin >> track_event;
// 显示田赛对象和径赛对象的信息
cout << "跳远比赛的信息:" << endl;
field_event.show_info();
cout << "100米比赛的信息:" << endl;
track_event.show_info();
// 修改田赛和径赛的成绩
field_event.add_distance("张三", 6.5);
track_event.add_time("李四", 12.3);
// 比较田赛和径赛的成绩
field_event.compare_distance();
track_event.compare_time();
// 显示田赛和径赛的最终成绩
cout << "跳远比赛的最终成绩:" << endl;
field_event.show_info();
cout << "100米比赛的最终成绩:" << endl;
track_event.show_info();
// 保存田赛和径赛的信息到文件
field_event.save_to_file();
track_event.save_to_file();
return 0;
}
```
这个程序首先定义了一个基类 `SportEvent`,包含了比赛的基本信息和参赛运动员的名单,并定义了一个虚函数 `show_info()` 用于输出比赛项目的基本信息。然后分别定义了田赛类 `FieldEvent` 和径赛类 `TrackEvent`,它们均由 `SportEvent` 类公有继承而来,并且分别增加了运动员跳的距离和运动员跑的时间两个数据成员,重定义了 `show_info()` 函数以输出相关信息,并且还实现了修改距离/时间和比较成绩的功能。此外,还重载了输入运算符 `>>` 以便从用户输入中读取田赛和径赛的信息,以及定义了 `save_to_file()` 函数以将田赛和径赛的信息保存到文件中。
在 `main()` 函数中,首先创建了田赛对象和径赛对象,并从用户输入中读取它们的信息。然后显示它们的信息,修改它们的成绩,比较它们的成绩,最后显示它们的最终成绩,并将它们的信息保存到文件中。
阅读全文