C++课程设计学生成绩管理系统

学生成绩管理系统,采用分模块开发

list.cpp

#include<iostream>
#include<fstream>
#include<stdio.h>
#include<cstdlib>
#include<cstring>
#include<iomanip>
#include"list.h"
using namespace std;

List::~List()
{
    pHead=NULL;
    pNext=NULL;
}

//从文件导入学生信息,并保存在链表中
void List::input_info()
{
    List *current=NULL;
    List *previous=NULL;
    pHead=NULL;

    string name;//姓名
    string stuID;//学号
    double english;//英语成绩
    double math;//数学成绩
    double cpp;//C++成绩
    int n=0;//用于统计学生的数量,同时设置编号
//读取文件信息可用fstream 
    ifstream fin;
    fin.open("学生成绩.txt",ios::in);//iOS::in打开文件用于读取 
    if(!fin)
    {
        cout<<"Fail to open the file!"<<endl;
        exit(0);
    }

    //创建链表,并保存数据
    while(1)
    {
        if(!(fin>>name>>stuID>>english>>math>>cpp))//从文件中读取数据
            break;

        ++n;//编号递增
        //cout<<name<<' '<<stuID<<' '<<english<<' '<<math<<' '<<cpp<<endl;

        current=new List;//创建结点
        if(pHead==NULL)
            pHead=current;//保存头指针
        if(previous!=NULL)
            previous->pNext=current;//将前一个结点的pNext指向当前结点

        //将文件中的一组数据保存在当前结点
        current->stu.set_name(name);//保存学生的姓名
        current->stu.set_stuID(stuID);//保存学生的学号
        current->stu.set_scores(english,math,cpp);//保存英语、数学、C++成绩
        current->stu.count_avg();//计算平均成绩,并保存
        current->stu.count_total();//计算总分
        current->stu.set_num(n);

        current->pNext=NULL;
        previous=current;

    }

    //关闭文件
    fin.close();
    //cout<<"已成功从文件导入"<<n<<"个学生的信息"<<endl;
}
//遍历链表,打印学生信息
void List::output_info()
{
    string name;//姓名
    string stuID;//学号
    int num;
    double english;//英语成绩
    double math;//数学成绩
    double cpp;//C++成绩
    double total;//总成绩
    double average;//平均成绩
    int n=0;//设置编号

    cout<<"\n编号\t"<<"姓名\t"<<"学号\t"<<"英语\t"<<"数学\t"<<"C++\t"<<"总分\t"<<"平均分\t"<<endl;

    List *p=pHead;

    while(p!=NULL)
    {
        ++n;
        p->stu.set_num(n);//重新设置编号
        name=p->stu.get_name();
        stuID=p->stu.get_stuID();
        num=p->stu.get_num();
        p->stu.get_scores(&english,&math,&cpp,&total,&average);
        cout<<fixed<<setprecision(2)<<num<<'\t'<<name<<'\t'<<stuID<<'\t'<<english<<'\t'<<math<<'\t'<<cpp<<'\t'<<total<<'\t'<<average<<endl;
        p=p->pNext;//设置指针指向下一个结点
    }
    cout<<endl;
}

