使用C++名单在文档处理和学生成绩管理系统相结合

对于学生成绩管理系统,我并不陌生,几乎学习C人的语言。做项目会想到学生成绩管理系统,我也不例外。在研究中的一段时间C语言之后,还用C语言到学生管理系统,然后做几个链接。计数,这个系统是以前的系统上的改进。件操作能够不用手动输入学生信息,能够直接从文件里读取学生信息,从而简化了操作

使用C语言实现学生成绩管理系统 http://blog.csdn.net/u010105970/article/details/17752193

使用链表实现学生成绩管理系统 http://blog.csdn.net/u010105970/article/details/25058379

使用C++实现学生成绩管理系统 http://blog.csdn.net/u010105970/article/details/27958237


程序模块


首先定义两个类Student类和Node类

Student类用于表示学生信息

class Student//学生类
{
public:
    Student();//构造函数
    void SetInfo(string N, int A);//设置学生的信息(设置姓名、年龄)
    void SetNo(int N);//设置学生的编号
    void SetScore(int C, int M, int E);//设置学生的成绩(C++、高数、英语)
    void CountTotal();//计算总分
    void CountAve();//计算平均分
    void SetS(int S);//设置序号(用于排名)
    void GetInfo(string *pN, int *pA);//得到学生的信息(得到姓名、年龄)
    int GetNo();//得到学生的编号

    //得到学生的分数(C++ 高数 英语 总分 平均分)
    void GetScore(int *pC, int *pM, int *pE, int *pT, int *pA);
    int GetS();//得到序号(用于排名)

private:
    int len;          //学生的人数
    string Name;     //姓名
    int Age;         //年龄
    int No;          //学号
    int Cpp;         //C++成绩
    int Math;       //高数成绩
    int English;    //英语成绩
    int Total;     //总分
    float Ave;      //平均分
    int Sort;     //排名
};


定义Student类中的成员函数

//构造函数
Student::Student()
{
    Sort = 0;
}


void Student::SetInfo(string N, int A)//设置学生的信息(设置姓名、年龄)
{
    Name = N;
    Age = A;
}


void Student::SetNo(int N)//设置学生的编号
{
    No = N;
}


void Student::SetScore(int C, int M, int E)//设置学生的成绩(C++、高数、英语)
{
    Cpp = C;
    Math = M;
    English = E;
}

void Student::CountTotal()//计算总分
{
    Total = Cpp + Math + English;
}


void Student::CountAve()//计算学生的平均分
{
    Ave = Total / 3;
}


void Student::SetS(int s)//设置序号(用于排名)
{
    Sort = s;
}


void Student::GetInfo(string *pN, int *pA)//得到学生的信息(得到姓名、年龄)
{
    *pN = Name;
    *pA = Age;
}


int Student::GetNo()//得到学生的编号
{
    return No;
}


//得到学生的分数(C++ 高数 英语 总分 平均分)
void Student::GetScore(int *pC, int *pM, int *pE, int *pT, int *pA)
{
    *pC = Cpp;//得到C++成绩
    *pM = Math;//得到数学成绩
    *pE = English;//得到英语成绩
    *pT = Total;//得到总分
    *pA = Ave;//得到平均分
}


int Student::GetS()//得到序号(用于排名)
{
    return Sort;
}

定义Node类用于处理学生信息

class Node//结点类
{
public:
    void InputStudent();//输入学生信息
    void OutputStudent();//输出学生信息
    Node* AddStudent();//添加学生信息
    bool DeleteStudent();//删除学生信息
    void ChangeStudent();//改动学生信息
    void SearchStudent();//查找学生信息
    void SortCpp();//将C++成绩依照从大到小排序
    void SortMath();//将高数成绩依照从大到小排序
    void SortEnglish();//将英语成绩依照从大到小排序
    void SortTotal();//将总分依照从大到小排序
    void SetScort();//设置排名
    void ChangeNo(Node *p);//改动学生的学号

private:
    Student st;//数据域
    Node *pNext;//指针域
    Node *pHead;//头结点
};
typedef Node NODE;
typedef Node* PNODE;
/*
NODE 相当于  Node
PNODE 相当于 Node*
*/


定义Node类的成员函数

