• 【挑战开发100个项目 | 1. C语言学生管理系统】


    本项目是一个简易的学生信息管理系统,用户可以通过命令行界面完成学生信息的增加、删除、修改、查询、排序和列表展示等功能。数据以txt文件形式存储,实现了数据持久化。项目采用模块化设计,具有较好的可读性和扩展性。适用于初学者学习c语言,也适用于高校学生课程设计,毕业设计参考。

    一,开发环境需求

    • 操作系统 :windows, linux

    • 开发环境工具 :qt ,vscode, visual studio

    • 技术要求

      • 语言: C
      • 数据结构: 链表
      • 文件操作: 文件读写操作

    二,功能说明

    在这里插入图片描述

    三,功能实现

    1. 录入学生信息
    void addStudent(StudentList *list) {
        Student newStudent;
        printf("请输入学生信息:\n");
        printf("学号: ");
        scanf("%d", &(newStudent.id));
        while(getchar() != '\n');
        printf("姓名: ");
        fgets(newStudent.name, sizeof(newStudent.name), stdin);
        newStudent.name[strlen(newStudent.name)-1] = '\0'; // remove the newline
        printf("年龄: ");
        scanf("%d", &(newStudent.age));
        while(getchar() != '\n');
        printf("性别: ");
        fgets(newStudent.gender, sizeof(newStudent.gender), stdin);
        newStudent.gender[strlen(newStudent.gender)-1] = '\0';
        printf("专业: ");
        fgets(newStudent.major, sizeof(newStudent.major), stdin);
        newStudent.major[strlen(newStudent.major)-1] = '\0';
        printf("班级: ");
        fgets(newStudent.class_name, sizeof(newStudent.class_name), stdin);
        newStudent.class_name[strlen(newStudent.class_name)-1] = '\0';
        printf("成绩: ");
        scanf("%f", &(newStudent.score));
    
        // add the new student to the list
        StudentNode *newNode = (StudentNode*)malloc(sizeof(StudentNode));
        newNode->data = newStudent;
        newNode->next = list->head;
        list->head = newNode;
        list->count++;
    
        printf("学生信息已添加成功!\n");
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    此函数用于添加学生信息。

    1. 删除学生信息
    void deleteStudent(StudentList *list) {
        int id;
        printf("请输入要删除的学生的学号: ");
        scanf("%d", &id);
    
        StudentNode *current = list->head;
        StudentNode *previous = NULL;
        while (current != NULL) {
            if (current->data.id == id) {
                if (previous == NULL) {
                    list->head = current->next;
                } else {
                    previous->next = current->next;
                }
                free(current);
                list->count--;
                printf("学生信息已删除。\n");
                return;
            }
            previous = current;
            current = current->next;
        }
        printf("未找到该学生的信息。\n");
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    此函数用于删除指定学生信息。

    3.s 修改学生信息

    void modifyStudent(StudentList *list) {
        int id;
        printf("请输入要修改的学生的学号: ");
        scanf("%d", &id);
    
        StudentNode *current = list->head;
        while (current != NULL) {
            if (current->data.id == id) {
                printf("请输入新的学生信息:\n");
                printf("姓名: ");
                while(getchar() != '\n'); // clear buffer
                fgets(current->data.name, sizeof(current->data.name), stdin);
                current->data.name[strlen(current->data.name)-1] = '\0'; // remove newline
                printf("年龄: ");
                scanf("%d", &(current->data.age));
                printf("性别: ");
                while(getchar() != '\n');
                fgets(current->data.gender, sizeof(current->data.gender), stdin);
                current->data.gender[strlen(current->data.gender)-1] = '\0';
                printf("专业: ");
                while(getchar() != '\n');
                fgets(current->data.major, sizeof(current->data.major), stdin);
                current->data.major[strlen(current->data.major)-1] = '\0';
                printf("班级: ");
                while(getchar() != '\n');
                fgets(current->data.class_name, sizeof(current->data.class_name), stdin);
                current->data.class_name[strlen(current->data.class_name)-1] = '\0';
                printf("成绩: ");
                scanf("%f", &(current->data.score));
                printf("学生信息已修改。\n");
                return;
            }
            current = current->next;
        }
        printf("未找到该学生的信息。\n");
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36

    此函数用于修改指定学生信息。

    1. 查询学生信息
    void queryStudent(const StudentList *list) {
        int id;
        printf("请输入要查询的学生的学号: ");
        scanf("%d", &id);
    
        StudentNode *current = list->head;
        while (current != NULL) {
            if (current->data.id == id) {
                printf("学号: %d\n", current->data.id);
                printf("姓名: %s\n", current->data.name);
                printf("年龄: %d\n", current->data.age);
                printf("性别: %s\n", current->data.gender);
                printf("专业: %s\n", current->data.major);
                printf("班级: %s\n", current->data.class_name);
                printf("成绩: %.2f\n", current->data.score);
                return;
            }
            current = current->next;
        }
        printf("未找到该学生的信息。\n");
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    此函数用于查询指定学生信息。

    1. 对学生信息排序
    // 排序学生信息(这里以学号为例,升序排列)
    void sortStudents(StudentList *list) {
        // 使用冒泡排序算法
        if (list->count < 2) return;
    
        StudentNode *i, *j;
        for (i = list->head; i->next != NULL; i = i->next) {
            for (j = list->head; j->next != NULL; j = j->next) {
                if (j->data.id > j->next->data.id) {
                    // 交换数据
                    Student temp = j->data;
                    j->data = j->next->data;
                    j->next->data = temp;
                }
            }
        }
        printf("学生信息已排序。\n");
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    此函数用于对学生信息进行排序。

    1. 列出所有学生信息
    void displayAllStudents(const StudentList *list) {
        if (!list->head) {
            printf("没有学生信息可供显示。\n");
            return;
        }
    
        printf("学号   姓名       年龄 性别 专业                  班级       成绩\n");
        printf("-----------------------------------------------------------------\n");
    
        StudentNode *current = list->head;
        while (current != NULL) {
            printf("%-6d %-10s %-4d %-4s %-20s %-10s %.2f\n",
                   current->data.id, current->data.name, current->data.age,
                   current->data.gender, current->data.major, current->data.class_name,
                   current->data.score);
            current = current->next;
        }
    
        printf("-----------------------------------------------------------------\n");
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    此函数用于显示所有学生的信息。

    四,效果图

    后续截图添加

    五,源码

    代码已开源,可访问gitee下载。

    六,总结

    本项目是一个简单的学生信息管理系统,通过命令行界面与用户交互。主要实现了学生信息的增、删、查、改等功能。项目中主要使用C语言进行开发,并使用链表作为主要数据结构。经过严格的测试和修正,现在可以正常运行并满足基本的需求。

    七,声明

    本项目大量使用AI编写,如有想法和疑问请联系作者

  • 相关阅读:
    2022强网拟态pwn-webheap
    拖拽的使用说明
    LeetCode-101. Symmetric Tree [C++][Java]
    【重识云原生】第六章容器6.3.3节——Kube-Scheduler使用篇
    debug技巧之远程调试
    【LeetCode-中等题】15. 三数之和
    微信小程序判断页面内容是否满一屏
    基于微信小程序的校运会管理系统设计与实现-计算机毕业设计源码+LW文档
    【微电网优化】萤火虫算法求解微电网优化问题【含Matlab源码 2146期】
    Flowable-6.7.2:一个简单流程分析
  • 原文地址:https://blog.csdn.net/qq_43657810/article/details/133323372