//根据姓名来查找学生信息
void List::search_by_name()
{
    string name;//姓名
    string stuID;//学号
    double english;//英语成绩
    double math;//数学成绩
    double cpp;//C++成绩
    double total;//总成绩
    double average;//平均成绩
    int flag=0;//用来标记是否找到对应的学生

    List *p=pHead;

    string na;
    cout<<"请输入你要查询的学生的姓名:";
    cin>>na;
    while(p!=NULL)
    {
        name=p->stu.get_name();
        if(name==na)
        {
            flag++;
            stuID=p->stu.get_stuID();
            p->stu.get_scores(&english,&math,&cpp,&total,&average);
            cout<<"\n该学生的信息如下:"<<endl<<endl;
            cout<<"姓名\t"<<"学号\t"<<"英语\t"<<"数学\t"<<"C++\t"<<"总分\t"<<"平均分\t"<<endl;
            cout<<fixed<<setprecision(2)<<name<<'\t'<<stuID<<'\t'<<english<<'\t'<<math<<'\t'<<cpp<<'\t'<<total<<'\t'<<average<<endl;
            break;
        }
        p=p->pNext;//设置指针指向下一个结点
    }
    if(flag==0)
        cout<<"没有找到该学生!"<<endl;
}
//根据学号来查找学生
void List::search_by_ID()
{
    string name;//姓名
    string stuID;//学号
    double english;//英语成绩
    double math;//数学成绩
    double cpp;//C++成绩
    double total;//总成绩
    double average;//平均成绩
    int flag=0;//用来标记是否找到对应的学生

    List *p=pHead;

    string ID;
    cout<<"请输入你要查询的学生的学号:";
    cin>>ID;
    while(p!=NULL)
    {
        stuID=p->stu.get_stuID();
        if(stuID==ID)
        {
            flag++;
            name=p->stu.get_name();
            cout<<"\n该学生的信息如下:"<<endl<<endl;
            p->stu.get_scores(&english,&math,&cpp,&total,&average);
            cout<<"姓名\t"<<"学号\t"<<"英语\t"<<"数学\t"<<"C++\t"<<"总分\t"<<"平均分\t"<<endl;
            cout<<fixed<<setprecision(2)<<name<<'\t'<<stuID<<'\t'<<english<<'\t'<<math<<'\t'<<cpp<<'\t'<<total<<'\t'<<average<<endl;
            break;
        }
        p=p->pNext;//设置指针指向下一个结点
    }
    if(flag==0)
        cout<<"没有找到该学生!"<<endl;
}

