C++语言 学生成绩管理系统.docx
- 文档编号:9790681
- 上传时间:2023-02-06
- 格式:DOCX
- 页数:55
- 大小:483.95KB
C++语言 学生成绩管理系统.docx
《C++语言 学生成绩管理系统.docx》由会员分享,可在线阅读,更多相关《C++语言 学生成绩管理系统.docx(55页珍藏版)》请在冰豆网上搜索。
C++语言学生成绩管理系统
《高级语言课程设计》
实验项目:
学生成绩管理系统
学号:
姓名:
专业:
班级:
指导教师:
成绩:
年月日
3.1记录录入模块的实现……………………………………………………...........11
3.2信息管理模块的实现…………………………………………………………...16
3.3成绩管理模块的实现…………………………………………………………...23
3.4保存退出模块的实现…………………………………………………………...33
1、系统分析
本程要求学生完成学生成绩管理系统的设计和实现,该系统包括学生记录录入、学生信息管理和学生成绩管理三大功能模块。
学生记录录入功能包括从键盘录入,和从文件录入两种方式。
学生信息管理功能分为学生信息显示、学生信息添加(依然可以有两种录入方式)、学生信息删除、学生信息修改四个子模块。
学生信息显示模块显示所有学生信息;学生信息添加模块向学生文件中添加学生信息;学生信息删除模块从文件中删除指定学号的学生信息;学生信息修改模块修改指定学号的学生信息。
学生成绩管理模块分为学生成绩排序和学生成绩查询两个子模块。
学生成绩排序模块需要分别实现:
按学号从小到大排序;按总成绩从大到小排序两种不同的排序方式。
学生成绩查询模块需要分别实现:
查询给定学号的学生信息;查询给定姓名的学生信息;查询给定班级的学生信息;查询60分以下学生的信息;查询平均分80分以上的学生信息等不同的查询方式。
系统功能模块图如下所示。
2、系统设计
2.1数据结构设计
学生成绩管理系统中需要处理的数据对象有,学生、班级、课程等。
要求设计并实现学生类Student、Person类、课程成绩类Score、班级类Class。
将类定义放在头文件中,将类中成员函数的定义放在源文件中。
1、定义课程成绩类Score
数据成员(私有)
课程名name:
长度为40的字符数组;
学分credit:
整型;
成绩score:
浮点型;
成员函数(公有):
无参构造函数,将学分和成绩初始化为0;
voidsetInfo(char*sname,intcre,floats);//给各数据成员赋值
voidprint();//输出课程成绩信息
为了方便学生类Student访问该类的成员,将学生类Student声明为课程成绩类Score的友类。
2、定义Person类
数据成员(保护):
姓名name:
长度为20的字符数组;
年龄age:
整型;
性别sex:
字符型;
成员函数(公有):
voidsetInfo(char*pName,intpAge,charpSex);//给各数据成员赋值
voidprint();//输出信息
3、定义学生类型Student
学生类继承Person类;
数据成员(私有):
学号stuId:
长度为10的字符数组;
班级名className:
长度为10的字符数组;
课程成绩score:
向量或者数组(一个学生有多个课程成绩
总成绩total:
浮点型;
平均成绩ave:
浮点型;
总学分allCredi:
整型;
课程数courseNum:
整型;
标志标量isLess60:
布尔类型,标志是否有60分以下课程
成员函数(公有):
无参构造函数:
将数据置为0
voidsetInfo(char*sID,char*sName,intage,charsex,char*clas);
voidsetInfo(char*sID,char*sName,intage,charsex);//设置信息
voidaddScore(Score&one);//添加课程成绩信息
voidprint();//输出学生信息
voidprintLess60();//输出60分以下的课程
char*getStuID();//获取各数据成员的get方法
char*getStuName();
char*getClassName();
floatgetTotal();
intgetAllCredit();
intgetCourseNum();
floatgetAve();
boolgetIsLess60();
voidwriteStudentToFile(char*fileName);//将学生信息写入文件
4、定义班级类Class
数据成员(私有):
班级名className:
长度为10的字符数组;
班级人数num:
整型;
学生stu;向量或数组,存储该班级的所有学生,vector
成员函数(公有):
构造函数;
voidaddStu(Student&one);//向学生向量stu中添加学生
voidprintAll();//输出该班级的所有学生信息
voidsetClassName(char*clasname);设置班级名
获取各数据成员的get方法。
intgetClassNum();
char*getClassName();
voidprintStudents();//输出一个班的学生
booldelStu(char*id);
boolreviseStu(char*id);
boolsearchStuByID(char*TstuID);
boolIDhefa(char*TstuID);//判断所输入的学号是否合法
boolsearchStuByName(char*TstuName);
intAveOver80();
intless60();
voidlistTotalScore();
voidlistStuID();
voidwriteClassToFile(char*fileName);
2.2各功能模块设计
2.2.1学生记录录入模块设计
1、定义全局变量
vector
intstuNum;//stuNum表示系统中当前学生人数
注:
全局变量在一个源文件中定义,在其它源文件中使用时通过extern进行声明;不要重复定义全局变量。
2、定义函数Class*getClass(char*name);
参数:
班级名
返回:
指向班级的指针
功能:
在全局变量allClass中查找指定班级名的班级,如果找到返回该班级的地址,如果找不到返回NULL。
3、定义函数voidaddStudentFormKeyboard();
功能:
从键盘录入学生信息,并将信息保存在全局变量allClass中。
4、定义函数voidreadFromFile();
功能:
从文件录入学生信息,并将信息保存在全局变量allClass中。
文件中学生记录存放特点:
第一行是一个整数n,表示该文件中学生记录总数为n;
接下来是n个学生记录;
每个学生记录的第一行依次存放学号、姓名、年龄、性别、班级
每个学生记录的第二行存放该学生的课程总数m;
接下来分m行存放,每行存放一门课程,依次为课程名、学分、成绩。
例如,下图文件中信息含义如下:
第一行2,表示共有2个学生;
第二行,表示第一个学生的学号、姓名、年龄、性别、班级;
第三行2,表示第一个学生有2门课;
第四行,表示第一个学生的第一门课;
第五行,表示第一个学生的第二门课;
2.2.2学生信息管理模块设计
该模块设计并实现学生信息管理模块的功能,学生信息管理功能分为学生信息显示、学生信息添加、学生信息删除、学生信息修改四个子模块。
实验内容:
1、学生信息显示功能
voidprintAll();//将所有学生信息显示到屏幕
功能:
遍历在全局向量allClass,调用每个班级对象的printAll()方法,将所有学生信息显示到屏幕。
2、学生信息添加功能
前面已经定义了从键盘录入学生记录的方法voidaddStudentFormKeyboard();
实现该功能时直接调用此方法即可addStudentFormKeyboard();
3、学生信息删除功能
(1)给班级类添加方法:
booldelSut(char*id);
功能:
从本班级中删除指定学号的学生信息,删除成功返回true,学生不存在返回false。
(2)定义函数:
voiddelStudent()();
功能:
从键盘录入学生学号,遍历在全局向量allClass,删除指定学号的学生信息。
在菜单程序中调用此函数即可。
4、学生信息修改功能
(1)给班级类添加方法:
boolreviseStu(char*id);
功能:
修改本班级中指定学号的学生信息,修改成功返回true,学生不存在返回false。
(2)定义函数:
voidreviseStudent();
功能:
从键盘录入学生学号,遍历在全局向量allClass,修改指定学号的学生信息。
在菜单程序中调用此函数即可。
2.2.3学生成绩管理模块设计
该模块设计并实现学生成绩管理模块的功能。
学生成绩管理模块分为学生成绩排序和学生成绩查询两个子模块。
学生成绩排序模块需要分别实现:
按学号从小到大排序;按总成绩从大到小排序两种不同的排序方式。
学生成绩查询模块需要分别实现:
查询给定学号的学生信息;查询给定姓名的学生信息;查询给定班级的学生信息;查询60分以下学生的信息,查询平均分80分以上的学生信息。
实验内容:
1、按学号从小到大排序
(1)给班级类添加方法:
voidsprintStudentByID();
功能:
对本班级学生信息,按学号从小到大排序。
(2)定义函数:
voidsortById();
功能:
遍历在全局向量allClass,对所有班级的学生信息按学号从小到大排序。
在菜单程序中调用此函数即可。
2、按总成绩从高到低排序
(1)给班级类添加方法:
voidprintStudentByTotalScore();
功能:
对本班级学生信息,按总分从高到低排序。
(2)定义函数:
voidprintStudentByTotalScore()
功能:
遍历在全局向量allClass,对所有班级的学生信息按总分从高到低排序。
在菜单程序中调用此函数即可。
3、输出所有60分以下学生信息
(1)给学生类添加方法:
printStudentIsLess60();
功能:
如果学生有60分以下的课程,输出该学生基本信息及60分以下的课程信息。
(2)定义函数:
intLess60();
功能:
获得一个班级内60分以下课程的学生人数。
(3)调用班级类方法:
printStudent();
功能:
输出该班级中所有具有60分以下课程的学生信息。
其中还包含着printScore()方法,输出学生的成绩
4、输出平均分在80分以上的学生信息
(1)给班级类添加方法:
voidprintStudentAveOver80();
功能:
输出该班级中所有平均分在80分以上的学生信息。
(2)定义函数:
voidprintStudentAveOver80();
功能:
遍历在全局向量allClass,调用每个班级对象的printMore80()方法,将所有具有80分以上课程的学生信息输出。
在菜单程序中调用此函数即可。
5、查询指定学号的学生信息
(1)给班级类添加方法:
boolClass:
:
searchStuByID(char*TstuID);
功能:
在本班级中查找指定学号的学生信息,如果找到输出该学生的信息,并返回真,如果找不到返回假。
(2)定义函数:
voidsearchStudentByID();
功能:
遍历在全局向量allClass,在所有班级中查找指定学号的学生信息。
在菜单程序中调用此函数即可。
6、查询指定姓名的学生信息
(1)给班级类添加方法:
boolClass:
:
searchStuByName(char*stuName);
功能:
在本班级中查找指定姓名的学生信息,如果找到输出该学生的信息,并返回真,如果找不到返回假。
(2)定义函数:
voidsearchStudentByName();
功能:
遍历在全局向量allClass,在所有班级中查找指定姓名的学生信息。
在菜单程序中调用此函数即可。
7、查询指定班级的学生信息
定义函数:
voidsearchStudentByClass();
功能:
遍历在全局向量allClass,查询给定班级名的学生信息,如果找到输出该班级的学生信息,如果找不到输出提示信息。
3、系统实现
主菜单的实现:
//主菜单
voidmenu()
{
intselect;
do
{
system("cls");
cout< cout<<"****学生成绩管理系统[当前学生人数: "< cout<<"1.学生记录录入功能"< cout<<"2.学生信息管理功能"< cout<<"3.学生成绩管理功能"< cout<<"4.保存"< cout<<"0.退出"< cout<<"*********************************************"< cout< "; fflush(stdin);//清除缓存 cin.clear(); cin>>select; if(select>=0&&select<=4) break; }while(true); switch(select) { case1: menu1();break; case2: menu2();break; case3: menu3();break; case4: menu4();break; case0: exit();break; } } 如图所示: 3.1学生记录录入模块的实现 该模块的菜单实现为: voidmenu1() { intselect; do { system("cls"); cout<<"****学生成绩管理系统[当前学生人数: "< cout<<"1.从键盘输入学生记录"< cout<<"2.从文件导入学生记录"< cout<<"0.返回上级目录"< cout<<"**********************************************************"< cout<<"请给出你的选择<0-2>: "< fflush(stdin);//清除缓存 cin.clear(); cin>>select; if(select>=0&&select<=2) break; }while(true); switch(select) { case1: addStudentFromKeyboard(); menu1();break; case2: readFromFile(); menu1();break; case0: menu();break; } } 如图所示: 学生记录录入分两种录入方式: 1从键盘输入信息 2从文件导入信息 ①从键盘输入信息的实现函数为: voidaddStudentFromKeyboard() { intn; cout<<"你需要输入的人数是: "; cin>>n; Studentstu1; charstuId[10];charclassName[10];charstuName[20];charsex;intage;//基本属性定义 for(inti=1;i<=n;i++) { cout<<"请输入第["< cout<<"输入学号【长度不超过10】: ";//提示信息 cin>>stuId; while(true)//判断学号是否非法 { boolisFind=false; vector : iteratorip=allClass.begin(); while(ip! =allClass.end()) { if(ip->IDhefa(stuId)==true)//调用函数 { isFind=true; break; } ip++; } if(isFind==true) { cout<<"【对不起,该学号已经是存在的】请重新输入: "; cin>>stuId; } else break;//如果学号是合法的就跳出循环 } cout<<"姓名: "; cin>>stuName; cout<<"年龄: "; cin>>age; cout<<"性别【男: m或者M女: f或者F】"; cin>>sex; cout<<"班级: "; cin>>className; stu1.setInfo(stuId,stuName,age,sex,className); cout<<"请依次输入该学生选修的课程信息: 【课程名,学分,分数】"< cout<<"【温馨提示: 】需要终止时在行末尾加#符号"< charc;//c为输入结束判断 charcourseName[40];intcredit;floatscore; for(intj=0;;j++) { cout<<"输入第["<<(j+1)<<"]门课: "; cin>>courseName>>credit>>score; Scorescore1; score1.setInfo(courseName,credit,score); stu1.addScore(score1); c=getchar(); if(c=='#')break; } if(NULL==getClass(className)) { Classc1; c1.addStu(stu1); c1.setClassName(className); allClass.push_back(c1); } else//该学生所在班级在classes中已存在 { getClass(className)->addStu(stu1); } stuNum++; } cout<<"输入完成"< system("pause");//系统暂停 fflush(stdin); cin.clear(); } 如图所示: ②从文件导入信息的实现函数为 voidreadFromFile() { charstuId[10],className[10],stuName[20],sex; intage; charcourseName[40]; intcredit; floatscore; intnum;//文件中学生记录个数 intcourseNum;//课程数 charfileName[40];//文件名 stringstr;//字符串 cout<<"请输入文件名: "; cin>>fileName; str=fileName; fstreamfin; fin.open(fileName,ios: : in); if(! fin) { cout<<"文件不能打开! "< } else { getline(fin,str);//读第一行,放在str中 istringstreamsin(str);//定义字符串流对象sin if(sin>>num)stuNum+=num;//从字符串str中读入一个整数放在变量num中,读入成功,全局变量stuNum加上num。 for(inti=0;i { getline(fin,str);//读入第一行 istringstreamsin1(str);//定义字符串流对象sin1 sin1>>stuId; //在读取文件的时候判断是否有学号错误的 boolisFind=false; vector : iteratorip=allClass.begin(); while(ip! =allClass.end()) { if(ip->IDhefa(stuId)==true) { isFind=true; break; } ip++; } if(isFind==true) { cout<<"【对不起,"< } sin1>>stuName>>age>>sex>>className; Studentstu1;//创建学生对象 stu1.setInfo(stuId,stuName,age,sex,className); getline(fin,str);//读入下一行,即读入课程数courseNum; istringstreamsin2(str); sin2>>courseNum; for(intj=0;(j {//循环读入courceNum门课程信息 istringstreamsin2(str);//定义字符串流对象; sin2>>courseName>>credit>>score;//依次读入课程名,学分,成绩 Scores; s.setInfo(courseName,credit,score); stu1.addScore(s); } //第一个学生信息读入完成,下面需要将该学生放入全局变量allClass中。 if(NULL==getClass(className)) { Classc1; c1.s
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+语言 学生成绩管理系统 C+ 语言 学生 成绩管理系统