对于学生成绩管理系统,我并不陌生,几乎学习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++成绩排序:
对学生的高数成绩排序