使用C语言实现学生信息管理系统
前言
在我们实现学生信息管理系统的过程中,我们几乎会使用到C语言最常用最重要的知识,对于刚学习完C语言的同学来说是一次很好的巩固机会,其中还牵扯到数据结果中链表的插入和删除内容。
实现学生信息管理系统
文件的创建与使用
·对于要实现一个大项目而言,我们要把函数进行分装,分装到头文件中,在.c文件中使用
#include"//头文件名"
另外对于定义函数时还可以专门的放在另一个.c文件中,便于维护,在这个小项目中当然不用这样做,不过为了养成好习惯,建议大家这样做。
头文件的使用
#include<stdio.h> #include<stdlib.h> #include<conio.h>
创建存储学生信息结构体和节点信息结构体
//学生信息
typedef struct _Student
{int stuNum;char name[30];int source;
}Student;//节点信息
typedef struct _Node
{Student student;struct _Node* next;
}Node;
系统界面的初始化
//初始化界面
void welcome()
{printf("**********************************\n");printf("*\t学生成绩管理系统\t*\n");printf("**********************************\n");printf("*\t请选择功能列表\t\t*\n");printf("**********************************\n");printf("*\t1.录入学生信息\t\t*\n");printf("*\t2.打印学生信息\t\t*\n");printf("*\t3.统计学生信息\t\t*\n");printf("*\t4.查找学生信息\t\t*\n");printf("*\t5.修改学生信息\t\t*\n");printf("*\t6.删除学生信息\t\t*\n");printf("*\t7.按成绩排序\t\t*\n");printf("*\t8.退出系统\t\t*\n");printf("**********************************\n");
}
输入学生信息
//输入学生信息
void inputStudent(Node* head)
{Node* fresh = (Node*)malloc(sizeof(Node));fresh->next = NULL;printf("请输入学生的学号、姓名、成绩:");scanf("%d %s %d", &fresh->student.stuNum, fresh->student.name, &fresh->student.source);Node* move = head;while (move->next != NULL){move = move->next;}//将学生信息插入链表尾部move->next = fresh;saveStudent(head);//学生信息持久化函数(自定义)
}
打印学生信息
//打印学生信息
void printStudent(Node* head)
{Node* move = head->next;while (move != NULL){printf("学号:%d 姓名:%s 成绩:%d\n", move->student.stuNum, move->student.name, move->student.source);move = move->next;}//暂停程序system("pause");
//清空控制台system("cls");
}
统计学生人数
//统计学生人数
void countStudent(Node* head)
{welcome();int count = 0;Node* move = head->next;while (move != NULL){count++;move = move->next;}printf("学生的总人数为%d", count);//暂停程序system("pause");
//清空控制台system("cls");
}
查找学生信息
void findStudent(Node* head)
{welcome();int stuNum;printf("\n请输入要查找的学生的学号:");scanf("%d", &stuNum);Node* move = head->next;while (move != NULL){if (stuNum == move->student.stuNum){printf("学号:%d 姓名:%s 成绩:%d\n", move->student.stuNum, move->student.name, move->student.source);return;}move = move->next;}printf("未找到学生信息\n");//暂停程序system("pause");
//清空控制台system("cls");
}
学生信息持久化
//学生信息持久化
void saveStudent(Node* head)
{FILE* file = fopen("./stu.info", "w");if (file == NULL){printf("文件打开失败\n");return;}Node* move = head->next;while (move != NULL){if ((fwrite(&move->student, sizeof(Student), 1, file)) != 1){printf("写入失败\n");return;}move = move->next;}fclose(file);
}
读取学生信息
//读取学生信息
void loadStudent(Node* head)
{FILE* file = fopen("./stu.info", "r");if (!file){printf("没有学生文件,跳过读取\n");return;}Node* fresh = (Node*)malloc(sizeof(Node));fresh->next = NULL;Node* move = head;while (fread(&fresh->student, sizeof(Student), 1, file) == 1){move->next = fresh;move = fresh;fresh = (Node*)malloc(sizeof(Node));fresh->next = NULL;}free(fresh);fclose(file);printf("读取成功\n");
}
修改学生信息
//学生信息修改
void modifyStudent(Node* head)
{welcome();printf("请输入要修改信息学生的学号:");int stuNum;scanf("%d", &stuNum);Node* move = head->next;while (move != NULL){if (stuNum == move->student.stuNum){printf("请输入学生的姓名、成绩\n");scanf("%s %d", move->student.name, &move->student.source);saveStudent(head);printf("修改成功\n");return;}move = move->next;//暂停程序system("pause");
//清空控制台system("cls");}printf("未找到学生信息\n");
}
删除学生信息
//删除学生信息
void deleteStudent(Node* head)
{welcome();int stuNum;printf("请输入要删除学生信息的学号");scanf("%d", &stuNum);Node* move = head;while (move->next != NULL){if (move->student.stuNum == stuNum){Node* tmp = move->next;//把要删除的数据的保存的节点存放在一个临时节点中,防止前后节点丢失move->next = move->next->next;free(tmp);tmp = NULL;saveStudent(head);printf("删除成功\n");return;}move = move->next;}//暂停程序system("pause");
//清空控制台system("cls");
}
链表的删除操作

由于没学到数据结构,这个只是我浅薄的认识。
对学生成绩进行排序
//对学生成绩排序
void sortStudent(Node* head)
{welcome();Node* move = NULL;Node* save = NULL;for (Node* turn = head->next; turn->next != NULL; turn = turn->next){for (Node* move = head->next; move->next != save; move = move->next){if (move->student.source > move->next->student.source){Student temp = move->student;move->student = move->next->student;move->next->student = temp;}}save = move;//下一趟排序不用再次比较已经排序好的最大值}printStudent(head);//暂停程序system("pause");
//清空控制台system("cls");
}
冒泡排序
冒泡排序是在一趟一趟的过程中对相邻元素比较大小进行排序,例如我们进行升序排序,在每一趟的过程中,会把这一趟的最大元素排到最前面,进而进行下一趟排序,周而复始知道最后一趟的相邻元素大小符合升序排列。
在其中排序的过程中,由于在每一趟中我们会把最大数排列在随后,所以在以后的每一次排序中都不必要对上一趟排序后结果的最大值进行比较,例如:

对于这个算法的实现请看下面:

![]()
退出系统以及在main函数中调用这些函数:
int main()
{Node* head = (Node*)malloc(sizeof(Node));head->next = NULL;loadStudent(head);welcome();while(1){char c = _getch();switch (c){case '1': inputStudent(head);break;case '2':printStudent(head);break;case '3':countStudent(head);break;case '4':findStudent(head);break;case '5':modifyStudent(head);break;case '6':deleteStudent(head);break;case '7':sortStudent(head);break;case '8':printf("\n欢迎下次使用,bye-");exit(0);break;default:printf("请重新输入\n");break;}}return 0;
}
退出系统

总结
对于前面的函数实现而言,大多数代码的思路是相同的,对于学生信息的删除和成绩排序需要我们重点理解,愿与诸君共勉!
相关文章:
使用C语言实现学生信息管理系统
前言 在我们实现学生信息管理系统的过程中,我们几乎会使用到C语言最常用最重要的知识,对于刚学习完C语言的同学来说是一次很好的巩固机会,其中还牵扯到数据结果中链表的插入和删除内容。 实现学生信息管理系统 文件的创建与使用 对于要实现…...
上下文视觉提示实现zero-shot分割检测及多visual-prompt改造
文章目录 一、Closed-Set VS Open-set二、DINOv2.1 论文和代码2.2 内容2.3 安装部署2.4 使用效果 三、多visual prompt 改造3.1 获取示例图mask3.2 修改函数参数3.3 推理代码3.4 效果的提升! 四、总结 本文主要介绍visual prompt模型DINOv,该模型可输入八…...
WebGL学习(一)渲染关系
学习webgl 开发理解渲染关系是必须的,也非常重要,很多人忽视了这个过程。 我这里先简单写一下,后面尽量用通俗易懂的方式,举例讲解。 WebGL,全称Web Graphics Library,是一种在网页上渲染3D图形的技术。它…...
人生建议:向猫学习
心安理得地被爱 猫从不担心自己不配得到爱,也正是这幅理所应当、宠辱不惊的样子,让人欲罢不能。或许 当你相信自己值得世界上最好的爱时,你就会拥有。 多晒太阳多睡觉 猫喜欢睡觉,尤其喜欢躺阳光好的地方。阳光和睡眠,…...
软件架构设计属性之三:结构性属性浅析
文章目录 引言一、结构性属性的定义二、结构性属性的关键要素1. 组件化2. 模块化3. 层次化4. 接口定义5. 数据流6. 依赖管理 三、结构性属性的设计原则1. 高内聚低耦合2. 松耦合3. 清晰的接口4. 可维护性5. 可扩展性 四、结构性属性的实现策略1. 组件划分2. 模块化设计3. 接口设…...
JAVA:多线程常见的面试题和答案
请关注微信公众号:拾荒的小海螺 博客地址:http://lsk-ww.cn/ 1、并发编程三要素? 原 子 性 原子性指的是一个或者多个操作,要么全部执行并且在执行的过程中不被其他操作打断,要么就全部都不执行。可 见 性 可见性指多…...
短信平台-平台群发短信
时代的进步带来了我们生活的便利,而其中最受欢迎和广泛应用的方式之一就是通过短信传递信息。在这个飞速发展的数字时代,我们需要一个高效、可靠的短信平台来满足不断增长的通讯需求。而今天,我要向大家推荐的正是这样一款卓越的短信平台——…...
C++:类和对象
一、前言 C是面向对象的语言,本文将通过上、中、下三大部分,带你深入了解类与对象。 目录 一、前言 二、部分:上 1.面向过程和面向对象初步认识 2.类的引入 3.类的定义 4.类的访问限定符及封装 5.类的作用域 6.类的实例化 7.类的…...
JavaScript条件语句与逻辑判断:解锁代码逻辑的奥秘【含代码示例】
JavaScript条件语句与逻辑判断:解锁代码逻辑的奥秘【含代码示例】 基本概念与作用if...else:决策的基础switch:多路分支的能手逻辑运算符:连接逻辑的纽带三元运算符:简洁的力量 功能使用思路与技巧短路求值优化防止swi…...
sparksql自定义函数
前言 Spark SQL UDF(也称为用户定义函数)是Spark SQL&DataFrame最有用的功能,它扩展了Spark内置功能。在本文中,我将解释什么是UDF?为什么我们需要它,以及如何使用Java、Scala示例在DataFrame和SQL上创建和使用它。 注意:UDF是最昂贵的操作,因此只有在必要时才使用…...
新人开发新系统,旧人维护旧系统
通常来说旧系统存在一些难以解决的问题,软件架构及逻辑实现可能会有一定的缺陷和复杂度,甚至有些烂系统可以称为”焦油坑“,意思是出现问题难以分析解决,谁来谁陷进去。因此,如果同时存在新系统(可能正在开…...
鸿蒙应用模型:【Stage模型开发】概述
Stage模型开发概述 基本概念 下图展示了Stage模型中的基本概念。 图1 Stage模型概念图 [AbilityStage] 每个Entry类型或者Feature类型的HAP在运行期都有一个AbilityStage类实例,当HAP中的代码首次被加载到进程中的时候,系统会先创建AbilityStage实例…...
java使用jdbcTemplatep批量插入数据
JdbcTemplate 是 Spring 框架中提供的一个简化 JDBC 操作的工具类,它封装了 JDBC 的核心功能,使得开发者能够更方便、简洁地进行数据库操作。 下面是一个使用 JdbcTemplate 进行批量插入的示例: import org.springframework.jdbc.core.Batch…...
K8s service 进阶
文章目录 K8s service 进阶Service 工作逻辑Service 具体实现Service 资源类型ClusterIPNodePortLoadBalancerExternalName Service 与 EndpointEndpoint 与 容器探针自定义Endpoint Service 相关字段sessionAffinityexternalTrafficPolicyinternalTrafficPolicypublishNotRead…...
CompletableFuture详细讲解
目录 一、基本概念 1.1 异步编程 1.2 CompletableFuture简介 二、创建和完成CompletableFuture 2.1 创建CompletableFuture对象 2.2 手动完成CompletableFuture 2.3 异常完成CompletableFuture 三、异步计算和回调 3.1 异步任务的执行 3.2 处理计算结果 四、组合多个…...
【Linux】初识Linux和Linux环境配置
1.什么是Linux操作系统 说到电脑系统 我想有大多数人会脱口而出:windows、mac 是的,这也是如今市场上主流的两种操作系统。 但是对于IT相关的人士来说,还有一种系统也是必须有姓名 那就是Linux Linux,Linux Is Not UniX 的…...
redis-cli help使用
1. redis-cli命令使用—先连接上服务器 连接到 Redis 服务器: 使用 redis-cli 命令即可连接到本地运行的 Redis 服务器,默认连接到本地的 6379 端口。 redis-cli如果 Redis 服务器不在本地或者端口不同,可以使用 -h 和 -p 参数指定主机和端…...
中华活页文选高中版投稿发表
《中华活页文选(高中版)》创刊于1960年,是中宣部所属中国出版传媒股份有限公司主管、中华书局主办的国家级基础教育期刊,曾获得“中国期刊方阵双效期刊”、国家新闻出版广电总局推荐的“百种优秀报刊”等荣誉称号。本刊以高中学科…...
[图解]企业应用架构模式2024新译本讲解02-表数据入口
1 00:00:00,420 --> 00:00:04,330 这个案例,我们就是用书上的案例了 2 00:00:06,080 --> 00:00:08,860 收入确认的一个案例 3 00:00:09,510 --> 00:00:11,100 书上讲了,收入确认 4 00:00:13,330 --> 00:00:15,270 就是说,你给…...
SSE(Server Sent Event) 踩坑留念
整条链路是 客户端A --> 服务端 A —> 服务端 B 我负责服务端 A 此时要注意 Client 中的 processes 的写法 Post(value “/v2/xx”, processes MediaType.TEXT_EVENT_STREAM) 这样写是一直报错的 改成下面的写法才可以 Post(value “/v2/xx”, processes MediaT…...
【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器
一.自适应梯度算法Adagrad概述 Adagrad(Adaptive Gradient Algorithm)是一种自适应学习率的优化算法,由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率,适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...
python/java环境配置
环境变量放一起 python: 1.首先下载Python Python下载地址:Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个,然后自定义,全选 可以把前4个选上 3.环境配置 1)搜高级系统设置 2…...
如何在看板中体现优先级变化
在看板中有效体现优先级变化的关键措施包括:采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中,设置任务排序规则尤其重要,因为它让看板视觉上直观地体…...
Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)
概述 在 Swift 开发语言中,各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过,在涉及到多个子类派生于基类进行多态模拟的场景下,…...
线程与协程
1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指:像函数调用/返回一样轻量地完成任务切换。 举例说明: 当你在程序中写一个函数调用: funcA() 然后 funcA 执行完后返回&…...
WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)
一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解,适合用作学习或写简历项目背景说明。 🧠 一、概念简介:Solidity 合约开发 Solidity 是一种专门为 以太坊(Ethereum)平台编写智能合约的高级编…...
如何理解 IP 数据报中的 TTL?
目录 前言理解 前言 面试灵魂一问:说说对 IP 数据报中 TTL 的理解?我们都知道,IP 数据报由首部和数据两部分组成,首部又分为两部分:固定部分和可变部分,共占 20 字节,而即将讨论的 TTL 就位于首…...
分布式增量爬虫实现方案
之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面,避免重复抓取,以节省资源和时间。 在分布式环境下,增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路:将增量判…...
使用Spring AI和MCP协议构建图片搜索服务
目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式(本地调用) SSE模式(远程调用) 4. 注册工具提…...
免费PDF转图片工具
免费PDF转图片工具 一款简单易用的PDF转图片工具,可以将PDF文件快速转换为高质量PNG图片。无需安装复杂的软件,也不需要在线上传文件,保护您的隐私。 工具截图 主要特点 🚀 快速转换:本地转换,无需等待上…...
