学生成绩管理系统课程设计报告C++实现.docx
《学生成绩管理系统课程设计报告C++实现.docx》由会员分享,可在线阅读,更多相关《学生成绩管理系统课程设计报告C++实现.docx(34页珍藏版)》请在冰豆网上搜索。
![学生成绩管理系统课程设计报告C++实现.docx](https://file1.bdocx.com/fileroot1/2022-11/28/da11f6d8-da31-42ac-b6ea-e637c012f3ae/da11f6d8-da31-42ac-b6ea-e637c012f3ae1.gif)
学生成绩管理系统课程设计报告C++实现
C++课程设计报告
课程设计题目:
学生成绩管理系统
学生姓名:
吴深深
学号:
201420181013
专业:
软件工程
班级:
1421810
指导教师:
邓微
2015年6月27日
目录
1功能需求分析3
2总体设计3
3数据结构的设计5
4算法设计8
4.1总体的算法设计8
4.2较难部分的算法设计9
4.2.1密码验证模块9
4.2.2降序排序部分9
4.2.3打开已有文件部分11
5.程序代码12
6.运行环境24
7.运行结果24
8.课程设计总结28
学生成绩管理系统课程设计报告
1功能需求分析
学生成绩管理是一个学校必不可少的部分,随着计算机和计算机知识的普及,学生成绩管理系统得到了更大的发展空间,通过对学生成绩管理系统的开发,可以提高校务人员的工作效率。
本系统具有以下基本功能:
1、功能菜单实现功能选择;
2、输入功能:
输入学生信息,并保存到文件中;
3、计算每个学生的总分与平均分并排序
4、能根据学号修改学生信息
5、能根据学号删除学生信息
6、查询功能:
1)能够根据学号查询学生信息;
2)能够根据姓名、班级查询学生信息
3)统计学生成绩,按照班级和科目计算平均分。
2总体设计
根据以上功能需求,本系统定义了一下函数,来逐步实现。
(1)voidinput_student();该函数实现从键盘中录入学生成绩,并且保存给学生类数组。
(2)voidrank_down();该函数以总分对学生降序排序,该函数会从每个学生的成员函数中调用intget_sum()函数,在调用函数时,被调函数根据输入数据计算出总分并且返回给主调函数。
排序以冒泡法实现,排序完成后,再依次给每个学生的数据成员rank(名次)赋值。
(3)voidsave_student();在有数据后,该函数可以实现数据以十进制的方式保存,保存时,可以自己输入文件名以及保存地址。
(4)voidrwrite_student();该函数实现对学生成绩等信息进行修改,修改前,以学号先查找到该学生,并且输出其详细信息,方便操作者进行修改。
(5)voiddelete_student();该函数能够以学号为依据,实现对象的删除,并且删除后该位置会被写一个数据填充。
(6)voidserch_menu();该函数被调用后系统会进入查看菜单,可选择以不同的方式查看学生的成绩信息。
按照不同的选择,该函数会调用一下函数。
①voidsurch_number();该函数以学号为依据实现精确查找。
②voidsurch_CLASS();能够根据姓名、班级查询学生信息
③voiddetial_class();该函数能够汇总您要查询的班级详细情况,功能包括人数,每个人都详细情况,班级平均分,和该班级的各个科目的平均分。
④voidsubject_ave();该函数能够计算出所有科目的平均分。
(7)voidopen_file();该函数可以打开已经保存的学生信息,并且显示到屏幕上,打开后可以进行上述的各种操作。
除此之外,还写了voidmain_menu();主菜单,实现对上述各个功能的选择。
3数据结构的设计
UML类图
数据结构的代码设计如下:
constintN=5000;//students[N]
staticintcount=N;//控制学生的操作数,默认值为N,在main中会提示改变
classstudent//定义学生类
{
private:
stringname,sex,number,CLASS;
intchinese,math,english,comprehensive,sum,ave,rank;
public:
stringget_name()//外部接口,查询信息时用到。
{
returnname;
}
stringget_number()//外部接口,查询信息时用到。
{
returnnumber;
}
intget_chinese()//外部接口,分班级处理时用到。
{
returnchinese;
}
intget_math()//外部接口,分班级处理时用到。
{
returnmath;
}
intget_english()//外部接口,分班级处理时用到。
{
returnenglish;
}
intget_comprehensive()//外部接口,分班级处理时用到。
{
returncomprehensive;
}
intget_sum()//总分是排序的依据,在输出信息和排序时会产生
{
sum=chinese+math+english+comprehensive;
returnsum;
}
intget_ave()
{
ave=(chinese+math+english+comprehensive)/4;
returnave;
}
stringget_CLASS()
{
returnCLASS;
}
voidset_rank(intrank)//对多个学生进行排序时产生产生名次
{
this->rank=rank;
}
voidset_Rn(intnsum,intnave,intnrank)//我把总分、平均数和名次称为余项。
{//这些数据在基本数据录入后会产生。
sum=nsum;//提供这个外部接口用于从文件中读取这些数据
ave=nave;
rank=nrank;
}
friendistream&operator>>(istream&in,student&cs)//重载插入符,实现输入基本数据
{
in>>cs.CLASS>>cs.number>>cs.name>>cs.sex>>cs.chinese
>>cs.math>>cs.english>>prehensive;
returnin;
}
friendostream&operator<<(ostream&out,student&cs)//重载提取符,实现格式输出详细信息
{
out<<<<"\t"<returnout;
}
~student()
{}
};
students[N];//N=5000,但是学生的操作数是由count控制
注意:
学生的最终操作数是通过count决定。
4算法设计
4.1总体的算法设计
4.2较难部分的算法设计
4.2.1密码验证模块
该模块主要使用输入输出流的模块编写,进入密码验证模块时先检验密码文件是否存在,若不存在,则进行密码设置,进行密码设置时要输入两次,确保能够记住密码,设置密码成功后,密码内容会保存在文件。
若密码文件存在,则成功打开,输入密码并验证,只有三次输入机会。
4.2.2降序排序部分
该部分的核心算法是冒泡法实现排序。
作为学生成绩基本数据的派生,学生的排名也是一个基本的数据,本排名是在降序排序之后,通过外部接口set_rank()直接赋值给对象的数据成员rank,然后输出。
这一个循环体是该框图的核心部分,是冒泡法的算法。
该排序是以学生的总分为依据,通过类的外部接口voidget_sum()函数计算出总分并带回比较。
其中的N是在全局定义的学生的操作数,又是学生个数
4.2.3打开已有文件部分
文件保存之后,要能实现正常的读取,要不然,保存的就没有意义。
重要说明
每个学生对象有11个数据成员,为了输入与输出方便,该系统重载了插入符(>>)和提取符(<<)。
但是11个数据成员中只有8个是是从键盘输入,所以重载插入符时仅仅实现了8个基本数据的输入。
另外3个数据有两个是通过调用get_ave()和get_sum()时由基本数据自动算出并返回给调取位置,另外一个排名rank是在降序排序时产生。
所以,在重载提取符时实现了11个数据的格式输出。
所以文件中,每个成员有11个数据,通过重载的提取符只能提取8个,另外三个暂时保存在临时定义的sum,ave,rank中,通过对象的成员函数voidset_Rn(intnsum,intnave,intnrank)把剩余的三个值对象的数据成员。
从而避免从文件中读取数据时出现读取错位的现象。
5.程序代码请注意参考注释
#include
#include
#include
usingnamespacestd;
constintN=5000;//students[N]
staticintcount=N;//控制学生的操作数,默认值为N,在main中会提示改变
voidmima();//函数的声明
voidinput_student();
voidrank_down();
voidsave_student();
voidrwrite_student();
voiddelete_student();
voidserch_menu();
voidopen_file();
voidsurch_number();
voidsurch_CLASS();
voiddetial_class();
voidsubject_ave();
classstudent//定义学生类
{
private:
stringname,sex,number,CLASS;
intchinese,math,english,comprehensive,sum,ave,rank;
public:
stringget_name()//外部接口,查询信息时用到。
{
returnname;
}
stringget_number()//外部接口,查询信息时用到。
{
returnnumber;
}
intget_chinese()//外部接口,分班级处理时用到。
{
returnchinese;
}
intget_math()//外部接口,分班级处理时用到。
{
returnmath;
}
intget_english()//外部接口,分班级处理时用到。
{
returnenglish;
}
intget_comprehensive()//外部接口,分班级处理时用到。
{
returncomprehensive;
}
intget_sum()//总分是排序的依据,在输出信息和排序时会产生
{
sum=chinese+math+english+comprehensive;
returnsum;
}
intget_ave()
{
ave=(chinese+math+english+comprehensive)/4;
returnave;
}
stringget_CLASS()
{
returnCLASS;
}
voidset_rank(intrank)//对多个学生进行排序时产生产生名次
{
this->rank=rank;
}
voidset_Rn(intnsum,intnave,intnrank)//我把总分、平均数和名次称为余项。
{//这些数据在基本数据录入后会产生。
sum=nsum;//提供这个外部接口用于从文件中读取这些数据
ave=nave;
rank=nrank;
}
friendistream&operator>>(istream&in,student&cs)//重载插入符,实现输入基本数据
{
in>>cs.CLASS>>cs.number>>cs.name>>cs.sex>>cs.chinese
>>cs.math>>cs.english>>prehensive;
returnin;
}
friendostream&operator<<(ostream&out,student&cs)//重载提取符,实现格式输出详细信息
{
out<<<<"\t"<returnout;
}
~student()
{}
};
students[N];//N=5000,但是学生的操作数是由count控制
voidmima()//密码设置与验证模块
{
stringmima,mima1;
ifstreammimafile("mima.txt");
if(mimafile.fail())//检验是否设置过密码
{
cout<<"您是第一次使用本系统,请设置密码:
"<cin>>mima;
cout<<"请再输入一次:
"<cin>>mima1;
if(mima==mima1)
{
ofstreammimafile;
mimafile.open("mima.txt");
mimafile<cout<<"密码设置成功!
"<}
else//当设置密码两次输入不一致,重新设置
{
do
{
cout<<"两次输入不一致,请重新输入:
"<cin>>mima;
cout<<"请再输入一次:
"<cin>>mima1;
}while(mima!
=mima1);
ofstreammimafile;
mimafile.open("mima.txt");
mimafile<cout<<"密码设置成功!
"<}
}
else//若之前设置过密码,可以直接进入密码验证模块
{
stringmima,mima1;
cout<<"检验您之前设置过密码,请输入密码:
"<cin>>mima1;
mimafile>>mima;
if(mima!
=mima1)
{
inti=2;
for(;i>0;i--)
{
cout<<"密码错误,请重新输入(您还有"<
"<cin>>mima1;
if(mima1==mima)
{
mimafile.close();
break;
}
}
if(i<=0)
{
exit(0);
mimafile.close();
}
}
else
{
mimafile.close();
}
}
return;
}
voidinput_student()//输入学生信息
{
system("cls");
cout<<"请按照下面格式输入"<<<"班级\t学号\t姓名\t性别\t语文\t数学\t英语\t综合"<for(inti=0;i{
cin>>s[i];
}
}
voidsave_student()//保存学生信息
{
system("cls");
stringfilename;
cout<<"请输入文件名字:
"<cin>>filename;
//getline(cin,filename,'\n');
fstreamstudentfile(filename,ios:
:
out);
studentfile<studentfile<for(inti=0;i{
studentfile<
}
studentfile.close();
cout<<"数据已经成功保存为文件"<}
voidrwrite_student()//修改学生成绩信息
{
system("cls");
charF;
stringnumber;
do//用do循环实现持续的修改
{
inti=0;
cout<<"请输入要修改的学生学号:
";
cin>>number;
for(i=0;i{
if(number==s[i].get_number())
{
cout<<"修改前,学生信息为:
"<cout<<"班级\t学号\t姓名\t性别\t语文\t数学\t英语\t综合\t总分\t平均\t名次"<cout<
cout<<"请按照下面格式输入"<<<"班级\t学号\t姓名\t性别\t语文\t数学\t英语\t综合"<cin>>s[i];
cout<<"数据修改成功!
"<break;
}
}
if(i>=count)
{
cout<<"查无此人!
"<}
cout<<"是否继续修改数据?
(输入任意键继续,输入n取消本次操作。
):
";
cin>>F;
}while(F!
='n');
}
voiddelete_student()//删除学生信息
{
system("cls");
charF,P;
stringnumber;
do
{
inti=0;
cout<<"请输入要删除的学生学号:
";
cin>>number;
for(i=0;i{
if(number==s[i].get_number())
{
cout<<"要删除的学生信息为:
"<cout<<"班级\t学号\t姓名\t性别\t语文\t数学\t英语\t综合\t总分\t平均\t名次"<cout<
cout<<"是否删除?
(输入任意键继续,输入n取消本次操作。
)"<cin>>P;
if(P!
='n')
{
for(;i{
s[i]=s[i+1];//数据删除过程
}
cout<<"数据删除成功!
"<count--;//数据删除后,就少了一个,计数变量自减
}
break;
}
}
cout<<"是否继续查找删除对象?
(输入任意键继续,输入n取消本次操作。
):
";
cin>>F;
}while(F!
='n');
}
voidsurch_number()//按照学号查找学生成绩信息
{
system("cls");
charF;
stringnumber;
do//用do实现持续删除
{
inti=0;
cout<<"请输入要查询的学生学号:
";
cin>>number;
for(i=0;i{
if(number==s[i].get_number())
{
cout<<"该学生详细信息为:
"<cout<<"班级\t学号\t姓名\t性别\t语文\t数学\t英语\t综合\t总分\t平均\t名次"<cout<
cout<<"查询结束!
"<break;
}
}
if(i>=count)
{
cout<<"查无此人!
"<}
cout<<"是否继续查找?
(输入任意键继续,输入n取消本次操作。
):
";
cin>>F;
}while(F!
='n');
}
voidsurch_CLASS()//按照班级和姓名实现学生信息的查找
{
system("cls");
charF;
stringname,CLASS;
do//用do循环实现持续的查找
{