//根据C++成绩对学生进行降序排名
void List::sortCpp()
{
    double english;//英语成绩
    double math;//数学成绩
    double total;//总成绩
    double average;//平均成绩
    //C++成绩
    double cpp1;
    double cpp2;

    List *p;
    List *q;
    List temp;//临时的对象
    for(p=pHead;p->pNext!=NULL;p=p->pNext)
        for(q=p->pNext;q!=NULL;q=q->pNext)
    {
        p->stu.get_scores(&english,&math,&cpp1,&total,&average);
        q->stu.get_scores(&english,&math,&cpp2,&total,&average);
        if(cpp1<cpp2)
        {
            temp.stu=q->stu;
            q->stu=p->stu;
            p->stu=temp.stu;
        }
    }
}
//根据数学成绩对学生进行降序排名
void List::sortMath()
{
    double english;//英语成绩
    double cpp;//C++成绩
    double total;//总成绩
    double average;//平均成绩
    //数学成绩
    double math1;
    double math2;

    List *p;
    List *q;
    List temp;//临时的对象
    for(p=pHead;p->pNext!=NULL;p=p->pNext)
        for(q=p->pNext;q!=NULL;q=q->pNext)
    {
        p->stu.get_scores(&english,&math1,&cpp,&total,&average);
        q->stu.get_scores(&english,&math2,&cpp,&total,&average);
        if(math1<math2)
        {
            temp.stu=q->stu;
            q->stu=p->stu;
            p->stu=temp.stu;
        }
    }
}
//根据英语成绩对学生进行降序排名
void List::sortEnglish()
{
    double cpp;//C++成绩
    double math;//数学成绩
    double total;//总成绩
    double average;//平均成绩
    //英语成绩
    double english1;
    double english2;

    List *p;
    List *q;
    List temp;//临时的对象
    for(p=pHead;p->pNext!=NULL;p=p->pNext)
        for(q=p->pNext;q!=NULL;q=q->pNext)
    {
        p->stu.get_scores(&english1,&math,&cpp,&total,&average);
        q->stu.get_scores(&english2,&math,&cpp,&total,&average);
        if(english1<english2)
        {
            temp.stu=q->stu;
            q->stu=p->stu;
            p->stu=temp.stu;
        }
    }
}
//根据英语成绩对学生进行升序排名
void List::sortEnglish_s()
{
    double cpp;//C++成绩
    double math;//数学成绩
    double total;//总成绩
    double average;//平均成绩
    //英语成绩
    double english1;
    double english2;

    List *p;
    List *q;
    List temp;//临时的对象
    for(p=pHead;p->pNext!=NULL;p=p->pNext)
        for(q=p->pNext;q!=NULL;q=q->pNext)
    {
        p->stu.get_scores(&english1,&math,&cpp,&total,&average);
        q->stu.get_scores(&english2,&math,&cpp,&total,&average);
        if(english1>english2)
        {
            temp.stu=q->stu;
            q->stu=p->stu;
            p->stu=temp.stu;
        }
    }
}
//根据数学成绩对学生进行升序排名
void List::sortMath_s()
{
    double english;//英语成绩
    double cpp;//C++成绩
    double total;//总成绩
    double average;//平均成绩
    //数学成绩
    double math1;
    double math2;

    List *p;
    List *q;
    List temp;//临时的对象
    for(p=pHead;p->pNext!=NULL;p=p->pNext)
        for(q=p->pNext;q!=NULL;q=q->pNext)
    {
        p->stu.get_scores(&english,&math1,&cpp,&total,&average);
        q->stu.get_scores(&english,&math2,&cpp,&total,&average);
        if(math1>math2)
        {
            temp.stu=q->stu;
            q->stu=p->stu;
            p->stu=temp.stu;
        }
    }
}
//根据C++成绩对学生进行升序排名
void List::sortCpp_s()
{
    double english;//英语成绩
    double math;//数学成绩
    double total;//总成绩
    double average;//平均成绩
    //C++成绩
    double cpp1;
    double cpp2;

    List *p;
    List *q;
    List temp;//临时的对象
    for(p=pHead;p->pNext!=NULL;p=p->pNext)
        for(q=p->pNext;q!=NULL;q=q->pNext)
    {
        p->stu.get_scores(&english,&math,&cpp1,&total,&average);
        q->stu.get_scores(&english,&math,&cpp2,&total,&average);
        if(cpp1>cpp2)
        {
            temp.stu=q->stu;
            q->stu=p->stu;
            p->stu=temp.stu;
        }
    }
}
//根据总成绩对学生进行降序排名
void List::sortTotal()
{
    double english;//英语成绩
    double cpp;//C++成绩
    double math;//数学成绩
    double average;//平均成绩
    //总成绩
    double sum1;
    double sum2;

    List *p;
    List *q;
    List temp;//临时的对象
    for(p=pHead;p->pNext!=NULL;p=p->pNext)
        for(q=p->pNext;q!=NULL;q=q->pNext)
    {
        p->stu.get_scores(&english,&math,&cpp,&sum1,&average);
        q->stu.get_scores(&english,&math,&cpp,&sum2,&average);
        if(sum1<sum2)
        {
            temp.stu=q->stu;
            q->stu=p->stu;
            p->stu=temp.stu;
        }
    }
}

