C语言学生成绩录入系统

一、系统概述

该系统是一个由链表创建主菜单的框架,旨在快速创建学生成绩录入系统的主菜单结构。其主要任务包括:

  1. 实现链表的创建、插入和遍历功能,用于存储和展示学生成绩录入系统各个模块的菜单项。 2. 提供用户友好的主菜单界面,使用户可以方便地选择需要执行的操作。 3. 实现各个子模块的相关操作和处理功能,包括学生信息的录入、删除、修改和查询等功能,以及成绩统计和排名等功能。

该系统具有良好的可扩展性和可维护性,能够快速、高效地完成学生成绩录入系统的开发工作,并保证系统的易用性和稳定性。
该系统的设计和实现需要充分考虑用户体验和易用性,例如主菜单的设计应简单明了、易于理解和操作,各个子模块的功能也需要尽可能贴近用户的实际需求和使用场景。 为保证系统的可靠性和稳定性,在开发过程中需要充分考虑各种异常情况的处理方式,例如输入错误、内存溢出等问题,以及防止非法操作和数据损坏,避免给用户带来不必要的困扰或损失。
总之,该系统是一个完整实用、易操作的学生成绩录入系统,可以为教育机构和教育工作者提供高效、准确、方便的学生成绩管理服务。
(程序运行菜单目录)
在这里插入图片描述

二、需求分析或设计

需求分析:

数据录入与管理:支持学生信息的录入、修改、删除和查询功能,包括基本信息、成绩等数据的录入和管理。
主菜单设计:提供直观友好的主菜单结构,使用户能够快速、方便地选择需要执行的操作。
功能扩展与定制:具有良好的可扩展性和定制性,使用户能够根据实际需求扩展或定制特定模块的功能。
稳定性与可靠性:系统需要具有较高的稳定性和可靠性,能够处理各种异常情况和错误输入,并保证数据的完整和安全。

设计:

根据需求本系统的设计主要包括以下方面: 系统结构设计:将系统分为若干模块,包括主菜单、学生信息管理、成绩统计等模块,并根据需求设计相应的功能和数据结构。
界面设计:尽可能简洁明了、美观大方,方便用户操作,在主菜单中提供可视化的菜单项,使用户能够直观地浏览和选择所需的操作。
数据结构设计:由于系统需要处理大量数据,我们采用链表来储存每一个功能的名称、序号、运行函数,采用结构体存储学生信息和成绩等数据,并根据需求实时更新和维护数据。 (程序主要框架)
在这里插入图片描述

算法设计:

由于系统需要进行各种数据查询、排序和统计等操作,我们采用了合适的算法来支持这些操作,如链表遍历、快速排序等。 异常处理设计:针对系统可能出现的各种异常情况,如输入错误、越界访问等问题,需要设计相应的异常处理机制,保证系统的稳定性和可靠性。

通过以上设计,我们可以实现一个高效、稳定、易用的学生成绩录入系统,满足用户对成绩管理的各种需求。

三、编程实现

开发工具说明

使用MinGW提供的环境进行开发,MinGW 提供了一套简单方便的Windows下的基于GCC 程序开发环境。MinGW 收集了一系列免费的Windows 使用的头文件和库文件;同时整合了GNU的工具集,特别是GNU 程序开发工具,如经典gcc, g++, make等。MinGW是完全免费的自由软件,它在Windows平台上模拟了Linux下GCC的开发环境,为C/C++的跨平台开发提供了良好基础支持。
IDE使用Clion2020.3.4的版本进行开发,CLion是由JetBrains开发的一个跨平台的集成开发环境,专为C和C++语言开发者而设计。它包含许多功能,如代码分析、调试、自动补全、版本控制等等。同时,CLion还支持多种编译器,如GCC、Clang、MSVC等等 ,适用于本项目的多文件开发。

关键算法分析

systemlist.ctypedef struct list_structure
{int id;char* name;void (*funtion)(void);struct list_structure* plist;
}systemlist;systemlist* head = NULL;void list_create(char* list_name, int list_id, void (*funtion)(void))
{systemlist *list = (systemlist *) malloc(sizeof(systemlist));list->id = list_id;list->name = list_name;list->funtion = funtion;list->plist = NULL;if(head == NULL){head = list;}else{systemlist* current = head;while(current->plist != NULL){current = current->plist;}current->plist = list;}
}

