学生运动会系统设计(C++)

学生运动会系统

1. 系统概述

本系统是一个运动会管理系统,用于管理运动会的项目信息、学生信息以及学生参与项目的情况。系统提供了添加项目、添加学生、学生报名项目、查询学生参与项目情况、查询项目参与者以及展示所有项目信息及参与情况等功能。

2. 系统架构

  • 主要包含以下几个类:
  • 1.SportsEvent类:
    • 作为基类,定义了所有体育相关类的基本接口。包含一个静态成员变量total,用于记录项目总数,以及纯虚函数display()和静态函数gets()。
  • 2. Event类:
    • 继承自SportsEvent类,用于表示具体的运动会项目。包含项目名称、类别和分值等属性,以及相应的构造函数、析构函数和显示函数。
  • 3 Student类:
    • 继承自SportsEvent类,用于表示参与运动会的学生。包含学号、姓名和参与的项目列表等属性,以及相应的构造函数、显示函数和报名项目的函数。
  • 4. Management类:
    • 作为系统的核心管理类,与Student类和Event类构成友元关系,负责管理所有学生和项目的信息,以及处理学生报名项目的业务逻辑。包含学生列表、项目列表和项目与学生的关联映射等属性,以及添加学生、添加项目、学生报名项目、查询学生参与情况、查询项目参与者和展示所有项目信息等功能函数。

3. 数据结构设计

  • 1. Student类:
    • id: 学生学号
    • name: 学生姓名
    • events: 学生参与的项目名称列表
  • 2. Event类:
    • name: 项目名称
    • category: 项目类别
    • score: 项目分值
  • 3. Management类:
    • students: 学生指针列表
    • events: 项目对象列表
    • eventJoin: 项目名称到参与学生指针列表的映射

4 功能模块设计

  • 1. 添加项目功能:
    • 输入项目名称、类别和分值
    • 创建项目对象并添加到项目列表中
    • 初始化项目的参与学生列表
  • 2. 添加学生功能:
    • 输入学生学号和姓名
    • 创建学生对象并添加到学生列表中
  • 3. 学生报名项目功能:
    • 输入学生学号和项目名称
    • 检查学生和项目是否存在
    • 若存在,将项目添加到学生的参与项目列表中,并将学生添加到项目的参与学生列表中
  • 4. 查询学生参与情况功能:
    • 输入学生学号
    • 查找学生并显示其基本信息
    • 显示学生参与的所有项目信息
  • 5. 查询项目参与者功能:
    • 输入项目名称
    • 查找项目并显示其参与者信息
  • 6. 展示所有项目信息及参与情况功能:
    • 遍历所有项目,显示每个项目的基本信息、参与人数和参与者列表

5. 系统流程

  • 1. 初始化阶段:
    • 创建管理对象
    • 输入项目数量并添加项目
    • 输入学生数量并添加学生
    • 输入记录数量并处理学生报名项目
  • 2. 查询阶段:
    • 输入要查询的学生数量并查询学生参与情况
    • 输入要查询的项目数量并查询项目参与者
  • 3. 展示阶段:
    • 显示总项目数
    • 展示所有项目信息及参与情况

6. 类设计详细说明

  • 1. SportsEvent类:
    • 基类,提供统一接口
    • 静态成员变量total用于记录项目总数
    • 纯虚函数display()要求派生类实现显示功能
    • 静态函数gets()用于获取项目总数
  • 2. Event类:
    • 继承自SportsEvent类
    • 构造函数初始化项目信息并增加项目总数
    • 拷贝构造函数复制项目信息并增加项目总数
    • 析构函数减少项目总数
    • 实现display()函数显示项目信息
  • 3. Student类:
    • 继承自SportsEvent类
    • 构造函数初始化学生信息
    • 拷贝构造函数复制学生信息
    • 实现display()函数显示学生信息
    • join()函数用于添加学生参与的项目
  • 4. Management类:
    • 管理所有学生和项目的信息
    • 析构函数释放学生对象的内存
    • addStudent()函数添加学生到学生列表
    • addEvent()函数添加项目到项目列表并初始化参与学生列表
    • joinEvent()函数处理学生报名项目的逻辑
    • queryStudent()函数查询学生参与情况
    • queryEvent()函数查询项目参与者
    • show()函数展示所有项目信息及参与情况

