用面向对象的思想实现学生信息管理 vector c++ 封装性实验(+文件 STL)

题目具体要求:  (老师出的题目,可能有那么不太完美)

请用面向对象的思想实现学生信息管理:

学生信息包括:学号、姓名、数学成绩、英语成绩,建立一个学生类Student。依次从文件调入学生信息以对象的形式存在vector中,按学号顺序依次存放。如果需要,请增加必要的其他类及异常处理及运算符重载。

1)根据学号查询学生的单科分和总分;

2)根据学号修改某科成绩;

3)按学号输出所有学生的成绩单(文件存放),含学号、姓名、数学成绩、英语成绩、总分、排名(能力足的同学实现)

4)输出有挂科学生的学号、姓名和对应的科目。

txt文件内容如下图:姓名 学号 数学成绩 英语成绩

用面向对象的思想实现学生信息管理 vector c++ 封装性实验(+文件 STL)_第1张图片

 完整代码如下:

#include
#include
#include
#include
#include

using namespace std;



class Student        //学生类
{
public:
    Student(string name, long long id, float Math, float English)
    {
        this->name = name;
        this->id = id;
        this->Math = Math;
        this->English = English;
        Sum = (Math + English);
    }
    string name;
    long long id;  
    float Math;
    float English;
    float Sum;
};

class stusystem
{
public:
    
    stusystem()    //打开文件
    {
        system("cls");
        ifstream ifs("score.txt", ios::in);
        if (ifs.is_open() != NULL)
        {
            string name;
            long long id;
            float Math;
            float English;
            
               
            while (ifs >> name >> id >> Math >> English )
            {
                Student s(name, id, Math,English);
                a.push_back(s);
            }
        }
        else
        {
            cout << "不存在该文件" << endl;

        }
        
    }
    vectora;
    
    void Save();//保存
    void Findid();     //查找学号
    void Remake();//修改成绩
    void Sort();//按学号排名
    void M_Sort();//按总分排名
    void guake();//输出挂科

    void mainmenu()    //主菜单
    {
            system("cls");
            cout << "1.按学号查询"<> x;
        switch (x)
        {
        case 1:Findid(); break;
            
        case 2:Remake(); break;
        case 3:Sort(); break;
        case 4:M_Sort(); break;
        case 5:guake(); break;
        default:cout << "输入错误,请重新输入\n";
            mainmenu(); break;
        }
    }
};


void stusystem::Save()  //保存文件
{
    ofstream ofs("score.txt", ios::out);
    for (vector::iterator i = a.begin(); i != a.end(); i++)
    {
        ofs << (*i).name << "\t" << (*i).id << "\t" << (*i).Math << "\t" << (*i).English << "\t" << (*i).Sum << endl;
    }
    ofs.close();
}
void stusystem::Findid()
{
    long long y;            //输入查找的学号
    bool flag = false;         //异常解决方案
    cout << "请输入需查找的学生学号:";
    cin >> y;
    for (vector::iterator i = a.begin(); i != a.end(); i++)
    {
        if ((*i).id == y)
        {
            flag = true;
            
            cout << (*i).name << " " << (*i).id << " " << (*i).Math << " " << (*i).English << "\t" <<(*i).Sum  << endl;
            cout << "\n按任意键返回主菜单";
            char ch;
            cin >> ch;
            mainmenu();
        }
        if (flag == false)
        {
            cout << "查无此人!" << endl;
            Findid();
        }
    }
}
void stusystem::Remake()
{
    system("cls");
    cout << "修改学生成绩:" << endl;
    cout << "请输入要修改的学生学号:";
    long long id;
    cin >> id;
    for (vector::iterator i = a.begin(); i != a.end(); i++)
    {
        if ((*i).id == id)
        {
            cout << "已找到该学生,请重新输入该学生的信息" << endl;
            cout << "修改数学成绩输入 1 ,修改英语成绩输入 2 ";
            float  math, english;
            int c;
            cin >> c;
            
            switch (c)
            {
            case 1:cin >> math; (*i).Math = math; break;
            case 2:cin >> english; (*i).English = english; break;
            default:cout << "输入错误,将返回主菜单\n"; mainmenu(); break;
            }
            

            
        }
    }
    Save();
    cout << "\n按任意键返回主菜单"; char ch;
    cin >> ch; return;
}
bool mysort(Student a, Student b)//自定义排序规则
{
    
        return a.id  < b.id ;       //学号从小到大排
    
}
void stusystem::Sort()//按学号排名
{
    system("cls");
    if (a.size() == 0)
        cout << "文件不存在" << endl;
    else {
        sort(a.begin(), a.end(),mysort);   //排序函数从向量表头至表尾使用自定义mysort规则
        
        
        Save();
        cout << "\n按任意键返回主菜单"; char ch;
        cin >> ch; return;
    }
}

bool M_mysort(Student a, Student b)//自定义排序规则
{

    return a.Sum >  b.Sum ;       //总分从大到小排

}
void stusystem::M_Sort()//按学号排名
{
    system("cls");
    if (a.size() == 0)
        cout << "文件不存在" << endl;
    else {
        sort(a.begin(), a.end(), M_mysort);   //排序函数从向量表头至表尾使用自定义mysort规则


        Save();
        cout << "\n按任意键返回主菜单";
        char ch;
        cin >> ch;
        return;
    }
}
void stusystem::guake()
{
    cout << "数学挂科:" << endl;
    for (vector::iterator it = a.begin(); it != a.end(); it++)
    {
        if ((*it).Math < 60)
        {
            cout << (*it).name << " " << (*it).id << " " << (*it).Math<< endl;
        }
    }
    cout << "英语挂科:" << endl;
    for (vector::iterator it = a.begin(); it != a.end(); it++)
    {
        if ((*it).English  < 60)
        {
            cout << (*it).name << " " << (*it).id << " " << (*it).English  << endl;
        }
    }
    
    cout << "\n按任意键返回主菜单";
    char ch;
    cin >> ch;
    return;
    
}


int main()
{
    
    stusystem stu;
    while (1)
    {
        stu.mainmenu();
    }

    system("pause");
    return 0;
}

运行截图:

用面向对象的思想实现学生信息管理 vector c++ 封装性实验(+文件 STL)_第2张图片

你可能感兴趣的:(C++,c++)