学生成绩管理系统(完整代码,可直接用)

一、简介

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");
}
 




五、代码运行结果如图

希望这些可以帮到大家!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值