在各类学校中,学生成绩管理都是一个非常重要的问题,传统的成绩管理记录和保存都非常困难,而
且容易出错,查询也非常不方便。
因此,在当今信息时代,学生成绩管理系统应运而生。它主要提供学生资料的输入、输出、查询、删除以及学生信息的排序等功能。
本文基于C语言来开发和设计出写学生成绩管理系统程序,来达到学习C语言之后的综和的实际应用。
1、主要功能显示菜单,并有选择提示,可以根据提示输入不同字符以选择相应功能。
2、建立学生信息数据,包括学号,姓名,5门课(语文、数学、英语、物理和计算机)的成绩。
3、能实现学生信息的增加、删除。
4、统计每个学生的平均成绩。
5、按照平均分从大到小排序输出信息。
6、任意输入一个学号,能够查出该学生的相关信息。
7、学生的信息可以保存在txt文件中
将学生成绩管理系统的整体功能,划分为几个具体的模块。
各个模块实现相应的功能。
最后将各个的模块功能的函数,在主函数中调用即可实现学生成绩管理系统 的功能。

学生成绩管理系统项目使用Visual Studio 2019作为开发工具。
打开VS2019,选择语言为C++,所属平台为Windows,项目类型为控制台项目,并选择空项目,如下图所示

然后输入项目的名称和选择项目的路径如下图所示


#ifndef STUDENT_H
#define STUDENT_H
#include
#include
#endif
#include "Student.h"
int main()
{
system("color 3E");
system("pause");
return 0;
}
学生成绩管理系统
主要功能如下
所以学生成绩管理系统的主要流程图如下所示
学生成绩管理系统的主菜单设计模块的代码如下
// 菜单功能
void stuMenu()
{
printf("********************************************\n");
printf("* *\n");
printf("* 学生信息管理系统 *\n");
printf("* 主菜单 *\n");
printf("* *\n");
printf("* 1:录入信息 *\n");
printf("* *\n");
printf("* 2:输出信息 *\n");
printf("* *\n");
printf("* 3:增加信息 *\n");
printf("* *\n");
printf("* 4:查询信息 *\n");
printf("* *\n");
printf("* 5:修改信息 *\n");
printf("* *\n");
printf("* 6:删除信息 *\n");
printf("* *\n");
printf("* 7:成绩排序 *\n");
printf("* *\n");
printf("* 0:退出系统 *\n");
printf("* *\n");
printf("********************************************\n");
}
在主函数中调用主菜单显示函数
int main()
{
system("color 3E");
while (1)
{
stuMenu(); // 主菜单
break;
}
system("pause");
return 0;
}
调试结果如下所示

学生成绩管理系统的退出功能模块的代码如下
// 退出功能
void stuSystemQiut()
{
printf("***********************************************************************\n");
printf("* *\n");
printf("* 欢迎在一次使用 *\n");
printf("* 退出! *\n");
printf("* *\n");
printf("***********************************************************************\n");
}
主函数中while循环、Switch选择功能来实现系统的功能的代码如下所示
int main()
{
system("color 3E");
int select = 0;
while (1)
{
stuMenu(); // 主菜单
printf("请输入选择项(0-7):");
scanf("%d", &select);
printf("\n");
if (select > 0 && select < 8)
{
switch (select)
{
case 1: stuInput(); break; // 录入信息
case 2: break; // 输出信息
case 3: break; // 增加信息
case 4: break; // 查询信息
case 5: break; // 修改信息
case 6: break; // 删除信息
case 7: break; // 成绩排序
}
}
else if (select == 0)
{
stuSystemQiut(); // 系统退出功能
break;
}
else
{
printf("输入有误, 请重新输入!!!\n");
system("pause");
system("cls");
}
}
system("pause");
return 0;
}
可以看到,在系统运行的时候,当用户输入0时,就可以退出系统了
调试结果如下所示

