C++实现学生成绩管理系统
终于结束了期末考试,有时间将这学期C++作业整理一下,都是一些基础的内容,写出来希望给一些初学者一些参考。主要使用到C++的面对对象编程思想,对学生信息类及链表类进行封装
文章可能有点长,可以只参考需要的部分
题目要求
用C++及类和对象来进行抽象、封装与实现,用作课内的第四次作业。注意学生的成绩需要用链表来实现,并且链表也需要实现封装。
成绩管理系统
信息描述:
现有学生成绩信息,内容如下
姓名学号语文数学英语
张明明01677882
李成友02789188
张辉灿03688256
王露04564577
陈东明05673847
……………
请用C++编写一系统,实现学生信息管理,包含以下功能:
(1)信息维护
要求:学生信息数据要以文件的形式保存,能实现学生信息数据的维护。此模块包括子模块有:增加学生信息、删除学生信息、修改学生信息。所有的学生数据需要存放于文件中;能够从文件中读入数据,并在程序中以链表的形式予以实现。
(2)信息查询
要求:查询时可实现按姓名查询、按学号查询
(3)成绩统计
要求:
输入任意的一个课程名(如数学)给出该门课程的成绩的分段统计(以10分为一个成绩段,如90-100,80-89,70-79,60-69,小于60),给出在此分数段的学生数目。
根据指定的课程名求该门课所有学生的平均成绩
给出每个学生的平均成绩
排序:能对用户指定的任意课程名,按成绩升序或降序排列学生数据并显示排序结果
至少采用文本菜单界面
整体分析
此系统为学生成绩管理系统,根据题目要求,它需要包含:信息维护、信息查询、成绩统计、排序、文本界面菜单五个模块。
为实现这些功能,该程序包含两个类:
1、Student类:包含一个学生的所有信息,以及学生信息的设置和获取函数
2、List类:包含对学生信息链表的所有操作
实现该系统共使用到7个文件:
1、menu.cpp:内含多个创建菜单函数,用于实现不同模块的功能显示
2、student.h:包含用于保存学生信息的Student类
3、student.cpp:包含Student类的成员函数的实现
4、list.h:包含用于操作学生信息的的List类
5、list.cpp:包含List类的成员函数的实现
6、main.cpp:调用所有的函数,并进行适当的组合实现完整的学生成绩管理系统
7、student.txt:包含学生的全部信息
程序源码
menu.cpp
//全部的菜单函数 #includeusingnamespacestd; //主界面 voidmenu() { cout<<"\n\n\t\t----------------学生成绩管理系统------------------"< main.cpp
//主函数,采用switch结构的多层嵌套 #include#include #include #include"student.h" #include"list.h" voidmenu(); voidmenu1(); voidmenu2(); voidmenu3(); voidmenu4(); usingnamespacestd; intmain(void) { intchoice,choice1,choice2,choice3,choice4; ListpHead; stringsubj; pHead.input_info(); while(1) { menu(); cout<<"请选择你要进行的操作:"; cin>>choice; switch(choice) { //信息维护功能 case1: while(1) { pHead.input_info(); system("cls"); menu1(); cout<<"请选择你要进行的操作:"; cin>>choice1; switch(choice1) { //增加学生信息 case1: pHead.output_info();//遍历链表,并打印学生的信息 pHead.add_info();//增加学生信息 system("cls"); cout<<"\n\n\n\t\t学生成绩信息表(更新)"< >choice2; switch(choice2) { //按姓名进行查询 case1: pHead.search_by_name(); system("pause"); break; //按学号进行查询 case2: pHead.search_by_ID(); system("pause"); //system("cls"); break; default: system("cls"); break; } if(choice2!=1&&choice2!=2) break; //break; } break; //成绩统计功能 case3: while(1) { system("cls"); menu3(); cout<<"请选择你要进行的操作:"; cin>>choice3; switch(choice3) { //根据课程名给出成绩的分段统计 case1: cout<<"输入课程名称:"; cin>>subj; if(subj=="数学") pHead.separate_by_math(); elseif(subj=="英语") pHead.separate_by_english(); elseif(subj=="C++") pHead.separate_by_cpp(); else cout<<"没有该科目!"< >choice4; switch(choice4) { //升序排列 case1: cout<<"请输入科目名称:"; cin>>subj; cout< >subj; cout< student.h
#ifndef__STUDENT_H__ #define__STUDENT_H__ #include#include #include usingnamespacestd; classStudent { public: Student(); //~Student(); public: voidset_stuID(stringID);//设置学号 voidset_name(stringna);//设置姓名 voidset_scores(doubleen,doublem,doublecp);//设置学生的各科成绩 voidset_num(intn);//设置学生编号 voidcount_avg();//计算平均成绩 voidcount_total();//计算总成绩 voidget_scores(double*en,double*m,double*cp,double*sum,double*avg);//得到学生的各科成绩(大英、高数、C++、总分、平均分) stringget_stuID();//得到学生的学号 stringget_name();//得到学生的姓名 intget_num();//得到学生的编号 private: stringstuID;//学号 stringname;//姓名 doubleenglish;//英语成绩 doublemath;//数学成绩 doublecpp;//C++成绩 doubletotal;//总分 doubleaverage;//平均成绩 intnum;//学生编号 }; #endif student.cpp
#include"student.h" #include#include #include Student::Student() { stuID="00"; } //设置学号 voidStudent::set_stuID(stringID) { stuID=ID; } //设置姓名 voidStudent::set_name(stringna) { name=na; } //设置学生的各科成绩 voidStudent::set_scores(doubleen,doublem,doublecp) { english=en; math=m; cpp=cp; } //设置学生编号 voidStudent::set_num(intn) { num=n; } //计算平均成绩 voidStudent::count_avg() { average=(english+math+cpp)/3; } //计算总成绩 voidStudent::count_total() { total=english+math+cpp; } //得到学生的各类成绩(大英、高数、C++、总分、平均分) voidStudent::get_scores(double*en,double*m,double*cp,double*sum,double*avg) { *en=english; *m=math; *cp=cpp; *sum=total; *avg=average; } //得到学生的学号 stringStudent::get_stuID() { returnstuID; } //得到学生的姓名 stringStudent::get_name() { returnname; } //得到学生的编号 intStudent::get_num() { returnnum; } list.h
#ifndef__LIST_H__ #define__LIST_H__ #include#include"student.h" classList { public: List(){};//构造函数 ~List();//析构函数 public: //学生信息读取相关函数 voidinput_info();//创建链表,并从文件读取学生的信息保存到链表中 voidoutput_info();//遍历链表,并打印学生的信息 //学生信息查询相关函数 voidsearch_by_name();//通过姓名查找学生 voidsearch_by_ID();//通过学号查找学生 //排序功能函数 voidsortEnglish();//根据英语成绩对学生进行降序排名 voidsortMath();//根据数学成绩对学生进行降序排名 voidsortCpp();//根据C++成绩对学生进行降序排名 voidsortEnglish_s();//根据英语成绩对学生进行升序排名 voidsortMath_s();//根据数学成绩对学生进行升序排名 voidsortCpp_s();//根据C++成绩对学生进行升序排名 voidsortTotal();//根据总成绩对学生进行降序排序 //成绩统计功能相关函数 voidseparate_by_english();//根据英语成绩进行分段统计 voidseparate_by_math();//根据数学成绩进行分段统计 voidseparate_by_cpp();//根据C++成绩进行分段统计 voidcount_subject_avg();//计算各学科的平均成绩 //学生信息维护功能函数 voidmodify_info();//修改学生信息 voiddelete_info();//删除学生信息 voidadd_info();//增加学生信息 public: voidsave_list();//将列表保存至文件中 voiddelete_list();//销毁链表,释放内存空间 private: Studentstu;//学生数据体 List*pHead;//头指针 List*pNext;//指向下一组学生信息的指针 }; #endif list.cpp
#include#include #include #include #include #include #include"list.h" usingnamespacestd; List::~List() { pHead=NULL; pNext=NULL; } //从文件导入学生信息,并保存在链表中 voidList::input_info() { List*current=NULL; List*previous=NULL; pHead=NULL; stringname;//姓名 stringstuID;//学号 doubleenglish;//英语成绩 doublemath;//数学成绩 doublecpp;//C++成绩 intn=0;//用于统计学生的数量,同时设置编号 ifstreamfin; fin.open("student.txt",ios::in); if(!fin) { cout<<"Failtoopenthefile!"< >name>>stuID>>english>>math>>cpp))//从文件中读取数据 break; ++n;//编号递增 //cout< pNext=current;//将前一个结点的pNext指向当前结点 //将文件中的一组数据保存在当前结点 current->stu.set_name(name);//保存学生的姓名 current->stu.set_stuID(stuID);//保存学生的学号 current->stu.set_scores(english,math,cpp);//保存英语、数学、C++成绩 current->stu.count_avg();//计算平均成绩,并保存 current->stu.count_total();//计算总分 current->stu.set_num(n); current->pNext=NULL; previous=current; } //关闭文件 fin.close(); //cout<<"已成功从文件导入"< stu.set_num(n);//重新设置编号 name=p->stu.get_name(); stuID=p->stu.get_stuID(); num=p->stu.get_num(); p->stu.get_scores(&english,&math,&cpp,&total,&average); cout< pNext;//设置指针指向下一个结点 } cout< >na; while(p!=NULL) { name=p->stu.get_name(); if(name==na) { flag++; stuID=p->stu.get_stuID(); p->stu.get_scores(&english,&math,&cpp,&total,&average); cout<<"\n该学生的信息如下:"< pNext;//设置指针指向下一个结点 } if(flag==0) cout<<"没有找到该学生!"< >ID; while(p!=NULL) { stuID=p->stu.get_stuID(); if(stuID==ID) { flag++; name=p->stu.get_name(); cout<<"\n该学生的信息如下:"< stu.get_scores(&english,&math,&cpp,&total,&average); cout<<"姓名\t"<<"学号\t"<<"英语\t"<<"数学\t"<<"C++\t"<<"总分\t"<<"平均分\t"< pNext;//设置指针指向下一个结点 } if(flag==0) cout<<"没有找到该学生!"< pNext!=NULL;p=p->pNext) for(q=p->pNext;q!=NULL;q=q->pNext) { p->stu.get_scores(&english,&math,&cpp1,&total,&average); q->stu.get_scores(&english,&math,&cpp2,&total,&average); if(cpp1 stu; q->stu=p->stu; p->stu=temp.stu; } } } //根据数学成绩对学生进行降序排名 voidList::sortMath() { doubleenglish;//英语成绩 doublecpp;//C++成绩 doubletotal;//总成绩 doubleaverage;//平均成绩 //数学成绩 doublemath1; doublemath2; List*p; List*q; Listtemp;//临时的对象 for(p=pHead;p->pNext!=NULL;p=p->pNext) for(q=p->pNext;q!=NULL;q=q->pNext) { p->stu.get_scores(&english,&math1,&cpp,&total,&average); q->stu.get_scores(&english,&math2,&cpp,&total,&average); if(math1 stu; q->stu=p->stu; p->stu=temp.stu; } } } //根据英语成绩对学生进行降序排名 voidList::sortEnglish() { doublecpp;//C++成绩 doublemath;//数学成绩 doubletotal;//总成绩 doubleaverage;//平均成绩 //英语成绩 doubleenglish1; doubleenglish2; List*p; List*q; Listtemp;//临时的对象 for(p=pHead;p->pNext!=NULL;p=p->pNext) for(q=p->pNext;q!=NULL;q=q->pNext) { p->stu.get_scores(&english1,&math,&cpp,&total,&average); q->stu.get_scores(&english2,&math,&cpp,&total,&average); if(english1 stu; q->stu=p->stu; p->stu=temp.stu; } } } //根据英语成绩对学生进行升序排名 voidList::sortEnglish_s() { doublecpp;//C++成绩 doublemath;//数学成绩 doubletotal;//总成绩 doubleaverage;//平均成绩 //英语成绩 doubleenglish1; doubleenglish2; List*p; List*q; Listtemp;//临时的对象 for(p=pHead;p->pNext!=NULL;p=p->pNext) for(q=p->pNext;q!=NULL;q=q->pNext) { p->stu.get_scores(&english1,&math,&cpp,&total,&average); q->stu.get_scores(&english2,&math,&cpp,&total,&average); if(english1>english2) { temp.stu=q->stu; q->stu=p->stu; p->stu=temp.stu; } } } //根据数学成绩对学生进行升序排名 voidList::sortMath_s() { doubleenglish;//英语成绩 doublecpp;//C++成绩 doubletotal;//总成绩 doubleaverage;//平均成绩 //数学成绩 doublemath1; doublemath2; List*p; List*q; Listtemp;//临时的对象 for(p=pHead;p->pNext!=NULL;p=p->pNext) for(q=p->pNext;q!=NULL;q=q->pNext) { p->stu.get_scores(&english,&math1,&cpp,&total,&average); q->stu.get_scores(&english,&math2,&cpp,&total,&average); if(math1>math2) { temp.stu=q->stu; q->stu=p->stu; p->stu=temp.stu; } } } //根据C++成绩对学生进行升序排名 voidList::sortCpp_s() { doubleenglish;//英语成绩 doublemath;//数学成绩 doubletotal;//总成绩 doubleaverage;//平均成绩 //C++成绩 doublecpp1; doublecpp2; List*p; List*q; Listtemp;//临时的对象 for(p=pHead;p->pNext!=NULL;p=p->pNext) for(q=p->pNext;q!=NULL;q=q->pNext) { p->stu.get_scores(&english,&math,&cpp1,&total,&average); q->stu.get_scores(&english,&math,&cpp2,&total,&average); if(cpp1>cpp2) { temp.stu=q->stu; q->stu=p->stu; p->stu=temp.stu; } } } //根据总成绩对学生进行降序排名 voidList::sortTotal() { doubleenglish;//英语成绩 doublecpp;//C++成绩 doublemath;//数学成绩 doubleaverage;//平均成绩 //总成绩 doublesum1; doublesum2; List*p; List*q; Listtemp;//临时的对象 for(p=pHead;p->pNext!=NULL;p=p->pNext) for(q=p->pNext;q!=NULL;q=q->pNext) { p->stu.get_scores(&english,&math,&cpp,&sum1,&average); q->stu.get_scores(&english,&math,&cpp,&sum2,&average); if(sum1 stu; q->stu=p->stu; p->stu=temp.stu; } } } //根据英语成绩进行分段统计 voidList::separate_by_english() { //sortEnglish();//调用根据英语成绩排序函数 stringname;//姓名 doubleenglish;//英语成绩 doublemath;//数学成绩 doublecpp;//C++成绩 doubletotal;//总成绩 doubleaverage;//平均成绩 intt1=0,t2=0,t3=0,t4=0,t5=0;//用于统计各分数段的人数 List*p=pHead; while(p!=NULL) { p->stu.get_scores(&english,&math,&cpp,&total,&average); if(english>=90&&english<=100) ++t1; elseif(english>=80&&english<=89) ++t2; elseif(english>=70&&english<=79) ++t3; elseif(english>=60&&english<=69) ++t4; else ++t5; p=p->pNext; } cout<<"\n\t\t\t英语成绩分段统计表"< stu.get_scores(&english,&math,&cpp,&total,&average); if(math>=90&&math<=100) ++t1; elseif(math>=80&&math<=89) ++t2; elseif(math>=70&&math<=79) ++t3; elseif(math>=60&&math<=69) ++t4; else ++t5; p=p->pNext; } cout<<"\n\t\t\t数学成绩分段统计表"< stu.get_scores(&english,&math,&cpp,&total,&average); if(cpp>=90&&cpp<=100) ++t1; elseif(cpp>=80&&cpp<=89) ++t2; elseif(cpp>=70&&cpp<=79) ++t3; elseif(cpp>=60&&cpp<=69) ++t4; else ++t5; p=p->pNext; } cout<<"\n\t\t\tC++成绩分段统计表"< stu.get_scores(&english,&math,&cpp,&total,&average); Esum+=english; Msum+=math; Csum+=cpp; ++n; p=p->pNext; } english_avg=Esum/n; math_avg=Msum/n; cpp_avg=Csum/n; cout<<"各科目的平均成绩如下"< >content; //根据输入来进行查找并修改 if(content[0]>='0'&&content[0]<='9') { intflag=0;//标记是否找到对应学生; stringID=content; while(p!=NULL) { stuID=p->stu.get_stuID(); if(stuID==ID) { flag++; name=p->stu.get_name(); p->stu.get_scores(&english,&math,&cpp,&total,&average); cout<<"\n姓名\t"<<"学号\t"<<"英语\t"<<"数学\t"<<"C++\t"<<"总分\t"<<"平均分\t"< >name>>stuID>>english>>math>>cpp; p->stu.set_name(name);//重新设置姓名 p->stu.set_stuID(stuID);//重新设置学号 p->stu.set_scores(english,math,cpp);//重新设置各科成绩 p->stu.count_total();//重新计算总成绩 p->stu.count_avg();//重新计算平均成绩 break; } p=p->pNext;//设置指针指向下一个结点 } if(flag==0) cout<<"没有找到该学生!"< stu.get_name(); if(name==na) { flag++; stuID=p->stu.get_stuID(); p->stu.get_scores(&english,&math,&cpp,&total,&average); cout<<"姓名\t"<<"学号\t"<<"英语\t"<<"数学\t"<<"C++\t"<<"总分\t"<<"平均分\t"< >name>>stuID>>english>>math>>cpp; p->stu.set_name(name);//重新设置姓名 p->stu.set_stuID(stuID);//重新设置学号 p->stu.set_scores(english,math,cpp);//重新设置各科成绩 p->stu.count_total();//重新计算总成绩 p->stu.count_avg();//重新计算平均成绩 break; } p=p->pNext;//设置指针指向下一个结点 } if(flag==0) cout<<"没有找到该学生!"< >content; //根据输入来进行查找并删除 if(content[0]>='0'&&content[0]<='9') { intflag=0;//标记是否找到对应学生; stringID=content; charanswer;//记录回答的内容 while(p!=NULL) { //++n; stuID=p->stu.get_stuID(); if(stuID==ID) { flag++; name=p->stu.get_name(); p->stu.get_scores(&english,&math,&cpp,&total,&average); cout<<"姓名\t"<<"学号\t"<<"英语\t"<<"数学\t"<<"C++\t"<<"总分\t"<<"平均分\t"< >answer; if(tolower(answer)=='y') { if(pf==NULL) { List*temp=p;//暂时保存指向该结点的指针 pHead=p->pNext;//跳过当前结点,实现信息的删除 deletetemp;//将其所占内存删除 } else { List*temp=p;//暂时保存指向该结点的指针 pf->pNext=p->pNext;//跳过当前结点,实现信息的删除 deletetemp;//将其所占内存删除 } cout<<"\t该组信息已删除!"< pNext;//设置指针指向下一个结点 } if(flag==0) cout<<"没有找到该学生!"< stu.get_name(); if(name==na) { flag++; stuID=p->stu.get_stuID(); p->stu.get_scores(&english,&math,&cpp,&total,&average); cout<<"姓名\t"<<"学号\t"<<"英语\t"<<"数学\t"<<"C++\t"<<"总分\t"<<"平均分\t"< >answer; if(tolower(answer)=='y') { if(pf==NULL) { List*temp=p;//暂时保存指向该结点的指针 pHead=p->pNext;//跳过当前结点,实现信息的删除 deletetemp;//将其所占内存删除 } else { List*temp=p;//暂时保存指向该结点的指针 pf->pNext=p->pNext;//跳过当前结点,实现信息的删除 deletetemp;//将其所占内存删除 } cout<<"\t该组信息已删除!"< pNext;//设置指针指向下一个结点 } if(flag==0) cout<<"没有找到该学生!"< >location; while(p!=NULL)//遍历链表 { num=p->stu.get_num(); if(num==location) { ++flag; cout<<"请输入新增学生的信息"< >name>>stuID>>english>>math>>cpp; List*new_node=newList;//创建一个新的结点 new_node->stu.set_name(name); new_node->stu.set_stuID(stuID); new_node->stu.set_scores(english,math,cpp); new_node->stu.count_total();//计算总成绩 new_node->stu.count_avg();//计算平均成绩 if(pf==NULL) { new_node->pNext=p; pHead=new_node; break; } else { new_node->pNext=p; pf->pNext=new_node; break; } } pf=p; p=p->pNext; } if(flag==0) { cout<<"请输入新增学生的信息"< >name>>stuID>>english>>math>>cpp; List*new_node=newList;//创建一个新的结点 new_node->stu.set_name(name); new_node->stu.set_stuID(stuID); new_node->stu.set_scores(english,math,cpp); new_node->stu.count_total();//计算总成绩 new_node->stu.count_avg();//计算平均成绩 pf->pNext=new_node; new_node->pNext=NULL; } } //保存链表至文件中 voidList::save_list() { stringname;//姓名 stringstuID;//学号 doubleenglish;//英语成绩 doublemath;//数学成绩 doublecpp;//C++成绩 doubletotal;//总成绩 doubleaverage;//平均成绩 List*p=pHead; ofstreamfout; fout.open("student.txt",ios::out); while(p!=NULL) { name=p->stu.get_name(); stuID=p->stu.get_stuID(); p->stu.get_scores(&english,&math,&cpp,&total,&average); fout< pNext; } fout.close(); } //销毁链表,释放内存空间 voidList::delete_list() { List*p=pHead; List*pt; while(p!=NULL) { pt=p; p=p->pNext; deletept; } pt=NULL; pHead=NULL; p=NULL; } student.txt
小赵01909090
小王02848489
小方03868590
小李04907670
小刘05897890
小曹06607869
小张07807090
小田08909090
小童09897867如果程序运行不了,或有什么问题的话,欢迎在评论区留言
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。