【C语言】学生成绩管理系统(附源码+思路讲解)

在这里插入图片描述
欢迎来到我的博客!💃💃
🏡🏡推荐博客:August_._一起持续学习,不断总结,共同进步🎊🎊

前言

这段代码定义了一个学生结构体Student,包含学生的学号、姓名、性别和成绩等信息。代码实现了一个菜单驱动的学生成绩管理系统。

整体架构流程

利用函数定义各功能模块,通过菜单完成各功能模块的选择。
注:学生成绩管理系统的功能模块包括:输入班级课程成绩、统计各课程最高分、最低分、平均分。统计每个学生的最高分、最低分、平均分,输出响应的结果等等。
在这里插入图片描述

完整代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_STUDENTS 100
#define MAX_SUBJECTS 5

int data_flag;
int fileflag;

struct Student
{
    char student_id[12];
    char name[9];
    char sex;
    float grades[MAX_SUBJECTS];
};

int menu()
{
    int dd;
    while (1){
    ll2:system("cls");
        printf("\n 功能选择\n");
        printf(" --------------\n");
        printf(" | 1 求最大数  |\n");
        printf(" | 2 求最小数  |\n");
        printf(" | 3 求平均数  |\n");
        printf(" | 4 数据求和  |\n");
        printf(" | 5 数据排序  |\n");
        printf(" | 6 输出数据  |\n");
        printf(" | 7 创建数据  |\n");
        printf(" | 8 统计数据  |\n");
        printf(" | 9 插入数据  |\n");
        printf(" | 10 删除数据 |\n");
        printf(" | 11 查找数据 |\n");
        printf(" | 12 获取数据 |\n");
        printf(" | 13 保存数据 |\n");
        printf(" | 0  退出系统 |\n");
        printf(" --------------\n");
        printf("请选择一个功能:");
        scanf("%d",&dd);

        if (dd<0||dd>13){
            printf("\n选择有错,请重新输入! 按任意键继续");
            fflush(stdin);
            getchar();
        }

        else if(dd==0||dd==7||data_flag==1)
            break;

        else{
            printf("\n无数据,请选择功能7创建数据! 按任意键继续");
            fflush(stdin);
            getchar();
        }
    }
    return dd;
}

int max_grade(struct Student a[], int n, int index)
{
    int i,mm;
    mm=a[0].grades[index];
    for(i=0;i<n;i++)
        if(a[i].grades[index]>mm) mm=a[i].grades[index];

    return mm;
}

int min_grade(struct Student a[], int n, int index)
{
    int i,mm;
    mm=a[0].grades[index];
    for(i=0;i<n;i++)
        if(a[i].grades[index]<mm) mm=a[i].grades[index];

    return mm;
}

float average_grade(struct Student a[], int n, int index)
{
    int i,mm=0;
    for (i=0;i<n;i++)
        mm=mm+a[i].grades[index];

    return mm/(float)n;
}

int sum_grades(struct Student a[], int n, int index)
{
    int i,mm=0;
    for (i=0;i<n;i++)
        mm=mm+a[i].grades[index];

    return mm;
}

void sort_grades(struct Student a[], int n, int index)
{
    int i,j,k,maxs;
    struct Student mid;

    for (i=0;i<n;i++){
        k=i;
        maxs=a[i].grades[index];
        for (j=i+1;j<n;j++){
            if(maxs<a[j].grades[index]){
                k=j;
                maxs=a[j].grades[index];
            }
        }
        mid=a[i];
        a[i]=a[k];
        a[k]=mid;
    }
}

void output_data(struct Student a[], int n)
{
    int i;
    printf("\n                       数据显示!\n");
    for (i=0;i<20;i++) printf("——");
    printf("\n");
    printf("%10s%13s%6s%6s%6s%6s%6s%6s\n",
           "姓名","学号","性别","数学","物理","英语","思政","编程");

    for (i=0;i<20;i++) printf("——");
    printf("\n");

    for (i=0;i<n;i++)
        if (a[i].sex=='1')
            printf("%10s%13s%6s%6.1f%6.1f%6.1f%6.1f%6.1f\n",
                   a[i].name,a[i].student_id,"男",a[i].grades[0],a[i].grades[1],a[i].grades[2],a[i].grades[3],a[i].grades[4]);
        else
            printf("%10s%13s%6s%6.1f%6.1f%6.1f%6.1f%6.1f\n",
                   a[i].name,a[i].student_id,"女",a[i].grades[0],a[i].grades[1],a[i].grades[2],a[i].grades[3],a[i].grades[4]);

    for (i=0;i<20;i++) printf("——");
    printf("\n按任意键继续!");
}

struct Student input_data()
{
    struct Student data;

