C++:学生类的设计和实现

定义一个学生类,设计公有成员函数:构造函数,复制构造函数等构造函数,输出学生基本信息函数,修改学生基本信息函数

img

img

#include <iostream>
#include <string>

using namespace std;

class Student
{
public:
    // 构造函数
    Student(int id, string name) : stu_id_(id), name_(name)
    {
        ++num_students_; // 学生人数加 1
    }

    // 复制构造函数
    Student(const Student &other) : stu_id_(other.stu_id_), name_(other.name_)
    {
        ++num_students_; // 学生人数加 1
    }

    // 输出学生基本信息的函数
    void DisplayInfo() const
    {
        cout << "学号: " << stu_id_ << ", 姓名: " << name_ << endl;
    }

    // 修改学生基本信息的函数
    void SetInfo(int id, string name)
    {
        stu_id_ = id;
        name_ = name;
    }

    // 返回是否有挂科记录
    bool IsFail() const
    {
        return is_fail_;
    }

    // 返回学生学号
    int GetStuId() const
    {
        return stu_id_;
    }

    // 输入学号、各课程号与成绩,并同时修改成员 is_fail_、num_lessons_
    void InputScore();

    // 输出各课程号与成绩
    void DisplayAll() const;

    // 输出挂科课程
    void DisplayFail() const;

    // 将各课程成绩升序,使得课程号序号与成绩对应升序排列,并输出
    void Sort();

private:
    static int num_students_; // 学生人数(静态成员数据)
    const int stu_id_;        // 学号(常数成员数据)
    string name_;             // 姓名(常数成员数据)
    int lesson_ids_[5];       // 各课程号(1门课 ==> 设最多 5 门课程)
    float scores_[5];         //  // 各课程成绩(1 门课 ==> 存储 5 门课成绩)
    bool is_fail_;            // 是否挂科标志
    int num_lessons_;         // 已输入的课程数
};

// 定义学生类的友元类:教师类
class Teacher
{
public:
    // 修改学生的各科课程成绩
    void ModifyScore(Student &student, int lesson_id, float score);

    // 输出挂科学生名单
    void DisplayFailStudents() const;

    // 输出所有学生名单
    void DisplayStudents() const;
};

int Student::num_students_ = 0; // 初始化静态成员数据

// 输入学号、各课程号与成绩,并同时修改成员 is_fail_、num_lessons_
void Student::InputScore()
{
    cout << "输入课程数: ";
    cin >> num_lessons_;

    for (int i = 0; i < num_lessons_; ++i)
    {
        cout << "输入第 " << i + 1 << " 门课的课程号和成绩: ";
        cin >> lesson_ids_[i] >> scores_[i];
    }
}

// 输出各课程号与成绩
void Student::DisplayAll() const
{
    for (int i = 0; i < num_lessons_; ++i)
    {
        cout << "课程号: " << lesson_ids_[i] << ", 成绩: " << scores_[i] << endl;
    }
}

// 输出挂科课程
void Student::DisplayFail() const
{
    cout << "挂科课程: ";
    for (int i = 0; i < num_lessons_; ++i)
    {
        if (scores_[i] < 60)
        {
            cout << lesson_ids_[i] << " ";
        }
    }
    cout << endl;
}

// 将各课程成绩升序,使得课程号序号与成绩对应升序排列,并输出
void Student::Sort()
{
    // 冒泡排序
    for (int i = 0; i < num_lessons_; ++i)
    {
        for (int j = 0; j < num_lessons_ - i - 1; ++j)
        {
            if (scores_[j] > scores_[j + 1])
            {
                swap(scores_[j], scores_[j + 1]);
                swap(lesson_ids_[j], lesson_ids_[j + 1]);
            }
        }
    }

    cout << "按成绩升序排列后的课程号和成绩: " << endl;
    for (int i = 0; i < num_lessons_; ++i)
    {
        cout << "课程号: " << lesson_ids_[i] << ", 成绩: " << scores_[i] << endl;
    }
}

// 修改学生的各科课程成绩
void Teacher::ModifyScore(Student &student, int lesson_id, float score)
{
    for (int i = 0; i < student.num_lessons_; ++i)
    {
        if (student.lesson_ids_[i] == lesson_id)
        {
            student.scores_[i] = score;
            return;
        }
    }
}

// 输出挂科学生名单
void Teacher::DisplayFailStudents() const
{
    cout << "挂科学生: " << endl;
    for (int i = 0; i < Student::num_students_; ++i)
    {
        if (students_[i].IsFail())
        {
            students_[i].DisplayInfo();
        }
    }
}

// 输出所有学生名单
void Teacher::DisplayStudents() const
{
    cout << "学生: " << endl;
    for (int i = 0; i < Student::num_students_; ++i)
    {
        students_[i].DisplayInfo();
    }
}

int main()
{
    // 定义一个班,班级有 10 位学生
    Student students[10];

    // 基本信息的设置
    for (int i = 0; i < 10; ++i)
    {
        students[i].SetInfo(10000 + i, "学生 " + to_string(i + 1));
    }

    // 传入课程号和成绩
    for (int i = 0; i < 10; ++i)
    {
        students[i].InputScore();
    }

    // 定义一个教师
    Teacher teacher;

    // 修改学生的各科课程成绩
    teacher.ModifyScore(students[0], 1001, 90);
    teacher.ModifyScore(students[0], 1002, 80);
    teacher.ModifyScore(students[1], 1001, 70);
    teacher.ModifyScore(students[1], 1002, 60);
    teacher.ModifyScore(students[2], 1001, 50);
    teacher.ModifyScore(students[2], 1002, 40);
    teacher.ModifyScore(students[3], 1001, 30);
    teacher.ModifyScore(students[3], 1002, 20);
    teacher.ModifyScore(students[4], 1001, 10);
    teacher.ModifyScore(students[4], 1002, 0);

    // 输出挂科学生名单
    teacher.DisplayFailStudents();

    // 输出所有学生名单
    teacher.DisplayStudents();

    return 0;
}
main.cpp:
#include
#include
#include"Student.h"
using namespace std;
void main()
{
int i;
Student a[3];
for(i=0;i<3;i++)
{
cin>>a[i].age>>a[i].name;
a[i].Input(a[i].age,a[i].name);
}
for(i=0;i<3;i++)
{
a[i].Output();
}
}

student.h
#pragma once
#include
#include
using namespace std;
class Student
{
public:
int age;
string name;
int Input(int a, string str);
int Output();
};
Student.cpp
#include “Student.h”
using namespace std;
#include
int Student::Input(int a, string str)
{
a=age;
str=name;
return 0;
}

int Student::Output()
{
cout<<age<<"__"<<name<<endl;
return 0;
}