学生成绩管理系统设计与实现
1.1 系统开发思路(需求分析)
使用C语言,在VC环境下,设计实现一个简单实用的学生成绩管理系统,本系统功能设计要求如下:
- 简单的操作界面,登陆系统,首先需要验证身份信息,验证成功后进入系统,若不成功,则提示错误信息。成功进入系统后,根据不同身份进入不同的操作界面。管理员可对各科成绩和成绩排序进行增删改查等相关功能,学生可查看成绩和成绩排序。
- 录入操作:首次进入系统,可以进行数据录入操作。
- 添加操作:用户输入要添加的学生姓名、学号、语文成绩、数学成绩、英语成绩等。
- 删除操作:对某一个学生的信息(姓名、学号、成绩等等)从系统里删除。
- 显示操作:将结构体中的学生信息输出到屏幕上。
- 查询操作
(1) 可以分别按学号和学生姓名查询;
(2) 查到则显示该学生的全部信息。
- 修改操作:修改学生信息并保存。
- 统计操作:分别统计所有员工的总工资;
- 排序操作:
(1) 对所有学生按三门课程总成绩进行降序排序;
(2) 对所有学生按某一门课程的成绩进行降序排序;
- 文件操作:
(7)系统退出时,把数据保存到文件中;
(8)再次进入系统,数据从文件中导入进去。。
数据输入用两种方式来实现:一是从键盘上手动录入数据;二是从文件中导入数据。
1.2系统功能设计
根据需求分析的结果,本系统至少要分为以下几个模块:(1)身份验证模块、菜单选择模块和文件模块。身份验证模块主要用于验证后台管理员身份,将文件中存储的用户名及密码与后台管理员输入的信息比较,若一致,成功进入系统,若不一致,提示错误信息。(2)菜单选择模块主要提供服务选项,在管理员或者学生选择服务命令后进行相应操作。菜单操作模块的功能为本系统的核心模块,提供给管理员录入、更新、查询、添加、删除、排序学生成绩等操作;提供给学生查询成绩等操作。(3)文件操作模块主要建立了两个文件,分别用于存储后台管理员登陆信息,以及学生卡的账号、用户名、密码、余额、状态等信息。当学生进行相应操作后,系统将更新后的信息存于文件夹中。
本系统的功能模块图如1-1示。
图1-1 学生成绩管理系统功能结构图
1.3 系统详细设计
1.3.1数据结构设计
本系统的核心数据对象是学生的学号、姓名及其对应的各科成绩
学生信息:(学生姓名、学生学号、学生的语文成绩、学生的数学成绩、学生的英语成绩、学生的总成绩)
登陆账号(验证身份)
intpassword(int num_Input)
{
int passwork = 2333; passwork 为设定的密码;
/*printf("输入密码的次数:%d\n", num_Input);*/
if (num_Input == 0)
{
printf("请输入密码\n");
intpasswork_Input = 0;
scanf_s("%d",&passwork_Input);
if(passwork_Input == passwork)
{
num_Input = num_Input + 1;
/*printf("输入密码的次数:%d\n", num_Input);*/
return 1; //1表示密码正确;
}
else
{
printf("密码错误\n");
main();
}
}
else
{
return1;
}
}
1.3.2数据文件
本系统是基于文件操作的,数据都以文件的形式存储在硬盘上。系统涉及到的文件主要有两类,一是存储管理员登录信息的文件“password.txt”;另外是存储每个用户的用户信息的文件“file.dat”。
图1-2文件
(1) 把数据从文件读入到内存函数代码如下:
void Input2(student Information[]) //对管理员的文件导入
{
FILE* fp;
fp =fopen("z:\\xuexiaoshixi\\wenjian.txt", "r+");
if (fp)
{
int i = 0;
while (!feof(fp))
{
fscanf(fp,"%s %s %d %d %d %d %d", Information[i].num, Information[i].name,&Information[i].score[0], &Information[i].score[1],&Information[i].score[2], &Information[i].score[3], &Information[i].score[4]);
printf("%s%s %d %d %d %d %d\n", Information[i].num, Information[i].name,Information[i].score[0], Information[i].score[1], Information[i].score[2],Information[i].score[3], Information[i].score[4]);
Information[i].n= 1;
i++;
}
}
else
printf("此文件为空\n");
fclose(fp);
}
void Input3(student Information[]) //对普通用户的文件导入
{
FILE* fp;
fp =fopen("z:\\xuexiaoshixi\\baocun.txt", "r+");
if (fp)
{
int i = 0;
while (!feof(fp))
{
fscanf(fp,"%s %s %d %d %d %d %d", Information[i].num, Information[i].name,&Information[i].score[0], &Information[i].score[1],&Information[i].score[2], &Information[i].score[3],&Information[i].score[4]);
printf("%s%s %d %d %d %d %d\n", Information[i].num, Information[i].name,Information[i].score[0], Information[i].score[1], Information[i].score[2],Information[i].score[3], Information[i].score[4]);
Information[i].n= 1;
i++;
printf("i=%d\n",i);
}
}
else
printf("当前无数据\n");
fclose(fp);
}
(2)将学生信息写入到文件“file.dat”文件中,代码如下:
该文件中包含申请学生学号、姓名、各科成绩等信息,运用users数组将信息存入文件中,并将每次修改后更新的信息存入文件。
1.3.3系统实现的各个函数及接口说明
void show02();
void show01();
void show03();
int Bianli(student Information[]); //根据学生的姓名或者学号返回其存于数组的下表;
int sumnumber(student Information[]); // 记录现有的学生数据的数量,返回最后一个数据存储的下标;
void Sort_Data(int j, int i, student Information[]); //对数据按科目进行排序;
void Data_addition( student Information[]); //添加数据,只能向后添加,从最后开始;
void Delete_Data(int j, student Information[]); //删除数据,j为删除的学生的下标;
void Search_Num(char number[8], student Information[]);//按学号查询
void Search_Name(char number[10], student Information[]); //按姓名查询
void Input1(student Information[]); //管理员手动输入;
void Input2(student Information[]); //管理员文件输入;
void Input3(student Information[]);//普通用的数据库;
void Save_Data(student Information[]); //保存;
void Modify_Data(int j, student Information[]); //修改学生信息;j为学生所在数组的下标;
void manager(student Information[]);//管理员功能菜单;
void ordinary(student Information[]);//学生功能菜单;
int password(int num_Input);
1.4 系统实现
1.4.1系统功能模块详细设计
(1) 添加学生信息
void Data_addition(studentInformation[])
{
intj;
for(j = 0; Information[j].n == 1; j++);
if(j == 0)
printf("当前数据为空,请先录入数据\n");
else
{
printf("请输入要添加的学生人数:\n");
int num = 0;
scanf_s("%d", &num);
for (int i = 0; i < num; i++)
{
printf_s("请输入学生学号:\n");
getchar();
gets_s(Information[j+ i].num);
/*printf("输入时,学号输入位置计数 %d\n", j + i);*/
printf("输入时,学号的输入%s\n", Information[j+ i].num);
printf_s("请输入学生姓名:\n");
gets_s(Information[j+ i].name);
printf("请输入学生语文成绩:\n");
scanf_s("%d",&Information[j + i].score[0]);
printf("请输入学生数学成绩:\n");
scanf_s("%d",&Information[j + i].score[1]);
printf("请输入学生英语成绩:\n");
scanf_s("%d",&Information[j + i].score[2]);
Information[j+ i].score[3] = Information[j + i].score[0] + Information[j + i].score[1] +Information[j + i].score[2];
Information[j+ i].score[4] = (Information[j + i].score[0] + Information[j + i].score[1] +Information[j + i].score[2]) / 3;
Information[j+ i].n = 1;
}
printf("已添加\n");
}
(2)删除学生信息
voidDelete_Data(int j, student Information[]) //j为删除的学生的下标;
{
/*printf("Delete函数要删除的下标j:%d\n", j);*/
int numberofstudents = 0;
numberofstudents =sumnumber(Information); //当前最后一位学生的下标
/*printf("numberofstudents:%d\n", numberofstudents);*/
int L;
if (j != numberofstudents )
{
for(L = j; L < numberofstudents; L++)
{
Information[L] = Information[L + 1];
}
if(L == numberofstudents )
Information[numberofstudents].n = 0;
}
else
{
strcpy(Information[j].num,"\0");
strcpy(Information[j].name,"\0");
Information[j].n= 0;
}
printf("已删除\n");
}
(3) 给学生成绩排序
voidSort_Data(int j, int i, student Information[]) //j为科目的选择的排序,i为最后一名学生的下标,程序内会自动+1变为人数;
{
int mingci = 0;
printf("最后一名学生的下标:%d\n", i);
int p, q;
student temp;
if (j > 5 || j < 1)
printf("操作有误\n");
else
{
for(p = 0; p < i + 1; p++)
{
for (q = p + 1; q < i + 1; q++)
{
if(Information[p].score[j - 1] > Information[q].scor