一、系统需求分析
1、总需求
设计一个实用的小型学生成绩管理程序,具有查询,检索和删除等功能。
2、具体需求
(1)学生基本信息、考试科目及成绩的信息录入。
(2)已有学生信息的显示。
(3)学生基本信息的读取和保存输入数据等功能
(4)学生基本信息的查询与修改。可以对已有的学生信息进行修改。
(5)学生基本信息的删除。
(6)对该班各科成绩进行分析;对学生成绩进行统计(包括最高分,最低分,排序,平均成绩,及格率和需要补考的学生)
具体源码详见
https://download.csdn.net/download/weixin_44855366/12838949
二、总体设计
1、定义四个类Student类、StudentData类、StudentFile类、StudentManagement类,它们的继承关系如下图所示:
三、 详细设计
1、基类Student
定义字符型变量Name[20]、Number[20],采用默认构造函数Student(),为了派生类能够正确析构对象,定义析构函数为虚析构函数,virtual ~Student()解 决静态绑定 防止内存泄漏,定义GetName()、GetNumber()函数进行姓名和学号的初始化赋值。
GetName()、GetNumber()函数调用cstring库函数strcpy_s对name、number 赋值。
2、派生类StudentData设计说明
StudentData类主要是对学生成绩的记录包括学科数目、学科名字和成绩的录入,StudentData定义了学科数目整型变量SubjectNumber、学科字符串变量 Subject[10]、成绩整型数组Score[10]、总分Sum。同时定义给SubjectNumber赋值以及给Subject、Score、Sum、Rank赋值的成员函数GetSubjectNumber()、 GetSubject()。GetSubject()使用循环结构对Subject[10]、Score[10]、Sum赋值。
3、派生类StudentFile设计说明
StudentFile类实现学生成绩文件的输入和输出,主要定义了四个函数: Initialize()、Add()、Read()、Write()。Initialize()用于建立新文件,建立流对象并创建FileName字符数组存储文件名,进行文件的建立和初始化,以写方式输出标题到txt文档首行,表明这是一个学生信息管理系统保存文档;Read()从文件头读取文件内容到内存,读取方式为逐行读取并将行读入字符数组, 行之间用回车换行区分。Write()函数从文件头开始从内存输出数据到文件,同时定义索引数组元素值初始化为类数组元素地址,采用冒泡排序法对总分Sum进行排序并写入对应学生的类数据成员中,最后将记录写入文件。Add()用于添加学生信息,创建对象数组,容量为100并初始化学生人数StuNum为0,以追加方式打开已创建的txt文档并写入文档,再次打开文件将文件中的记录重新排序后写入文件。
4、派生类StudentManagement设计说明
StudentManagement是该学生信息管理系统中操作函数最多的类,实现对学生成绩的统计和分析,包括最高分、最低分、排序、平均成绩、及格率和需要补考的学生等信息的统计,同时定义学生基本信息的查询、修改以及删除函数。Delete()函数可按姓名查询删除和按学号查询删除,两项子功能的实现方式一致,读取文件后调用库函数strcmp()进行姓名或者学号搜索并返回学生信息(姓名、学号、总分、学科、分数),删除功能的思想是把读取的对象数组从后往前覆盖数据直到删除位置,然后在写文件的同时重新排序。Refer()函数是查询目的数据,与Delete()函数一样可按姓名查询和按学号查询,两项子功能的实现方式一致,读取文件后调用库函数strcmp()进行姓名或者学号搜索并返回学生信息(姓名、学号、总分、学科、分数)。Modify()可按姓名查询和按学号 查询后修改,修改即重新赋值。
在子菜单【5】学生信息统计中,有四个子功能即排序、平均分、最高分最低分、挂科率及名单,RankSort()函数为按照总分排序,采用冒泡排序法对学生 总分进行排序,RankSort()函数在Write()函数也有类似算法,额外定义RankSort()函数主要是在没有读写文件时调用进行排序;GetAverage()函数输出指定学科的平均分;GetHighLow()函数返回指定科目的最高分最低分学生的部分信息(名次、总分、姓名);GetPass()返回及格率和需要补考的学生名单。
5、main函数设计说明
main函数采用switch和goto设计操作选择,创建StudentManagement对象并调用类中定义的函数实现学生数据的初始化和相关操作。
主函数中主界面设计如下:
*****************************WELCOME******************************
*************************学生成绩管理系统*************************
******************************主菜单******************************
******【1】新建学生信息*******************【2】添加学生信息*******
******【3】修改学生信息*******************【4】删除学生信息*******
******【5】学生信息统计*******************【6】退出管理系统*******
******************************************************************
******************************************************************
请输入操作选项:
子菜单【5】学生信息统计设计如下:
******************************************************************
*************************【5】学生信息统计************************
*******************************①排序*****************************
*******************************②平均分***************************
***************************③最高分最低分*************************
***************************④挂科率及名单*************************
****************************⑤返回主菜单**************************
******************************************************************
请输入操作选项:
子菜单③最高分最低分设计如下
******************************************************************
****************************最高分最低分**************************
*************************①总分最高分最低分***********************
*************************②单科最高分最低分***********************
***************************③返回上一界面*************************
******************************************************************
请输入操作选项:
#include"StudentManagement.h"
#include"StudentFile.h"
int main()
{
int choice; //定义选择
StudentManagement s;//创建操作StudentManagement对象实例
//StudentFile f;//创建操作StudentFile对象实例
L://返回主菜单
while (1)
{
cout << "*****************************WELCOME******************************" << endl;
cout << "*************************学生成绩管理系统*************************" << endl;
cout << "******************************主菜单******************************" << endl;
cout << "******【1】新建学生信息*******************【2】添加学生信息*******" << endl;
cout << "******【3】修改学生信息*******************【4】删除学生信息*******" << endl;
cout << "******【5】学生信息统计*******************【6】退出管理系统*******" << endl;
cout << "******************************************************************" << endl;
cout << "******************************************************************" << endl;
cout << "请输入操作选项:";
cin >> choice;
switch (choice)
{
case 1:
{
s.Initialize();//初始化,新建管理系统录入文件
goto L;//返回主菜单
}
case 2:
{
char filename[20];
cout << "请输入打开文件名:";
cin >> filename;
s.Add(filename);//添加学生信息
goto L;//返回主菜单
}
case 3:
{
char filename[20];
cout << "请输入打开文件名:";
cin >> filename;
s.Modify(filename);//修改学生信息
goto L;//返回主菜单
}
case 4:
{
char filename[20];
cout << "请输入打开文件名:";
cin >> filename;
s.Delete(filename);//删除学生信息
goto L;
}
L1://返回
case 5:
{
int cho;
cout << "******************************************************************" << endl;
cout << "*************************【5】学生信息统计************************" << endl;
cout << "*******************************①排序*****************************" << endl;
cout << "*******************************②平均分***************************" << endl;
cout << "***************************③最高分最低分*************************" << endl;
cout << "***************************④挂科率及名单*************************" << endl;
cout << "****************************⑤返回主菜单**************************" << endl;
cout << "******************************************************************" << endl;
cout << "请输入操作选项:"; cin >> cho;
switch (cho)
{
case 1:
{
char answer;
int y = 1;
char filename[20];
cout << "请输入打开文件名:";
cin >> filename;
while (y)
{
s.RankSort(filename);//排序
cout << "是否返回上一个界面?(Y/N)";
cin >> answer;
if (answer == 'Y' || answer == 'y')
goto L1;
else
{
cout << "是否返回主菜单?";
cin >> answer;
if (answer == 'Y' || answer == 'y')
goto L;
}
}
}
case 2:
{
char answer;
char filename[20];
cout << "请输入打开文件名:";
cin >> filename;
int y = 1;
while (y)
{
s.GetAverage(filename);//计算平均值
cout << "是否继续?(Y/N)";
cin >> answer;
if (answer == 'Y' || answer == 'y')
y = 1;
else
{
cout << "是否返回上一个界面?(Y/N)";
cin >> answer;
if (answer == 'Y' || answer == 'y')
goto L1;
else
{
cout << "是否返回主菜单?";
cin >> answer;
if (answer == 'Y' || answer == 'y')
goto L;
}
}
}
}
case 3:
{
char answer;
char filename[20];
cout << "请输入打开文件名:";
cin >> filename;
int y = 1;
L2:
while (y)
{
cout << "******************************************************************" << endl;
cout << "****************************最高分最低分**************************" << endl;
cout << "*************************①总分最高分最低分***********************" << endl;
cout << "*************************②单科最高分最低分***********************" << endl;
cout << "***************************③返回上一界面*************************" << endl;
cout << "******************************************************************" << endl;
cout << "请输入操作选项:"; int d; cin >> d;
switch (d)
{
case 1:
{
s.GetHighLowAll(filename);//得出总分最高和最低
cout << "是否返回上一个界面?(Y/N)";
cin >> answer;
if (answer == 'Y' || answer == 'y')
goto L2;
else
{
cout << "是否返回子菜单“学生信息统计”?";
cin >> answer;
if (answer == 'Y' || answer == 'y')
goto L1;
}
break;
}
case 2:
{
while (1)
{
s.GetHighLowSignal(filename);
cout << "是否继续?(Y/N)";
cin >> answer;
if (answer == 'Y' || answer == 'y')
y = 1;
else
{
cout << "是否返回上一个界面?(Y/N)";
cin >> answer;
if (answer == 'Y' || answer == 'y')
goto L2;
else
{
cout << "是否返回子菜单“学生信息统计”?(Y/N)";
cin >> answer;
if (answer == 'Y' || answer == 'y')
goto L1;
}
}
}
break;
}
}
}
}
case 4:
{
char answer;
char filename[20];
cout << "请输入打开文件名:";
cin >> filename;
int y = 1;
while (y)
{
s.GetPass(filename);//统计挂科率和挂科名单
cout << "是否继续?(Y/N)";
cin >> answer;
if (answer == 'Y' || answer == 'y')
y = 1;
else
{
cout << "是否返回上一个界面?(Y/N)";
cin >> answer;
if (answer == 'Y' || answer == 'y')
goto L1;
else
{
cout << "是否返回主菜单?";
cin >> answer;
if (answer == 'Y' || answer == 'y')
goto L;
}
}
}
}
case 5:
goto L;
}
}
case 6:
cout << "退出系统!" << endl;
return 0;
}
}
while (1);
return 0;
}