【挑战开发100个项目 | 1. C语言学生管理系统】
本项目是一个简易的学生信息管理系统,用户可以通过命令行界面完成学生信息的增加、删除、修改、查询、排序和列表展示等功能。数据以txt文件形式存储,实现了数据持久化。项目采用模块化设计,具有较好的可读性和扩展性。适用于初学者学习c语言,也适用于高校学生课程设计,毕业设计参考。
一,开发环境需求
-
操作系统 :windows, linux
-
开发环境工具 :qt ,vscode, visual studio
-
技术要求:
- 语言: C
- 数据结构: 链表
- 文件操作: 文件读写操作
二,功能说明
三,功能实现
- 录入学生信息
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 newlineprintf("年龄: ");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 listStudentNode *newNode = (StudentNode*)malloc(sizeof(StudentNode));newNode->data = newStudent;newNode->next = list->head;list->head = newNode;list->count++;printf("学生信息已添加成功!\n");
}
此函数用于添加学生信息。
- 删除学生信息
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");
}
此函数用于删除指定学生信息。
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 bufferfgets(current->data.name, sizeof(current->data.name), stdin);current->data.name[strlen(current->data.name)-1] = '\0'; // remove newlineprintf("年龄: ");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");
}
此函数用于修改指定学生信息。
- 查询学生信息
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");
}
此函数用于查询指定学生信息。
- 对学生信息排序
// 排序学生信息(这里以学号为例,升序排列)
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");
}
此函数用于对学生信息进行排序。
- 列出所有学生信息
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");
}
此函数用于显示所有学生的信息。
四,效果图
五,源码
代码已开源,可访问gitee下载。
六,总结
本项目是一个简单的学生信息管理系统,通过命令行界面与用户交互。主要实现了学生信息的增、删、查、改等功能。项目中主要使用C语言进行开发,并使用链表作为主要数据结构。经过严格的测试和修正,现在可以正常运行并满足基本的需求。
相关文章:

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

内存利用:迟来的blindless与逃不掉的exit漏洞
0x01 前言 在计算机安全领域,漏洞的危险性往往与其广泛性和潜在攻击方式密切相关。今天,我们将深入探讨一个异常危险的漏洞,它存在于程序退出时执行的常见函数"exit"中。无论是在操作系统还是应用程序中,"exit&qu…...

