【C语言】C语言-学籍管理系统(源码+文件存储)【独一无二】

简介: 【C语言】C语言-学籍管理系统(源码+文件存储)【独一无二】

一、设计要求

1. 主菜单显示与选择功能

  • 功能描述:显示主菜单,并根据用户输入选择不同功能模块。
  • 代码实现display_main_menu 函数用于显示主菜单,main 函数实现菜单选择和功能调用。


2. 成绩录入功能

  • 功能描述:录入学生的学号、姓名及五门课程的成绩。
  • 代码实现input_grades 函数实现成绩录入,通过用户输入学生数量和各个学生的详细信息存入 students 数组。


3. 成绩排序功能

3.1 按学号排序
  • 功能描述:按学生学号进行排序,并将排序结果写入文件 std.dat
  • 代码实现sort_by_id 函数调用 qsort 函数和 compare_by_id 比较函数实现排序,并将结果写入文件。
// 按学号排序
void sort_by_id() {
    // 使用qsort函数进行排序
    qsort(students, student_count, sizeof(Student), compare_by_id);
    
    // 打开文件std.dat写入排序结果
    FILE *file = fopen("std.dat", "w");
    if (file == NULL) {
        printf("无法打开文件 std.dat 进行写入。\n");
        return;
    }
    
    // 将排序后的结果写入文件
    for (int i = 0; i < student_count; i++) {
        fprintf(file, "%s %s %d %d %d %d %d\n", 
                students[i].id, students[i].name, 
                students[i].math, students[i].english, 
                students[i].physics, students[i].programming, 
                students[i].philosophy);
    }
    
    fclose(file);
    printf("学生成绩已按学号排序并存入文件 std.dat。\n");
}


3.2 计算平均分并排序
  • 功能描述:计算每个学生的平均分,按平均分排序,并将排序结果写入文件 sort.dat
  • sort_by_average 函数调用 qsort 函数和 compare_by_average 比较函数实现排序,并将结果写入文件。

👉👉👉 源码获取 关注【测试开发自动化】公众号,回复 “ 学籍 ” 获取。👈👈👈


4. 成绩统计功能

4.1 计算平均分
  • 功能描述:计算每个学生的平均分,并输出结果。
  • 代码实现calculate_average 函数遍历 students 数组,计算并输出每个学生的平均分。


4.2 统计分数段
  • 功能描述:统计每门课程各个分数段的人数,并输出统计结果。
  • 代码实现count_grade_sections 函数统计每门课程的分数段人数,并输出结果。


5. 学籍处理功能

5.1 生成并打印补考通知单
  • 功能描述:根据用户输入的课程名称、时间和地点,生成并打印需要补考的学生通知单。
  • 代码实现print_reexam_notice 函数根据输入的信息,遍历 students 数组,生成并输出补考通知单。


5.2 生成并打印退学通知单
  • 功能描述:统计超过两门课不及格的学生,生成并打印退学通知单。
  • 代码实现print_dropout_notice 函数遍历 students 数组,统计并输出退学通知单。


5.3 生成并打印新名册
  • 功能描述:生成新的学生名册,包含至多两门课不及格的学生,并写入文件 next.dat
  • 代码实现print_new_roster 函数遍历 students 数组,将符合条件的学生信息写入文件。

👉👉👉 源码获取 关注【测试开发自动化】公众号,回复 “ 学籍 ” 获取。👈👈👈


6. 自定义功能

  • 功能描述:提供按学号或姓名查询学生信息的功能。
  • 代码实现handle_custom_feature 函数根据用户选择的查询方式,查询并输出对应的学生信息。


7. 系统退出功能

  • 功能描述:退出系统。
  • 代码实现exit_system 函数用于退出系统,并在退出前提示用户按任意键结束程序。


8. 菜单显示功能

8.1 显示成绩统计子菜单
  • 功能描述:显示成绩统计子菜单,并根据用户选择执行相应的统计功能。
  • 代码实现display_stat_menu 函数显示子菜单,并根据用户输入调用相应的统计函数。