这段函数定义了一个链表结构体 systemlist,并实现了向链表中添加节点的功能。具体而言,该函数实现了以下操作:
定义 systemlist 结构体,其中包括节点 ID、节点名称、节点功能和指向下一个节点的指针 plist。
定义全局变量 head 作为链表的头结点,并初始化为空。 实现 list_create 函数,该函数接收三个参数:节点名称 list_name、节点 ID list_id 和一个指向函数的指针 funtion。
在函数中通过动态内存分配函数 malloc 分配空间,创建一个新的链表节点,并将传入的参数赋值给该节点的对应成员。
判断链表是否为空,若为空,则将新建的节点设置成头结点。 若链表不为空,则遍历链表到最后一个节点,并将新节点添加在最后一个节点的最后在链表中添加节点后,可以使用其他函数按照需求对链表进行修改和遍历。
总体而言,这段函数的主要作用是提供一种简单的数据结构来组织和管理不同的元素,同时也方便后续的数据操作。

void create_bootlist(void)
{list_create("新增学生信息", 1, option_1);list_create("删除学生信息", 2, option_2);list_create("学生成绩排名", 3, option_3);list_create("信息搜索(按学号)", 4, option_4);list_create("修改学生信息", 5, option_5);list_create("退出该系统", 6, system_exit);
}
create_bootlist()为多次调用list_create()来添加新功能。
void menu_init(void)
{char choice[2] = {'\0','\0'};create_bootlist();while (choice[0] != '6'){system("cls");show_menu();printf("请选择菜单(1~6)\n"));scanf("%s", choice);while((choice[0] > 7 || choice[0] < 0) && choice[1] != '\0') {printf("错误,请重新选择菜单(1~6)\n");choice[1] = '\0';scanf("%s", choice);}menu_choose(choice[0] - '0');}
}

最后在void menu_init(void)通过调用 create_bootlist() 函数来创建启动项链表,然后显示菜单并等待用户输入选择。一般而言,该函数是一个主菜单的循环,直到用户选择“6”(退出程序)为止,不断显示菜单,接受用户的选择,执行对应的功能。

具体而言,该函数实现了以下操作: 初始化菜单选择数组,将初始值设置为\0(任何时候都不等于6)。 调用 create_bootlist() 函数来创建启动项链表。 进入一个 while 循环,不断显示菜单和接收用户的选择。 在循环中,先清空所有输出信息,调用 show_menu 函数显示菜单。 通过 printf 函数提示用户选择菜单,并通过 scanf 函数读取用户输入的数据并保存到 choice 数组中。 通过 while 循环检查输入是否合法,即输入是否为数字且在1~6之间,如果不在这个范围内则提示用户重新选择菜单。 如果输入合法,则将输入转换为数字并调用 menu_choose 函数执行相应的操作。 继续循环,直到用户选择退出,即输入6为止。
该函数的主要作用是提供一个交互式的菜单界面,并执行用户选择的操作。同时,用户可以通过菜单进行多个功能的操作,提高了程序的扩展性和可用性。
option.c

在代码的1-81行定义了一个结构体 student_t,其中包含了学生的姓名、学号、语文、数学、英语、政治成绩以及总分。它还实现了两个比较函数:id_cmp按照学号升序排序,Score_cmp按照总分降序排序。

此外,这段代码还定义了一个名为 File_Search 的函数,其参数为整型 mode。该函数会打开名为 data.txt 的文件,并读取其中记录的学生信息到一个结构体数组 student 中,在读取完数据后,程序会根据 mode 的值选择是按照学号从小到大排序(mode=2),还是按照总分从高到低排序(mode=1),并输出学生的信息。最后,函数返回存储有学生信息的结构体数组 student 的首地址。
在打开数据文件并读取数据之前,程序会先尝试检查数据文件是否存在。如果文件不存在,那么函数就会返回空指针,告诉调用者没有找到学生信息。

如果文件存在,程序首先读入第一行,即学生人数 num。然后根据 num 的值动态分配一个存储 num 个学生信息的结构体数组 student,并根据数据文件中的格式依次读取每个学生的姓名、学号、语文、数学、英语、政治成绩以及总分。在读取数据行末的换行符后,程序会将该学生的信息存入数组 student 的相应位置。

数据读取完成后,根据传入的 mode 参数进行排序,排序使用了 qsort 函数,并传入指定的比较函数。最后,程序按照特定的格式输出排序后的学生信息,包括学生的姓名、学号、各科成绩和总分。最后关闭数据文件,并返回存储有学生信息的结构体数组 student 的首地址。