Vue - 虚拟DOM的简单理解
目录 虚拟DOM虚拟DOM树生成流程 因为直接操作真实的 DOM 会比较影响效率。所以 vue 使用了 虚拟DOM(VNode)来描述要渲染的内容。 虚拟DOM 它是一个 js 对象,比如: const vnode {tag: "h1",children: [{ tag: undefi…...

TongWeb8下应用忙碌线程监控
问题 : 在系统运行过程中发现TongWeb进程占用CPU过高,需要分析是应用哪里引起的问题。 分析过程(仅限Linux环境): 1. 通过top命令查看TongWeb的java进程占用的CPU情况。 查看误区:不要以为java进程CPU占到398%就是高࿰…...

Docker部署ActiveMQ消息中间件
1、准备工作 docker pull webcenter/activemq:5.14.3 Pwd"/data/software/activemq" mkdir ${Pwd}/data -p2、运行容器 docker run -d --name activemq \-p 61616:61616 \-p 8161:8161 \-v ${Pwd}/data:/opt/activemq/data \-v /etc/localtime:/etc/localtime \--r…...
Python并发执行(未完待续)
python的多进程执行 多进程实现方式一 from multiprocessing import Processdef func1(name):print("测试 %s 多进程" %name)if __name__ "__main__":process_list []for i in range(5):p Process(target func1, args (Python, ))p.start()process_…...
4.一元多项式相乘
题目说明: 要求采用链表形式,求两个一元多项式的乘积:h3 h1*h2。函数原型为:void multiplication( NODE * h1, NODE * h2, NODE * h3 )。 输入: 输入数据为两行,分别表示两个一元多项式。每个一元多项式以…...
Android Gilde获取网络图片显示保存路径并转化为bitmap
为某个按钮或者图片添加点击事件,然后:strImg为图片url地址 ,loadDialog只是个提示信息,可以不要这个参数。使用Glide的onResourceReady方法获取到bitmap对象: LoadDialog loadDialognew LoadDialog(); loadDialog.initShow(cont…...
Uts阿里百川旗舰版插件UniApp-X
简介: 此插件为Uts插件,1.0版暂只支持安卓 插件地址:https://ext.dcloud.net.cn/plugin?id14771 接入阿里百川安卓旗舰版最新版5.0.1.9!支持淘宝授权登录,获取登录用户信息,拉起淘宝,打开商…...

一创聚宽的实盘就要关闭了,有没有好用的实盘平台推荐
挺多的,比较普遍的是QMT和Ptrade,python语言,易上手,通用性好,要说适用性可以考虑Ptrade,问一下你的客户经理有没有,用Ptrade的券商也多,如果之前用一创聚宽你可以无缝切换ÿ…...

全套办公软件Office 2019 mac专业版功能
Microsoft office 2019 Beta for Mac 是一款办公软件套装,它包含常用的办公应用程序,如 Word、Excel、PowerPoint 和 Outlook 等。office 2019 Beta 版本是一个测试版本,旨在让用户提前体验下一个版本的 office 套件,以便用户可以…...

【计算机网络】IP协议
目录 前言 IP协议 基本概念 IP协议格式 分片 16位标识 3位标志与13位片偏移 分片流程 网段划分 网络号和主机号 DHCP协议 CIDR划分方案 特殊的ip地址 ip地址数量限制 私有ip地址与公网ip地址 路由转发 前言 我们前面讲了HTTP/HTTPS协议和TCP/…...

【操作系统笔记九】并发安全问题
用户态抢占和内核态抢占 内核中可以执行以下几种程序: ① 当前运行的进程:陷阱程序(系统调用) 和 故障程序(page fault) ,进程运行在内核态的时候,其实就是在执行进程在用户态触发的…...
主要文库网站网赚分析
前言 躺赚的方式有很多,最常见的是文档网站。你上传文档后,等别人来下载,然后你就获得收益。这似乎比开直播,写专栏,赚粉丝更轻松,但实际调研发现,情况没那么简单,真正赚到钱的是少…...

“ElementUI实现动态树和动态表格的综合应用“
目录 引言1. ElementUI树1.1 树的基本概念1.2 示例代码和效果展示 2. ElementUI实现动态表格2.1 表格的基本概念2.2 示例代码和效果展示 总结 引言 在前端开发中,动态树和动态表格是常见的功能需求。ElementUI是一套基于Vue.js的组件库,提供了丰富的UI组…...
按键检测|中断检测
一.按键检测 1.硬件原理 当未按下按键时,GPIO_5为低电平,按下按键GPIO_5变为高电平。 根据引脚编号找到引脚名称 根据引脚名称找到引脚编号 裸机程序控制外设 特点:读数据手册、设寄存器值 找出外设有哪些相关寄存器找出外设相关寄存器如何…...

MySQL的执行流程
在聊mysql的执行流程之前,咱们要先聊聊mysql的逻辑架构。 逻辑架构 可以将上图简化为下图 连接层 客服端访问mysql服务器前,要先和mysq建立tcp连接。经过3次握手建立连接成功后,mysql服务器对tcp传输过来的账号密码进行身份认证&#x…...

如何办一份有价值的企业内刊/报纸?向《华为人》学习就够了
前两天有一个朋友联系华研荟,说他是今年大学毕业加入了一个中型公司,他学的是企业管理,在公司人力资源部门工作。上周老板说公司要办一份自己的内刊,这个工作由人力资源部负责,而人力资源经理就把这个活交给她了。 她…...

C++:从初识到初识的旅程
为什么文章是初识到初识呢,因为我真的仅仅是初识,大学只上了半个学期的C,其他的都是网络课程为主 在我踏入大学校门的那刻,我对于未来充满了无限的好奇和期待。其中,C这门神秘的编程语言进入了我的视线。虽然我的专业…...

JavaWeb 学习
1. 基本概念 1.1 Web web:网络,网页 静态 web html,css提供给所有人看的数据始终不会变化 动态 web 淘宝提供给每个人看的数据会有所不同技术栈:Servlet/JSP,ASP,PHP Java 中,动态 web 资…...

IDEA运行Tomcat出现乱码问题解决汇总
最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…...

深入剖析AI大模型:大模型时代的 Prompt 工程全解析
今天聊的内容,我认为是AI开发里面非常重要的内容。它在AI开发里无处不在,当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗",或者让翻译模型 "将这段合同翻译成商务日语" 时,输入的这句话就是 Prompt。…...

.Net框架,除了EF还有很多很多......
文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...
渲染学进阶内容——模型
最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...
使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装
以下是基于 vant-ui(适配 Vue2 版本 )实现截图中照片上传预览、删除功能,并封装成可复用组件的完整代码,包含样式和逻辑实现,可直接在 Vue2 项目中使用: 1. 封装的图片上传组件 ImageUploader.vue <te…...
ffmpeg(四):滤镜命令
FFmpeg 的滤镜命令是用于音视频处理中的强大工具,可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下: ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜: ffmpeg…...
Python如何给视频添加音频和字幕
在Python中,给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加,包括必要的代码示例和详细解释。 环境准备 在开始之前,需要安装以下Python库:…...

【开发技术】.Net使用FFmpeg视频特定帧上绘制内容
目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法,当前调用一个医疗行业的AI识别算法后返回…...

算法笔记2
1.字符串拼接最好用StringBuilder,不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...

给网站添加live2d看板娘
给网站添加live2d看板娘 参考文献: stevenjoezhang/live2d-widget: 把萌萌哒的看板娘抱回家 (ノ≧∇≦)ノ | Live2D widget for web platformEikanya/Live2d-model: Live2d model collectionzenghongtu/live2d-model-assets 前言 网站环境如下,文章也主…...