// 显示成绩统计子菜单
void display_stat_menu() {
    int choice;
    do {
        printf("------------------------\n");
        printf("请输入选项编号(0-4):\n");
        printf("------------------------\n");
        printf("1————按学号排序\n");
        printf("2————计算平均分并排序\n");
        printf("3————统计分数段\n");
        printf("4————返回\n");
        printf("0————退出系统\n");
        printf("请输入选项编号(0-4):");
        scanf("%d", &choice);


8.2 显示学籍处理子菜单
  • 功能描述:显示学籍处理子菜单,并根据用户选择执行相应的学籍处理功能。
  • 代码实现display_mgmt_menu 函数显示子菜单,并根据用户输入调用相应的学籍处理函数。


9. 文件操作功能

9.1 写入按学号排序后的结果
  • 功能描述:将按学号排序后的学生成绩写入文件 std.dat
  • 代码实现sort_by_id 函数实现。


9.2 写入按平均分排序后的结果
  • 功能描述:将按平均分排序后的学生成绩写入文件 sort.dat
  • 代码实现sort_by_average 函数实现。


9.3 写入新名册
  • 功能描述:将符合条件的学生信息写入文件 next.dat
  • 代码实现print_new_roster 函数实现。

二、设计思路

代码设计思路

一、总体结构设计

本程序的设计目标是实现一个学生成绩管理系统,提供成绩录入、成绩统计、学籍处理以及其他自定义功能。整体设计思路如下:

  1. 数据结构设计:采用结构体 Student 来表示学生的相关信息,包括学号、姓名、五门课程成绩及平均分。
  2. 菜单系统设计:通过主菜单和子菜单的设计,使用户能够方便地进行不同功能的选择和操作。
  3. 功能模块设计:根据功能需求,将系统功能模块化,分别实现成绩录入、成绩排序、成绩统计、学籍处理及自定义查询等功能。


二、数据结构设计

程序中使用结构体 Student 来存储单个学生的详细信息:

typedef struct {
    char id[11];         // 学号
    char name[20];       // 姓名
    int math;            // 高数成绩
    int english;         // 英语成绩
    int physics;         // 物理成绩
    int programming;     // 编程成绩
    int philosophy;      // 马哲成绩
    float average;       // 平均分
} Student;

另外,定义了一个全局数组 students 存储所有学生的数据,并使用 student_count 记录当前学生数量。


三、菜单系统设计

  1. 主菜单:显示系统的主要功能选项,包括成绩录入、成绩统计、学籍处理、自定义功能及退出系统。
  2. 成绩统计子菜单:提供按学号排序、计算平均分并排序、统计分数段等功能的选项。
  3. 学籍处理子菜单:提供生成并打印补考通知单、退学通知单、新名册等功能的选项。


四、功能模块设计

1. 成绩录入

通过 input_grades 函数实现成绩录入功能。用户输入学生数量后,逐个输入每个学生的详细信息,包括学号、姓名及五门课程成绩。

// 输入学生成绩
void input_grades() {
    printf("请输入学生的数量:");
    scanf("%d", &student_count);
    for (int i = 0; i < student_count; i++) {
        printf("请输入第%d个学生的学号、姓名、高数、英语、物理、编程、马哲成绩:\n", i+1);
        scanf("%s %s %d %d %d %d %d", students[i].id, students[i].name, &students[i].math, &students[i].english, &students[i].physics, &students[i].programming, &students[i].philosophy);
    }
}

👉👉👉 源码获取 关注【测试开发自动化】公众号,回复 “ 学籍 ” 获取。👈👈👈


2. 成绩排序
  • 按学号排序:使用 qsort 函数和比较函数 compare_by_id 实现按学号排序,并将排序结果写入文件 std.dat
  • 按平均分排序:先通过 calculate_averages 函数计算每个学生的平均分,再使用 qsort 函数和比较函数 compare_by_average 实现按平均分排序,并将排序结果写入文件 sort.dat
// 比较函数,用于按平均分排序(从高到低)
int compare_by_average(const void *a, const void *b) {
    float avg_a = ((Student *)a)->average;
    float avg_b = ((Student *)b)->average;
    if (avg_b > avg_a) return 1;
    else if (avg_b < avg_a) return -1;
    else return 0;
}


3. 成绩统计

通过 calculate_average 函数计算每个学生的平均分,并输出结果。通过 count_grade_sections 函数统计每门课程的分数段人数,并输出统计结果。

void calculate_averages() {
    for (int i = 0; i < student_count; i++) {
        students[i].average = (students[i].math + students[i].english + students[i].physics + students[i].programming + students[i].philosophy) / 5.0;
    }
}


4. 学籍处理
  • 生成并打印补考通知单:通过 print_reexam_notice 函数,根据用户输入的课程名称、时间及地点,生成并打印需要补考的学生通知单。
  • 生成并打印退学通知单:通过 print_dropout_notice 函数,统计超过两门课不及格的学生,并生成并打印退学通知单。
  • 生成并打印新名册:通过 print_new_roster 函数,生成新的学生名册并写入文件 next.dat


5. 自定义查询功能

通过 handle_custom_feature 函数实现按学号或姓名查询学生信息功能。用户可选择查询方式并输入相应信息,程序会查找并输出对应的学生信息。


五、代码逻辑实现

主程序通过 main 函数调用 display_main_menu 显示主菜单,并根据用户输入调用相应的功能模块。各功能模块在实现时注重用户体验和错误处理,确保程序的健壮性和易用性。

void display_main_menu() {
    printf("------------------------\n");
    printf("请输入选项编号(0-4):\n");
    printf("------------------------\n");
    printf("1————入录成绩\n");
    printf("2————统计成绩\n");
    printf("3————处理学籍\n");
    printf("4————创新功能\n");
    printf("0————退出系统\n");
}


六、文件操作

在成绩排序和学籍处理过程中,程序涉及多个文件的读写操作:

  • std.dat:用于存储按学号排序后的学生成绩。
  • sort.dat:用于存储按平均分排序后的学生成绩。
  • next.dat:用于存储新名册。


文件操作部分注意了错误处理,确保文件能正常打开和写入数据。

👉👉👉 源码获取 关注【测试开发自动化】公众号,回复 “ 学籍 ” 获取。👈👈👈


三、可视化分析


👉👉👉 源码获取 关注【测试开发自动化】公众号,回复 “ 学籍 ” 获取。👈👈👈



👉👉👉 源码获取 关注【测试开发自动化】公众号,回复 “ 学籍 ” 获取。👈👈👈






👉👉👉 源码获取 关注【测试开发自动化】公众号,回复 “ 学籍 ” 获取。👈👈👈

相关文章
|
16天前
|
C语言
【数据结构】栈和队列(c语言实现)(附源码)
本文介绍了栈和队列两种数据结构。栈是一种只能在一端进行插入和删除操作的线性表,遵循“先进后出”原则;队列则在一端插入、另一端删除,遵循“先进先出”原则。文章详细讲解了栈和队列的结构定义、方法声明及实现,并提供了完整的代码示例。栈和队列在实际应用中非常广泛,如二叉树的层序遍历和快速排序的非递归实现等。
91 9
|
16天前
|
程序员 C语言 开发者
pymalloc 和系统的 malloc 有什么区别
pymalloc 和系统的 malloc 有什么区别
|
15天前
|
存储 搜索推荐 算法
【数据结构】树型结构详解 + 堆的实现(c语言)(附源码)
本文介绍了树和二叉树的基本概念及结构,重点讲解了堆这一重要的数据结构。堆是一种特殊的完全二叉树,常用于实现优先队列和高效的排序算法(如堆排序)。文章详细描述了堆的性质、存储方式及其实现方法,包括插入、删除和取堆顶数据等操作的具体实现。通过这些内容,读者可以全面了解堆的原理和应用。
58 16
|
11天前
|
搜索推荐 算法 C语言
【排序算法】八大排序(上)(c语言实现)(附源码)
本文介绍了四种常见的排序算法:冒泡排序、选择排序、插入排序和希尔排序。通过具体的代码实现和测试数据,详细解释了每种算法的工作原理和性能特点。冒泡排序通过不断交换相邻元素来排序,选择排序通过选择最小元素进行交换,插入排序通过逐步插入元素到已排序部分,而希尔排序则是插入排序的改进版,通过预排序使数据更接近有序,从而提高效率。文章最后总结了这四种算法的空间和时间复杂度,以及它们的稳定性。
52 8
|
11天前
|
搜索推荐 算法 C语言
【排序算法】八大排序(下)(c语言实现)(附源码)
本文继续学习并实现了八大排序算法中的后四种:堆排序、快速排序、归并排序和计数排序。详细介绍了每种排序算法的原理、步骤和代码实现,并通过测试数据展示了它们的性能表现。堆排序利用堆的特性进行排序,快速排序通过递归和多种划分方法实现高效排序,归并排序通过分治法将问题分解后再合并,计数排序则通过统计每个元素的出现次数实现非比较排序。最后,文章还对比了这些排序算法在处理一百万个整形数据时的运行时间,帮助读者了解不同算法的优劣。
42 7
|
9天前
|
C语言 Windows
C语言课设项目之2048游戏源码
C语言课设项目之2048游戏源码,可作为课程设计项目参考,代码有详细的注释,另外编译可运行文件也已经打包,windows电脑双击即可运行效果
21 1
|
15天前
|
C语言
【数据结构】二叉树(c语言)(附源码)
本文介绍了如何使用链式结构实现二叉树的基本功能,包括前序、中序、后序和层序遍历,统计节点个数和树的高度,查找节点,判断是否为完全二叉树,以及销毁二叉树。通过手动创建一棵二叉树,详细讲解了每个功能的实现方法和代码示例,帮助读者深入理解递归和数据结构的应用。
65 8
|
12天前
|
程序员 C语言 开发者
pymalloc 和系统的 malloc 有什么区别?
pymalloc 和系统的 malloc 有什么区别?
|
18天前
|
存储 C语言
【数据结构】手把手教你单链表(c语言)(附源码)
本文介绍了单链表的基本概念、结构定义及其实现方法。单链表是一种内存地址不连续但逻辑顺序连续的数据结构,每个节点包含数据域和指针域。文章详细讲解了单链表的常见操作,如头插、尾插、头删、尾删、查找、指定位置插入和删除等,并提供了完整的C语言代码示例。通过学习单链表,可以更好地理解数据结构的底层逻辑,提高编程能力。
45 4
|
19天前
|
存储 C语言
【数据结构】顺序表(c语言实现)(附源码)
本文介绍了线性表和顺序表的基本概念及其实现。线性表是一种有限序列,常见的线性表有顺序表、链表、栈、队列等。顺序表是一种基于连续内存地址存储数据的数据结构,其底层逻辑是数组。文章详细讲解了静态顺序表和动态顺序表的区别,并重点介绍了动态顺序表的实现,包括初始化、销毁、打印、增删查改等操作。最后,文章总结了顺序表的时间复杂度和局限性,并预告了后续关于链表的内容。
50 3