【C语言】C语言 学生成绩管理系统(源码+报告)【千行代码】【独一无二】

简介: 【C语言】C语言 学生成绩管理系统(源码+报告)【千行代码】【独一无二】

一、设计要求

学生成绩管理系统旨在提供一个高效且便捷的工具,用于管理学生、课程和选课信息,并生成和显示学生成绩单。系统主要包括以下功能模块:

数据初始化模块:读取学生、课程和选课信息表文件,初始化系统数据。

主菜单模块:显示主菜单,供用户选择操作。

学生信息管理模块:添加、修改、删除和查询学生信息。

课程信息管理模块:添加、修改、删除和查询课程信息。

选课信息管理模块:添加、修改、删除和查询选课信息。

成绩单管理模块:根据选课信息和课程信息生成学生成绩单,并支持显示和排序功能。

数据存储模块:将当前的学生信息、课程信息和选课信息保存到文件中。


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


二、设计思路

程序的主要数据结构包括学生信息、课程信息、选课信息和成绩单信息,具体定义

typedef struct    //学生信息 
{   
    char xh[10];  //学号
  char xm[9];   //姓名,最多4个汉字
    char xb[3];   //性别
  int nl;       //年龄
}Student;

typedef struct    //课程信息
{
  char kh[8];   //课号
  char km[11];  //课名,最多5个汉字
    float xf;     //学分
}Course;

typedef struct    //选课信息
{
  char xh[10];  //学号
  char kh[8];   //课号
    float cj;     //成绩
}Select;


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


Student:表示学生信息,包括学号、姓名、性别和年龄。

Course:表示课程信息,包括课号、课名和学分。

Select:表示选课信息,包括学号、课号和成绩。

Score:表示成绩单信息,包括学号、各门课程成绩、加权平均分和总学分。

这些数据结构用于存储和管理系统中的各类信息。


首先需要定义程序所需的数据结构、全局变量、常量以及各个函数。数据的定义包括学生信息、课程信息、选课信息和成绩单信息的结构体定义,以及用于操作这些数据的函数定义。

这些结构体定义描述了学生、课程、选课和成绩的相关信息。


1.Student 结构体:

xh :学号,用字符数组表示,长度为10。

xm :姓名,用字符数组表示,长度为9。注释提到最多4个汉字,但实际长度是9,可能是为了容纳更多的字符。

xb :性别,用字符数组表示,长度为3。通常只需要一个字符表示性别,这里可能是为了包含空字符(‘\0’)。

nl :年龄,用整型表示。


2.Course 结构体:

kh :课号,用字符数组表示,长度为8。

km :课名,用字符数组表示,长度为11。注释提到最多5个汉字,但实际长度是11,同样可能是为了容纳更多的字符。

xf :学分,用浮点数表示。


3.Select 结构体:

xh :学号,用字符数组表示,长度为10。

kh :课号,用字符数组表示,长度为8。

cj :成绩,用浮点数表示。


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


4.Score 结构体:

xh :学号,用字符数组表示,长度为9。注释中长度为9,与其他结构体中的长度不同,可能是一个错误。

cj :课程成绩数组,用浮点数表示,长度为10。注释中说明不超过10门课程成绩。

pj :加权平均分,用浮点数表示。

zxf :总学分,用浮点数表示。

结构体可以用来表示学生、课程、选课和成绩信息,可以方便地进行相关数据的存储和操作,比如记录学生选课情况、计算学生的平均成绩等。


2.1 主菜单模块

主菜单模块提供用户界面,让用户可以选择各种操作。display_main_menu函数用于显示菜单并处理用户输入。

代码定义了一个函数 display_main_menu() ,用于显示学生成绩管理系统的主菜单,并返回用户选择的菜单项。函数通过一个 do-while 循环来实现,循环条件是用户输入的字符不在 ‘0’ 到 ‘5’ 的范围内。在循环体内,首先调用 system(“cls”) 清空控制台屏幕,然后使用 printf 输出主菜单选项以及作者信息。用户被提示选择一个菜单选项,并通过 getchar() 获取用户输入的字符,这个字符被存储在变量 c 中。若用户输入不在合法范围内,则继续显示主菜单直至输入正确为止。最后,函数返回用户选择的菜单项对应的整数值。


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