//根据英语成绩进行分段统计
void List::separate_by_english()
{
    //sortEnglish();//调用根据英语成绩排序函数

    string name;//姓名
    double english;//英语成绩
    double math;//数学成绩
    double cpp;//C++成绩
    double total;//总成绩
    double average;//平均成绩
    int t1=0,t2=0,t3=0,t4=0,t5=0;//用于统计各分数段的人数

    List *p=pHead;

    while(p!=NULL)
    {
        p->stu.get_scores(&english,&math,&cpp,&total,&average);
        if(english>=90&&english<=100)
            ++t1;
        else if(english>=80&&english<=89)
            ++t2;
        else if(english>=70&&english<=79)
            ++t3;
        else if(english>=60&&english<=69)
            ++t4;
        else
            ++t5;
        p=p->pNext;
    }
    cout<<"\n\t\t\t英语成绩分段统计表"<<endl<<endl;
    cout<<"\t\t分数段\t"<<"100-90\t"<<"89-80\t"<<"79-70\t"<<"69-60\t"<<"59-0\t"<<endl<<endl;
    cout<<"\t\t人数\t"<<t1<<'\t'<<t2<<'\t'<<t3<<'\t'<<t4<<'\t'<<t5<<endl<<endl;
}
//根据数学成绩进行分段统计
void List::separate_by_math()
{
    //sortEnglish();//调用根据英语成绩排序函数

    string name;//姓名
    double english;//英语成绩
    double math;//数学成绩
    double cpp;//C++成绩
    double total;//总成绩
    double average;//平均成绩
    int t1=0,t2=0,t3=0,t4=0,t5=0;//用于统计各分数段的人数

    List *p=pHead;

    while(p!=NULL)
    {
        p->stu.get_scores(&english,&math,&cpp,&total,&average);
        if(math>=90&&math<=100)
            ++t1;
        else if(math>=80&&math<=89)
            ++t2;
        else if(math>=70&&math<=79)
            ++t3;
        else if(math>=60&&math<=69)
            ++t4;
        else
            ++t5;
        p=p->pNext;
    }
    cout<<"\n\t\t\t数学成绩分段统计表"<<endl<<endl;
    cout<<"\t\t分数段\t"<<"100-90\t"<<"89-80\t"<<"79-70\t"<<"69-60\t"<<"59-0\t"<<endl<<endl;
    cout<<"\t\t人数\t"<<t1<<'\t'<<t2<<'\t'<<t3<<'\t'<<t4<<'\t'<<t5<<endl<<endl;
}
//根据C++成绩进行分段统计
void List::separate_by_cpp()
{
    //sortEnglish();//调用根据英语成绩排序函数

    string name;//姓名
    double english;//英语成绩
    double math;//数学成绩
    double cpp;//C++成绩
    double total;//总成绩
    double average;//平均成绩
    int t1=0,t2=0,t3=0,t4=0,t5=0;//用于统计各分数段的人数

    List *p=pHead;

    while(p!=NULL)
    {
        p->stu.get_scores(&english,&math,&cpp,&total,&average);
        if(cpp>=90&&cpp<=100)
            ++t1;
        else if(cpp>=80&&cpp<=89)
            ++t2;
        else if(cpp>=70&&cpp<=79)
            ++t3;
        else if(cpp>=60&&cpp<=69)
            ++t4;
        else
            ++t5;
        p=p->pNext;
    }
    cout<<"\n\t\t\tC++成绩分段统计表"<<endl<<endl;
    cout<<"\t\t分数段\t"<<"100-90\t"<<"89-80\t"<<"79-70\t"<<"69-60\t"<<"59-0\t"<<endl<<endl;
    cout<<"\t\t人数\t"<<t1<<'\t'<<t2<<'\t'<<t3<<'\t'<<t4<<'\t'<<t5<<endl<<endl;
}
//计算各学科的平均成绩
void List::count_subject_avg()
{

    double english;//英语成绩
    double math;//数学成绩
    double cpp;//C++成绩
    double total;//总成绩
    double average;//平均成绩

    double english_avg;//英语平均成绩
    double math_avg;//数学平均成绩
    double cpp_avg;//C++平均成绩
    int n=0;//用于记录学生人数
    double Esum=0,Msum=0,Csum=0;//用于计算各科目总分

    List *p=pHead;
    while(p!=NULL)
    {
        p->stu.get_scores(&english,&math,&cpp,&total,&average);
        Esum+=english;
        Msum+=math;
        Csum+=cpp;
        ++n;
        p=p->pNext;
    }
    english_avg=Esum/n;
    math_avg=Msum/n;
    cpp_avg=Csum/n;
    cout<<"各科目的平均成绩如下"<<endl;
    cout<<"英语\t"<<"数学\t"<<"C++\t"<<endl;
    cout<<english_avg<<'\t'<<math_avg<<'\t'<<cpp_avg<<endl;
}