//输入学生信息
void Node::InputStudent()
{
    //创建一个头结点
    pHead =  new NODE[sizeof(NODE)];

    if(NULL == pHead)
    {
        cout<<"动态内存分配失败,程序终止!"<<endl;

        exit(0);
    }

    PNODE pTail = pHead;//创建一个指向头结点的指针
    pTail->pNext = NULL;//初始化指针的指针域为NULL

    //将文件里的数据输入到程序中
    ifstream infile("score.dat", ios::in);

    if(!infile)
    {
        cout<<"文件打开失败,程序终止!"<<endl;

        exit(0);
    }

    int l;//人数
    string name;//姓名
    int age;//年龄
    int no;//学号
    int cpp;//C++成绩
    int math;//数学成绩
    int english;//英语成绩

    cout<<"请输入学生的人数:";
    cin>>l;


    for(int i=1; i<=l; i++)
    {
        //创建一个保存数据的新结点
        PNODE pNew = new NODE[sizeof(NODE)];

        if(NULL == pNew)
        {
            cout<<"动态内存分配失败,程序终止!"<<endl;

            exit(0);
        }

        //读取文件里的数据
        infile>>name>>age>>no>>cpp>>math>>english;

        //初始化结点
        //pNew->st.SetLen(l);//学生的人数
        pNew->st.SetInfo(name, age);//学生的姓名和年龄
        pNew->st.SetNo(no);//学生的编号
        pNew->st.SetScore(cpp, math, english);//设置学生的成绩(C++、高数、英语)
        pNew->st.CountTotal();//计算学生的总分
        pNew->st.CountAve();//计算学生的平均分

        pTail->pNext = pNew;//将pNew挂在老结点的后面
        pTail = pNew;//将指针pTail移到pNew上
        pTail->pNext = NULL;//清空指针域
    }

    //关闭文件
    infile.close();

    cout<<"已经成功的向程序中输入了"<<l<<"个学生的信息"<<endl;
}


//遍历链表
void Node::OutputStudent()
{
    PNODE p = pHead->pNext;

    cout<<"姓名	"<<"年龄	"<<"学号	"<<"C++	"<<"数学	"<<"英语	"<<"总分	"<<"平均分	"<<"排名"<<endl;

    string name;
    int age;
    int cpp;
    int math;
    int english;
    int total;
    int ave;

    //遍历学生信息
    while(NULL != p)
    {
        p->st.GetInfo(&name, &age);
        p->st.GetScore(&cpp, &math, &english, &total, &ave);

        cout<<name<<"	"<<age<<"	"<<p->st.GetNo()<<"	"<<cpp
        <<"	"<<math<<"	"<<english<<"	"<<total<<"	"<<ave<<"	"<<p->st.GetS()<<endl;

        p = p->pNext;
    }
}