在头文件中定义学生结构体的代码如下
#include
#define SIZE 10000
typedef struct tagStudent
{
int n; /*顺序号*/
int sNum; /*学号*/
char sName[10]; /*姓名*/
int sCn; /*语文成绩*/
int sMaths; /*数学成绩*/
int sEn; /*英语成绩*/
int sPhy; /*物理成绩*/
int sCom; /*计算机成绩*/
double sAvage; /*平均成绩*/
} Student, *pStudent;
Student stu[SIZE];
学生成绩管理系统的录入功能模块的代码如下
// 录入信息功能
void stuInput()
{
int i; // 定义变量
FILE* fp; // 定义文件指针
fp = fopen("studentfile.txt", "wb"); // 打开二进制文件
while(1)
{
printf("\n\r请输入序号i(当输入i=-1时,返回), i = ");
scanf("%d", &i); // 输入学生的序号
if (i == -1)
{
fclose(fp);
system("pause");
system("cls");
return;
}
else // 输入学生相关信息
{
printf("\n\r请输入学号(数字型):");
scanf("%d", &stu[i].sNum);
printf("\n\r请输入姓名(字符型):");
scanf("%s", stu[i].sName);
printf("\n\r请输入语文成绩(0~100):");
scanf("%d", &stu[i].sCn);
printf("\n\r请输入数学成绩(0~100):");
scanf("%d", &stu[i].sMaths);
printf("\n\r请输入英语成绩:(0~100)");
scanf("%d", &stu[i].sEn);
printf("\n\r请输入物理成绩:(0~100)");
scanf("%d", &stu[i].sPhy);
printf("\n\r请输入计算机成绩(0~100):");
scanf("%d", &stu[i].sCom);
stu[i].sAvage = (stu[i].sCn + stu[i].sMaths + stu[i].sEn + stu[i].sPhy + stu[i].sCom) / 5.0;
stu[i].n = i + 1;
fwrite(&stu[i], sizeof(Student), 1, fp); // 将学生信息写入二进制文件中
}
}
fclose(fp);
}
按F5调试结果如下

打开学生成绩管理系统的的目录,打开txt文件,如下所示

学生成绩管理系统的输出功能模块代码如下
// 输出信息功能
void stuOutput()
{
int i; // 定义变量
FILE* fp; // 定义文件指针
fp = fopen("studentfile.txt", "rb"); // 打开二进制文件
printf("***********************************************************************\n");
printf(" 成绩列表\n");
printf("-----------------------------------------------------------------------\n");
printf("序号 学号 姓名 语文 数学 英语 物理 计算机 平均\n");
printf("-----------------------------------------------------------------------\n");
for (i = 0; fread(&stu[i], sizeof(Student), 1, fp) == 1; i++) // 从文件中输出学生信息
{
printf("%d%8d%8s%8d%8d%8d%8d%8d%10.2f\n",
stu[i].n, stu[i].sNum, stu[i].sName,
stu[i].sCn, stu[i].sMaths, stu[i].sEn, stu[i].sPhy, stu[i].sCom, stu[i].sAvage);
}
printf("-----------------------------------------------------------------------\n");
fclose(fp);
system("pause");
system("cls");
}
按F5调试结果如下

学生成绩管理系统的增加功能模块代码如下
// 增加信息功能
void stuAdd()
{
int i, s; // 定义变量
FILE* fp; // 定义文件指针
fp = fopen("studentfile.txt", "ab+"); // 打开二进制文件
rewind(fp);
printf("***********************************************************************\n");
printf(" 成绩列表\n");
printf("-----------------------------------------------------------------------\n");
printf("序号 学号 姓名 语文 数学 英语 物理 计算机 平均\n");
printf("-----------------------------------------------------------------------\n");
for (i = 0; fread(&stu[i], sizeof(Student), 1, fp) == 1; i++) // 输出文件中的学生信息
{
printf("%d%8d%8s%8d%8d%8d%8d%8d%10.2f\n",
stu[i].n, stu[i].sNum, stu[i].sName,
stu[i].sCn, stu[i].sMaths, stu[i].sEn, stu[i].sPhy, stu[i].sCom, stu[i].sAvage);
}
printf("***********************************************************************\n");
s = i;
for (i = s; i < SIZE; i++)
{
printf("输入序号i(当输入i=-1时,返回):");
scanf("%d", &i);
if (i == -1 || i == 0)
{
fclose(fp);
system("pause");
system("cls");
return;
}
else // 增加学生信息
{
printf("\n\r请输入学号(数字型):");
scanf("%d", &stu[i].sNum);
printf("\n\r请输入姓名(字符型):");
scanf("%s", stu[i].sName);
printf("\n\r请输入语文成绩(0~100):");
scanf("%d", &stu[i].sCn);
printf("\n\r请输入数学成绩(0~100):");
scanf("%d", &stu[i].sMaths);
printf("\n\r请输入英语成绩:(0~100)");
scanf("%d", &stu[i].sEn);
printf("\n\r请输入物理成绩:(0~100)");
scanf("%d", &stu[i].sPhy);
printf("\n\r请输入计算机成绩(0~100):");
scanf("%d", &stu[i].sCom);
stu[i].sAvage = (stu[i].sCn + stu[i].sMaths + stu[i].sEn + stu[i].sPhy + stu[i].sCom) / 5.0;
stu[i].n = i + 1;
fwrite(&stu[i], sizeof(Student), 1, fp);
printf("%d%8d%8s%8d%8d%8d%8d%8d%10.2f\n",
stu[i].n, stu[i].sNum, stu[i].sName,
stu[i].sCn, stu[i].sMaths, stu[i].sEn, stu[i].sPhy, stu[i].sCom, stu[i].sAvage);
}
}
fclose(fp);
}
按F5调试结果如下