在数据读取和排序的过程中,程序对每个学生的姓名进行了特殊处理。由于数据文件中姓名后面紧跟着学号,因此读取姓名时也会读取学号。为了避免读取学号时出现格式上的问题,程序在读取学生姓名时会使用 fgetws 函数读取一行字符串,并使用 wcschr 函数查找该字符串中换行符的位置。如果找到了换行符,则将其替换成字符串结束符。

最后,程序还提供了一个可选的参数 mode,让用户可以根据不同的需求选择不同的排序方式,从而更方便地查找所需的学生信息。同时,在输出学生信息时,程序也使用了格式化输出来使得数据更加易于阅读和理解。

除了以上的功能之外,这个函数还做了一些安全性和健壮性的处理。例如,在打开数据文件失败时,程序会返回 NULL 指针,以避免因使用未打开的文件而导致的错误。在动态分配内存空间时,程序会检查是否成功分配了足够的内存,如果内存分配失败,则会输出错误信息并退出程序,以避免出现内存泄漏等问题。此外,在读取学生信息时,程序也会根据数据文件的格式进行精确的读取,以避免因读取错误而产生的问题。

总之,这个函数实现了读取、排序和输出学生信息的功能,并做了一定的安全性和健壮性处理,可以在一定程度上保证程序的正确性和可靠性。

option1

该函数的主要功能是实现新增学生信息的操作。具体而言,函数首先定义了一个名为New_student的结构体,来存储新增加的学生信息。随后进入一个while循环,该循环会反复询问用户是否确认新增的学生信息以及是否更改信息,直到用户确认信息或放弃操作为止。在循环内部,函数会通过scanf函数依次读取用户输入的新增学生的姓名、学号、语文、数学、英语和政治等相关信息,并显示新增学生的各项成绩及总分。当用户确认添加学生信息时,函数将学生信息写入文件"data.txt"中,同时增加文件的头信息,即学生数量。如果用户放弃添加操作,则退出循环直接返回主菜单。最后,函数通过system和pause函数等待用户按回车键以返回主菜单。

option2

该函数用于从文件中删除学生信息。此代码首先尝试打开名为"data.txt"的文件,并读取其中存储的学生信息。如果找不到学生,则输出"没有找到学生!“。否则,它会在屏幕上显示所有学生的信息,并要求用户输入想要删除哪个学生的数据。该代码会处理学生编号输入错误的情况,并允许用户更改选定的学生。一旦确认删除,该程序将从文件"data.txt"中删除所选的学生并在屏幕上输出"已删除!”。最后,该程序等待用户按下回车键以返回主菜单。

option4

这段函数的作用是从外部存储的数据文件中读取学生信息,根据输入的学号搜索相应的学生信息,并可以对学生信息进行修改确认。具体而言,以下是该函数的实现步骤:
打开名为"data.txt"的文件,以只读模式打开;
读取文件中的第一行,读取保存在文件中的学生数量;
如果学生数量为0,则输出“没有找到学生!”并关闭文件,结束函数;
如果学生数量不为0,则读取每个学生的信息,分别包括姓名、学号、语文、数学、英语、政治和总分,保存到结构体变量student中;
不断循环,直到用户选择确认结束(选择1),或者放弃查找(选择2并输入1);
首先让用户输入要搜索的学生的学号,如果找到该学生就输出信息,否则提示无此学生,要求用户重新输入或者放弃操作;
如果用户选择更改学生信息(选择2),则重新让用户输入要搜索的学生学号;如果用户选择其他非法选项,会提示用户重新输入;
最后,通过打印按回车键以返回主菜单的提示语句,暂停程序,等待用户按下回车键,以便返回主菜单。

option5

这段代码是一个函数,用于向文本文件中的特定行写入学生成绩信息。
主要思路是:
首先,从data.txt读出学生数据,使用fseek函数将文件指针移动到文件开始处。
然后,定义一个数组line,用于存储读入的一行字符,假设每行不超过512个字符。定义变量target_line,记录要修改的目标行。定义变量line_count,记录当前读取文件的行数。
接着,使用while循环结合fgetws函数读取文本文件的每一行,如果已经读取了目标行,则使用fseek函数将文件指针移动到该行的起始位置。然后使用fprintf函数将学生的成绩信息写入该行。
最后,使用fclose函数关闭文件,提示用户按回车键以返回主菜单。
总体来说,这段代码是实现了一种向文本文件中指定行写入内容的方法,可以用于更改学生考试成绩等信息。

  1. 结果演示(或使用说明或指南或运行测试说明)