该函数的设计简洁明了,通过循环确保了用户只能选择合法的菜单选项,防止了输入错误的情况。菜单项的显示清晰明了,包括了各种功能选项以及作者信息,使用户能够方便地了解系统功能并选择操作。

int display_main_menu()
{  
  char c;
  do
  {
    system("cls");
    printf("\n\n\t\t\t         学生成绩管理系统\n\n");
    printf("\t\t\t 1.修改或添加学生、课程和选课信息\n");
    printf("\t\t\t 2.显示学生、课程和选课信息\n");
    printf("\t\t\t 3.删除学生、课程和选课信息\n");
    printf("\t\t\t 4.查询学生、课程和选课信息\n");
    printf("\t\t\t 5.保存学生、课程和选课信息到文件\n");
    printf("\t\t\t 0.退出\n");
    printf("\t\t\t 软件作者 学号:032330135 姓名:南小航\n");
    printf("\n\t\t\t   请选择 (0~5):  ");
    fflush(stdin);
    c=getchar();
  }while (c<'0'||c>'5');
  return c-'0';
}


2. 2 学生信息管理模块

学生信息管理模块包含添加、修改、删除和查询学生信息的功能。

添加或修改学生信息 (input_stud):


这段代码定义了一个名为 input_stud 的函数,用于向学生信息数组中输入新的学生信息。函数接受两个参数:一个是存储学生信息的数组 slist ,另一个是当前已存在的学生数量 scount 。在函数内部,首先创建一个临时的 Student 结构体变量 temp 用于存储新输入的学生信息。然后,通过一系列 printf 和 scanf 语句,提示用户输入学号、姓名、性别和年龄,并将输入的信息存储到 temp 变量中。接着,使用 for 循环遍历已存在的学生信息数组,检查输入的学号是否已经存在于数组中。如果找到了相同学号的学生,则询问用户是否要覆盖已存在的学生信息,若用户选择覆盖,则更新对应位置的学生信息。如果输入的学号在数组中不存在,则将新的学生信息存储到数组的末尾,并将已存在的学生数量 scount 增加一。最后,函数返回更新后的学生数量 scount 。

int input_course(Course clist[], int ccount)
{ 
    Course temp;
    int i; 
    char yes;

    printf("请输入课号:");
    scanf("%s", temp.kh);
    printf("请输入课名:");
    scanf("%s", temp.km);
    printf("请输入学分:");
    scanf("%f", &temp.xf);

    for (i = 0; i < ccount; i++) {
        if (strcmp(clist[i].kh, temp.kh) == 0) {
            printf("课程已存在,是否覆盖(Y/N):");
            fflush(stdin);
            yes = getchar();
            if (yes == 'Y' || yes == 'y') {
                clist[i] = temp;
            }
            return ccount;
        }
    }

    clist[ccount++] = temp;

    return ccount;
}

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


2.3 显示课程信息

这段代码定义了一个名为 disp_stud 的函数,用于显示学生信息。函数接受两个参数:一个是存储学生信息的数组 slist ,另一个是当前已存在的学生数量 scount 。在函数内部,首先使用 printf 输出表头,包括学号、姓名、性别和年龄等字段。然后,通过 for 循环遍历学生信息数组,逐一输出每个学生的学号、姓名、性别和年龄。每个字段之间用制表符 \t 分隔,每个学生信息占据一行。最后,使用 system(“pause”) 函数暂停程序的执行,等待用户按下任意键继续。


void disp_stud(Student slist[], int scount) //显示学生信息
{
    int i;
    printf("学号\t姓名\t性别\t年龄\n");
    for (i = 0; i < scount; i++) {
        printf("%s\t%s\t%s\t%d\n", slist[i].xh, slist[i].xm, slist[i].xb, slist[i].nl);
    }
    system("pause");
}

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


2.4 删除课程信息