添加的学生信息,查询结果如下所示
学生成绩管理系统的查询能模块主要是实现学生信息查询的功能
从文件中读取学生信息数据。
查询学生的信息是根据学生的学号进行查询。
查询功能可以方便用户查询学生的信息,并将从文件中查询指定学生的信息输出显示。
学生成绩管理系统的查询功能模块代码如下
// 查询信息功能
void stuSearch()
{
int i, num; // 定义变量
FILE* fp; // 定义文件指针
fp = fopen("studentfile.txt", "ab+"); // 打开二进制文件
rewind(fp);
printf("请输入要查找的学号:");
scanf("%d", &num);
for (i = 0; i <= SIZE; i++)
{
if (stu[i].sNum == num)
{
printf("***********************************************************************\n");
printf(" 查询结果\n");
printf("-----------------------------------------------------------------------\n");
printf("序号 学号 姓名 语文 数学 英语 物理 计算机 平均\n");
printf("-----------------------------------------------------------------------\n");
printf("%d%8d%8s%8d%8d%8d%8d%8d%10.2f\n",
stu[i].n, stu[i].sNum, stu[i].sName,
stu[i].sCn, stu[i].sMaths, stu[i].sEn, stu[i].sPhy, stu[i].sCom, stu[i].sAvage);
printf("\n");
system("pause");
system("cls");
fclose(fp);
return;
}
}
printf("***********************************************************************\n");
printf(" 查询结果\n");
printf("-----------------------------------------------------------------------\n");
printf(" 没有查询到学生学号为:%d 的相关学生信息!!!\n", num);
printf("-----------------------------------------------------------------------\n");
printf("***********************************************************************\n\n");
system("pause");
system("cls");
fclose(fp);
}
按F5调试结果如下
当输入的学号在文件中存在时

当输入的学号在文件中不存在时

