使用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 SetLen(int l);//设置学生的人数
    void SetName(string N);//设置学生的姓名
    void SetAge(int A);//设置学生的年龄
    void SetNo(int N);//设置学生的编号
    void SetCpp(int C);//设置C++成绩
    void SetMath(int M);//设置高数成绩
    void SetEnglish(int E);//设置英语成绩
    void CountTotal();//计算总分
    void CountAve();//计算平均分
    void SetS(int S);//设置序号(用于排名)
    int GetLen();//得到学生的人数
    string GetName();//得到学生的姓名
    int GetAge();//得到学生的年龄
    int GetNo();//得到学生的编号
    int GetCpp();//得到学生的C++成绩
    int GetMath();//得到学生的高数成绩
    int GetEnglish();//得到学生的英语成绩
    int GetTotal();//得到学生的总分
    float GetAve();//得到学生的平均分
    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::SetLen(int l)//设置学生的人数
{
    len = l;
}

void Student::SetName(string N)//设置学生的姓名
{
    Name = N;
}

void Student::SetAge(int A)//设置学生的年龄
{
    Age = A;
}

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

void Student::SetCpp(int C)//设置C++成绩
{
    Cpp = C;
}

void Student::SetMath(int M)//设置高数成绩
{
    Math = M;
}

void Student::SetEnglish(int E)//设置英语成绩
{
    English = E;
}

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

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

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

int Student::GetLen()//得到学生的人数
{
    return len;
}

string Student::GetName()//得到学生的姓名
{
    return Name;
}

int Student::GetAge()//得到学生的年龄
{
    return Age;
}

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

int Student::GetCpp()//得到学生的C++成绩
{
    return Cpp;
}

int Student::GetMath()//得到学生的高数成绩
{
    return Math;
}

int Student::GetEnglish()//得到学生的英语成绩
{
    return English;
}

int Student::GetTotal()//得到学生的总分
{
    return Total;
}

float Student::GetAve()//得到学生的平均分
{
    return 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.SetName(name);//学生的姓名
        pNew->st.SetAge(age);//学生的年龄
        pNew->st.SetNo(no);//学生的编号
        pNew->st.SetCpp(cpp);//学生的C++成绩
        pNew->st.SetMath(math);//学生的数学成绩
        pNew->st.SetEnglish(english);//学生的英语成绩
        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<<"姓名\t"<<"年龄\t"<<"学号\t"<<"C++\t"<<"数学\t"<<"英语\t"<<"总分\t"<<"平均分\t"<<"排名"<<endl;

    //遍历学生信息
    while(NULL != p)
    {
        cout<<p->st.GetName()<<"\t"<<p->st.GetAge()<<"\t"<<p->st.GetNo()<<"\t"<<p->st.GetCpp()
        <<"\t"<<p->st.GetMath()<<"\t"<<p->st.GetEnglish()<<"\t"<<p->st.GetTotal()<<"\t"<<p->st.GetAve()<<"\t"<<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("动态内存分配失败,程序终止!\n");
		exit(-1);
	}

    //初始化结点
    pt->st.SetName(name);//学生的姓名
    pt->st.SetAge(age);//学生的年龄
    pt->st.SetNo(pos+1);//学生的学号
    pt->st.SetCpp(cpp);//学生的C++成绩
    pt->st.SetMath(math);//学生的数学成绩
    pt->st.SetEnglish(english);//学生的英语成绩
    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<<"\n删除学号为"<<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 flag = 0;//标识符,初始化表示没找到

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

    //遍历学生信息
    while(NULL != p)
    {
        if(name == p->st.GetName())
        {
            flag = 1;

            cout<<"\n修改前的学生信息:"<<endl;

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

            cout<<p->st.GetName()<<"\t"<<p->st.GetAge()<<"\t"<<p->st.GetNo()<<"\t"<<p->st.GetCpp()
            <<"\t"<<p->st.GetMath()<<"\t"<<p->st.GetEnglish()<<"\t"<<p->st.GetTotal()<<"\t"<<p->st.GetAve()<<endl;

            break;
        }

        p = p->pNext;
    }

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

        return;
    }

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

    int age;//年龄
    int no;//学号
    int cpp;//C++成绩
    int math;//数学成绩
    int english;//英语成绩

    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.SetName(name);//学生的姓名
    p->st.SetAge(age);//学生的年龄
    p->st.SetNo(no);//学生的编号
    p->st.SetCpp(cpp);//学生的C++成绩
    p->st.SetMath(math);//学生的数学成绩
    p->st.SetEnglish(english);//学生的英语成绩
    p->st.CountTotal();//计算学生的总分
    p->st.CountAve();//计算学生的平均分

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

    cout<<p->st.GetName()<<"\t"<<p->st.GetAge()<<"\t"<<p->st.GetNo()<<"\t"<<p->st.GetCpp()
      <<"\t"<<p->st.GetMath()<<"\t"<<p->st.GetEnglish()<<"\t"<<p->st.GetTotal()<<"\t"<<p->st.GetAve()<<endl;
}

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

    string name;//姓名

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

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

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

    //遍历学生信息
    while(NULL != p)
    {
        if(name == p->st.GetName())
        {
            flag = 1;

            cout<<p->st.GetName()<<"\t"<<p->st.GetAge()<<"\t"<<p->st.GetNo()<<"\t"<<p->st.GetCpp()
            <<"\t"<<p->st.GetMath()<<"\t"<<p->st.GetEnglish()<<"\t"<<p->st.GetTotal()<<"\t"<<p->st.GetAve()<<endl;

            break;//退出循环
        }

        p = p->pNext;
    }

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