//修改学生的信息
void List::modify_info()
{
    string name;//姓名
    string stuID;//学号
    double english;//英语成绩
    double math;//数学成绩
    double cpp;//C++成绩
    double total;//总成绩
    double average;//平均成绩

    List *p=pHead;

    char content[20];
    cout<<"请输入信息待修改学生的姓名或学号:";
    cin>>content;

    //根据输入来进行查找并修改
    if(content[0]>='0'&&content[0]<='9')
    {
        int flag=0;//标记是否找到对应学生;
        string ID=content;
        while(p!=NULL)
        {
            stuID=p->stu.get_stuID();
            if(stuID==ID)
            {
                flag++;
                name=p->stu.get_name();
                p->stu.get_scores(&english,&math,&cpp,&total,&average);
                cout<<"\n姓名\t"<<"学号\t"<<"英语\t"<<"数学\t"<<"C++\t"<<"总分\t"<<"平均分\t"<<endl;
                cout<<name<<'\t'<<stuID<<'\t'<<english<<'\t'<<math<<'\t'<<cpp<<'\t'<<total<<'\t'<<average<<endl<<endl;

                cout<<"请输入修改后的信息"<<endl;
                cout<<"姓名\t"<<"学号\t"<<"英语\t"<<"数学\t"<<"C++\t"<<endl;
                cin>>name>>stuID>>english>>math>>cpp;
                p->stu.set_name(name);//重新设置姓名
                p->stu.set_stuID(stuID);//重新设置学号
                p->stu.set_scores(english,math,cpp);//重新设置各科成绩

                p->stu.count_total();//重新计算总成绩
                p->stu.count_avg();//重新计算平均成绩

                break;
            }
            p=p->pNext;//设置指针指向下一个结点
        }
        if(flag==0)
            cout<<"没有找到该学生!"<<endl;
    }
    else
    {
        int flag=0;//标记是否找到对应学生;
        string na=content;//将字符串数组转化成string类型
        while(p!=NULL)
        {
            name=p->stu.get_name();
            if(name==na)
            {
                flag++;
                stuID=p->stu.get_stuID();
                p->stu.get_scores(&english,&math,&cpp,&total,&average);
                cout<<"姓名\t"<<"学号\t"<<"英语\t"<<"数学\t"<<"C++\t"<<"总分\t"<<"平均分\t"<<endl;
                cout<<name<<'\t'<<stuID<<'\t'<<english<<'\t'<<math<<'\t'<<cpp<<'\t'<<total<<'\t'<<average<<endl<<endl;

                cout<<"请输入修改后的信息"<<endl;
                cout<<"姓名\t"<<"学号\t"<<"英语\t"<<"数学\t"<<"C++\t"<<endl;
                cin>>name>>stuID>>english>>math>>cpp;

                p->stu.set_name(name);//重新设置姓名
                p->stu.set_stuID(stuID);//重新设置学号
                p->stu.set_scores(english,math,cpp);//重新设置各科成绩

                p->stu.count_total();//重新计算总成绩
                p->stu.count_avg();//重新计算平均成绩

                break;
            }
            p=p->pNext;//设置指针指向下一个结点
        }
        if(flag==0)
            cout<<"没有找到该学生!"<<endl;
    }
}
//删除学生信息
void List::delete_info()
{
    string name;//姓名
    string stuID;//学号
    double english;//英语成绩
    double math;//数学成绩
    double cpp;//C++成绩
    double total;//总成绩
    double average;//平均成绩
    //int n=0;//记录已遍历的学生的人数

    List *p=pHead;//指向当前结点的指针
    List *pf=NULL;//指向前一个结点的指针

    char content[20];
    cout<<"请输入信息待删除学生的姓名或学号:";
    cin>>content;

    //根据输入来进行查找并删除
    if(content[0]>='0'&&content[0]<='9')
    {
        int flag=0;//标记是否找到对应学生;
        string ID=content;
        char answer;//记录回答的内容

        while(p!=NULL)
        {
            //++n;
            stuID=p->stu.get_stuID();
            if(stuID==ID)
            {
                flag++;
                name=p->stu.get_name();
                p->stu.get_scores(&english,&math,&cpp,&total,&average);
                cout<<"姓名\t"<<"学号\t"<<"英语\t"<<"数学\t"<<"C++\t"<<"总分\t"<<"平均分\t"<<endl;
                cout<<name<<'\t'<<stuID<<'\t'<<english<<'\t'<<math<<'\t'<<cpp<<'\t'<<total<<'\t'<<average<<endl<<endl;

                cout<<"你确定要删除这组信息吗?(Y/N)";
                cin>>answer;
                if(tolower(answer)=='y')
                {
                    if(pf==NULL)
                    {
                        List *temp=p;//暂时保存指向该结点的指针
                        pHead=p->pNext;//跳过当前结点,实现信息的删除
                        delete temp;//将其所占内存删除
                    }
                    else
                    {
                        List *temp=p;//暂时保存指向该结点的指针
                        pf->pNext=p->pNext;//跳过当前结点,实现信息的删除
                        delete temp;//将其所占内存删除
                    }
                    cout<<"\t该组信息已删除!"<<endl;
                    break;
                }
                else
                {
                    break;
                }
            }
            pf=p;//保存当前指针
            p=p->pNext;//设置指针指向下一个结点
        }
        if(flag==0)
            cout<<"没有找到该学生!"<<endl;
    }
    else
    {
        int flag=0;//标记是否找到对应学生;
        string na=content;//将字符串数组转化成string类型
        char answer;//记录回答的内容

        while(p!=NULL)
        {
            //++n;
            name=p->stu.get_name();
            if(name==na)
            {
                flag++;
                stuID=p->stu.get_stuID();
                p->stu.get_scores(&english,&math,&cpp,&total,&average);
                cout<<"姓名\t"<<"学号\t"<<"英语\t"<<"数学\t"<<"C++\t"<<"总分\t"<<"平均分\t"<<endl;
                cout<<name<<'\t'<<stuID<<'\t'<<english<<'\t'<<math<<'\t'<<cpp<<'\t'<<total<<'\t'<<average<<endl<<endl;

                cout<<"你确定要删除这组信息吗?(Y/N)";
                cin>>answer;
                if(tolower(answer)=='y')
                {
                    if(pf==NULL)
                    {
                        List *temp=p;//暂时保存指向该结点的指针
                        pHead=p->pNext;//跳过当前结点,实现信息的删除
                        delete temp;//将其所占内存删除
                    }
                    else
                    {
                        List *temp=p;//暂时保存指向该结点的指针
                        pf->pNext=p->pNext;//跳过当前结点,实现信息的删除
                        delete temp;//将其所占内存删除
                    }

                    cout<<"\t该组信息已删除!"<<endl;
                    break;
                }
                else
                {
                    break;
                }
            }
            pf=p;//保存当前指针
            p=p->pNext;//设置指针指向下一个结点
        }
        if(flag==0)
            cout<<"没有找到该学生!"<<endl;
    }
}
//增加学生信息
void List::add_info()
{
    string name;//姓名
    string stuID;//学号
    int num;//编号
    double english;//英语成绩
    double math;//数学成绩
    double cpp;//C++成绩
    int location=0;//位置编号
    int flag=0;//标记是否有对应的编号

    List *p=pHead;//指向当前结点的指针
    List *pf=NULL;//指向前一个结点的指针
    cout<<"请输入你想增加的信息的位置(位置编号,大于0):";
    cin>>location;

    while(p!=NULL)//遍历链表
    {
        num=p->stu.get_num();
        if(num==location)
        {
            ++flag;

            cout<<"请输入新增学生的信息"<<endl;
            cout<<"姓名\t"<<"学号\t"<<"英语\t"<<"数学\t"<<"C++\t"<<endl;
            cin>>name>>stuID>>english>>math>>cpp;

            List *new_node=new List;//创建一个新的结点
            new_node->stu.set_name(name);
            new_node->stu.set_stuID(stuID);
            new_node->stu.set_scores(english,math,cpp);
            new_node->stu.count_total();//计算总成绩
            new_node->stu.count_avg();//计算平均成绩

            if(pf==NULL)
            {
                new_node->pNext=p;
                pHead=new_node;
                break;
            }
            else
            {
                new_node->pNext=p;
                pf->pNext=new_node;
                break;
            }
        }
        pf=p;
        p=p->pNext;
    }
    if(flag==0)
    {
        cout<<"请输入新增学生的信息"<<endl;
        cout<<"姓名\t"<<"学号\t"<<"英语\t"<<"数学\t"<<"C++\t"<<endl;
        cin>>name>>stuID>>english>>math>>cpp;

        List *new_node=new List;//创建一个新的结点
        new_node->stu.set_name(name);
        new_node->stu.set_stuID(stuID);
        new_node->stu.set_scores(english,math,cpp);
         new_node->stu.count_total();//计算总成绩
        new_node->stu.count_avg();//计算平均成绩

        pf->pNext=new_node;
        new_node->pNext=NULL;
    }
}