PNODE Node::AddStudent(void)//添加学生信息
{
    PNODE p = pHead->pNext;
    Student st;//定义一个学生类
	int i = 1000;
	int pos;
    string name;//姓名
    int age;//年龄
    int no;//学号
    int cpp;//C++成绩
    int math;//数学成绩
    int english;//英语成绩

	cout<<"请输入一个学生的学号:";
	cin>>pos;

    cout<<"你将在学号为"<<pos<<"的学生后添加一个学生"<<endl;

    st.SetNo(pos+1);//设置须要加入的学生的学号

    cout<<"添加的学生的学号为"<<pos+1<<endl;
  
    cout<<"请输入学号为"<<st.GetNo()<<"的学生的姓名:";
    cin>>name;

    cout<<"请输入学号为"<<st.GetNo()<<"的学生的年龄:";
    cin>>age;

    cout<<"请输入学号为"<<st.GetNo()<<"的学生的C++成绩:";
    cin>>cpp;

     cout<<"请输入学号为"<<st.GetNo()<<"的学生的数学成绩:";
     cin>>math;
    
    cout<<"请输入学号为"<<st.GetNo()<<"的学生的英语成绩:";
    cin>>english;

	while(NULL != p && i<pos-1)
	{
		p = p->pNext;
		i++;
	}

	if(NULL == p || i>pos)
	{
        cout<<"程序错误!"<<endl;

        exit(1);
	}

	PNODE pt = new NODE[sizeof(NODE)];

	if(NULL == pt)
	{
		printf("动态内存分配失败,程序终止!
");
		exit(-1);
	}

    //初始化结点
    pt->st.SetInfo(name, age);//学生的姓名和年龄
    pt->st.SetNo(pos+1);//学生的学号
    pt->st.SetScore(cpp, math, english);//设置学生的成绩(C++、高数、英语)
    pt->st.CountTotal();//计算学生的总分
    pt->st.CountAve();//计算学生的平均分

    PNODE q = p->pNext;
	p->pNext = pt;
	pt->pNext = q;

    return p->pNext;
}


bool Node::DeleteStudent()//删除学生信息
{
 	int i = 1000;
	int pos;
	PNODE p = pHead;

	cout<<"请输入要删除的学生的学号:";
	cin>>pos;

    cout<<"
删除学号为"<<pos<<"后的学生信息:"<<endl;

	while(NULL != p && i<pos-1)
	{
		p = p->pNext;
		i++;
	}

	if(NULL == p || i>pos)
	{
		return true;
	}

	PNODE q = p->pNext;

	p->pNext = p->pNext->pNext;

	delete []q;

    return true;
}


void Node::ChangeStudent()//改动学生信息
{
    PNODE p = pHead->pNext;

    string name;//姓名
    int age;//年龄
    int no;//学号
    int cpp;//C++成绩
    int math;//数学成绩
    int english;//英语成绩
    int total;//总分
    int ave;//平均分

    int flag = 0;//标识符,初始化表示没找到

    cout<<"请输入你须要改动的学生的姓名:";
    cin>>name;

    string nm;//姓名

    //遍历学生信息
    while(NULL != p)
    {
        //得到学生的姓名和年龄
        p->st.GetInfo(&nm, &age);
        p->st.GetScore(&cpp, &math, &english, &total, &ave);

        if(name == nm)
        {
            flag = 1;

            cout<<"
改动前的学生信息:"<<endl;

            cout<<"姓名	"<<"年龄	"<<"学号	"<<"C++	"<<"数学	"<<"英语	"<<"总分	"<<"平均分	"<<"排名"<<endl;

            cout<<nm<<"	"<<age<<"	"<<p->st.GetNo()<<"	"<<cpp
            <<"	"<<math<<"	"<<english<<"	"<<total<<"	"<<ave<<endl;
        
            break;
        }

        p = p->pNext;
    }

    if(0 == flag)
    {
        cout<<"没找到你须要改动的学生信息!
"<<endl;

        return;
    }

    cout<<"
你将改动学号为"<<p->st.GetNo()<<"的学生信息"<<endl;

    no = p->st.GetNo();//得到学生的学号

    cout<<"请输入学号为"<<p->st.GetNo()<<"的学生的姓名:";
    cin>>name;

    cout<<"请输入学号为"<<p->st.GetNo()<<"的学生的年龄:";
    cin>>age;

    cout<<"请输入学号为"<<p->st.GetNo()<<"的学生的C++成绩:";
    cin>>cpp;

     cout<<"请输入学号为"<<p->st.GetNo()<<"的学生的数学成绩:";
     cin>>math;
    
    cout<<"请输入学号为"<<p->st.GetNo()<<"的学生的英语成绩:";
    cin>>english;
    
    //初始化结点
    p->st.SetInfo(name, age);//学生的姓名和年龄
    p->st.SetNo(no);//学生的编号
    p->st.SetScore(cpp, math, english);//设置学生的成绩(C++、高数、英语)
    p->st.CountTotal();//计算学生的总分
    p->st.CountAve();//计算学生的平均分

    cout<<"
改动后的学生信息:"<<endl;
    cout<<"姓名	"<<"年龄	"<<"学号	"<<"C++	"<<"数学	"<<"英语	"<<"总分	"<<"平均分	"<<"排名"<<endl;

    //得到学生的姓名和年龄吧
    p->st.GetInfo(&name, &age);

    //得到学生的成绩
    p->st.GetScore(&cpp, &math, &english, &total, &ave);
    
    cout<<name<<"	"<<age<<"	"<<p->st.GetNo()<<"	"<<cpp
   <<"	"<<math<<"	"<<english<<"	"<<total<<"	"<<ave<<endl;
}


void Node::SearchStudent()//查找学生信息
{
    PNODE p = pHead->pNext;

    string name;//姓名

    int flag = 0;//标识符,初始化表示没找到

    cout<<"请输入你须要查找的学生的姓名:";
    cin>>name;

    cout<<"姓名	"<<"年龄	"<<"学号	"<<"C++	"<<"数学	"<<"英语	"<<"总分	"<<"平均分	"<<"排名"<<endl;

    string nm;//姓名
    int age;//年龄
    int no;//学号
    int cpp;//C++成绩
    int math;//数学成绩
    int english;//英语成绩
    int total;//总分
    int ave;//平均分

    //遍历学生信息
    while(NULL != p)
    {
        //得到学生的姓名和年龄
        p->st.GetInfo(&nm, &age);

        //得到学生的成绩
        p->st.GetScore(&cpp, &math, &english, &total, &ave);

        if(name == nm)
        {
            flag = 1;

             cout<<name<<"	"<<age<<"	"<<p->st.GetNo()<<"	"<<cpp
            <<"	"<<math<<"	"<<english<<"	"<<total<<"	"<<ave<<endl;
            
             break;//退出循环
        }

        p = p->pNext;
    }

    if(0 == flag)
    {
        cout<<"没找到你须要的学生信息!"<<endl;
    }
}


void Node::SortCpp()//将C++成绩依照从大到小排序
{
    PNODE p, q;//定义两个指针
    
	
	NODE temp;//定义一个暂时结点

    int cpp1, cpp2;//C++成绩
    int math1, math2;//数学成绩
    int english1, english2;//英语成绩
    int total1, total2;//总分
    int ave1, ave2;//平均分

	for(p = pHead->pNext; NULL != p; p = p->pNext)
	{
		for(q = p->pNext; NULL != q; q = q->pNext)
		{
            p->st.GetScore(&cpp1, &math1, &english1, &total1, &ave1);
            q->st.GetScore(&cpp2, &math2, &english2, &total2, &ave2);

			if(cpp1 < cpp2)//当前一个学生的C++成绩小于后一个学生的C++成绩时
			{
				temp.st  = p->st;//交换学生的位置
				p->st =  q->st;
				q->st = temp.st;
			}
		}
	}
}


void Node::SortMath()//将高数成绩依照从大到小排序
{
     PNODE p, q;//定义两个指针
	
	NODE temp;//定义一个暂时结点

    int cpp1, cpp2;//C++成绩
    int math1, math2;//数学成绩
    int english1, english2;//英语成绩
    int total1, total2;//总分
    int ave1, ave2;//平均分

    for(p = pHead->pNext; NULL != p; p = p->pNext)
    {
        for(q = p->pNext; NULL != q; q = q->pNext)
        {
            p->st.GetScore(&cpp1, &math1, &english1, &total1, &ave1);
            q->st.GetScore(&cpp2, &math2, &english2, &total2, &ave2);
            
            if(math1 < math2)//当前一个学生的高数成绩小于后一个学生的高数成绩时
            {
                temp.st  = p->st;//交换学生的位置(交换结点中的数据域)
                p->st = q->st;
                q->st = temp.st;
            }
        }
    }
}


void Node::SortEnglish()//将英语成绩依照从大到小排序
{
    PNODE p, q;//定义两个指针
     
    NODE temp;//定义一个暂时结点
     
    int cpp1, cpp2;//C++成绩
    int math1, math2;//数学成绩
    int english1, english2;//英语成绩
    int total1, total2;//总分
    int ave1, ave2;//平均分
    
    for(p = pHead->pNext; NULL != p; p = p->pNext)
    {
        for(q = p->pNext; NULL != q; q = q->pNext)
        {
            p->st.GetScore(&cpp1, &math1, &english1, &total1, &ave1);
            q->st.GetScore(&cpp2, &math2, &english2, &total2, &ave2);
            
            if(english1 < english2)//当前一个学生的英语成绩小于后一个学生的英语成绩时
            {
                temp.st  = p->st;//交换学生的位置(交换结点中的数据域)
                p->st = q->st;
                q->st = temp.st;
            }
        }
    }
}


void Node::SortTotal()//将总分依照从大到小排序
{
    PNODE p, q;//定义两个指针
	
	NODE temp;//定义一个暂时结点

    int cpp1, cpp2;//C++成绩
    int math1, math2;//数学成绩
    int english1, english2;//英语成绩
    int total1, total2;//总分
    int ave1, ave2;//平均分
    
    for(p = pHead->pNext; NULL != p; p = p->pNext)
    {
        for(q = p->pNext; NULL != q; q = q->pNext)
        {
            p->st.GetScore(&cpp1, &math1, &english1, &total1, &ave1);
            q->st.GetScore(&cpp2, &math2, &english2, &total2, &ave2);
            
            if(total1 < total2)//当前一个学生的总分小于后一个学生的总分时
            {
                temp.st  = p->st;//交换学生的位置(交换结点中的数据域)
                p->st = q->st;
                q->st = temp.st;
            }
        }
    }
}


void Node::SetScort()//设置排名
{
    PNODE p;//定义一个指向结点的指针
    int i;//保存排名

    //给学生的排名赋值
    for(p=pHead->pNext, i=1; NULL !=p; p=p->pNext, i++)
    {
        p->st.SetS(i);
    }
}


//改动学生的学号
void Node::ChangeNo(PNODE p)
{
    int i = p->st.GetNo();//提供改动的数据

    //遍历学生信息
    while(NULL != p)
    {
        p->st.SetNo(i);

        i++;

        p = p->pNext;
    }
}


程序的所有代码

#include <iostream>
#include <cstdlib>
#include <string>
#include <fstream>

using namespace std;

class Student//学生类
{
public:
    Student();//构造函数
    void SetInfo(string N, int A);//设置学生的信息(设置姓名、年龄)
    void SetNo(int N);//设置学生的编号
    void SetScore(int C, int M, int E);//设置学生的成绩(C++、高数、英语)
    void CountTotal();//计算总分
    void CountAve();//计算平均分
    void SetS(int S);//设置序号(用于排名)
    void GetInfo(string *pN, int *pA);//得到学生的信息(得到姓名、年龄)
    int GetNo();//得到学生的编号

    //得到学生的分数(C++ 高数 英语 总分 平均分)
    void GetScore(int *pC, int *pM, int *pE, int *pT, int *pA);
    int GetS();//得到序号(用于排名)

private:
    int len;          //学生的人数
    string Name;     //姓名
    int Age;         //年龄
    int No;          //学号
    int Cpp;         //C++成绩
    int Math;       //高数成绩
    int English;    //英语成绩
    int Total;     //总分
    float Ave;      //平均分
    int Sort;     //排名
};


//构造函数
Student::Student()
{
    Sort = 0;
}


void Student::SetInfo(string N, int A)//设置学生的信息(设置姓名、年龄)
{
    Name = N;
    Age = A;
}


void Student::SetNo(int N)//设置学生的编号
{
    No = N;
}


void Student::SetScore(int C, int M, int E)//设置学生的成绩(C++、高数、英语)
{
    Cpp = C;
    Math = M;
    English = E;
}

void Student::CountTotal()//计算总分
{
    Total = Cpp + Math + English;
}


void Student::CountAve()//计算学生的平均分
{
    Ave = Total / 3;
}


void Student::SetS(int s)//设置序号(用于排名)
{
    Sort = s;
}


void Student::GetInfo(string *pN, int *pA)//得到学生的信息(得到姓名、年龄)
{
    *pN = Name;
    *pA = Age;
}


int Student::GetNo()//得到学生的编号
{
    return No;
}


//得到学生的分数(C++ 高数 英语 总分 平均分)
void Student::GetScore(int *pC, int *pM, int *pE, int *pT, int *pA)
{
    *pC = Cpp;//得到C++成绩
    *pM = Math;//得到数学成绩
    *pE = English;//得到英语成绩
    *pT = Total;//得到总分
    *pA = Ave;//得到平均分
}


int Student::GetS()//得到序号(用于排名)
{
    return Sort;
}


class Node//结点类
{
public:
    void InputStudent();//输入学生信息
    void OutputStudent();//输出学生信息
    Node* AddStudent();//添加学生信息
    bool DeleteStudent();//删除学生信息
    void ChangeStudent();//改动学生信息
    void SearchStudent();//查找学生信息
    void SortCpp();//将C++成绩依照从大到小排序
    void SortMath();//将高数成绩依照从大到小排序
    void SortEnglish();//将英语成绩依照从大到小排序
    void SortTotal();//将总分依照从大到小排序
    void SetScort();//设置排名
    void ChangeNo(Node *p);//改动学生的学号

private:
    Student st;//数据域
    Node *pNext;//指针域
    Node *pHead;//头结点
};
typedef Node NODE;
typedef Node* PNODE;
/*
NODE 相当于  Node
PNODE 相当于 Node*
*/


//输入学生信息
void Node::InputStudent()
{
    //创建一个头结点
    pHead =  new NODE[sizeof(NODE)];

    if(NULL == pHead)
    {
        cout<<"动态内存分配失败,程序终止!"<<endl;

        exit(0);
    }

    PNODE pTail = pHead;//创建一个指向头结点的指针
    pTail->pNext = NULL;//初始化指针的指针域为NULL

    //将文件里的数据输入到程序中
    ifstream infile("score.dat", ios::in);

    if(!infile)
    {
        cout<<"文件打开失败,程序终止!"<<endl;

        exit(0);
    }

    int l;//人数
    string name;//姓名
    int age;//年龄
    int no;//学号
    int cpp;//C++成绩
    int math;//数学成绩
    int english;//英语成绩

    cout<<"请输入学生的人数:";
    cin>>l;


    for(int i=1; i<=l; i++)
    {
        //创建一个保存数据的新结点
        PNODE pNew = new NODE[sizeof(NODE)];

        if(NULL == pNew)
        {
            cout<<"动态内存分配失败,程序终止!"<<endl;

            exit(0);
        }

        //读取文件里的数据
        infile>>name>>age>>no>>cpp>>math>>english;

        //初始化结点
        //pNew->st.SetLen(l);//学生的人数
        pNew->st.SetInfo(name, age);//学生的姓名和年龄
        pNew->st.SetNo(no);//学生的编号
        pNew->st.SetScore(cpp, math, english);//设置学生的成绩(C++、高数、英语)
        pNew->st.CountTotal();//计算学生的总分
        pNew->st.CountAve();//计算学生的平均分

        pTail->pNext = pNew;//将pNew挂在老结点的后面
        pTail = pNew;//将指针pTail移到pNew上
        pTail->pNext = NULL;//清空指针域
    }

    //关闭文件
    infile.close();

    cout<<"已经成功的向程序中输入了"<<l<<"个学生的信息"<<endl;
}


//遍历链表
void Node::OutputStudent()
{
    PNODE p = pHead->pNext;

    cout<<"姓名	"<<"年龄	"<<"学号	"<<"C++	"<<"数学	"<<"英语	"<<"总分	"<<"平均分	"<<"排名"<<endl;

    string name;
    int age;
    int cpp;
    int math;
    int english;
    int total;
    int ave;

    //遍历学生信息
    while(NULL != p)
    {
        p->st.GetInfo(&name, &age);
        p->st.GetScore(&cpp, &math, &english, &total, &ave);

        cout<<name<<"	"<<age<<"	"<<p->st.GetNo()<<"	"<<cpp
        <<"	"<<math<<"	"<<english<<"	"<<total<<"	"<<ave<<"	"<<p->st.GetS()<<endl;

        p = p->pNext;
    }
}


PNODE Node::AddStudent(void)//添加学生信息
{
    PNODE p = pHead->pNext;
    Student st;//定义一个学生类
	int i = 1000;
	int pos;
    string name;//姓名
    int age;//年龄
    int no;//学号
    int cpp;//C++成绩
    int math;//数学成绩
    int english;//英语成绩

	cout<<"请输入一个学生的学号:";
	cin>>pos;

    cout<<"你将在学号为"<<pos<<"的学生后添加一个学生"<<endl;

    st.SetNo(pos+1);//设置须要加入的学生的学号

    cout<<"添加的学生的学号为"<<pos+1<<endl;
  
    cout<<"请输入学号为"<<st.GetNo()<<"的学生的姓名:";
    cin>>name;

    cout<<"请输入学号为"<<st.GetNo()<<"的学生的年龄:";
    cin>>age;

    cout<<"请输入学号为"<<st.GetNo()<<"的学生的C++成绩:";
    cin>>cpp;

     cout<<"请输入学号为"<<st.GetNo()<<"的学生的数学成绩:";
     cin>>math;
    
    cout<<"请输入学号为"<<st.GetNo()<<"的学生的英语成绩:";
    cin>>english;

	while(NULL != p && i<pos-1)
	{
		p = p->pNext;
		i++;
	}

	if(NULL == p || i>pos)
	{
        cout<<"程序错误!"<<endl;

        exit(1);
	}

	PNODE pt = new NODE[sizeof(NODE)];

	if(NULL == pt)
	{
		printf("动态内存分配失败,程序终止!
");
		exit(-1);
	}

    //初始化结点
    pt->st.SetInfo(name, age);//学生的姓名和年龄
    pt->st.SetNo(pos+1);//学生的学号
    pt->st.SetScore(cpp, math, english);//设置学生的成绩(C++、高数、英语)
    pt->st.CountTotal();//计算学生的总分
    pt->st.CountAve();//计算学生的平均分

    PNODE q = p->pNext;
	p->pNext = pt;
	pt->pNext = q;

    return p->pNext;
}


bool Node::DeleteStudent()//删除学生信息
{
 	int i = 1000;
	int pos;
	PNODE p = pHead;

	cout<<"请输入要删除的学生的学号:";
	cin>>pos;

    cout<<"
删除学号为"<<pos<<"后的学生信息:"<<endl;

	while(NULL != p && i<pos-1)
	{
		p = p->pNext;
		i++;
	}

	if(NULL == p || i>pos)
	{
		return true;
	}

	PNODE q = p->pNext;

	p->pNext = p->pNext->pNext;

	delete []q;

    return true;
}


void Node::ChangeStudent()//改动学生信息
{
    PNODE p = pHead->pNext;

    string name;//姓名
    int age;//年龄
    int no;//学号
    int cpp;//C++成绩
    int math;//数学成绩
    int english;//英语成绩
    int total;//总分
    int ave;//平均分

    int flag = 0;//标识符,初始化表示没找到

    cout<<"请输入你须要改动的学生的姓名:";
    cin>>name;

    string nm;//姓名

    //遍历学生信息
    while(NULL != p)
    {
        //得到学生的姓名和年龄
        p->st.GetInfo(&nm, &age);
        p->st.GetScore(&cpp, &math, &english, &total, &ave);

        if(name == nm)
        {
            flag = 1;

            cout<<"
改动前的学生信息:"<<endl;

            cout<<"姓名	"<<"年龄	"<<"学号	"<<"C++	"<<"数学	"<<"英语	"<<"总分	"<<"平均分	"<<"排名"<<endl;

            cout<<nm<<"	"<<age<<"	"<<p->st.GetNo()<<"	"<<cpp
            <<"	"<<math<<"	"<<english<<"	"<<total<<"	"<<ave<<endl;
        
            break;
        }

        p = p->pNext;
    }

    if(0 == flag)
    {
        cout<<"没找到你须要改动的学生信息!
"<<endl;

        return;
    }

    cout<<"
你将改动学号为"<<p->st.GetNo()<<"的学生信息"<<endl;

    no = p->st.GetNo();//得到学生的学号

    cout<<"请输入学号为"<<p->st.GetNo()<<"的学生的姓名:";
    cin>>name;

    cout<<"请输入学号为"<<p->st.GetNo()<<"的学生的年龄:";
    cin>>age;

    cout<<"请输入学号为"<<p->st.GetNo()<<"的学生的C++成绩:";
    cin>>cpp;

     cout<<"请输入学号为"<<p->st.GetNo()<<"的学生的数学成绩:";
     cin>>math;
    
    cout<<"请输入学号为"<<p->st.GetNo()<<"的学生的英语成绩:";
    cin>>english;
    
    //初始化结点
    p->st.SetInfo(name, age);//学生的姓名和年龄
    p->st.SetNo(no);//学生的编号
    p->st.SetScore(cpp, math, english);//设置学生的成绩(C++、高数、英语)
    p->st.CountTotal();//计算学生的总分
    p->st.CountAve();//计算学生的平均分

    cout<<"
改动后的学生信息:"<<endl;
    cout<<"姓名	"<<"年龄	"<<"学号	"<<"C++	"<<"数学	"<<"英语	"<<"总分	"<<"平均分	"<<"排名"<<endl;

    //得到学生的姓名和年龄吧
    p->st.GetInfo(&name, &age);

    //得到学生的成绩
    p->st.GetScore(&cpp, &math, &english, &total, &ave);
    
    cout<<name<<"	"<<age<<"	"<<p->st.GetNo()<<"	"<<cpp
   <<"	"<<math<<"	"<<english<<"	"<<total<<"	"<<ave<<endl;
}


void Node::SearchStudent()//查找学生信息
{
    PNODE p = pHead->pNext;

    string name;//姓名

    int flag = 0;//标识符,初始化表示没找到

    cout<<"请输入你须要查找的学生的姓名:";
    cin>>name;

    cout<<"姓名	"<<"年龄	"<<"学号	"<<"C++	"<<"数学	"<<"英语	"<<"总分	"<<"平均分	"<<"排名"<<endl;

    string nm;//姓名
    int age;//年龄
    int no;//学号
    int cpp;//C++成绩
    int math;//数学成绩
    int english;//英语成绩
    int total;//总分
    int ave;//平均分

    //遍历学生信息
    while(NULL != p)
    {
        //得到学生的姓名和年龄
        p->st.GetInfo(&nm, &age);

        //得到学生的成绩
        p->st.GetScore(&cpp, &math, &english, &total, &ave);

        if(name == nm)
        {
            flag = 1;

             cout<<name<<"	"<<age<<"	"<<p->st.GetNo()<<"	"<<cpp
            <<"	"<<math<<"	"<<english<<"	"<<total<<"	"<<ave<<endl;
            
             break;//退出循环
        }

        p = p->pNext;
    }

    if(0 == flag)
    {
        cout<<"没找到你须要的学生信息!"<<endl;
    }
}


void Node::SortCpp()//将C++成绩依照从大到小排序
{
    PNODE p, q;//定义两个指针
    
	
	NODE temp;//定义一个暂时结点

    int cpp1, cpp2;//C++成绩
    int math1, math2;//数学成绩
    int english1, english2;//英语成绩
    int total1, total2;//总分
    int ave1, ave2;//平均分

	for(p = pHead->pNext; NULL != p; p = p->pNext)
	{
		for(q = p->pNext; NULL != q; q = q->pNext)
		{
            p->st.GetScore(&cpp1, &math1, &english1, &total1, &ave1);
            q->st.GetScore(&cpp2, &math2, &english2, &total2, &ave2);

			if(cpp1 < cpp2)//当前一个学生的C++成绩小于后一个学生的C++成绩时
			{
				temp.st  = p->st;//交换学生的位置
				p->st =  q->st;
				q->st = temp.st;
			}
		}
	}
}


void Node::SortMath()//将高数成绩依照从大到小排序
{
     PNODE p, q;//定义两个指针
	
	NODE temp;//定义一个暂时结点

    int cpp1, cpp2;//C++成绩
    int math1, math2;//数学成绩
    int english1, english2;//英语成绩
    int total1, total2;//总分
    int ave1, ave2;//平均分

    for(p = pHead->pNext; NULL != p; p = p->pNext)
    {
        for(q = p->pNext; NULL != q; q = q->pNext)
        {
            p->st.GetScore(&cpp1, &math1, &english1, &total1, &ave1);
            q->st.GetScore(&cpp2, &math2, &english2, &total2, &ave2);
            
            if(math1 < math2)//当前一个学生的高数成绩小于后一个学生的高数成绩时
            {
                temp.st  = p->st;//交换学生的位置(交换结点中的数据域)
                p->st = q->st;
                q->st = temp.st;
            }
        }
    }
}


void Node::SortEnglish()//将英语成绩依照从大到小排序
{
    PNODE p, q;//定义两个指针
     
    NODE temp;//定义一个暂时结点
     
    int cpp1, cpp2;//C++成绩
    int math1, math2;//数学成绩
    int english1, english2;//英语成绩
    int total1, total2;//总分
    int ave1, ave2;//平均分
    
    for(p = pHead->pNext; NULL != p; p = p->pNext)
    {
        for(q = p->pNext; NULL != q; q = q->pNext)
        {
            p->st.GetScore(&cpp1, &math1, &english1, &total1, &ave1);
            q->st.GetScore(&cpp2, &math2, &english2, &total2, &ave2);
            
            if(english1 < english2)//当前一个学生的英语成绩小于后一个学生的英语成绩时
            {
                temp.st  = p->st;//交换学生的位置(交换结点中的数据域)
                p->st = q->st;
                q->st = temp.st;
            }
        }
    }
}


void Node::SortTotal()//将总分依照从大到小排序
{
    PNODE p, q;//定义两个指针
	
	NODE temp;//定义一个暂时结点

    int cpp1, cpp2;//C++成绩
    int math1, math2;//数学成绩
    int english1, english2;//英语成绩
    int total1, total2;//总分
    int ave1, ave2;//平均分
    
    for(p = pHead->pNext; NULL != p; p = p->pNext)
    {
        for(q = p->pNext; NULL != q; q = q->pNext)
        {
            p->st.GetScore(&cpp1, &math1, &english1, &total1, &ave1);
            q->st.GetScore(&cpp2, &math2, &english2, &total2, &ave2);
            
            if(total1 < total2)//当前一个学生的总分小于后一个学生的总分时
            {
                temp.st  = p->st;//交换学生的位置(交换结点中的数据域)
                p->st = q->st;
                q->st = temp.st;
            }
        }
    }
}


void Node::SetScort()//设置排名
{
    PNODE p;//定义一个指向结点的指针
    int i;//保存排名

    //给学生的排名赋值
    for(p=pHead->pNext, i=1; NULL !=p; p=p->pNext, i++)
    {
        p->st.SetS(i);
    }
}


//改动学生的学号
void Node::ChangeNo(PNODE p)
{
    int i = p->st.GetNo();//提供改动的数据

    //遍历学生信息
    while(NULL != p)
    {
        p->st.SetNo(i);

        i++;

        p = p->pNext;
    }
}


void main()
{

    cout<<"================================================================================
"<<endl;  
    cout<<"================================================================================
"<<endl;  
    cout<<"*************************欢迎使用学生成绩管理系统*******************************
"<<endl;  
    cout<<"-----------------------------------------------------------------制作人:梅沙小子
"<<endl;  
    cout<<"********************************************************************************
"<<endl;  
    cout<<"================================================================================
"<<endl;  
    
    cout<<"请按随意将进入学生管理系统:";  
    getchar();  
    system("cls");  
  
    cout<<"===============================================================================

";  
    cout<<"------------------------ 请选择要操作的命令:----------------------------------

";  
    cout<<"-------------------------- 1 输入学生信息--------------------------------------

";  
    cout<<"-------------------------- 2 输出学生信息--------------------------------------

";  
    cout<<"-------------------------- 3 添加学生信息--------------------------------------

";
    cout<<"-------------------------- 4 删除学生信息--------------------------------------

";  
    cout<<"-------------------------- 5 改动学生信息--------------------------------------

";  
    cout<<"-------------------------- 6 查找学生信息--------------------------------------

";  
    cout<<"-------------------------- 7 将学生的C++成绩按从大到小排----------------------

";  
    cout<<"-------------------------- 8 将学生的高数成绩按从大到小排----------------------

";  
    cout<<"-------------------------- 9 将学生的英语成绩按从大到小排----------------------

";  
    cout<<"--------------------------10 将学生的总成绩按从大到小排------------------------

";  
    cout<<"===============================================================================

";  
    
    int Item;//操作命令

     NODE pHead;//定义一个结点

    while(1)  
   {  
        cout<<"
请选择操作命令:";  
        cin>>Item;  
        system("cls");//清屏  
  
       switch(Item)  
        {  
            case 1://输入学生信息  
            {  
                //创建链表
                pHead.InputStudent();
            }  
            break;  
  
            case 2://输出学生信息  
            {  
              //遍历链表
                pHead.OutputStudent();
            }  
            break;  
            
            case 3://添加学生信息  
           {
               PNODE q;
               q = pHead.AddStudent();
               pHead.ChangeNo(q);//改动学号8
           }  
            break;  
  
            case 4://删除学生信息  
            {  
                pHead.DeleteStudent();
                pHead.OutputStudent();
            }  
            break;  
  
            case 5://改动学生信息  
            {  
                pHead.ChangeStudent();
            }              
            break;  

             case 6://查找学生信息  
            {  
                pHead.SearchStudent();
            }              
            break;  
 
 
            case 7://对学生的C++成绩排序  
            {  
                pHead.SortCpp();//C++排序
                cout<<"C++成绩排序后的结果:"<<endl;
                pHead.SetScort();//设置排名
                pHead.OutputStudent();//打印排序后的结果
            }  
            break;  
  
            case 8://对学生的高数成绩排序  
            {  
                pHead.SortMath();//高数排序
                cout<<"高数成绩排序后的结果:"<<endl;
                pHead.SetScort();//设置排名
                pHead.OutputStudent();//打印排序后的结果
            }  
            break;  
  
            case 9://对学生的英语成绩排序  
            {  
                pHead.SortEnglish();//英语排序
                cout<<"英语成绩排序后的结果:"<<endl;
                pHead.SetScort();//设置排名
                pHead.OutputStudent();//打印排序后的结果
            }  
            break;  
  
            case 10://对学生的总分排序  
            {  
                pHead.SortTotal();//总分排序
                cout<<"总分排序后的结果:"<<endl;
                pHead.SetScort();//设置排序
                pHead.OutputStudent();//打印排序后的结果
            }  
            break;  
            default:  
            break;  
        }  
    }  

    system("pause");
}



測试程序:

特别说明在測试前应在project文件夹或者程序文件夹下放一个score.dat文件以实现文件操作(程序执行时会从score.dat文件里读取学生信息到程序中)

score.dat的下载地址  http://download.csdn.net/detail/u010105970/7841327

score.dat中的部分学生信息


程序主界面


功能选择界面


输入学生信息:从score.dat文件里读取10个学生的信息到程序中


显示学生信息:显示读取到程序中的10个学生的信息


在学号为1009的学生后添加一个学生信息 

学生信息为  姓名:张三    年龄:20   C++成绩:78     高数成绩:89    英语成绩:89  

由于是在学号为1009的学生后添加的学生信息,  所以新增的学生的学号系统会自己主动将其设置为1010,曾经的学号为

1010的学生的学号会自己主动变为1011


加入后的效果:


删除学生信息:删除学号为1010的学生的学生信息


改动学生信息:改动姓名为贺祺的学生信息


查看改动后的学生信息:


对学生的C++成绩排序:


对学生的高数成绩排序


对学生的英语成绩排序

学生成绩排序

原文地址:https://www.cnblogs.com/zfyouxi/p/5039809.html