    printf("姓名:");
    fflush(stdin);
    scanf("%s",data.name);

l03:printf("学号: ");
    fflush(stdin);
    scanf("%s",data.student_id);
    if ( strlen(data.student_id)>11 || strlen(data.student_id)<1) {
        printf("学号输入有错,请重新输入!\n");
        while (getchar() != '\n');
        goto l03;
    }

le1:printf("性别:(1:男,2:女)");
    fflush(stdin);
    scanf(" %c",&data.sex);  //添加空格跳过之前的空白字符
    if  (data.sex!='1'&&data.sex!='2'){
        printf("输入有错,请重新输入1或者2\n");
        goto le1;
    }

le2:printf("数学: ");
    fflush(stdin);
    scanf("%f",&data.grades[0]);
    if  (data.grades[0]<0||data.grades[0]>100){
        printf("输入有错,请重新输入! \n");
        goto le2;
    }

le3:printf("物理: ");
    fflush(stdin);
    scanf("%f",&data.grades[1]);
    if  (data.grades[1]<0||data.grades[1]>100){
        printf("输入有错,请重新输入! \n");
        goto le3;
    }

le4:printf("英语: ");
    fflush(stdin);
    scanf("%f",&data.grades[2]);
    if  (data.grades[2]<0||data.grades[2]>100){
        printf("输入有错,请重新输入! \n");
        goto le4;
    }

le5:printf("思政: ");
    fflush(stdin);
    scanf("%f",&data.grades[3]);
    if  (data.grades[3]<0||data.grades[3]>100){
        printf("输入有错,请重新输入! \n");
        goto le5;
    }

le6:printf("编程: ");
    fflush(stdin);
    scanf("%f",&data.grades[4]);
    if  (data.grades[4]<0||data.grades[4]>100){
        printf("输入有错,请重新输入! \n");
        goto le6;
    }
    data_flag=1;

    return data;
}

int input_all_data(struct Student a[])
{
    int n,i;
    struct Student data;

    printf("班级数据输入!\n");
l1: printf("请输入班级人数:");
    scanf("%d",&n);

    if (n<2||n>MAX_STUDENTS){
        printf("输入有错,请重新输入!");
        goto l1;
    }
    for (i=0;i<n;i++){
        printf("\n学生%d数据输入!\n",i+1);
        data=input_data();
        a[i]=data;
    }
    data_flag=1;

    return n;
}

void count_grades(struct Student a[], int n, int counts[], int index)
{
    int i;
    for (i=0;i<5;i++) counts[i]=0;
    for (i=0;i<n;i++){
        if (a[i].grades[index] >= 90) counts[0]++;
        else if (a[i].grades[index] >= 80) counts[1]++;
        else if (a[i].grades[index] >= 70) counts[2]++;
        else if (a[i].grades[index] >= 60) counts[3]++;
        else if (a[i].grades[index] >= 0) counts[4]++;
    }
}

int insert_student(struct Student a[], int n, int pos, struct Student s)
{
    int i;
    for (i=n-1;i>=pos;i--) a[i+1]=a[i];
    a[pos]=s;
    return n+1;
}

int delete_student(struct Student a[], int n, int pos)
{
    int i;
    for (i=pos-1;i<n;i++) a[i]=a[i+1];
    return n-1;
}

int find_data(struct Student a[], int n, int x, int index)
{
    int i,flag=0;
    for (i=0;i<n;i++){
        if (a[i].grades[index]==x){
            flag=1;
            break;
        }
    }
    if(flag) return i+1;
    else return 0;
}

int opendata(struct Student a[])
{
    FILE *fp;
    int n=0;

    fp=fopen("score.dat", "r+" );
    if(!fp) return 0;
    fseek(fp,0,SEEK_END);
    n=ftell(fp)/sizeof(struct Student);
    fseek(fp,0,SEEK_SET);
    fread(a,sizeof(struct Student),n,fp);
    fclose(fp);
    data_flag=1;
    return n;
}

int writedata(struct Student a[],int n)
{
    FILE *fp;
    fp=fopen("score.dat","w+");
    if(!fp) return 0;
    fwrite(a,sizeof(struct Student),n,fp);
    fclose(fp);
    fileflag=0;
    return 1;
}

void goodbye()
{
    printf("\n谢谢使用,再见!");
}