//保存链表至文件中
void List::save_list()
{
    string name;//姓名
    string stuID;//学号
    double english;//英语成绩
    double math;//数学成绩
    double cpp;//C++成绩
    double total;//总成绩
    double average;//平均成绩

    List *p=pHead;

    ofstream fout;
    fout.open("学生成绩.txt",ios::out);
    while(p!=NULL)
    {
        name=p->stu.get_name();
        stuID=p->stu.get_stuID();
        p->stu.get_scores(&english,&math,&cpp,&total,&average);
        fout<<name<<' '<<stuID<<' '<<english<<' '<<math<<' '<<cpp<<endl;

        p=p->pNext;
    }
    fout.close();
}
//销毁链表,释放内存空间
void List::delete_list()
{
    List *p=pHead;
    List *pt;
    while(p!=NULL)
    {
        pt=p;
        p=p->pNext;
        delete pt;
    }
    pt=NULL;
    pHead=NULL;
    p=NULL;
}

list.h

#ifndef __LIST_H__
#define __LIST_H__
#include<iostream>
#include"student.h"
class List
{
public:
    List(){};//构造函数
    ~List();//析构函数

public:
    //学生信息读取相关函数
    void input_info();//创建链表,并从文件读取学生的信息保存到链表中
    void output_info();//遍历链表,并打印学生的信息