从调试结果来看,学生成绩管理系统的查询功能实现了。
可以查询存储于文件中的学生信息。
学生成绩管理系统的修改功能模块代码如下
// 修改信息功能
void stuModify()
{
int i, n, num, flag = 0; // 定义变量
FILE* fp; // 定义文件指针
fp = fopen("studentfile.txt", "ab+"); // 打开二进制文件
printf("请输入要修改学生的学号:");
scanf("%d", &num);
for (i = 0; i <= SIZE; i++)
{
if (stu[i].sNum == num)
{
printf("***********************************************************************\n");
printf(" 成绩列表\n");
printf("-----------------------------------------------------------------------\n");
printf("序号 学号 姓名 语文 数学 英语 物理 计算机 平均\n");
printf("-----------------------------------------------------------------------\n");
printf("%d%8d%8s%8d%8d%8d%8d%8d%10.2f\n",
stu[i].n, stu[i].sNum, stu[i].sName,
stu[i].sCn, stu[i].sMaths, stu[i].sEn, stu[i].sPhy, stu[i].sCom, stu[i].sAvage);
printf("-----------------------------------------------------------------------\n");
printf("***********************************************************************\n");
n = i;
flag = 1;
break;
}
}
if (flag == 0)
{
printf("***********************************************************************\n");
printf(" 输入学生的学号错误!\n");
printf(" 请返回!\n");
printf("***********************************************************************\n\n");
system("pause");
system("cls");
return;
}
fp = fopen("studentfile.txt", "rb+");
fseek(fp, n * sizeof(Student), 0);
printf("\n\r请输入学号(数字型):");
scanf("%d", &stu[i].sNum);
printf("\n\r请输入姓名(字符型):");
scanf("%s", stu[i].sName);
printf("\n\r请输入语文成绩(0~100):");
scanf("%d", &stu[i].sCn);
printf("\n\r请输入数学成绩(0~100):");
scanf("%d", &stu[i].sMaths);
printf("\n\r请输入英语成绩:(0~100)");
scanf("%d", &stu[i].sEn);
printf("\n\r请输入物理成绩:(0~100)");
scanf("%d", &stu[i].sPhy);
printf("\n\r请输入计算机成绩(0~100):");
scanf("%d", &stu[i].sCom);
stu[i].sAvage = (stu[i].sCn + stu[i].sMaths + stu[i].sEn + stu[i].sPhy + stu[i].sCom) / 5.0;
stu[i].n = i + 1;
fwrite(&stu[i], sizeof(Student), 1, fp);
fclose(fp);
fp = fopen("studentfile.txt", "r");
printf("***********************************************************************\n");
printf(" 修改信息成功\n");
printf(" 成绩列表\n");
printf("-----------------------------------------------------------------------\n");
printf("序号 学号 姓名 语文 数学 英语 物理 计算机 平均\n");
printf("-----------------------------------------------------------------------\n");
for (i = 0; fread(&stu[i], sizeof(Student), 1, fp) == 1; i++)
{
printf("%d%8d%8s%8d%8d%8d%8d%8d%10.2f\n",
stu[i].n, stu[i].sNum, stu[i].sName,
stu[i].sCn, stu[i].sMaths, stu[i].sEn, stu[i].sPhy, stu[i].sCom, stu[i].sAvage);
}
printf("-----------------------------------------------------------------------\n");
printf("***********************************************************************\n\n");
system("pause");
system("cls");
fclose(fp);
}
按F5调试结果如下
当输入的学号在文件中存在时

当输入的学号在文件中不存在时

从调试结果来看,学生成绩管理系统的修改功能实现了。
可以修改存储于文件中的学生相关信息。
学生成绩管理系统的修改功能模块代码如下
// 删除信息功能
void stuDelete()
{
FILE* fp; // 文件指针变量
int i, num, n; // 定义变量
int total = 0;
int flag = 0;
fp = fopen("studentfile.txt", "rb"); // 打开文件
printf("***********************************************************************\n");
printf(" 成绩列表\n");
printf("-----------------------------------------------------------------------\n");
printf("序号 学号 姓名 语文 数学 英语 物理 计算机 平均\n");
printf("-----------------------------------------------------------------------\n");
for (i = 0; fread(&stu[i], sizeof(Student), 1, fp) == 1; i++)
{
printf("%d%8d%8s%8d%8d%8d%8d%8d%10.2f\n",
stu[i].n, stu[i].sNum, stu[i].sName,
stu[i].sCn, stu[i].sMaths, stu[i].sEn, stu[i].sPhy, stu[i].sCom, stu[i].sAvage);
}
printf("-----------------------------------------------------------------------\n");
printf("***********************************************************************\n");
fclose(fp);
total = i - 1;
printf("请输入要删除学生的学号:");
scanf("%d", &num);
for (i = 0; i <= SIZE; i++)
{
if (stu[i].sNum == num)
{
printf("***********************************************************************\n");
printf("要删除的学生信息\n");
printf("-----------------------------------------------------------------------\n");
printf("序号 学号 姓名 语文 数学 英语 物理 计算机 平均\n");
printf("-----------------------------------------------------------------------\n");
printf("%d%8d%8s%8d%8d%8d%8d%8d%10.2f\n",
stu[i].n, stu[i].sNum, stu[i].sName,
stu[i].sCn, stu[i].sMaths, stu[i].sEn, stu[i].sPhy, stu[i].sCom, stu[i].sAvage);
printf("-----------------------------------------------------------------------\n");
printf("***********************************************************************\n");
n = i + 1;
flag = 1;
break;
}
}
if (flag == 0)
{
printf("***********************************************************************\n");
printf(" 输入错误!\n");
printf(" 请返回!\n");
printf("***********************************************************************\n");
system("pause");
system("cls");
return;
}
for (i = n; i <= total; i++) // 删除学生信息
{
memcpy(&stu[i - 1], &stu[i], sizeof(Student));
}
memset(&stu[total], 0, sizeof(Student));
fp = fopen("studentfile.txt", "w+"); // 打开文件
for (i = 0; i < total; i++)
{
fwrite(&stu[i], sizeof(Student), 1, fp); // 将学生数据写入文件中
}
fclose(fp);
fp = fopen("studentfile.txt", "r");
printf("***********************************************************************\n");
printf("当前成绩列表\n");
printf("-----------------------------------------------------------------------\n");
printf("序号 学号 姓名 语文 数学 英语 物理 计算机 平均\n");
printf("-----------------------------------------------------------------------\n");
for (i = 0; fread(&stu[i], sizeof(Student), 1, fp) == 1; i++)
{
printf("%d%8d%8s%8d%8d%8d%8d%8d%10.2f\n",
stu[i].n, stu[i].sNum, stu[i].sName,
stu[i].sCn, stu[i].sMaths, stu[i].sEn, stu[i].sPhy, stu[i].sCom, stu[i].sAvage);
}
printf("-----------------------------------------------------------------------\n");
printf("***********************************************************************\n");
system("pause");
system("cls");
fclose(fp);
}
按F5调试结果如下
先查询文件中存储的学生数据