int main() {
    struct Student s, a[MAX_STUDENTS];
    int counts[MAX_SUBJECTS];
    int n, sel, pos, x, index, max_data, min_data, sum_data;
    float average_data;
    char ch;

    data_flag = 0;

    do {
        sel = menu();
        if (sel == 1 || sel == 2 || sel == 3 || sel == 4 || sel == 5 || sel == 8 || sel == 11)
        {
        ls: printf("\n请选择一门课程: \n");
            printf("------------\n");
            printf("1: 数学\n2: 物理\n3: 英语\n4: 思政\n5: 编程\n");
            printf("------------\n");
            printf("选择哪一门课程: ");
            scanf("%d", &index);
            if (index < 1 || index > MAX_SUBJECTS) {
                printf("\n课程号错误,请重新输入! ");
                goto ls;
            }
            printf("\n");
        }
        if (sel == 0) break;
        else if (sel == 1) {
            max_data = max_grade(a, n, index - 1);
            printf("最大数:%d\n", max_data);
            printf("\n按任意键继续!");
        }
        else if (sel == 2) {
            min_data = min_grade(a, n, index - 1);
            printf("最小数:%d\n", min_data);
            printf("\n按任意键继续!");
        }
        else if (sel == 3) {
            average_data = average_grade(a, n, index - 1);
            printf("平均数:%.2f\n", average_data);
            printf("\n按任意键继续!");
        }
        else if (sel == 4) {
            sum_data = sum_grades(a, n, index - 1);
            printf("总和:%d\n", sum_data);
            printf("\n按任意键继续!");
        }
        else if (sel == 5) {
            sort_grades(a, n, index - 1);
            output_data(a, n);
        }
        else if (sel == 6) {
            output_data(a, n);
        }
        else if (sel == 7) {
            n = input_all_data(a);
            output_data(a, n);
        }
        else if (sel == 8) {
            count_grades(a, n, counts, index - 1);
            printf("------------\n");
            printf("优秀人数:%d\n良好人数:%d\n一般人数:%d\n及格人数:%d\n不及格数:%d\n",
                   counts[0], counts[1], counts[2], counts[3], counts[4]);
            printf("------------\n");
            printf("\n按任意键继续!");
        }
        else if (sel == 9) {
            if (n >= MAX_STUDENTS)
                printf("\n表已满, 不能再插入了! ");
            else {
            l2: printf("请输入要插入的位置:");
                scanf("%d", &pos);
                if (pos < 1 || pos > n) {
                    printf("\n位置输入有错,请重新输入!");
                    goto l2;
                }
                printf("请输入要插入的值:");
                s = input_data();
                n = insert_student(a, n, pos, s);
                printf("\n插入结果:\n");
                output_data(a, n);
            }
        }
        else if (sel == 10) {
        l3: printf("请输入要删除的位置:");
            scanf("%d", &pos);
            if (pos < 1 || pos > n) {
                printf("\n位置输入值有错,请重新输入!\n");
                goto l3;
            }
            n = delete_student(a, n, pos);
            if (n == 0) {
                printf("成绩表被清空! \n");
                data_flag = 0;
            }
            else {
                printf("删除后的结果:\n");
                output_data(a, n);
            }
        }
        else if (sel == 11) {
        l4: printf("请输入要查找的值:");
            scanf("%d", &x);
            if (x < 0 || x > 100) {
                printf("\n输入值有错,请重新输入!\n");
                goto l4;
            }
            pos = find_data(a, n, x, index - 1);
            if (pos == 0) printf("\n要查找的数据不存在!\n");
            else printf("\n该数据序号为%d\n", pos);
            printf("\n按任意键继续!");
        }
        else if(sel==12) {
        l6: n=opendata(a);
            if(n==0) {
                printf("文件不存在,请创建数据!\n");
                goto l6;
            }
            else
                output_data(a,n);
            data_flag=1;
        }
        else if(sel==13) {
            writedata(a,n);
            printf("数据保存成功!\n");
        }

        fflush(stdin);
        getchar();

    } while (1);

    goodbye();

    return 0;
}

重点提炼

代码主要涉及以下几个方面:

  1. 结构体:代码定义了一个名为Student的结构体,用于存储学生的信息,包括学号、姓名、性别和成绩等。
  2. 数组:使用数组来存储多个学生的信息,以及用于统计成绩的计数器。
  3. 菜单选择:通过一个循环菜单让用户选择要执行的操作,如求最大数、最小数、平均数等。
  4. 函数:定义了多个函数来实现不同的功能,如menu函数用于显示菜单,input_data函数用于输入学生数据,max_grade函数用于求最大数等。
  5. 文件操作:使用文件来保存学生数据,通过opendatawritedata函数实现数据的读取和写入。
  6. 条件判断和循环:在代码中使用了大量的条件判断和循环来控制程序的流程,如根据用户的选择执行相应的操作,对学生数据进行遍历和处理等。
  7. 指针:在input_data函数中使用了指针来动态分配内存,以存储输入的学生姓名。
  8. 数据验证:在输入学生数据时进行了数据验证,确保输入的学号、性别和成绩等符合要求。
  9. 数据排序:使用冒泡排序算法对学生数据按照指定的课程成绩进行排序。
  10. 数据统计:通过遍历学生数据,统计各课程成绩的优秀、良好、一般、及格和不及格人数。

总的来说,这段代码涵盖了 C 语言的基础知识,包括结构体、数组、函数、文件操作、条件判断、循环等,同时也涉及到一些数据处理和算法的应用。通过这段代码,可以更好地理解和掌握 C 语言的基本语法和编程思想。

运行结果

以下是部分功能的运行结果,您可以在完成代码后,自己试试完整的功能哦!
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值