void Node::SortCpp()//将C++成绩按照从大到小排序
{
    PNODE p, q;//定义两个指针

	NODE temp;//定义一个临时结点

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

void Node::SortMath()//将高数成绩按照从大到小排序
{
     PNODE p, q;//定义两个指针

	NODE temp;//定义一个临时结点

    for(p = pHead->pNext; NULL != p; p = p->pNext)
    {
        for(q = p->pNext; NULL != q; q = q->pNext)
        {
            if(p->st.GetMath() < q->st.GetMath())//当前一个学生的高数成绩小于后一个学生的高数成绩时
            {
                temp.st  = p->st;//交换学生的位置(交换结点中的数据域)
                p->st = q->st;
                q->st = temp.st;
            }
        }
    }
}

void Node::SortEnglish()//将英语成绩按照从大到小排序
{
     PNODE p, q;//定义两个指针

     NODE temp;//定义一个临时结点

     for(p = pHead->pNext; NULL != p; p = p->pNext)
    {
        for(q = p->pNext; NULL != q; q = q->pNext)
        {
            if(p->st.GetEnglish() < q->st.GetEnglish())//当前一个学生的英语成绩小于后一个学生的英语成绩时
            {
                temp.st  = p->st;//交换学生的位置(交换结点中的数据域)
                p->st = q->st;
                q->st = temp.st;
            }
        }
    }
}

void Node::SortTotal()//将总分按照从大到小排序
{
    PNODE p, q;//定义两个指针

	NODE temp;//定义一个临时结点

    for(p = pHead->pNext; NULL != p; p = p->pNext)
    {
        for(q = p->pNext; NULL != q; q = q->pNext)
        {
            if(p->st.GetTotal() < q->st.GetTotal())//当前一个学生的总分小于后一个学生的总分时
            {
                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 SetLen(int l);//设置学生的人数
    void SetName(string N);//设置学生的姓名
    void SetAge(int A);//设置学生的年龄
    void SetNo(int N);//设置学生的编号
    void SetCpp(int C);//设置C++成绩
    void SetMath(int M);//设置高数成绩
    void SetEnglish(int E);//设置英语成绩
    void CountTotal();//计算总分
    void CountAve();//计算平均分
    void SetS(int S);//设置序号(用于排名)
    int GetLen();//得到学生的人数
    string GetName();//得到学生的姓名
    int GetAge();//得到学生的年龄
    int GetNo();//得到学生的编号
    int GetCpp();//得到学生的C++成绩
    int GetMath();//得到学生的高数成绩
    int GetEnglish();//得到学生的英语成绩
    int GetTotal();//得到学生的总分
    float GetAve();//得到学生的平均分
    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::SetLen(int l)//设置学生的人数
{
    len = l;
}

void Student::SetName(string N)//设置学生的姓名
{
    Name = N;
}

void Student::SetAge(int A)//设置学生的年龄
{
    Age = A;
}

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

void Student::SetCpp(int C)//设置C++成绩
{
    Cpp = C;
}

void Student::SetMath(int M)//设置高数成绩
{
    Math = M;
}

void Student::SetEnglish(int E)//设置英语成绩
{
    English = E;
}

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

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

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

int Student::GetLen()//得到学生的人数
{
    return len;
}

string Student::GetName()//得到学生的姓名
{
    return Name;
}

int Student::GetAge()//得到学生的年龄
{
    return Age;
}

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

int Student::GetCpp()//得到学生的C++成绩
{
    return Cpp;
}

int Student::GetMath()//得到学生的高数成绩
{
    return Math;
}

int Student::GetEnglish()//得到学生的英语成绩
{
    return English;
}

int Student::GetTotal()//得到学生的总分
{
    return Total;
}

float Student::GetAve()//得到学生的平均分
{
    return 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.SetName(name);//学生的姓名
        pNew->st.SetAge(age);//学生的年龄
        pNew->st.SetNo(no);//学生的编号
        pNew->st.SetCpp(cpp);//学生的C++成绩
        pNew->st.SetMath(math);//学生的数学成绩
        pNew->st.SetEnglish(english);//学生的英语成绩
        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<<"姓名\t"<<"年龄\t"<<"学号\t"<<"C++\t"<<"数学\t"<<"英语\t"<<"总分\t"<<"平均分\t"<<"排名"<<endl;

    //遍历学生信息
    while(NULL != p)
    {
        cout<<p->st.GetName()<<"\t"<<p->st.GetAge()<<"\t"<<p->st.GetNo()<<"\t"<<p->st.GetCpp()
        <<"\t"<<p->st.GetMath()<<"\t"<<p->st.GetEnglish()<<"\t"<<p->st.GetTotal()<<"\t"<<p->st.GetAve()<<"\t"<<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("动态内存分配失败,程序终止!\n");
		exit(-1);
	}

    //初始化结点
    pt->st.SetName(name);//学生的姓名
    pt->st.SetAge(age);//学生的年龄
    pt->st.SetNo(pos+1);//学生的学号
    pt->st.SetCpp(cpp);//学生的C++成绩
    pt->st.SetMath(math);//学生的数学成绩
    pt->st.SetEnglish(english);//学生的英语成绩
    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<<"\n删除学号为"<<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 flag = 0;//标识符,初始化表示没找到

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

    //遍历学生信息
    while(NULL != p)
    {
        if(name == p->st.GetName())
        {
            flag = 1;

            cout<<"\n修改前的学生信息:"<<endl;

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

            cout<<p->st.GetName()<<"\t"<<p->st.GetAge()<<"\t"<<p->st.GetNo()<<"\t"<<p->st.GetCpp()
            <<"\t"<<p->st.GetMath()<<"\t"<<p->st.GetEnglish()<<"\t"<<p->st.GetTotal()<<"\t"<<p->st.GetAve()<<endl;

            break;
        }

        p = p->pNext;
    }

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

        return;
    }

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

    int age;//年龄
    int no;//学号
    int cpp;//C++成绩
    int math;//数学成绩
    int english;//英语成绩

    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.SetName(name);//学生的姓名
    p->st.SetAge(age);//学生的年龄
    p->st.SetNo(no);//学生的编号
    p->st.SetCpp(cpp);//学生的C++成绩
    p->st.SetMath(math);//学生的数学成绩
    p->st.SetEnglish(english);//学生的英语成绩
    p->st.CountTotal();//计算学生的总分
    p->st.CountAve();//计算学生的平均分

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

    cout<<p->st.GetName()<<"\t"<<p->st.GetAge()<<"\t"<<p->st.GetNo()<<"\t"<<p->st.GetCpp()
      <<"\t"<<p->st.GetMath()<<"\t"<<p->st.GetEnglish()<<"\t"<<p->st.GetTotal()<<"\t"<<p->st.GetAve()<<endl;
}

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

    string name;//姓名

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

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

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

    //遍历学生信息
    while(NULL != p)
    {
        if(name == p->st.GetName())
        {
            flag = 1;

            cout<<p->st.GetName()<<"\t"<<p->st.GetAge()<<"\t"<<p->st.GetNo()<<"\t"<<p->st.GetCpp()
            <<"\t"<<p->st.GetMath()<<"\t"<<p->st.GetEnglish()<<"\t"<<p->st.GetTotal()<<"\t"<<p->st.GetAve()<<endl;

            break;//退出循环
        }

        p = p->pNext;
    }

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

void Node::SortCpp()//将C++成绩按照从大到小排序
{
    PNODE p, q;//定义两个指针

	NODE temp;//定义一个临时结点

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

void Node::SortMath()//将高数成绩按照从大到小排序
{
     PNODE p, q;//定义两个指针

	NODE temp;//定义一个临时结点

    for(p = pHead->pNext; NULL != p; p = p->pNext)
    {
        for(q = p->pNext; NULL != q; q = q->pNext)
        {
            if(p->st.GetMath() < q->st.GetMath())//当前一个学生的高数成绩小于后一个学生的高数成绩时
            {
                temp.st  = p->st;//交换学生的位置(交换结点中的数据域)
                p->st = q->st;
                q->st = temp.st;
            }
        }
    }
}

void Node::SortEnglish()//将英语成绩按照从大到小排序
{
     PNODE p, q;//定义两个指针

     NODE temp;//定义一个临时结点

     for(p = pHead->pNext; NULL != p; p = p->pNext)
    {
        for(q = p->pNext; NULL != q; q = q->pNext)
        {
            if(p->st.GetEnglish() < q->st.GetEnglish())//当前一个学生的英语成绩小于后一个学生的英语成绩时
            {
                temp.st  = p->st;//交换学生的位置(交换结点中的数据域)
                p->st = q->st;
                q->st = temp.st;
            }
        }
    }
}

void Node::SortTotal()//将总分按照从大到小排序
{
    PNODE p, q;//定义两个指针

	NODE temp;//定义一个临时结点

    for(p = pHead->pNext; NULL != p; p = p->pNext)
    {
        for(q = p->pNext; NULL != q; q = q->pNext)
        {
            if(p->st.GetTotal() < q->st.GetTotal())//当前一个学生的总分小于后一个学生的总分时
            {
                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<<"================================================================================\n"<<endl;
    cout<<"================================================================================\n"<<endl;
    cout<<"*************************欢迎使用学生成绩管理系统*******************************\n"<<endl;
    cout<<"-----------------------------------------------------------------制作人:梅沙小子\n"<<endl;
    cout<<"********************************************************************************\n"<<endl;
    cout<<"================================================================================\n"<<endl;  

    cout<<"请按任意将进入学生管理系统:";
    getchar();
    system("cls");  

    cout<<"===============================================================================\n\n";
    cout<<"------------------------ 请选择要操作的命令:----------------------------------\n\n";
    cout<<"-------------------------- 1 输入学生信息--------------------------------------\n\n";
    cout<<"-------------------------- 2 输出学生信息--------------------------------------\n\n";
    cout<<"-------------------------- 3 增加学生信息--------------------------------------\n\n";
    cout<<"-------------------------- 4 删除学生信息--------------------------------------\n\n";
    cout<<"-------------------------- 5 修改学生信息--------------------------------------\n\n";
    cout<<"-------------------------- 6 查找学生信息--------------------------------------\n\n";
    cout<<"-------------------------- 7 将学生的C++成绩按从大到小排----------------------\n\n";
    cout<<"-------------------------- 8 将学生的高数成绩按从大到小排----------------------\n\n";
    cout<<"-------------------------- 9 将学生的英语成绩按从大到小排----------------------\n\n";
    cout<<"--------------------------10 将学生的总成绩按从大到小排------------------------\n\n";
    cout<<"===============================================================================\n\n";  

    int Item;//操作命令

     NODE pHead;//定义一个结点

    while(1)
   {
        cout<<"\n请选择操作命令:";
        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");
}

测试程序:

特别说明在测试前应在工程目录或者程序目录下放一个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++成绩排序:

对学生的高数成绩排序

对学生的英语成绩排序

对学生的总分排序



时间: 2024-10-12 22:22:43

使用C++结合文件操作和链表实现学生成绩管理系统的相关文章

【C项目】 文件,结构体,链表,排序, 学生信息管理系统

1.密码登录: 2.通过键盘输入学生信息,包括学生学号.姓名.成绩: 3.将输入的信息保存到指定文件中: 4.从文件中读取学生信息: 5.显示全部学生信息: 6.按学生总分进行降序排序: 7.删除学生信息: 8.查找学生信息,可以通过学号查找,也可以通过姓名查找: 9.统计学生信息,统计出最高分和学生人数: 10.退出系统: 源代码: [email protected]:~$ cat main.c  #include<stdio.h> #include<stdlib.h> #inc

链表实现学生成绩管理系统

第一次没有发布真是醉了,昨晚奋斗了四个小时,完成 了九成的功能,难点还是文件的加载,摧残了一个多小时,最后还是请鲁老师出山,半小时疑难杂症全消.发现了几个知识的盲点,以后要多问,有些问题貌似懂了,但是用起来还是疏忽了不少细节,多问才可以不断完善知识点的积累,以下是劳动成果 #include<stdio.h>#include<stdlib.h>#include<string.h>#define MAXSIZE 50 typedef struct listnode //定义

指针、链表的原理和各类操作相关心得以及学生信息管理系统

伴随着学期末的到来,C语言程序设计这门课也接近尾声.经过前两次的教学,我们对C语言也有了深刻的了解,学习的内容也不断的加深.这次我们就学习了C语言程序设计里应用最广泛,也是最难学习的知识--链表和指针的应用. 关于指针和链表这两个的应用和上次的管理系统有着直接的关系,没有添加链表和指针的管理系统无法做到精确的查找.数据存储方面也显得不方便.所以指针和链表的作用能够直接指向你所需要的数据地址,使程序更加完善.这次我就利用指针的应用制作了一个管理员工工资等信息的程序. §1 指向结构体变量的指针变量

学生成绩管理系统--文件存储

1.学习Java代码分层,各层的作用entity/DAO/DaoImpl/Service/UI/Util/Conn 2.学习字符集编码,文件存取的编码级别.内存或磁盘中只能存0或1,显示得字符其实是操作系统支持的,如UTF-8.若系统不支持某个字符集,那么该字符就会乱码,若使用了错误的编码去读取文件,也会乱码. 设置eclipse文件存储的字符编码: a.点击windows--preferences b.  c. 3.解决IO输出文件中年龄为乱码,将年龄转化为String类型.使用byte[]类

C语言复习——指针 链表 与 文件操作

刚刚进入大二,准备开始学习C++,对大一所学的C语言一次练习,正好也是赶上老师布置的任务,用C语言写一个  销售管理系统  ,就尽可能的把所学的都用上,也就是结构,指针,文件操作,还有数据结构,本次加入了链表. 用两个函数 Load_LinkList() 和 Save_LinkList() 让链表与文件操作结合,除了打印函数,其他都是在内存中操作链表,这样写更有条理,在创建链表时没有采用书上的用一个中间变量引导,并插入到结点前面,而是直接在链表尾的next申请内存,便于理解,操作也方便. /*首

MFC文件操作、序列化机制

一 MFC的文件操作 1 相关类 CFile类-封装了文件句柄以及操作文件的API函数. CFileFind类-封装了文件搜索功能. 2CFile类的使用 2.1 文件读写 2.1.1 创建或者打开文件 CFile::Create 2.1.2 文件读写 CFile::Read/Write 2.1.3 关闭文件 CFile::Close 注意:1 文件读写需要异常处理 2 注意文件的指针位置 2.2 文件属性的获取和设置 2.2.1 CFile::GetStatus 2.2.2 CFile::Se

linux_api之文件操作

本篇索引: 1.引言 2.文件描述符 3.open函数 4.close函数 5.read函数 6.write函数 7.lseek函数 8.i/o效率问题 9.内核用以维护打开文件的相关数据结构 10.O_APPEND标志 11.dup函数(文件描述符重定位函数) 12.有关文件共享的问题 13.fcntl函数 14.ioctl函数         1.引言 1.1.文件io这个词的含义 实现对文件的数据输入(input)和输出(output),所以简称为文件io. 1.2.什么需要文件io 程序

FFMPEG之协议(文件)操作----AVIOContext, URLContext, URLProtocol

版权声明:本文为博主原创文章,未经博主允许不得转载. 协议操作对象结构: 协议(文件)操作的顶层结构是AVIOContext,这个对象实现了带缓冲的读写操作:FFMPEG的输入对象AVFormat的pb字段指向一个AVIOContext. AVIOContext的opaque实际指向一个URLContext对象,这个对象封装了协议对象及协议操作对象,其中prot指向具体的协议操作对象,priv_data指向具体的协议对象. URLProtocol为协议操作对象,针对每种协议,会有一个这样的对象,

C++MFC编程笔记day07 MFC的文件操作、序列化和保存

一 MFC的文件操作 1 相关类 CFile类-封装了文件句柄以及操作文件的API函数. CFileFind类-提供文件查找功能. 2 CFile类的使用 2.1 打开或者新建文件 CFile::Open 2.2 文件读写 注意:1 文件指针位置 2 异常处理 CFile::Write CFile::Read CFile::SeekToBegin 2.3 关闭文件 CFile::Close 2.4 设置/获取文件属性 CFile::SetStatus/GetStatus 3 CFileFind类