定义了一个名为 delete_course 的函数,用于删除课程信息数组中的某一门课程。函数接受两个参数:一个是存储课程信息的数组 clist ,另一个是当前已存在的课程数量 ccount 。在函数内部,首先声明了一些变量,包括用于存储用户输入课程号的字符数组 kh 、循环中的计数变量 i 和 j 、用于标记是否找到要删除的课程的标志变量 flag ,以及用于接收用户是否删除的字符 yes 。然后,通过 printf 提示用户输入要删除的课程号,并通过 scanf 获取用户输入的课程号。接着,通过 for 循环遍历课程信息数组,查找与用户输入的课程号匹配的课程。若找到匹配的课程,则提示用户找到课程信息,并询问用户是否删除该课程。若用户确认删除,则通过另一个嵌套的 for 循环将数组中该课程后面的所有课程向前移动一个位置,同时将课程数量减一,以实现删除操作。最后,根据是否找到课程,输出相应的提示信息,并通过 system(“pause”) 暂停程序的执行,等待用户按下任意键继续,最后返回更新后的课程数量 ccount 。

int delete_course(Course clist[], int ccount)  //删除课程信息
{   
    char kh[11]; 
    int i, j, flag = 0;
    char yes; 

    printf("请输入要删除的课程号:");
    scanf("%s", kh);

    for (i = 0; i < ccount; i++) {
        if (strcmp(clist[i].kh, kh) == 0) {
            printf("找到课程 %s %s %.1f,是否删除(Y/N):", clist[i].kh, clist[i].km, clist[i].xf);
            fflush(stdin);
            yes = getchar();
            if (yes == 'Y' || yes == 'y') {
                for (j = i; j < ccount - 1; j++) {
                    clist[j] = clist[j + 1];
                }
                ccount--;
                printf("删除成功\n");
            }
            flag = 1;
            break;
        }
    }
    if (!flag) {
        printf("未找到课程号为 %s 的课程\n", kh);
    }

    system("pause");
    return ccount;
}

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


2.5 成绩单管理模块

代码 略...


2.6 显示成绩单

定义了一个名为 disp_cjlist 的函数,用于显示成绩列表中每个学生的成绩情况。函数接受四个参数:一个是存储成绩信息的数组 cjlist ,一个是成绩列表中学生数量 cjcount ,另外两个是存储学生信息的数组 slist 以及学生数量 scount 。在函数内部,通过两个嵌套的 for 循环遍历成绩列表数组和学生信息数组,对每个学生进行处理。在内部循环中,首先比较学生学号,找到与成绩列表中学号匹配的学生信息,并输出学号和姓名。然后,通过另一个循环输出学生的课程成绩,以及加权平均分和总学分。在课程成绩输出时,限制最多输出10门课程的成绩,并且当成绩为0时停止输出。最后,通过 system(“pause”) 函数暂停程序的执行,等待用户按下任意键继续。

代码 略...


其他模块解释略…

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


三、可视化分析

主菜单


修改学生名单


修改课程信息

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


显示课程信息


显示学生信息


显示课程信息

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


显示成绩单


查询学生信息


查询成绩信息


删除学生信息

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


删除课程信息


保存到文件


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