当输入的学号在文件中存在时

当输入的学号在文件中不存在时

从调试结果来看,学生成绩管理系统的删除功能实现了。
可以删除存储于文件中的学生相关信息。
学生成绩管理系统的修改功能模块代码如下
// 排序成绩功能
void stuSort()
{
int i, j, n; // 定义变量
FILE* fp; // 定义文件指针
Student t; // 定义结构体变量
fp = fopen("studentfile.txt", "rb"); // 打开文件
printf("***********************************************************************\n");
printf(" 成绩列表, 排序前\n");
printf("-----------------------------------------------------------------------\n");
printf("序号 学号 姓名 语文 数学 英语 物理 计算机 平均\n");
printf("-----------------------------------------------------------------------\n");
for (i = 0; fread(&stu[i], sizeof(Student), 1, fp) == 1; i++)
{
printf("%d%8d%8s%8d%8d%8d%8d%8d%10.2f\n",
stu[i].n, stu[i].sNum, stu[i].sName,
stu[i].sCn, stu[i].sMaths, stu[i].sEn, stu[i].sPhy, stu[i].sCom, stu[i].sAvage);
}
printf("-----------------------------------------------------------------------\n");
printf("***********************************************************************\n");
fclose(fp);
n = i;
// 排序学生成绩信息
for (i = 0; i < n; i++)
{
for (j = i + 1; j < n; j++)
{
if (stu[i].sAvage < stu[j].sAvage)
{
t = stu[i];
stu[i] = stu[j];
stu[j] = t;
}
}
}
fp = fopen("studentfiles.txt", "wb"); // 打开文件
printf("\n***********************************************************************\n");
printf(" 成绩列表, 排序后\n");
printf("-----------------------------------------------------------------------\n");
printf("序号 学号 姓名 语文 数学 英语 物理 计算机 平均\n");
printf("-----------------------------------------------------------------------\n");
for (i = 0; i < n; i++)
{
printf("%d%8d%8s%8d%8d%8d%8d%8d%10.2f\n",
stu[i].n, stu[i].sNum, stu[i].sName,
stu[i].sCn, stu[i].sMaths, stu[i].sEn, stu[i].sPhy, stu[i].sCom, stu[i].sAvage);
fwrite(&stu[i], sizeof(Student), 1, fp);
}
printf("***********************************************************************\n");
system("pause");
system("cls");
fclose(fp);
}
按F5调试结果如下
本学生成绩管理系统的主要功能是
- 录入信息
- 输出信息
- 增加信息
- 查询信息
- 修改信息
- 输出信息
- 成绩排序
- 退出系统