一、简介
C语言基础知识学完后,学校通常会安排实训项目,此次向大家展示的是学生成绩管理系统的C语言代码。
二、程序内容及要求
1、题目
学生成绩管理系统
2、 需求描述
系统角色:学生、教师、系统管理员。
(1) 学生
学生:普通用户,能够完成以下功能:
1)录入个人信息,包括:姓名、学号、年龄、性别、班级等,请大家根据学校教学管理系统内容进行添加;
2)信息查询
根据自己的学号查询自己的相关信息,包括:单科成绩、总分、平均分等;
3)信息修改
能够修改部分个人信息,包括:姓名、学号、年龄、性别等。
4)约束:学生无法修改成绩。
(2) 教师
教师:普通用户,能够完成以下操作:
1)学生成绩录入
2)学生成绩修改
3)学生成绩统计
4)学生信息打印等
(3)系统管理员
系统管理员能够添加、删除、查询和修改系统用户,设置用户权限。包括
1)添加新用户
2)删除用户
3)修改用户权限
4)查询用户
基本要求:将所有课程信息、成绩信息、用户信息等内容,都写在一个文件中,对课程、成绩和用户的增加、删除都在文件中能查看到。
3、 系统流程描述
系统启动则进入登陆菜单。
(1)登陆流程
1)程序运行,显示登陆界面,请用户输入角色、账号及密码。
2)用户输入账号密码后,系统校验正确与否,正确则进入功能菜单。错误则提示输入错误,继续显示登陆界面。
(2)学生使用功能流程
1)主界面
学生登陆成功后,系统显示功能菜单:“1.资料浏览 2.资料修改 3.成绩查询 4.课表查询 5 退出”
2)资料浏览功能
学生输入数字1,则进入资料浏览界面。系统打印该学生所有信息,包括姓名、性别、班级、学号…等等(请按学校教学管理系统学生信息编写)
3)学生资料修改功能
学生输入数字2,则进入资料修改界面。系统打印该学生所有信息,并提示学生选择想要修改的字段(字段可用数字标识)。根据学生输入的数字,系统打印本字段的当前值。并提示学生输入修改后的值,学生输入修改后的值,系统修改学生信息并打印,然后询问学生是否保存,如果选择是则将学生信息更新到磁盘文件中。如果选择否则回到学生主界面。
4)成绩查询功能
学生输入数字3,则进入成绩查询界面。系统提示学生输入要查询的课程名。学生输入课程名后系统输出该课程的成绩。
5)课表查询功能
学生输入数字4,则进入课表查询界面,系统提示学生输入要查询的课程名,学生输入课程名后系统输出本课程的课程表。
6) 退出
学生输入数字5,则系统自动回到登陆界面。
(3)教师使用流程描述
1)主界面
教师登陆成功后,系统显示功能菜单:“1.成绩录入 2.成绩修改 3.成绩统计 4.成绩打印5.课表查询 6.退出”
2)学生成绩录入
教师输入班级、课程名。系统应能按照学号显示学生相关信息,并提示教师录入成绩。
系统应提供容错功能,例如如果用户输入非法信息,系统应予以提示并要求重新输入。
一个班级成绩全部输入完毕后,系统应提示是否保存。选择是则写入磁盘相应文件。
3)学生成绩修改
教师选择成绩修改功能,进入成绩修改界面。
系统提示教师输入要修改的学生的班级、课程及学号。
教师输入要修改的学生的班级、课程及学号后系统打印该学生该课程成绩,并提示教师输入修改后的成绩。
教师输入修改后的成绩,系统提示是否保存,选择是则写入磁盘文件。选择否则回到本级提示菜单
4)学生成绩统计
教师选择成绩统计功能,系统按照班级打印本班学生本门课程的最高分、最低分、平均分、及格率、不及格率及成绩统计情况。
5)学生成绩打印(即列表显示)
教师选择成绩打印功能,系统按照班级打印本班所有学生的成绩,按照学号、姓名、课程名、成绩的属性打印。
6) 退出
教师选择退出,则系统返回到登陆界面。
(4)系统管理员使用流程
1)主界面
管理员登陆成功后,系统显示功能菜单:“1.用户资料打印 2.添加用户 3.删除用户4.修改用户权限 5查询用户 6退出”
2)用户资料打印:
管理员选择用户资料打印功能,则进入用户资料打印界面,提示管理员输入用户账号,管理员输入后,系统打印该用户的账号、密码、角色、权限等信息。
3)添加用户
管理员选择添加用户功能,则进入添加用户界面,提示管理员输入用户账号和初始密码。管理员输入后,系统打印该用户相关信息并返回主界面。
4)删除用户
管理员选择删除用户功能,则进入删除用户界面,提示管理员输入要删除的用户账号。管理员输入后,系统提示已删除该用户信息并返回主界面。
5)修改用户权限
管理员选择修改用户权限功能,则进入修改用户权限界面,提示管理员输入要修改的用户账号。管理员输入后,系统打印该用户的权限,并提示管理员输入要修改后的权限,管理员输入后,系统打印该用户的信息并返回主界面。
6)查询用户
管理员选择查询用户功能,则进入查询用户界面,提示管理员输入要查询的用户账号或姓名。管理员输入后,系统显示该用户相关信息,如果该用户不存在,则给出相关提示。
7) 退出
管理员选择退出,则系统返回到登陆界面。
三、代码展示
#define _CRT_SECURE_NO_WARNINGS 1
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio. h>
#include<stdlib. h>
#include<string. h>
#define col 15
#define row 89
typedef struct
{
int Sid;
char id[10];
char sex[4];
int MA;
int HA;
int PY;
int EN;
int PT;
int Sum;
int rank;
}Str;
Str student[1000] ={0};
int N;
void manu1();
void manu2();
void Handle(int x);
void Handle1();
void Handle2();
void Handle3();
void Handle4();
void Handle5();
void Handle6();
void Handle7();
int compare1(const void* a, const void* b)
{
const Str*ia = (const Str*)a;
const Str* ib= (const Str*)b;
return -(ia->Sum-ib->Sum);
}
int compare2(const void* a, const void* b)
{
const Str*ia =(const Str*)a;
const Str* ib = (const Str*)b;
return ia->Sid-ib->Sid;
}
int compare3(const void* a, const void* b)
{
const Str* ia =(const Str*)a;
const Str* ib = (const Str*)b;
return(ib->MA+ib->HA)-(ia->MA+ia->HA);
}
int main()
{
int x;
manu1();
getchar();
system("cls");
manu2();
for(;;)
{
int c=0;
x = 0;
printf("是否需要提示? (需要请按1, 无需请按2) \n");
scanf("%d",&c);
if(c == 1)
{
manu2();
printf("请输入对应序号\n");
scanf("%d",&x);
fflush(stdin);
Handle(x);
if(x == 7)
{
exit(0);
}
}
else
{
printf("请输入对应序号\n");
scanf("%d",&x);
fflush(stdin);
Handle(x);
if (x == 7)
{
exit(0);
}
}
}
return 0;
}
void manu1()
{
char*a[13] ={
欢迎来到
学生成绩管理系统
};
int i,j;
for(j=0;j<col;j++)
{
for(i = 0;i<row;i++)
(
if(((j>= 0&&j<=1)&&(i>=0&&i<row))‖((j>=col-2&&j<col)&&(i>=0&&
i<row)))
printf("*");
}
if (j>=2&&j<=12)
{
printf("** %3s **",
a[j-2]);
}
printf("\n");
}
printf("(按任意键以继续)\n");
}
void manu2()
{
char*a[13]={
"学生成绩管理系统
"功能:
"1.学生信息录入
"2.单个学生信息查询
"3.查询全部学生信息
"4.修改学生信息
"5.删除学生信息
"6.将学生信息存入 txt文件
"7.退出系统
};
int i, j;
for(j=0;j<col;j++)
{
for(i = 0;i< row;i++)
{
if (((j>= 0&&j<= 1)&&(i>=0&&i<row))∥((j>= col-2&&j<col)&&(i>=0&&
i<row)))
printf("*");
)
if(j>= 2 &&j<= 12)
{
*
printf("** %3s
a[j-2]);
}
printf("\n");
}
printf("(按相应功能序号以进入)\n");
}
void Handle(int a)
{
switch(a)
{
case 1:
Handle1();
break;
case 2:
Handle2();
break;
case 3:
Handle3();
break;
case 4:
Handle4();
break;
case 5:
Handle5();
break;
case 6:
Handle6();
break;
case 7:
Handle7();
break;
default:
printf("无效的输入! 请输入对应功能的序号。\n");
break;
}
}
void Handle1()
{
system("cls");
int i;
printf("请输入要录入学生成绩的个数: ");
scanf("%d",&N);
printf("请按以下顺序输入学生信息\n");
printf("(学号 姓名 性别 数分成绩 高代成绩 物理成绩 英语成绩 体育成绩)\n");
for (i = 0;i< N;i++)
{
scanf("%d %s %s %d %d %d %d %d", &student[i]. Sid, student[i]. id, student[i]. sex, &student[i]. MA,&student[i]. HA,&student[i]. PY,&student[i]. EN,&student[i]. PT);
student[i]. Sum = student[i]. MA + student[i]. HA + student[i]. PY + student[i]. EN +student[i]. PT;
)
qsort(student, N, sizeof(Str), compare1);
for (i = 0;i<N;i++)
{
student[i]. rank =i + 1;
}
printf("录入成功\n");
}
void Handle2()
{
system("cls");
int i;
int a;
printf("请输入想要查询学生的学号\n");
scanf("%d",&a);
for (i = 0;i<N;i++)
{
if(student[i]. Sid == a)
{
printf(" -\n");
printf("|姓名: %3s |\n", student[i]. id);
printf("|总分: %3d |\n", student[i]. Sum);
printf("|数学分析: %3d |\n", student[i]. MA);
printf("|高等代数: %3d |\n", student[i]. HA);
printf("|物理: %3d |\n", student[i]. PY);
printf("|英语: %3d |\n", student[i]. EN);
printf("|体育: %3d |\n", student[i]. PT);
printf("|总成绩排名: %3d |\n", student[i]. rank);
printf(" -\n");
break;
}
}
}
void Handle3()
{
system("cls");
int i;
int a;
printf("请选择不同的排名方法\n");
printf("按 1->以总成绩排名\n");
printf("按 2->以学号排名\n");
printf("按 3->以专业课排名 (即数分与高代的分数之和) \n");
scanf("%3d", &a);
switch(a)
{
case 1:
{
qsort(student,N, sizeof(Str),compare1);
printf("- -\n");
printf("| 学号 姓名 性别 总分 数分 高代 物理 英语体育 排名 |\n");
for (i = 0; i < N; i++)
{
printf("|%9d %-8s %-3s %-3d %-3d %-3d %-3d %-3d %-3d %-3d |\n", student[i]. Sid, student[i]. id, student[i]. sex, student[i]. Sum, student[i]. MA, student[i]. HA, student[i]. PY, student[i]. E N, student[i]. PT,i+1);
}
printf("-\n");
break;
}
case 2:
{
qsort(student, N, sizeof(Str),compare2);
printf("-\n");
printf("| 学号 姓名 性别 总分 数分 高代 物理 英语体育 排名 |\n");
for (i = 0; i < N; i++)
{
printf("|%9d %-8s %-3s %-3d %-3d %-3d %-3d %-
3d %-3d %-3d |\n", student[i]. Sid, student[i]. id, student[i]. sex, student[i]. Sum, student[i]. MA, student[i]. HA, student[i]. PY, student[i]. EN, student[i]. PT,i+1);
}
printf("-\n");
break;
}
case 3:
{
qsort(student, N, sizeof(Str),compare3);
printf("- \n");
printf("| 学号 姓名 性别 总分 数分 高代 物理 英语体育 排名 \n");
for (i = 0;i < N;i++)
{
printf("|%9d %-8s %-3s %-3d %-3d %-3d %-3d %-
3d %-3d %-3d |\n", student[i]. Sid, student[i]. id, student[i]. sex, student[i]. Sum, student[i]. MA, student[i]. HA, student[i]. PY, student[i]. EN, student[i]. PT,i+1);
}
printf("-\n");
break;
}
default:
printf("输入异常, 已退出程序\n");
return;
break;
}
}
void Handle4()
(
system("cls");
int flag = 0;
int i;
int a =0;
int n;
int c[5];
int k;
printf("请输入想要修改成绩的学生学号\n");
scanf("%d",&a);
for (i = 0;i< N;i++)
{
if(student[i]. Sid == a)
{
k =i;
flag = 1;
printf("请输入需要更改科目的数量与科目的代号\n");
printf("(数学分析--1、高等代数--2、物理--3、英语--4、体育--5)\n");
printf("-\n");
scanf("%d", &n);
for(i = 0;i<n;i++)
{
scanf("%d", &c[i]);
}
for (i = 0;i<n;i++)
{
if (c[i]==1)
{
int key;
printf("请输入更改后的数分成绩: ");
scanf("%d",&key);
student[k]. MA = key;
}
else if (c[i]== 2)
{
int key;
printf("请输入更改后的高代成绩: ");
scanf("%d", &key);
student[k]. HA = key;
}
else if (c[i] == 3)
{
int key;
printf("请输入更改后的物理成绩: ");
scanf("%d",&key);
student[k]. PY = key;
}
else if (c[i] == 4)
{
int key;
printf("请输入更改后的英语成绩: ");
scanf("%d",&key);
student[k]. EN = key;
}
else if (c[i] == 5)
{
int key;
printf("请输入更改后的体育成绩: ");
scanf("%d",&key);
student[k]. PT = key;
}
else
{
printf("输入代号有误, 请重新检查\n");
break;
}
}
student[k]. Sum = student[k]. MA + student[k]. HA + student[k]. PT + student[k]. PY +student[k]. EN;
printf("更改后的学生成绩: \n");
printf("姓名: %3s\n", student[k]. id);
printf("总分: %3d\n", student[k]. Sum);
printf("数学分析: %2d\n", student[k]. MA);
printf("高等代数: %2d\n", student[k]. HA);
printf("物理: %2d\n", student[k]. PY);
printf("英语: %2d\n", student[k]. EN);
printf("体育: %2d\n", student[k]. PT);
printf("- -\n");
break;
}
}
if (flag == 0)
{
printf("找不到该学生,请检查输入的学号是否误\n");
}
}
void Handle5()
{
system("cls");
int i;
int n;
int flag =0;
printf("请输入需删除的学生学号:");
scanf("%d",&n);
for (i = 0;i<N;i++)
{
if(student[i]. Sid == n)
{
flag = 1;
N = N- 1;
for (int k=i;k< N;k++)
{
student[i] = student[i+1];
)
break;
}
}
if (flag == 0)
{
printf("找不到该学生,请检查输入的学号是否误\n");
}
else printf("删除成功, 系统现存%d人信息",N);
}
void Handle6()
{
system("cls");
printf("请选择以哪种方式,将学生成绩录入系统\n");
printf("1--以总成绩排名\n");
printf("2--以学号排名\n");
printf("3--以专业课成绩排名\n");
int x;
scanf("%d", &x);
switch(x)
{
case 1:
qsort(student, N, sizeof(Str),compare1);
break;
case 2:
qsort(student, N, sizeof(Str), compare2);
case 3:
qsort(student, N, sizeof(Str), compare3);
default:
printf("输入异常, 已退出程序\n");
break;
)
int i;
FILE*f;
f = fopen("Student _ grade", "w");
if (f == NULL)
{
printf("打开文件失败\n");
return 1;
}
fprintf(f,"学号 姓名 性别 总分 数分 高代 物理 英语 体育排名\n");
for (i = 0;i<N;i++)
{
fprintf(f,"% 9d % 3s % 1s % 3d % 2d % 2d % 2d % 2d % 2d % 2d% 3d\n", student[i]. Sid, student[i]. id, student[i]. sex, student[i]. Sum, student[i]. MA, student[i]. HA, student[i]. PY, student[i]. EN, student[i]. PT,i+1 );
}
fclose(f);
for (i = 0;i<N;i++)
{
printf("% 9d %3s % 1s %3d %2d % 2d % 2d % 2d % 2d% 3d\n", student[i]. Sid, student[i]. id, student[i]. sex, student[i]. Sum, student[i]. MA, student[i]. HA, student[i]. PY, student[i]. EN, student[i]. PT,i+1);
}
printf("成功录入\n");
}
void Handle7()
{
printf("退出成功\n");
}
四、代码的详细注释
//以下是添加了详细注释的代码:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
// 定义列数和行数
#define col 15
#define row 89
// 定义学生结构体
typedef struct
{
int Sid; // 学号
char id[10]; // 姓名
char sex[4]; // 性别
int MA; // 数学分析成绩
int HA; // 高等代数成绩
int PY; // 物理成绩
int EN; // 英语成绩
int PT; // 体育成绩
int Sum; // 总成绩
int rank; // 排名
} Str;
Str student[1000] = {0}; // 学生信息数组
int N; // 录入的学生数量
// 菜单 1 函数声明
void manu1();
// 菜单 2 函数声明
void manu2();
// 处理用户输入的功能选择函数声明
void Handle(int x);
// 处理录入学生信息的函数声明
void Handle1();
// 处理查询单个学生信息的函数声明
void Handle2();
// 处理查询全部学生信息的函数声明
void Handle3();
// 处理修改学生信息的函数声明
void Handle4();
// 处理删除学生信息的函数声明
void Handle5();
// 处理将学生信息存入 txt 文件的函数声明
void Handle6();
// 处理退出系统的函数声明
void Handle7();
// 比较函数 1,按总成绩降序排序
int compare1(const void* a, const void* b)
{
const Str* ia = (const Str*)a;
const Str* ib = (const Str*)b;
return -(ia->Sum - ib->Sum);
}
// 比较函数 2,按学号升序排序
int compare2(const void* a, const void* b)
{
const Str* ia = (const Str*)a;
const Str* ib = (const Str*)b;
return ia->Sid - ib->Sid;
}
// 比较函数 3,按专业课(数分和高代成绩之和)降序排序
int compare3(const void* a, const void* b)
{
const Str* ia = (const Str*)a;
const Str* ib = (const Str*)b;
return (ib->MA + ib->HA) - (ia->MA + ia->HA);
}
// 主函数
int main()
{
int x;
manu1(); // 调用菜单 1 函数
getchar();
system("cls"); // 清屏
manu2(); // 调用菜单 2 函数
for (;;)
{
int c = 0;
x = 0;
printf("是否需要提示? (需要请按 1, 无需请按 2) \n");
scanf("%d", &c);
if (c == 1)
{
manu2(); // 再次显示菜单 2 供提示
printf("请输入对应序号\n");
scanf("%d", &x);
fflush(stdin); // 清空输入缓冲区
Handle(x); // 根据输入的序号处理相应功能
if (x == 7)
{
exit(0); // 退出程序
}
}
else
{
printf("请输入对应序号\n");
scanf("%d", &x);
fflush(stdin);
Handle(x);
if (x == 7)
{
exit(0);
}
}
}
return 0;
}
// 菜单 1 函数实现
void manu1()
{
char* a[13] = {
"欢迎来到",
"学生成绩管理系统"
};
int i, j;
for (j = 0; j < col; j++)
{
for (i = 0; i < row; i++)
{
// 打印边框的星号
if (((j >= 0 && j <= 1) && (i >= 0 && i < row)) || ((j >= col - 2 && j < col) && (i >= 0 && i < row)))
printf("*");
}
if (j >= 2 && j <= 12)
{
printf("** %3s **", a[j - 2]);
}
printf("\n");
}
printf("(按任意键以继续)\n");
}
// 菜单 2 函数实现
void manu2()
{
char* a[13] = {
"学生成绩管理系统",
"功能:",
"1.学生信息录入",
"2.单个学生信息查询",
"3.查询全部学生信息",
"4.修改学生信息",
"5.删除学生信息",
"6.将学生信息存入 txt 文件",
"7.退出系统"
};
int i, j;
for (j = 0; j < col; j++)
{
for (i = 0; i < row; i++)
{
// 打印边框的星号
if (((j >= 0 && j <= 1) && (i >= 0 && i < row)) || ((j >= col - 2 && j < col) && (i >= 0 && i < row)))
printf("*");
}
if (j >= 2 && j <= 12)
{
printf("** %3s ", a[j - 2]);
}
printf("\n");
}
printf("(按相应功能序号以进入)\n");
}
// 根据用户输入的功能序号进行相应处理的函数
void Handle(int a)
{
switch (a)
{
case 1:
Handle1(); // 处理录入学生信息
break;
case 2:
Handle2(); // 处理查询单个学生信息
break;
case 3:
Handle3(); // 处理查询全部学生信息
break;
case 4:
Handle4(); // 处理修改学生信息
break;
case 5:
Handle5(); // 处理删除学生信息
break;
case 6:
Handle6(); // 处理将学生信息存入 txt 文件
break;
case 7:
Handle7(); // 处理退出系统
break;
default:
printf("无效的输入! 请输入对应功能的序号。\n");
break;
}
}
// 处理录入学生信息的函数
void Handle1()
{
system("cls");
int i;
printf("请输入要录入学生成绩的个数: ");
scanf("%d", &N);
printf("请按以下顺序输入学生信息\n");
printf("(学号 姓名 性别 数分成绩 高代成绩 物理成绩 英语成绩 体育成绩)\n");
for (i = 0; i < N; i++)
{
scanf("%d %s %s %d %d %d %d %d", &student[i].Sid, student[i].id, student[i].sex, &student[i].MA, &student[i].HA, &student[i].PY, &student[i].EN, &student[i].PT);
student[i].Sum = student[i].MA + student[i].HA + student[i].PY + student[i].EN + student[i].PT;
}
qsort(student, N, sizeof(Str), compare1); // 按总成绩降序排序
for (i = 0; i < N; i++)
{
student[i].rank = i + 1;
}
printf("录入成功\n");
}
// 处理查询单个学生信息的函数
void Handle2()
{
system("cls");
int i;
int a;
printf("请输入想要查询学生的学号\n");
scanf("%d", &a);
for (i = 0; i < N; i++)
{
if (student[i].Sid == a)
{
printf(" -\n");
printf("|姓名: %3s |\n", student[i].id);
printf("|总分: %3d |\n", student[i].Sum);
printf("|数学分析: %3d |\n", student[i].MA);
printf("|高等代数: %3d |\n", student[i].HA);
printf("|物理: %3d |\n", student[i].PY);
printf("|英语: %3d |\n", student[i].EN);
printf("|体育: %3d |\n", student[i].PT);
printf("|总成绩排名: %3d |\n", student[i].rank);
printf(" -\n");
break;
}
}
}
// 处理查询全部学生信息的函数
void Handle3()
{
system("cls");
int i;
int a;
printf("请选择不同的排名方法\n");
printf("按 1->以总成绩排名\n");
printf("按 2->以学号排名\n");
printf("按 3->以专业课排名 (即数分与高代的分数之和) \n");
scanf("%3d", &a);
switch (a)
{
case 1:
{
qsort(student, N, sizeof(Str), compare1); // 按总成绩降序排序
printf(" -\n");
printf("| 学号 姓名 性别 总分 数分 高代 物理 英语 体育 排名 |\n");
for (i = 0; i < N; i++)
{
printf("|%9d %-8s %-3s %-3d %-3d %-3d %-3d %-3d %-3d %-3d |\n", student[i].Sid, student[i].id, student[i].sex, student[i].Sum, student[i].MA, student[i].HA, student[i].PY, student[i].EN, student[i].PT, i + 1);
}
printf(" -\n");
break;
}
case 2:
{
qsort(student, N, sizeof(Str), compare2); // 按学号升序排序
printf(" -\n");
printf("| 学号 姓名 性别 总分 数分 高代 物理 英语 体育 排名 |\n");
for (i = 0; i < N; i++)
{
printf("|%9d %-8s %-3s %-3d %-3d %-3d %-3d %-3d %-3d %-3d |\n", student[i].Sid, student[i].id, student[i].sex, student[i].Sum, student[i].MA, student[i].HA, student[i].PY, student[i].EN, student[i].PT, i + 1);
}
printf(" -\n");
break;
}
case 3:
{
qsort(student, N, sizeof(Str), compare3); // 按专业课降序排序
printf(" -\n");
printf("| 学号 姓名 性别 总分 数分 高代 物理 英语 体育 排名 |\n");
for (i = 0; i < N; i++)
{
printf("|%9d %-8s %-3s %-3d %-3d %-3d %-3d %-3d %-3d %-3d |\n", student[i].Sid, student[i].id, student[i].sex, student[i].Sum, student[i].MA, student[i].HA, student[i].PY, student[i].EN, student[i].PT, i + 1);
}
printf(" -\n");
break;
}
default:
printf("输入异常, 已退出程序\n");
return;
break;
}
}
// 处理修改学生信息的函数
void Handle4()
{
system("cls");
int flag = 0;
int i;
int a = 0;
int n;
int c[5];
int k;
printf("请输入想要修改成绩的学生学号\n");
scanf("%d", &a);
for (i = 0; i < N; i++)
{
if (student[i].Sid == a)
{
k = i;
flag = 1;
printf("请输入需要更改科目的数量与科目的代号\n");
printf("(数学分析--1、高等代数--2、物理--3、英语--4、体育--5)\n");
printf(" -\n");
scanf("%d", &n);
for (i = 0; i < n; i++)
{
scanf("%d", &c[i]);
}
for (i = 0; i < n; i++)
{
if (c[i] == 1)
{
int key;
printf("请输入更改后的数分成绩: ");
scanf("%d", &key);
student[k].MA = key;
}
else if (c[i] == 2)
{
int key;
printf("请输入更改后的高代成绩: ");
scanf("%d", &key);
student[k].HA = key;
}
else if (c[i] == 3)
{
int key;
printf("请输入更改后的物理成绩: ");
scanf("%d", &key);
student[k].PY = key;
}
else if (c[i] == 4)
{
int key;
printf("请输入更改后的英语成绩: ");
scanf("%d", &key);
student[k].EN = key;
}
else if (c[i] == 5)
{
int key;
printf("请输入更改后的体育成绩: ");
scanf("%d", &key);
student[k].PT = key;
}
else
{
printf("输入代号有误, 请重新检查\n");
break;
}
}
student[k].Sum = student[k].MA + student[k].HA + student[k].PT + student[k].PY + student[k].EN;
printf("更改后的学生成绩: \n");
printf("姓名: %3s\n", student[k].id);
printf("总分: %3d\n", student[k].Sum);
printf("数学分析: %2d\n", student[k].MA);
printf("高等代数: %2d\n", student[k].HA);
printf("物理: %2d\n", student[k].PY);
printf("英语: %2d\n", student[k].EN);
printf("体育: %2d\n", student[k].PT);
printf(" -\n");
break;
}
}
if (flag == 0)
{
printf("找不到该学生,请检查输入的学号是否有误\n");
}
}
// 处理删除学生信息的函数
void Handle5()
{
system("cls");
int i;
int n;
int flag = 0;
printf("请输入需删除的学生学号:");
scanf("%d", &n);
for (i = 0; i < N; i++)
{
if (student[i].Sid == n)
{
flag = 1;
N = N - 1;
for (int k = i; k < N; k++)
{
student[i] = student[i + 1];
}
break;
}
}
if (flag == 0)
{
printf("找不到该学生,请检查输入的学号是否有误\n");
}
else
printf("删除成功, 系统现存%d人信息", N);
}
// 处理将学生信息存入 txt 文件的函数
void Handle6()
{
system("cls");
printf("请选择以哪种方式,将学生成绩录入系统\n");
printf("1--以总成绩排名\n");
printf("2--以学号排名\n");
printf("3--以专业课成绩排名\n");
int x;
scanf("%d", &x);
switch (x)
{
case 1:
qsort(student, N, sizeof(Str), compare1); // 按总成绩降序排序
break;
case 2:
qsort(student, N, sizeof(Str), compare2); // 按学号升序排序
break;
case 3:
qsort(student, N, sizeof(Str), compare3); // 按专业课降序排序
break;
default:
printf("输入异常, 已退出程序\n");
break;
}
int i;
FILE* f;
f = fopen("Student_grade", "w");
if (f == NULL)
{
// 如果文件打开失败,打印错误信息并返回 1
printf("打开文件失败\n");
return 1;
}
// 向文件中写入标题行
fprintf(f,"学号 姓名 性别 总分 数分 高代 物理 英语 体育 排名\n");
for (i = 0;i<N;i++)
{
// 按照指定格式将每个学生的信息写入文件
fprintf(f,"% 9d % 3s % 1s % 3d % 2d % 2d % 2d % 2d % 2d % 2d% 3d\n", student[i].Sid, student[i].id, student[i].sex, student[i].Sum, student[i].MA, student[i].HA, student[i].PY, student[i].EN, student[i].PT,i+1 );
}
// 关闭文件
fclose(f);
// 打印每个学生的信息到控制台
for (i = 0;i<N;i++)
{
printf("% 9d %3s % 1s %3d %2d % 2d % 2d % 2d % 2d% 3d\n", student[i].Sid, student[i].id, student[i].sex, student[i].Sum, student[i].MA, student[i].HA, student[i].PY, student[i].EN, student[i].PT,i+1);
}
printf("成功录入\n");
// 处理退出系统的函数
void Handle7()
{
printf("退出成功\n");
}
五、代码运行结果如图
希望这些可以帮到大家!