zoukankan      html  css  js  c++  java
  • 使用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++成绩排序:


    对学生的高数成绩排序


    对学生的英语成绩排序

    学生成绩排序
    
  • 相关阅读:
    组合继承
    包装明星——封装
    多种添加公用方法的方式
    专有扩展
    插入标记
    mac 命令操作
    php(apache)切换版本
    SqlServer索引+约束篇章
    sqlserver 常用语法
    C# 通用数据访问类
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/5039809.html
Copyright © 2011-2022 走看看