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;向量或数组,存储该班级的所有学生,vectorstu;
成员函数(公有):
构造函数;
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、定义全局变量
vectorallClass;//班级向量allClass,保存所有的班级信息,系统中可以有多个班级。
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