【C语言-学生管理系统】

慈云数据 2024-03-13 技术支持 125 0

学生管理系统

  • 前言
  • 题目要求
  • 功能实现
    • 定义结构体
    • 主函数
    • 功能函数
      • 学生信息录入
      • 删除学生信息
      • 修改学生的成绩
      • 查询学生成绩
      • 查询所有学生的信息
      • 查询所有学生成绩
      • 根据成绩进行排序
      • 按学号排序
      • 根据学号查询学生信息
      • 统计班级的平均成绩
      • 读取学生的信息
      • 保存文件信息
      • 完整代码
      • 项目效果演示

        前言

        C语言,学生管理系统是比较基础的一个项目,涉及到了结构体、函数、数组指针、文件读写等相关知识,可以通过完成一个学生管理系统来对我们所学的知识进行回顾,总结,并且也可以学习一些课外的知识,丰富我们自己。

        题目要求

        系统需要实现以下功能:

        登录系统(通过输入用户名及密码判断是否可以登录)

        录入学生信息

        删除学生信息(通过姓名来删除学生信息)

        修改学生成绩

        查询学生成绩

        查询所有学生的信息

        查询所有学生成绩

        学生成绩排序(冒泡排序)

        查询单个学生

        导入学生信息(通过文件导入学生信息)

        保存学生信息(将学生信息保存至文件)

        根据学号排序

        查看班级平均分

        退出系统(通过代码实现,不是Ctrl+C)

        系统界面如下:

        在这里插入图片描述

        功能实现

        定义结构体

        typedef struct Student
        {
            char num[20];
            char name[20];
            char sex;
            int age;
            int score;
        } Student_t;
        typedef struct class
        {
            Student_t stu_arr[50]; // 这个班级最多有50个学生
            unsigned int index;    // 当前班级学生的个数
        } class_t;                 // 班级的类
        

        主函数

        通过判断输入的账号密码来实现系统的的登录,通过switch语句来控制实现不同的功能。通过while循环以及goto语句来跳转退出系统。

        int main(int argc, char const *argv[])
        {
            int id = 0;
            int code = 0;
            int chose = 0;
            class_t *class = (class_t *)malloc(sizeof(class_t));
            if (class == NULL)
            {
                printf("malloc memory failed!\n");
                return -1;
            }
            class->index = 0;
            while (1)
            {
                printf("*********学生管理系统*********\n");
                printf("请输入登录账号->\n");
                scanf("%d", &id);
                printf("请输入登录密码->\n");
                scanf("%d", &code);
                if (id == 1001 && code == 1001)
                {
                    printf("|******登录成功******|\n");
                    while (1)
                    {
                        printf("请选择所需要的功能(输入0进入功能菜单):\n");
                        scanf("%d", &chose);
                        switch (chose)
                        {
                        case 0:
                            show();
                            break;
                        case 1:
                            student_interp(class);
                            break;
                        case 2:
                            student_delete(class);
                            break;
                        case 3:
                            student_changed(class);
                            break;
                        case 4:
                            student_inquire(class);
                            break;
                        case 5:
                            student_print(class);
                            break;
                        case 6:
                            student_score(class);
                            break;
                        case 7:
                            student_sort(class);
                            student_score(class);
                            break;
                        case 8:
                            student_one(class);
                            break;
                        case 9:
                            readStu(class);
                            student_print(class);
                            break;
                        case 10:
                            saveStu(class);
                            break;
                        case 11:
                            student_sort_num(class);
                            student_print(class);
                            break;
                        case 12:
                            printf("班级平均分为:%.2f\n",student_score_avg(class));
                            break;
                        case 13:
                            goto END;
                        default:
                            break;
                        }
                    }
                }
                else
                {
                    printf("账号或密码错误\n");
                }
            }
            END :
            return 0;
        }
        

        功能函数

        学生信息录入

        录入学生信息,如果出现相同学号的录入,则录入失败;相关代码如下:

        int student_interp(class_t *class)
        {
            int i;
            Student_t stu;
            printf("请输入学生的 学号、姓名、性别、年龄、成绩:\n");
            BEGIN:
            scanf("%s %s %c %d %d", stu.num, stu.name, &stu.sex, &stu.age, &stu.score);
            if(stu.sex!='M'&&stu.sex!='W')
            {
                printf("输入的性别有误,请重新输入:\n");
                goto BEGIN;
            }
            if(stu.score>100)
            {
                printf("输入成绩有误,请重新输入:\n");
                goto BEGIN;
            }
            for (i = 0; i index; i++)
            {
                if (strcmp(class->stu_arr[i].num, stu.num) == 0)
                {
                    printf("该学生已经存在,请重新输入:\n");
                    goto BEGIN;
                }
            }
            class->stu_arr[class->index] = stu;
            class->index++;
            printf("插入成功!\n");
            return 0;
        }
        

        删除学生信息

        通过输入要删除学生的姓名来删除相应的学生,先判断有无学生信息,再删除。代码如下:

        int student_delete(class_t *class)
        {
            int i = 0;
            int j = 0;
            char name[20];
            if (class->index == 0)
            {
                printf("还没有学生,请输入\n");
                return -1;
            }
            printf("请输入要删除学生的姓名:");
            scanf("%s", name);
            for (i = 0; i index; i++)
            {
                if (strcmp(name, class->stu_arr[i].name) == 0)
                {
                    // print_info(&class->stu_arr[i]);
                    for (j = i; j index - 1; j++)
                    {
                        class->stu_arr[j] = class->stu_arr[j + 1];
                    }
                    class->index--;
                    printf("删除成功!!!\n");
                    break;
                }
                if (i == class->index)
                {
                    printf("班级没有这个学员!\n");
                    return -1;
                }
            }
            return 0;
        }
        

        修改学生的成绩

        通过输入学生的姓名,来修改此学生的成绩,代码如下:

        int student_changed(class_t *class)
        {
            char name[20];
            int score = 0;
            int i = 0;
            if(class->index == 0){
                printf("还没有学生,请输入\n");
                return -1;
            }
            printf("请输入要修改学生的姓名:");
            scanf("%s",name);
            for(i = 0; i index; i++){
                if(strcmp(name,class->stu_arr[i].name) == 0){
                    printf("请输入要修改的成绩:");
                    scanf("%d",&score); 
                    class->stu_arr[i].score = score;            
                    printf("修改成功\n");
                    break;     
                }
            }
            if(i == class->index){
                printf("没有该学员!\n");
            }
            return 0;
        }
        

        查询学生成绩

        通过姓名来查询学生的成绩;代码如下:

        int student_inquire(class_t *class)
        {
            char name[20];
            int i;
            if(class->index==0)
            {
                printf("还没有学生,请输入:\n");
                return -1;
            }
            printf("请输入要查询的学生:");
            scanf("%s",name);
            for(i = 0; i index; i++){
                if(strcmp(name,class->stu_arr[i].name) == 0){
                    printf("姓名:%-10s 成绩:%-5d\n",name,class->stu_arr[i].score);
                    break;     
                }
            }
            if(i==class->index){
                printf("没有该学员!");
            }
            return 0;
        }
        

        查询所有学生的信息

        遍历整个数组,把学生信息遍历出来;代码如下:

        int student_print(class_t *class)
        {
            int i;
            if(class->index == 0){
                printf("还没有学生,请输入\n");
                return -1;
            }
            for (i = 0; i index; i++)
            {
                printf("所有学生信息:学号:%-10s 姓名:%-10s 性别:%-5c 年龄:%-5d 成绩:%-5d\n", class->stu_arr[i].num, class->stu_arr[i].name, class->stu_arr[i].sex, class->stu_arr[i].age, class->stu_arr[i].score);
            }
            return 0;
        }
        

        查询所有学生成绩

        代码如下:

        int student_score(class_t *class)
        {
            if(class->index == 0){
                printf("还没有学生,请输入\n");
                return -1;
            }
            int i;
            for (i = 0; i index; i++)
            {
                printf("姓名:%-10s 成绩:%-5d\n", class->stu_arr[i].name, class->stu_arr[i].score);
            }
            return 0;
        }
        

        根据成绩进行排序

        使用冒泡排序,对学生的成绩进行排序,由高到低输出,这里我犯了一个低级的错误,就是先定义了一个int型的变量temp交换,最后发现只交换了成绩,学生的其他信息没有交换,最后发现应该定义一个学生变量temp;代码如下:

        int student_sort(class_t *class)
        {
            int i,j;
            Student_t temp;
             if(class->index==0)
            {
                printf("还没有学生,请输入:\n");
                return -1;
            }
            for(i=0;iindex-1;i++)
            {
                for(j=0;jindex-1-i;j++)
                {
                    if(class->stu_arr[j].scorestu_arr[j+1].score)
                    {
                        temp=class->stu_arr[j];
                        class->stu_arr[j]=class->stu_arr[j+1];
                        class->stu_arr[j+1]=temp;
                    }
                   
                }
            }
            printf("成绩由高到低排序为:\n");
            return 0;
        }
        

        按学号排序

        同上,按学号由低到高排序,注意的是这里学号是字符串,用strcmp函数比较;代码如下:

        int student_sort_num(class_t *class)
        {
            int i,j;
            Student_t temp;
             if(class->index==0)
            {
                printf("还没有学生,请输入:\n");
                return -1;
            }
            for(i=0;iindex-1;i++)
            {
                for(j=0;jindex-1-i;j++)
                {
                    if(strcmp(class->stu_arr[j].num,class->stu_arr[j+1].num)>0)
                    {
                        temp=class->stu_arr[j];
                        class->stu_arr[j]=class->stu_arr[j+1];
                        class->stu_arr[j+1]=temp;
                    }
                   
                }
            }
            printf("学号由低到高排序:\n");
            return 0;
        }
        

        根据学号查询学生信息

        输入学号,查看学生的基本信息;代码如下:

        int student_one(class_t *class)
        {
            char num[20];
            int i;
            if(class->index==0)
            {
                printf("还没有学生,请输入:\n");
                return -1;
            }
            printf("请输入要查询的学生学号:\n");
            scanf("%s",num);
            for(i = 0; i index; i++){
                if(strcmp(num,class->stu_arr[i].num) == 0){
                    printf("学号:%-10s 姓名:%-10s 性别:%-5c 年龄:%-5d 成绩:%-5d\n", class->stu_arr[i].num, class->stu_arr[i].name, class->stu_arr[i].sex, class->stu_arr[i].age, class->stu_arr[i].score);
                    break;     
                }
            }
            if(i==class->index){
                printf("没有该学员!\n");
            }
            return 0;
        }
        

        统计班级的平均成绩

        计算班级所有学生的成绩,算出平均成绩;代码如下:

        float student_score_avg(class_t *class)
        {
            int i;
            float avg=0,sum=0;
            for(i=0;iindex;i++)
            {
                sum=sum+class->stu_arr[i].score;
            }
            avg=sum/class->index;
            return avg;
        }
        

        读取学生的信息

        实现从文件中导入学生信息,将文件的信息作为输入。代码如下:

        void readStu(class_t *class){
            int i = 0;
            FILE * fp;
            fp = fopen("students.txt","a+");
            if(fp == NULL){
                printf("文件打开失败!\n");
                exit(0);
            }
         
            fscanf(fp,"%d",&class->index);
            for(i = 0;i index;i++){
                fscanf(fp,"%s %s %c %d %d",class->stu_arr[i].num,class->stu_arr[i].name,&class->stu_arr[i].sex,&class->stu_arr[i].age,&class->stu_arr[i].score);
            }
            fclose(fp);
            printf("导入学生信息成功!\n");
        }
        

        保存文件信息

        将系统输入的学生信息写入到文件中;代码如下:

        int saveStu(class_t *class){
            int i = 0;
            if(class->index == 0){
                printf("还没有学生,请输入\n");
                return -1;
            }
            FILE * fp;
            fp = fopen("students.txt","w");
            if(fp == NULL){
                printf("文件打开失败!\n");
                exit(0);
            }
         
            fprintf(fp,"%d\n",class->index); 
            for(i = 0;i index;i++){
                fprintf(fp,"%s %s %c %d %d\n",class->stu_arr[i].num,class->stu_arr[i].name,class->stu_arr[i].sex,class->stu_arr[i].age,class->stu_arr[i].score);
            }
            fclose(fp);
            printf("写入成功!\n");
        }
        

        完整代码

        #include 
        #include 
        #include 
        typedef struct Student
        {
            char num[20];
            char name[20];
            char sex;
            int age;
            int score;
        } Student_t;
        typedef struct class
        {
            Student_t stu_arr[50]; // 这个班级最多有50个学生
            unsigned int index;    // 当前班级学生的个数
        } class_t;                 // 班级的类
        void show();
        int student_one(class_t *class);
        int student_interp(class_t *class);
        int student_delete(class_t *class);
        int student_changed(class_t *class);
        int student_inquire(class_t *class);
        int student_print(class_t *class);
        int student_score(class_t *class);
        int student_sort(class_t *class);
        int student_sort_num(class_t *class);
        float student_score_avg(class_t *class);
        void readStu(class_t *class);
        int saveStu(class_t *class);
        int main(int argc, char const *argv[])
        {
            int id = 0;
            int code = 0;
            int chose = 0;
            class_t *class = (class_t *)malloc(sizeof(class_t));
            if (class == NULL)
            {
                printf("malloc memory failed!\n");
                return -1;
            }
            class->index = 0;
            while (1)
            {
                printf("*********学生管理系统*********\n");
                printf("请输入登录账号->\n");
                scanf("%d", &id);
                printf("请输入登录密码->\n");
                scanf("%d", &code);
                if (id == 1001 && code == 1001)
                {
                    printf("|******登录成功******|\n");
                    while (1)
                    {
                        printf("请选择所需要的功能(输入0进入功能菜单):\n");
                        scanf("%d", &chose);
                        switch (chose)
                        {
                        case 0:
                            show();
                            break;
                        case 1:
                            student_interp(class);
                            break;
                        case 2:
                            student_delete(class);
                            break;
                        case 3:
                            student_changed(class);
                            break;
                        case 4:
                            student_inquire(class);
                            break;
                        case 5:
                            student_print(class);
                            break;
                        case 6:
                            student_score(class);
                            break;
                        case 7:
                            student_sort(class);
                            student_score(class);
                            break;
                        case 8:
                            student_one(class);
                            break;
                        case 9:
                            readStu(class);
                            student_print(class);
                            break;
                        case 10:
                            saveStu(class);
                            break;
                        case 11:
                            student_sort_num(class);
                            student_print(class);
                            break;
                        case 12:
                            printf("班级平均分为:%.2f\n",student_score_avg(class));
                            break;
                        case 13:
                            goto END;
                        default:
                            break;
                        }
                    }
                }
                else
                {
                    printf("账号或密码错误\n");
                }
            }
            END :
            return 0;
        }
        //菜单
        void show()
        {
                        printf("=======================学生信息管理系统============================\n");
                        printf("-----------------------------功能菜单------------------------------\n");
                        printf("\t\t\t1.录入学生信息\n");
                        printf("\t\t\t2.删除学生信息\n");
                        printf("\t\t\t3.修改学生成绩\n");
                        printf("\t\t\t4.查询学生成绩\n");
                        printf("\t\t\t5.查询所有学生的信息\n");
                        printf("\t\t\t6.查询所有学生成绩\n");
                        printf("\t\t\t7.学生成绩排序\n");
                        printf("\t\t\t8.查询单个学生\n");
                        printf("\t\t\t9.导入学生信息\n");
                        printf("\t\t\t10.保存学生信息\n");
                        printf("\t\t\t11.根据学号排序\n");
                        printf("\t\t\t12.查看班级平均分\n");
                        printf("\t\t\t13.退出系统\n");
                        printf("------------------------------------------------------------------\n");
                        
        }
        //插入一个学生 (姓名, 性别, 年龄,成绩)
        int student_interp(class_t *class)
        {
            int i;
            Student_t stu;
            printf("请输入学生的 学号、姓名、性别、年龄、成绩:\n");
            BEGIN:
            scanf("%s %s %c %d %d", stu.num, stu.name, &stu.sex, &stu.age, &stu.score);
            if(stu.sex!='M'&&stu.sex!='W')
            {
                printf("输入的性别有误,请重新输入:\n");
                goto BEGIN;
            }
            if(stu.score>100)
            {
                printf("输入成绩有误,请重新输入:\n");
                goto BEGIN;
            }
            for (i = 0; i index; i++)
            {
                if (strcmp(class->stu_arr[i].num, stu.num) == 0)
                {
                    printf("该学生已经存在,请重新输入:\n");
                    goto BEGIN;
                }
            }
            class->stu_arr[class->index] = stu;
            class->index++;
            printf("插入成功!\n");
            return 0;
        }
        //删除一个学生 (根据姓名删除一个学生)
        int student_delete(class_t *class)
        {
            int i = 0;
            int j = 0;
            char name[20];
            if (class->index == 0)
            {
                printf("还没有学生,请输入\n");
                return -1;
            }
            printf("请输入要删除学生的姓名:");
            scanf("%s", name);
            for (i = 0; i index; i++)
            {
                if (strcmp(name, class->stu_arr[i].name) == 0)
                {
                    // print_info(&class->stu_arr[i]);
                    for (j = i; j index - 1; j++)
                    {
                        class->stu_arr[j] = class->stu_arr[j + 1];
                    }
                    class->index--;
                    printf("删除成功!!!\n");
                    break;
                }
                if (i == class->index)
                {
                    printf("班级没有这个学员!\n");
                    return -1;
                }
            }
            return 0;
        }
        //修改学生成绩 (根据姓名修改成绩)
        int student_changed(class_t *class)
        {
            char name[20];
            int score = 0;
            int i = 0;
            if(class->index == 0){
                printf("还没有学生,请输入\n");
                return -1;
            }
            printf("请输入要修改学生的姓名:");
            scanf("%s",name);
            for(i = 0; i index; i++){
                if(strcmp(name,class->stu_arr[i].name) == 0){
                    printf("请输入要修改的成绩:");
                    scanf("%d",&score); 
                    class->stu_arr[i].score = score;            
                    printf("修改成功\n");
                    break;     
                }
            }
            if(i == class->index){
                printf("没有该学员!\n");
            }
            return 0;
        }
        //查询学生成绩 (根据姓名查询成绩)
        int student_inquire(class_t *class)
        {
            char name[20];
            int i;
            if(class->index==0)
            {
                printf("还没有学生,请输入:\n");
                return -1;
            }
            printf("请输入要查询的学生:");
            scanf("%s",name);
            for(i = 0; i index; i++){
                if(strcmp(name,class->stu_arr[i].name) == 0){
                    printf("姓名:%-10s 成绩:%-5d\n",name,class->stu_arr[i].score);
                    break;     
                }
            }
            if(i==class->index){
                printf("没有该学员!");
            }
            return 0;
        }
        //查询所有学生的信息
        int student_print(class_t *class)
        {
            int i;
            if(class->index == 0){
                printf("还没有学生,请输入\n");
                return -1;
            }
            for (i = 0; i index; i++)
            {
                printf("所有学生信息:学号:%-10s 姓名:%-10s 性别:%-5c 年龄:%-5d 成绩:%-5d\n", class->stu_arr[i].num, class->stu_arr[i].name, class->stu_arr[i].sex, class->stu_arr[i].age, class->stu_arr[i].score);
            }
            return 0;
        }
        //查询所有学生成绩
        int student_score(class_t *class)
        {
            if(class->index == 0){
                printf("还没有学生,请输入\n");
                return -1;
            }
            int i;
            for (i = 0; i index; i++)
            {
                printf("姓名:%-10s 成绩:%-5d\n", class->stu_arr[i].name, class->stu_arr[i].score);
            }
            return 0;
        }
        //根据成绩进行排序(从高到低, 冒泡排序)
        int student_sort(class_t *class)
        {
            int i,j;
            Student_t temp;
             if(class->index==0)
            {
                printf("还没有学生,请输入:\n");
                return -1;
            }
            for(i=0;iindex-1;i++)
            {
                for(j=0;jindex-1-i;j++)
                {
                    if(class->stu_arr[j].scorestu_arr[j+1].score)
                    {
                        temp=class->stu_arr[j];
                        class->stu_arr[j]=class->stu_arr[j+1];
                        class->stu_arr[j+1]=temp;
                    }
                   
                }
            }
            printf("成绩由高到低排序为:\n");
            return 0;
        }
        //根据学号查询学生信息
        int student_one(class_t *class)
        {
            char num[20];
            int i;
            if(class->index==0)
            {
                printf("还没有学生,请输入:\n");
                return -1;
            }
            printf("请输入要查询的学生学号:\n");
            scanf("%s",num);
            for(i = 0; i index; i++){
                if(strcmp(num,class->stu_arr[i].num) == 0){
                    printf("学号:%-10s 姓名:%-10s 性别:%-5c 年龄:%-5d 成绩:%-5d\n", class->stu_arr[i].num, class->stu_arr[i].name, class->stu_arr[i].sex, class->stu_arr[i].age, class->stu_arr[i].score);
                    break;     
                }
            }
            if(i==class->index){
                printf("没有该学员!\n");
            }
            return 0;
        }
        //读取学生信息
        void readStu(class_t *class){
            int i = 0;
            FILE * fp;
            fp = fopen("students.txt","a+");
            if(fp == NULL){
                printf("文件打开失败!\n");
                exit(0);
            }
         
            fscanf(fp,"%d",&class->index);
            for(i = 0;i index;i++){
                fscanf(fp,"%s %s %c %d %d",class->stu_arr[i].num,class->stu_arr[i].name,&class->stu_arr[i].sex,&class->stu_arr[i].age,&class->stu_arr[i].score);
            }
            fclose(fp);
            printf("导入学生信息成功!\n");
        }
        //保存学生信息
        int saveStu(class_t *class){
            int i = 0;
            if(class->index == 0){
                printf("还没有学生,请输入\n");
                return -1;
            }
            FILE * fp;
            fp = fopen("students.txt","w");
            if(fp == NULL){
                printf("文件打开失败!\n");
                exit(0);
            }
         
            fprintf(fp,"%d\n",class->index); 
            for(i = 0;i index;i++){
                fprintf(fp,"%s %s %c %d %d\n",class->stu_arr[i].num,class->stu_arr[i].name,class->stu_arr[i].sex,class->stu_arr[i].age,class->stu_arr[i].score);
            }
            fclose(fp);
            printf("写入成功!\n");
        }
        //按学号排序
        int student_sort_num(class_t *class)
        {
            int i,j;
            Student_t temp;
             if(class->index==0)
            {
                printf("还没有学生,请输入:\n");
                return -1;
            }
            for(i=0;iindex-1;i++)
            {
                for(j=0;jindex-1-i;j++)
                {
                    if(strcmp(class->stu_arr[j].num,class->stu_arr[j+1].num)>0)
                    {
                        temp=class->stu_arr[j];
                        class->stu_arr[j]=class->stu_arr[j+1];
                        class->stu_arr[j+1]=temp;
                    }
                   
                }
            }
            printf("学号由低到高排序:\n");
            return 0;
        }
        //统计班级平均成绩
        float student_score_avg(class_t *class)
        {
            int i;
            float avg=0,sum=0;
            for(i=0;iindex;i++)
            {
                sum=sum+class->stu_arr[i].score;
            }
            avg=sum/class->index;
            return avg;
        }
        

        项目效果演示

        这几演示几种功能,其他的大家有兴趣可以试试。

        登录

        在这里插入图片描述

        主界面

        在这里插入图片描述

        录入学生信息

        在这里插入图片描述

        修改学生成绩

        在这里插入图片描述

        查看学生成绩

        在这里插入图片描述

        导入学生信息

        文件内容:

        在这里插入图片描述

        导入成功后:

        在这里插入图片描述

        保存学生信息

        首先插入一个学生1005;

        在这里插入图片描述

        保存信息:

        在这里插入图片描述

        查看文件:

        在这里插入图片描述

        功能就演示到这里了。。。

微信扫一扫加客服

微信扫一扫加客服

点击启动AI问答
Draggable Icon