7. 数据流程

  • 项目数据通过addEvent()函数添加到events列表中,并在eventJoin映射中初始化对应的学生列表

  • 学生数据通过addStudent()函数添加到students列表中

  • 学生报名项目时,通过joinEvent()函数更新学生的events列表和eventJoin映射中对应的学生列表

  • 查询操作通过遍历students列表、events列表和eventJoin映射来获取相应信息

  • 展示操作通过遍历events列表和eventJoin映射来显示所有项目信息及参与情况

8. 系统交互流程

  • 用户输入项目信息,系统创建项目对象并存储

  • 用户输入学生信息,系统创建学生对象并存储

  • 用户输入学生报名项目信息,系统处理报名逻辑

  • 用户查询学生参与情况,系统查找并显示相关信息

  • 用户查询项目参与者,系统查找并显示相关信息

  • 系统展示所有项目信息及参与情况

9. 异常处理

  • 在学生报名项目时,若学生或项目不存在,系统会提示错误信息
  • 在查询学生参与情况时,若学生不存在,系统会提示错误信息
  • 在查询项目参与者时,若项目不存在,系统会提示错误信息

10. 总结

  • 代码完成一下要求:
    • 设计包含一个以上的类
    • 类中包含构造函数、拷贝构造函数
    • 类中包含静态成员和静态成员函数
    • 类中包含友元
    • 继承和派生
    • 虚函数和虚基类
    • Main函数
  • 系统提供了完善的查询和展示功能,具有良好的课扩展性和可维护性。

11. 代码实现

#include<bits/stdc++.h>
using namespace std;

// 运动会项目基类(抽象类)
class SportsEvent
{
    protected:
        static int total;	// 静态成员:统计所有项目数量 
    public:
        virtual void display() const = 0;	// 纯虚函数,强制派生类实现多态接口 
        static int gets(){return total;}
};

int SportsEvent::total=0;	 // 静态成员初始化 

// 具体项目类
class Event:public SportsEvent
{
        string name;	// 项目名称
        string category;	// 项目类别
        int score;	// 项目分值
        friend class Management;	// 友元声明:允许Management访问私有成员 
    public:
    	// 构造/拷贝构造时自动增加项目计数 
        Event(string n,string cat,int sc):name(n),category(cat),score(sc){total++;}
        Event(const Event& E):name(E.name),category(E.category),score(E.score){total++;}
        ~Event(){total--;}	// 析构时减少计数
        
        void display()const override {cout<<"项目:"<<name<<"  类别:"<<category<<"  分值:"<<score<<endl;} 
};

// 学生参与类
class Student:public SportsEvent
{
    protected:    
        string id;	// 学号
        string name;	// 姓名
        vector<string> events;	// 参与的项目名称列表
    public:
        Student(string sid,string n):id(sid),name(n){}
        Student(const Student& Students):id(Students.id),name(Students.name){}
        
        void display()const override {cout<<"学号:"<<id<<"  姓名:"<<name<<endl;}
        void join(string eventname) {events.push_back(eventname);} 	// 记录学生参与的项目
        friend class Management;	 // 友元声明 
};

// 运动会管理系统
class Management {
    vector<Student*> students;  // 学生对象指针集合
    vector<Event> events;       // 项目对象集合
    map<string, vector<Student*>> eventJoin;  // 项目名称-参与者映射(高效查询) 
public:
    ~Management() { 
        for (auto s : students) delete s;  // 析构时释放学生对象内存 
    }
    
    // 添加学生到系统
    void addStudent(Student* s) { 
        students.push_back(s); 
    }
    
    // 创建新项目
    void addEvent(string n, string c, int s) {
        events.emplace_back(n, c, s);      // 直接构造避免拷贝 
        eventJoin[n] = vector<Student*>();  // 初始化空参与列表
    }
    