    //学生信息查询相关函数
    void search_by_name();//通过姓名查找学生
    void search_by_ID();//通过学号查找学生

    //排序功能函数
    void sortEnglish();//根据英语成绩对学生进行降序排名
    void sortMath();//根据数学成绩对学生进行降序排名
    void sortCpp();//根据C++成绩对学生进行降序排名

    void sortEnglish_s();//根据英语成绩对学生进行升序排名
    void sortMath_s();//根据数学成绩对学生进行升序排名
    void sortCpp_s();//根据C++成绩对学生进行升序排名
    void sortTotal();//根据总成绩对学生进行降序排序

    //成绩统计功能相关函数
    void separate_by_english();//根据英语成绩进行分段统计
    void separate_by_math();//根据数学成绩进行分段统计
    void separate_by_cpp();//根据C++成绩进行分段统计
    void count_subject_avg();//计算各学科的平均成绩

    //学生信息维护功能函数
    void modify_info();//修改学生信息
    void delete_info();//删除学生信息
    void add_info();//增加学生信息

public:
    void save_list();//将列表保存至文件中
    void delete_list();//销毁链表,释放内存空间

private:
    Student stu;//学生数据体
    List *pHead;//头指针
    List *pNext;//指向下一组学生信息的指针
};
#endif

menu.cpp