可执行程序.exe在本文件\code\cmake-build-debug\code.exe里,不可改变目录。另外,编译的时候请注意编译路径不得有中文,不然无法编译,建议将code文件移出再进行编译。或者将.c和.h文件移出新建项目进行编译。

以下为演示:

1. 新增学生信息

在这里插入图片描述

2. 删除学生信息

在这里插入图片描述

3. 学生成绩排名

在这里插入图片描述

4.信息搜索(按学号)

在这里插入图片描述

5. 修改学生信息

在这里插入图片描述

四、联系与交流

q:969060742 完整代码、exe、程序资源、报告

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/97868.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Redis的五种常用数据类型

1.字符串 String的数据结构是简单的Key-Value模型&#xff0c;Value可以是字符串&#xff0c;也可以是数字。 String是Redis最基本的类型&#xff0c;是二进制安全的&#xff0c;意味着Redis的string可以包含任何数据&#xff0c;比如jpg图片。 一个redis中字符串value最大是…

AT9110H-单通道低压 H桥电机驱动芯片

AT9110H能够驱动一个直流有刷电机或其它诸如螺线管的器件。输出驱动模块由PMOSNMOS功率管构成的H桥组成&#xff0c;以驱动电机绕组。AT9110H能够提供高达12V1A的驱动输出。 AT9110H是SOP8封装&#xff0c;且是无铅产品&#xff0c;符合环保标准。 AT9110H具有一个PWM (IN1/IN2…

SpringBoot-黑马程序员-学习笔记(一)

8.pom文件中的parent 我们使用普通maven项目导入依赖时&#xff0c;通常需要在导入依赖的时候指定版本号&#xff0c;而springboot项目不需要指定版本号&#xff0c;会根据当前springboot的版本来下载对应的最稳定的依赖版本。 点开pom文件会看到这个&#xff1a; 继承了一个…

arm-三盏灯流水

.text .global _start _start: 1.设置GPIOE寄存器的时钟使能 RCC_MP_AHB4ENSETR[4]->1 0x50000a28 LDR R0,0x50000A28 LDR R1,[R0] ORR R1,R1,#(0x3<<4) 第四位第五位都设置为1 STR R1,[R0] 写回2.设置PE10管脚为输出模式 GPIOE_MODER[21:20]->01 0x5000…

扭线机控制

扭线机属于线缆加工设备&#xff0c;线缆加工设备种类非常多。有用于网线绞合的单绞&#xff0c;双绞机等&#xff0c;有关单绞机相关算法介绍&#xff0c;大家可以查看专栏相关文章&#xff0c;有详细介绍&#xff0c;常用链接如下&#xff1a; 线缆行业单绞机控制算法&#…

【软考】9.1 顺序表/链表/栈和队列

《线性结构》 顺序存储和链表存储 每个元素最多只有一个出度和一个入度&#xff0c;表现为一条线状链表存储结构&#xff1a;每个节点有两个域&#xff0c;即数据&#xff0c;指针域&#xff08;指向下一个逻辑上相邻的节点&#xff09; 时间复杂度&#xff1a;与其数量级成正…

【Docker】简易版harbor部署

文章目录 依赖于docker-compose下载添加执行权限测试 安装harbor下载解压修改配置文件部署配置开机自启动登录验证 使用harbor登录打标签上传下载 常见问题 依赖于docker-compose 下载 curl -L “https://github.com/docker/compose/releases/download/2.22.0/docker-compose-…

基于SVM+TensorFlow+Django的酒店评论打分智能推荐系统——机器学习算法应用(含python工程源码)+数据集+模型(三)

目录 前言总体设计系统整体结构图系统流程图 运行环境模块实现1. 数据预处理2. 模型训练及保存3. 模型应用 系统测试1. 训练准确率2. 测试效果3. 模型应用 相关其它博客工程源代码下载其它资料下载 前言 本项目以支持向量机&#xff08;SVM&#xff09;技术为核心&#xff0c;…

C语言 - 数组

目录 1. 一维数组的创建和初始化 1.1 数组的创建 1.2 数组的初始化 1.3 一维数组的使用 1.4 一维数组在内存中的存储 2. 二维数组的创建和初始化 2.1 二维数组的创建 2.2 二维数组的初始化 2.3 二维数组的使用 2.4 二维数组在内存中的存储 3. 数组越界 4. 数组作为函数参数 4.1…

【Vue面试题十一】、Vue组件之间的通信方式都有哪些?