    // 学生参加项目(双向关联)
    void joinEvent(string studentId, string eventName) {
        // Lambda表达式查找学生和项目 
        auto studentIt = find_if(students.begin(), students.end(), 
            [&](Student* s) { return s->id == studentId; });
        auto eventIt = find_if(events.begin(), events.end(), 
            [&](const Event& e) { return e.name == eventName; });
        
        if (studentIt != students.end() && eventIt != events.end()) {
            (*studentIt)->join(eventName);  // 更新学生参与列表
            eventJoin[eventName].push_back(*studentIt);  // 更新项目参与者
            cout << "学生 " << (*studentIt)->name << " 成功参加项目 " << eventName << endl;
        } else {
            cout << "学生或项目不存在!" << endl;
        }
    }
    
    // 查询学生参与情况
    void queryStudent(string id) {
        auto it = find_if(students.begin(), students.end(), 
            [&](Student* s) { return s->id == id; });
        
        if (it != students.end()) {
            (*it)->display();
            cout << "参与项目:" << endl;
            for (auto& eventName : (*it)->events) {
                auto eventIt = find_if(events.begin(), events.end(), 
                    [&](const Event& e) { return e.name == eventName; });
                if (eventIt != events.end()) 
                    eventIt->display();
                else 
                    cout << "-项目" << eventName << "信息缺失" << endl;
            }
        } else cout << "学生不存在";
    }
    
    // 查询项目参与情况
    void queryEvent(string evename) {
        if (eventJoin.find(evename) != eventJoin.end()) {
            cout << "项目" << evename << "的参与者:" << endl;
            for (auto student : eventJoin[evename]) 
                student->display();
            cout << "总计:" << eventJoin[evename].size() << "人" << endl;
        } else cout << "项目不存在!" << endl;
    }
    
    // 显示所有项目及参与统计
    void show() {
        cout << endl << "所有项目信息及参与情况:" << endl;
        for (auto& event : events) {
            cout << "项目名称: " << event.name << endl;
            cout << "参与人数: " << eventJoin[event.name].size() << endl;
            if (!eventJoin[event.name].empty()) {
                cout << "参与者: ";
                for (auto student : eventJoin[event.name]) 
                    cout << student->name << " ";
                cout << endl;
            }
            cout << endl;
        }
    }
};
// 主程序逻辑:数据输入→关系建立→查询→统计 
int main()
{
    Management m;
    int eventCount, studentCount, joinCount;
    cout<<"请输入项目数量:";
    cin>>eventCount;
    for(int i=0;i<eventCount;i++)
    {
        string name,cate;
        int sc;
        cout<<endl<<"项目"<<i+1<<"名称:"; cin>>name;
        cout<<"项目"<<i+1<<"类别:"; cin>>cate;
        cout<<"项目"<<i+1<<"分值:"; cin>>sc;
        m.addEvent(name,cate,sc);
    }
    
    cout<<endl<<"请输入学生数量:";
    cin>>studentCount;
    for(int i=0;i<studentCount;i++)
    {
        string id,name;
        cout<<endl<<"学生"<<i+1<<"学号:"; cin>>id;
        cout<<"学生"<<i+1<<"姓名:"; cin>>name;
        m.addStudent(new Student(id,name));
    }

    cout<<endl<<"请输入记录数量:";
    cin>>joinCount;
    for(int i=0;i<joinCount;i++)
    {
        string sid,ename;
        cout<<endl<<"记录"<<i+1<<"-学号:";cin>>sid;
        cout<<"记录"<<i+1<<"-项目:";cin>>ename;
        m.joinEvent(sid,ename);  
    }
    int querystu,querye;
    cout<<endl<<"请输入要查询的人数:"; cin>>querystu;
    while(querystu--)
    {
        string id;
        cout<<endl<<"请输入要查询的学号:";cin>>id;m.queryStudent(id);
    }
    cout<<endl<<"请输入要查询的项目数量:"; cin>>querye;
    while(querye--)
    {
        string evename;
        cout<<endl<<"请输入要查询的项目名称:";cin>>evename;m.queryEvent(evename);
    }
    cout<<endl<<"总项目数:"<<SportsEvent::gets()<<endl;
    m.show();
    return 0;
}
posted @ 2025-06-10 22:34  Yygz314  阅读(36)  评论(0)    收藏  举报