相关文章
|
10天前
|
安全 C语言
在C语言中,正确使用运算符能提升代码的可读性和效率
在C语言中,运算符的使用需要注意优先级、结合性、自增自减的形式、逻辑运算的短路特性、位运算的类型、条件运算的可读性、类型转换以及使用括号来明确运算顺序。掌握这些注意事项可以帮助编写出更安全和高效的代码。
22 4
|
27天前
|
存储 算法 C语言
数据结构基础详解(C语言):单链表_定义_初始化_插入_删除_查找_建立操作_纯c语言代码注释讲解
本文详细介绍了单链表的理论知识,涵盖单链表的定义、优点与缺点,并通过示例代码讲解了单链表的初始化、插入、删除、查找等核心操作。文中还具体分析了按位序插入、指定节点前后插入、按位序删除及按值查找等算法实现,并提供了尾插法和头插法建立单链表的方法,帮助读者深入理解单链表的基本原理与应用技巧。
|
27天前
|
存储 C语言 C++
数据结构基础详解(C语言) 顺序表:顺序表静态分配和动态分配增删改查基本操作的基本介绍及c语言代码实现
本文介绍了顺序表的定义及其在C/C++中的实现方法。顺序表通过连续存储空间实现线性表,使逻辑上相邻的元素在物理位置上也相邻。文章详细描述了静态分配与动态分配两种方式下的顺序表定义、初始化、插入、删除、查找等基本操作,并提供了具体代码示例。静态分配方式下顺序表的长度固定,而动态分配则可根据需求调整大小。此外,还总结了顺序表的优点,如随机访问效率高、存储密度大,以及缺点,如扩展不便和插入删除操作成本高等特点。
|
27天前
|
存储 C语言
数据结构基础详解(C语言): 栈与队列的详解附完整代码
栈是一种仅允许在一端进行插入和删除操作的线性表,常用于解决括号匹配、函数调用等问题。栈分为顺序栈和链栈,顺序栈使用数组存储,链栈基于单链表实现。栈的主要操作包括初始化、销毁、入栈、出栈等。栈的应用广泛,如表达式求值、递归等场景。栈的顺序存储结构由数组和栈顶指针构成,链栈则基于单链表的头插法实现。
151 3
|
27天前
|
存储 算法 C语言
C语言手撕实战代码_二叉排序树(二叉搜索树)_构建_删除_插入操作详解
这份二叉排序树习题集涵盖了二叉搜索树(BST)的基本操作,包括构建、查找、删除等核心功能。通过多个具体示例,如构建BST、查找节点所在层数、删除特定节点及查找小于某个关键字的所有节点等,帮助读者深入理解二叉排序树的工作原理与应用技巧。此外,还介绍了如何将一棵二叉树分解为两棵满足特定条件的BST,以及删除所有关键字小于指定值的节点等高级操作。每个题目均配有详细解释与代码实现,便于学习与实践。
|
27天前
|
存储 算法 C语言
C语言手撕实战代码_二叉树_构造二叉树_层序遍历二叉树_二叉树深度的超详细代码实现
这段代码和文本介绍了一系列二叉树相关的问题及其解决方案。其中包括根据前序和中序序列构建二叉树、通过层次遍历序列和中序序列创建二叉树、计算二叉树节点数量、叶子节点数量、度为1的节点数量、二叉树高度、特定节点子树深度、判断两棵树是否相似、将叶子节点链接成双向链表、计算算术表达式的值、判断是否为完全二叉树以及求二叉树的最大宽度等。每道题目均提供了详细的算法思路及相应的C/C++代码实现,帮助读者理解和掌握二叉树的基本操作与应用。
|
27天前
|
存储 算法 C语言
C语言手撕实战代码_循环单链表和循环双链表
本文档详细介绍了用C语言实现循环单链表和循环双链表的相关算法。包括循环单链表的建立、逆转、左移、拆分及合并等操作;以及双链表的建立、遍历、排序和循环双链表的重组。通过具体示例和代码片段,展示了每种算法的实现思路与步骤,帮助读者深入理解并掌握这些数据结构的基本操作方法。
|
27天前
|
算法 C语言 开发者
C语言手撕实战代码_单链表
本文档详细介绍了使用C语言实现单链表的各种基本操作和经典算法。内容涵盖单链表的构建、插入、查找、合并及特殊操作,如头插法和尾插法构建单链表、插入元素、查找倒数第m个节点、合并两个有序链表等。每部分均配有详细的代码示例和注释,帮助读者更好地理解和掌握单链表的编程技巧。此外,还提供了判断子链、查找公共后缀等进阶题目,适合初学者和有一定基础的开发者学习参考。
|
27天前
|
存储 算法 C语言
C语言手撕数据结构代码_顺序表_静态存储_动态存储
本文介绍了基于静态和动态存储的顺序表操作实现,涵盖创建、删除、插入、合并、求交集与差集、逆置及循环移动等常见操作。通过详细的C语言代码示例,展示了如何高效地处理顺序表数据结构的各种问题。
|
2月前
|
数据采集 自动驾驶 算法
C语言自动驾驶实战项目:基于激光雷达的实时路径规划与避障系统
C语言自动驾驶实战项目:基于激光雷达的实时路径规划与避障系统
66 0
下一篇
无影云桌面