文章底部有个人公众号&#xff1a;热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享&#xff1f; 踩过的坑没必要让别人在再踩&#xff0c;自己复盘也能加深记忆。利己利人、所谓双赢。 面试官&#xff1a;Vue组件之间的通信方式都…

Synchronized的实现和锁升级

1.JVM是如何处理和识别Synchronized的&#xff1f; 我们从字节码角度分析synchronized的实现&#xff1a; Synchronized(锁对象){}同步代码块底层实现方式是monitorenter和monitorexit指令。 修饰普通同步方法时底层实现方式是执行指令会检查方法是否设置ACC_SYNCHRONIZED&am…

从0到1基于ChatGLM-6B使用LoRA进行参数高效微调

从0到1基于ChatGLM-6B使用LoRA进行参数高效微调 吃果冻不吐果冻皮 ​ 关注他 cliniNLPer 等 189 人赞同了该文章 ​ 目录 收起 ChatGLM-6B简介 具备的一些能力 局限性 LoRA 技术原理 环境搭建 数据集准备 数据预处理 参数高效微调 单卡模式模型训练 数据并行模式模型训练 模型推…

Nginx详细学习记录

1. Nginx概述 Nginx是一个轻量级的高性能HTTP反向代理服务器&#xff0c;同时它也是一个通用类型的代理服务器&#xff0c;支持绝大部分协议&#xff0c;如TCP、UDP、SMTP、HTTPS等。 1.1 Nginx基础架构 Nginx默认采用多进程工作方式&#xff0c;Nginx启动后&#xff0c;会运行…

阿里云RDS关系型数据库详细介绍_多版本数据库说明

阿里云RDS关系型数据库大全&#xff0c;关系型数据库包括MySQL版、PolarDB、PostgreSQL、SQL Server和MariaDB等&#xff0c;NoSQL数据库如Redis、Tair、Lindorm和MongoDB&#xff0c;阿里云百科分享阿里云RDS关系型数据库大全&#xff1a; 目录 阿里云RDS关系型数据库大全 …

编译工具链 之二 详解 ELF 格式及标准、UNIX 发展、ABI

在计算机及嵌入式系统中&#xff0c;二进制文件也有一定的标准格式&#xff0c;通常会包含在各平台的应用程序二进制接口 &#xff08;Application Binary Interface&#xff0c;ABI&#xff09;规范中。它是编译工具链必须要遵守的规范&#xff08;编译工具链产生符合 ABI 的二…

C (1094) : DS双向链表—前驱后继

Description 在双向链表中&#xff0c;A有一个指针指向了后继节点B&#xff0c;同时&#xff0c;B又有一个指向前驱节点A的指针。这样不仅能从链表头节点的位置遍历整个链表所有节点&#xff0c;也能从链表尾节点开始遍历所有节点。 对于给定的一列数据&#xff0c;按照给定的…

Legion Y9000X IRH8 2023款(82Y3)原装出厂OEM预装Windows11系统

lenovo联想电脑笔记本拯救者原厂win11系统镜像 下载链接&#xff1a;https://pan.baidu.com/s/15G01j7ROVqOFOETccQSKHg?pwdt1ju 系统自带所有驱动、出厂主题壁纸、Office办公软件、联想电脑管家等预装程序 所需要工具&#xff1a;32G或以上的U盘 文件格式&#xff1a;ISO…

创作2周年?浅记一下~

前言&#xff1a; 最近确实有点缺乏去更新博客的动力&#xff0c;一晃两年过去了&#xff0c;其实也是我新入职公司的两年&#xff0c;两年虽然不长&#xff0c;但是确实发生了太多事情值得去记录下来... 机缘 说是机缘也不是算是&#xff0c;第一次写博客是刚好在CSDN里面查资…

CentOS如何查找java安装路径

目 录 背景 详细步骤 1.使用指令查看有关javad安装路径 2.填入java路径 3.查找java安装路径 4.配置文件展示 背景 准备部署分布式hadoop的时候&#xff0c;校验hadoop版本发现java没配置 但是又有java版本信息 详细步骤 1.使用指令查看有关javad安装路径 java -verb…

高级IO(Linux)

高级IO 五种IO模型高级IO重要概念同步通信 vs 异步通信阻塞 vs 非阻塞 非阻塞IOfcntl实现函数SetNoBlock轮询方式读取标准输入 I/O多路转接之select初识selectselect函数原型参数解释参数timeout取值关于fd_set结构关于timeval结构函数返回值三级目录 理解select执行过程socket…