//全部的菜单函数
#include<iostream>
using namespace std;
//主界面
void menu()
{
    cout<<"\n\n\t\t----------------学生成绩管理系统------------------"<<endl<<endl;
    cout<<"\t\t1、信息维护功能"<<"           "<<"\t2、信息查询功能"<<endl<<endl;
    cout<<"\t\t3、成绩统计功能"<<"           "<<"\t4、排序功能"<<endl<<endl;
    cout<<"\t\t5、退出"<<endl<<endl;
    return;
}

//信息维护功能界面
void menu1()
{
    cout<<"\n\n\t\t信息维护功能"<<endl<<endl;
    cout<<"\t\t1、增加学生信息"<<endl<<endl;
    cout<<"\t\t2、删除学生信息"<<endl<<endl;
    cout<<"\t\t3、修改学生信息"<<endl<<endl;
    cout<<"\t\t4、返回"<<endl<<endl;
    return;
}

//信息查询功能界面
void menu2()
{
    cout<<"\n\n\t\t信息查询功能"<<endl<<endl;
    cout<<"\t\t1、按姓名查询"<<endl<<endl;
    cout<<"\t\t2、按学号查询"<<endl<<endl;
    cout<<"\t\t3、返回"<<endl<<endl;
    return;
}

//成绩统计功能界面
void menu3()
{
    cout<<"\n\n\t\t成绩统计功能"<<endl<<endl;
    cout<<"\t\t1、根据课程名对成绩进行分段统计"<<endl<<endl;
    cout<<"\t\t2、各科目的平均成绩"<<endl<<endl;
    cout<<"\t\t3、返回"<<endl<<endl;
    return;
}

//排序功能界面
void menu4()
{
    cout<<"\n\n\t\t排序功能"<<endl<<endl;
    cout<<"\t\t1、降序"<<endl<<endl;
    cout<<"\t\t2、升序"<<endl<<endl;
    cout<<"\t\t3、返回"<<endl<<endl;
    return;
}

```
### student.h
```cpp
#ifndef __STUDENT_H__
#define __STUDENT_H__
#include<iostream>
#include<string>
#include<sstream>
using namespace std;
class Student
{
public:
    Student();
    //~Student();
public:
    void set_stuID(string ID);//设置学号
    void set_name(string na);//设置姓名
    void set_scores(double en,double m,double cp);//设置学生的各科成绩
    void set_num(int n);//设置学生编号

    void count_avg();//计算平均成绩
    void count_total();//计算总成绩

    void get_scores(double *en,double *m,double *cp,double *sum,double *avg);//得到学生的各科成绩(大英、高数、C++、总分、平均分)
    string get_stuID();//得到学生的学号
    string get_name();//得到学生的姓名
    int get_num();//得到学生的编号

private:
    string stuID;//学号
    string name;//姓名
    double english;//英语成绩
    double math;//数学成绩
    double cpp;//C++成绩
    double total;//总分
    double average;//平均成绩
    int num;//学生编号
};
#endif

```
### 完整代码去资源下载
![在这里插入图片描述](https://img-blog.csdnimg.cn/2021012719462627.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTIwNjIxOA==,size_16,color_FFFFFF,t_70)

## 运行截图
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210127194240709.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTIwNjIxOA==,size_16,color_FFFFFF,t_70)

  • 6
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

stevezhao6

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值