资源描述
目 录
目 录
第1章 引言 1
1.1 设计目的 1
1.2 设计目标 1
1.3 研究思路 2
1.4小组分工 2
1.5 本章小结 2
第2章 总体设计 3
2.1 系统需求 3
2.2功能结构 3
2.3 本章小结 4
第3章 详细设计 5
3.1 学生信息定义 5
3.2 功能模块 5
3.3 本章小结 6
第4章 系统实现 7
4.1系统主界面 7
4.2 学生信息录入界面 9
4.3 学生成绩管理界面 10
4.4 学生成绩统计界面 19
4.5 学生成绩查询界面 27
4.6 本章小结 32
第5章 测试和调试 33
5.1 测试和调试 33
5.2 系统存在的问题 33
5.3 收获及心得 33
5.4 本章小结 34
参考文献 35
致 谢 36
I
第1章 引言
第1章 引言
1.1 设计目的
目前,学校工作繁杂、资料重多,虽然各类管理信息系统已进入社会,但还未普及,而对于学生信息管理来说,目前还没有一套完整的、统一的系统。因此,开发一套适和大众的、兼容性好的学生管理系统是很有必要的。
1.2 设计目标
设计一个小型学生成绩管理系统。该系统将完成学生信息的查询、添加、修改,学生成绩的查询等功能。
1.2.1 基本功能
对学校学生信息管理的系统,主要划分为以下三个模块:
录入:包括录入学生基本个人信息。
管理:包括对学生成绩信息的修改,增加,删除。
查询:按学号,姓名查询、输出学生所有信息。
统计:按总分和平均分进行排名,以及统计及格人数,优秀的人数。
学生成绩管理系统的功能结构图如图1-1所示。
图1-1 学生成绩管理系统功能模块图
1.2.2 扩展功能
可以增加新学生的信息,统计及格人数和。
1.3 研究思路
首先确定要实现的功能,在我们的学生成绩管理系统中主要体现对学生成绩信息的操作如添加,查询,修改等;其次体现了学生对自己信息的查询,及浏览本人成绩信息的功能。
在具体实现时,利用C++的输出格式显示操作的界面,利用函数实现相应的模块功能,再利用循环、选择可灵活进行重复操作。
1.4小组分工
本次实训由衡欣、魏千森、王跃霖、王晓峰我们四位同学一组,每位同学的具体分工如下:
衡 欣:负责整个系统的框架以及整个界面的实现和学生成绩管理函数的实现以及各个函数的衔接;
王晓峰:负责学生成绩信息录入函数的实现;
王跃霖:负责学生成绩统计函数的实现;
魏千森:负责学生成绩查询函数的实现;
1.5 本章小结
本章主要对学生成绩管理系统以及研究思路进行了简单的介绍,为后面的工作做铺垫。
39
第2章 总体设计
第2章 总体设计
2.1 系统需求
管理人员在学生成绩信息录入界面可以录入多位学生信息,录入完毕后可以在学生成绩管理界面完成修改、增加、查询学生成绩信息等功能。管理人员也可以在学生信息查询界面完成查询学生的基本信息的功能,以及在学生成绩统计界面查询学生成绩的总分排名和平均分排名以及学生及格的人数和优秀的人数。
2.2功能结构
通过前面的分析,可以得到学生成绩管理系统如图2-1所示。其功能如下:
(1)录入学生信息
管理员输入学生基本信息和成绩信息。
(2)学生成绩操作
成绩管理界面,可以对学生成绩信息进行修改,增加,删除。
(3)学生成绩统计
进入成绩统计界面,可以查询学生成绩的排名和及格,优秀人数信息。
(4)学生成绩查询
进入查询界面可查询所有学生的成绩或按学号以及姓名查询学生成绩。
图2-1 学生成绩管理系统体系结构图
2.3 本章小结
本章主要从总体上对学生成绩管理系统的各功能模块进行了分析。
第3章 详细设计
第3章 详细设计
3.1 学生信息定义
本系统中主要考虑了学生的姓名、学号、性别、班级、科任老师、高等数学、大学英语、c++成绩等信息,利用结构体来定义每个学生的具体信息,利用结构体数组来存放多个学生的信息。
学生结构定义如下:
struct stuent //定义一个结构体变量
{
int number; //学生学号
char name[20]; //学生姓名
char sex[20]; //性别
int grade; //班级
char teacher[20]; //科任老师
float math; //高等数学
float english; //大学英语
float c; //c++语言
float java; //java成绩
float sum; //总成绩
float ave; //平均成绩
}stu[200],a; //定义一个能容下200个学生信息的静态结构体数组以存放学生的相关信息,和一个空闲的静态结构体变量a,为后面的排名函数作准备。
3.2 功能模块
(1)主模块
这一模块是系统的主界面,在main()函数中包括以下几个函数,它们的函数名以及主要功能如下:
void menu():主菜单功能。
(2)学生信息录入,管理模块
学生信息录入模块由input()函数实现,具体实现学生信息的录入。学生成绩管理模块由menu2()函数实现,具体实现学生成绩修改、增加、删除等操作通过调用三个函数完成,分别为:
void revamp_student(); //主菜单2的学生成绩修改
void increase_student(); //增加
void delete_student(); //删除
(3)学生成绩统计,查询模块
学生成绩统计,查询模块由menu3()和menu4()函数实现,可以统计学生的总成绩和平均成绩排名、及格和优秀人数。查询所有学生和按学号和姓名查询学生成绩信息。通过调用如下函数来实现:
void rank_total_score(); //总成绩排名
void rank_average_score(); //平均成绩排名
int pass_score(float m); //及格人数
int pass_total_score(float m); //总分及格人数
int excellent_score(float m); //优秀人数
int escellent_total_score(float m); //总分优秀人数
void display(); //菜单4下的所有学生成绩显示 void number_check(); //按姓名查询
void name_check(); //按学号查询
3.3 本章小结
本章主要对学生成绩管理系统学生的结构定义、管理员的操作做简单描述,为下一章的具体实现做准备。
第4章 系统实现
第4章 系统实现
4.1系统主界面
在学生成绩管理系统主界面有五个选项,分别为学生成绩录入、学生成绩管理、学生成绩统计、学生成绩查询以及退出系统。运行效果如图4-1所示。
图4-1 学生成绩管理系统主界面
设计思路:利用do-while循环实现反复显示主界面各信息,利用cout语句输出主界面的各信息,利用switch-case实现选择操作,input函数实现学生信息录入,menu2()函数实现学生成绩管理,利用menu3()函数实现学生成绩统计,利用menu4()函数实现学生成绩查询,利用exit()函数实现退出系统。
核心代码如下:
void menu() //定义一个主界面函数
{
do{
cout<<"\n\t\t--学 生 成 绩 管 理 系 统---"<<endl<<"\n";
cout<<"\t\t 1. 学生成绩录入 "<<endl<<"\n";
cout<<"\t\t 2. 学生成绩管理 "<<endl<<"\n";
cout<<"\t\t 3. 学生成绩统计 "<<endl<<"\n";
cout<<"\t\t 4. 学生成绩查询 "<<endl<<"\n";
cout<<"\t\t 0. 退出系统 "<<endl<<"\n";
cout<<"\t\t 请输入0-4之间的任意一数字(仅限数字) "<<endl;
cout<<"输入: ";
cin>>choose;
switch(choose)
{
case 1:
input();
break; //录入学生信息
case 2:
menu2();
break; //学生成绩管理,包括修改、增加、删除
case 3:
menu3();
break; //学生成绩统计,包括总分排名、及格人数等
case 4:
menu4();
break; //学生成绩查询,按姓名,学号
case 0:
exit();
break; //退出系统
default:cout<<"\t对不起,输入有误"<<endl;
break;
}
}while(choose!=0);
}
4.2 学生信息录入界面
在学生成绩录入界面里管理员可以进行学生信息的录入,运行效果如图4-2所示。
图4-2 学生信息录入界面
设计思路:利用for循环可以一次性输入多个学生信息,在for循环内利用cout和cin语句实现根据提示录入学生信息。
核心代码如下:
void input() //定义一个学生录入函数
{
cout<<"请输入需要录入的学生数量:";
cin>>n; //学生数量
for(i=0;i<n;i++)
{
cout<<"\n请输入第"<<i+1<<"个学生信息:"<<endl; //输入信息
cout<<"学号:"<<' ';
cin>>stu[i].number;
cout<<"姓名:"<<' ';
cin>>stu[i].name;
cout<<"性别:"<<' ';
cin>>stu[i].sex;
cout<<"班级:"<<' ';
cin>>stu[i].grade;
cout<<"科任老师:"<<' ';
cin>>stu[i].teacher;
cout<<"高等数学成绩:"<<' ';
cin>>stu[i].math;
cout<<"大学英语成绩:"<<' ';
cin>>stu[i].english;
cout<<"c++语言成绩:"<<' ';
cin>>stu[i].c;
cout<<"java成绩:"<<' ';
cin>>stu[i].java;
stu[i].sum=stu[i].math+stu[i].english+stu[i].c+stu[i].java; //总分计算
stu[i].ave=(stu[i].sum)/4.0; //平均分计算
}
cout<<'\n'<<"输入成功,0 返回主界面"<<endl;
cout<<"输入: ";
cin>>press;
switch(press) //选择操作
{
case '0' :
break;
}}
4.3 学生成绩管理界面
在学生信息操作界面有四个选项,分别为学生成绩修改、学生成绩、学生成绩删除以及返回到学生成绩管理系统主界面。运行效果如图4-3所示。
图4-3 学生成绩管理界面
设计思路:利用do-while循环反复显示这一子界面的信息,利用cout语句输出信息,利用revamp_student()函数实现学生成绩的修改,increase_student()函数实现学生成绩的增加,delete_student()函数实现新学成绩的删除。
核心代码如下:
void menu2() //主界面下2号菜单函数
{
do{
cout<<"\n\t\t---------学 生 成 绩 管 理----------"<<endl<<"\n";
cout<<"\t\t 1. 学生成绩修改 "<<endl<<"\n";
cout<<"\t\t 2. 学生成绩增加 "<<endl<<"\n";
cout<<"\t\t 3. 学生成绩删除 "<<endl<<"\n";
cout<<"\t\t 4. 返回主界面 "<<endl<<"\n";
cout<<"\t\t 请输入1-4之间的任意一数字(仅限数字) "<<endl;
cout<<"输入: ";
cin>>choose;
switch(choose)
{
case 1:
revamp_student();break; //学生信息修改
case 2:
increase_student();break; //学生信息增加
case 3:
delete_student(); break; //学生成绩删除
case 4:
menu();break; //返回主界面
default:cout<<"\t对不起,输入有误"<<endl;
break;
}
}while(choose!=0);
}
4.3.1学生成绩修改界面
在学生成绩管理界面可以按照姓名对学生成绩进行修改,运行效果如图4-4所示。
图4-4 学生成绩修改界面
设计思路:利用for循环语句以及if条件语句实现按照姓名匹配修改,利用cout语句实现信息的输出。
核心代码如下:
void revamp_student()
{
char rs[20];
int choose_2_1;
cout<<"请输入你想修改的学生姓名:"<<endl;
cin>>rs;
for(i=0;i<n;i++)
{
if(strcmp(rs,stu[i].name)==0)
{
cout<<"你要修改的学生信息如下:"<<endl<<endl;
cout<<"学号:"<<stu[i].number<<endl;
cout<<"姓名:"<<stu[i].name<<endl;
cout<<"性别:"<<stu[i].sex<<endl;
cout<<"班级:"<<stu[i].grade<<endl;
cout<<"科任教师:"<<stu[i].teacher<<endl;
cout<<"高等数学成绩:"<<stu[i].math<<endl;
cout<<"大学英语成绩:"<<stu[i].english<<endl;
cout<<"c++语言成绩:"<<stu[i].c<<endl;
cout<<"java成绩:"<<stu[i].java<<endl;
cout<<"总分数:"<<stu[i].sum<<endl;
cout<<"平均成绩:"<<stu[i].ave<<endl<<endl;
cout<<"确认修改请按1,返回请按2:"<<endl<<endl;
cin>>choose_2_1;
switch(choose_2_1)
{
case 1:
{
cout<<"学号:"<<' ';
cin>>stu[i].number;
cout<<"姓名:"<<' ';
cin>>stu[i].name;
cout<<"性别:"<<' ';
cin>>stu[i].sex;
cout<<"班级:"<<' ';
cin>>stu[i].grade;
cout<<"科任老师:"<<' ';
cin>>stu[i].teacher;
cout<<"高等数学成绩:"<<' ';
cin>>stu[i].math;
cout<<"大学英语成绩:"<<' ';
cin>>stu[i].english;
cout<<"c++语言成绩:"<<' ';
cin>>stu[i].c;
cout<<"java成绩:"<<' ';
cin>>stu[i].java;
stu[i].sum=stu[i].math+stu[i].english+stu[i].c+stu[i].java;
stu[i].ave=(stu[i].sum)/4.0;
cout<<"修改成功。"<<endl;
break;
}
case 2:
menu2();
break;
}
}
}
}
4.3.2 学生成绩增加界面
在学生成绩增加界面可以对学生成绩进行增加。运行效果如图4-5。
图4-5 学生成绩增加界面
设计思路:定义一个i_s来保存要增加的学生人数,利用for循环来录入新增加的学生成绩信息,并使n=n+i_s确保整个数组中元素个数的正确性。
核心代码如下:
void increase_student()
{
cout<<"请输入你想增加的学生人数:"<<endl;
cin>>i_s;
for(i=n;i<n+i_s;i++)
{
cout<<"请输入你要增加的学生的数据:"<<endl;
cout<<"\n请输入第"<<i+1<<"个学生信息:"<<endl; //输入信息
cout<<"学号:"<<' ';
cin>>stu[i].number;
cout<<"姓名:"<<' ';
cin>>stu[i].name;
cout<<"性别:"<<' ';
cin>>stu[i].sex;
cout<<"班级:"<<' ';
cin>>stu[i].grade;
cout<<"科任老师:"<<' ';
cin>>stu[i].teacher;
cout<<"高等数学成绩:"<<' ';
cin>>stu[i].math;
cout<<"大学英语成绩:"<<' ';
cin>>stu[i].english;
cout<<"c++语言成绩:"<<' ';
cin>>stu[i].c;
cout<<"java成绩:"<<' ';
cin>>stu[i].java;
stu[i].sum=stu[i].math+stu[i].english+stu[i].c+stu[i].java; //总分计算
stu[i].ave=(stu[i].sum)/4.0; //平均分计算
}
n=n+i_s;
}
4.3.3 学生成绩删除界面
在学生信息删除界面管理员可以删除学生的信息,运行效果如图4-6所示。
图4-6 学生成绩删除界面
设计思路:利用if和for循环来匹配要删除的学生的姓名然后利用逐个替换法用要删除的对象的后一个元素替换前一个元素,在匹配找到要删除的对象前利用cout语句以及cin语句来实现根据提示要删除的学生的信息。利用switch-case确认删除后n自减1,以保证后续查询所有学生成绩信息的正确。
核心代码如下:
void delete_student()
{
char ds[20];
int choose_2_3;
cout<<"请输入你想要删除的学生姓名:"<<endl;
cin>>ds;
for(i=0;i<n;i++)
{
if(strcmp(ds,stu[i].name)==0)
{
cout<<"你要删除的学生信息如下:"<<endl<<endl;
cout<<"学号:"<<stu[i].number<<endl;
cout<<"姓名:"<<stu[i].name<<endl;
cout<<"性别:"<<stu[i].sex<<endl;
cout<<"班级:"<<stu[i].grade<<endl;
cout<<"科任教师:"<<stu[i].teacher<<endl;
cout<<"高等数学成绩:"<<stu[i].math<<endl;
cout<<"大学英语成绩:"<<stu[i].english<<endl;
cout<<"c++语言成绩:"<<stu[i].c<<endl;
cout<<"java成绩:"<<stu[i].java<<endl;
cout<<"总分数:"<<stu[i].sum<<endl;
cout<<"平均成绩:"<<stu[i].ave<<endl<<endl;
cout<<"确认删除请按1,返回请按2:"<<endl<<endl;
cin>>choose_2_3;
switch(choose_2_3)
{
case 1:
{
stu[i]=stu[i+1];
n=n-1;
cout<<"删除成功。"<<endl;
break;
}
case 2:
menu2();
break;
}
}
}
}
4.4 学生成绩统计界面
在学生成绩统计界面可以统计学生总分和平均分的排名,也可以统计成绩及格和优秀的学生人数。运行效果如图4-7所示。
图4-7 学生成绩统计界面
分析:利用do-while语句实现反复显示学生成绩统计界面,利用switch-case语句来选择需要统计的内容。利用rank_total_score()函数实现总分的排名,利用rank_average_score()实现平均分的排名,利用pass_score(float m)函数统计及格人数,利用pass_total_score(float m)统计总分及格人数,利用excellent_score(float m)和escellent_total_score(float m)函数实现统计优秀人数和总分优秀人数。
核心代码如下:
void menu3()
{
do{
cout<<"\n\t\t----学 生 成 绩 统 计---------------"<<endl<<"\n";
cout<<"\t\t 1. 总 分 排 名 "<<endl<<"\n";
cout<<"\t\t 2. 平均成绩排名 "<<endl<<"\n";
cout<<"\t\t 3. 及 格 人 数 "<<endl<<"\n";
cout<<"\t\t 4. 优 秀 人 数 "<<endl<<"\n";
cout<<"\t\t 5. 返 回 主界面 "<<endl<<"\n";
cout<<"\t\t 请输入1-5之间的任意一数字(仅限数字) "<<endl;
cout<<"输入: ";
cin>>choose;
switch(choose)
{
case 1:
rank_total_score();break; //总分排名
case 2:
rank_average_score(); break; //平均成绩排名
case 3:
menu3_3();break; //及格人数
case 4:
menu3_4();break; //优秀人数
case 5:
menu();break; //返回主界面
default:cout<<"\t对不起,输入有误"<<endl;
break;
}
}while(choose!=0);
}
4.4.1总分排名,平均成绩排名
设计思路:定义一个新的循环变量j然后利用双循环和if语句对前后成绩进行对比,利用开始定义的空闲的结构体a存放要调换的成绩,然后再把成绩高的和成绩低的作调换。
核心代码如下:
void rank_total_score()
{
int j;
for(j=0;j<n-1;j++)
{
for(i=0;i<n;i++)
{
if(stu[i].sum<=stu[i+1].sum)
{
a=stu[i];
stu[i]=stu[i+1];
stu[i+1]=a;
}
}
}
for(i=0;i<n;i++)
{
cout<<"第"<<i+1<<"名;"<<endl;
cout<<"姓名:"<<stu[i].name<<endl;
cout<<"总成绩:"<<stu[i].sum<<endl<<endl;
}
}
void rank_average_score()
{
int j;
for(j=0;j<n-1;j++)
{
for(i=0;i<n;i++)
{
if(stu[i].ave<=stu[i+1].ave)
{
a=stu[i];
stu[i]=stu[i+1];
stu[i+1]=a;
}
}
}
for(i=0;i<n;i++)
{
cout<<"第"<<i+1<<"名;"<<endl;
cout<<"姓名:"<<stu[i].name<<endl;
cout<<"平均分:"<<stu[i].ave<<endl<<endl;
}
}
4.4.2及格人数,优秀人数统计
设计思路:利用if语句对成绩大于及格和优秀标准的学生成绩进行判断,利用cout语句输出学生成绩信息并返回1,然后再调用函数的时候利用for循环对函数进行反复调用并用num来统计人数,切注意在用num来统计人数的时候要对其进行初始化即num=0。
核心代码如下:
int pass_score(float m)
{
if(m>=60)
{
cout<<"姓名;"<<stu[i].name<<endl;
cout<<"分数:"<<m<<endl<<endl;
return 1;
}
return 0;
}
int pass_total_score(float m)
{
if(m>=240)
{
cout<<"姓名;"<<stu[i].name<<endl;
cout<<"分数:"<<m<<endl<<endl;
return 1;
}
return 0;
}
int excellent_score(float m)
{
if(m>=90)
{
cout<<"姓名;"<<stu[i].name<<endl;
cout<<"分数:"<<m<<endl<<endl;
return 1;
}
return 0;
}
int escellent_total_score(float m)
{
if(m>=360)
{
cout<<"姓名;"<<stu[i].name<<endl;
cout<<"分数:"<<m<<endl<<endl;
return 1;
}
return 0;
}
调用函数如下(大都一致只出示一个做代表):
void menu3_3()
{
do{
cout<<"\n\t\t---及 格 人 数 统 计---------------"<<endl<<"\n";
cout<<"\t\t 1. 高 等 数 学 "<<endl<<"\n";
cout<<"\t\t 2. 大 学 英 语 "<<endl<<"\n";
cout<<"\t\t 3. c++ 语 言 "<<endl<<"\n";
cout<<"\t\t 4. java 成 绩 "<<endl<<"\n";
cout<<"\t\t 5. 总 成 绩 "<<endl<<"\n";
cout<<"\t\t 6. 平 均 成 绩 "<<endl<<"\n";
cout<<"\t\t 7. 返 回 上一页 "<<endl<<"\n";
cout<<"\t\t 8. 返 回 主界面 "<<endl<<"\n";
cout<<"\t\t 请输入1-8之间的任意一数字(仅限数字) "<<endl;
cout<<"输入: ";
cin>>choose;
switch(choose)
{
case 1:
cout<<endl<<"及格的学生:"<<endl;
num=0;
for(i=0;i<n;i++)
{
num=num+pass_score(stu[i].math);
}
cout<<"及格人数"<<num;
break; //高等数学
case 2:
cout<<endl<<"及格的学生:"<<endl;
num=0;
for(i=0;i<n;i++)
{
num=num+pass_score(stu[i].english);
}
cout<<"及格人数"<<num;
break; //大学英语
case 3:
cout<<endl<<"及格的学生:"<<endl;
num=0;
for(i=0;i<n;i++)
{
num=num+pass_score(stu[i].c);
}
cout<<"及格人数"<<num;
break; //c++语言
case 4:
num=0;
cout<<endl<<"及格的学生:"<<endl;
for(i=0;i<n;i++)
{
num=num+pass_score(stu[i].java);
}
cout<<"及格人数"<<num;
break; //java成绩
case 5:
num=0;
cout<<endl<<"及格的学生:"<<endl;
for(i=0;i<n;i++)
{
num=num+pass_total_score(stu[i].sum);
}
cout<<"及格人数"<<num;
break; //总成绩
case 6:
num=0;
cout<<endl<<"及格的学生:"<<endl;
for(i=0;i<n;i++)
{
num=num+pass_s
展开阅读全文