使用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…...

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)
题目:3442. 奇偶频次间的最大差值 I 思路 :哈希,时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况,哈希表这里用数组即可实现。 C版本: class Solution { public:int maxDifference(string s) {int a[26]…...
oracle与MySQL数据库之间数据同步的技术要点
Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异,它们的数据同步要求既要保持数据的准确性和一致性,又要处理好性能问题。以下是一些主要的技术要点: 数据结构差异 数据类型差异ÿ…...
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...
06 Deep learning神经网络编程基础 激活函数 --吴恩达
深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...
高防服务器能够抵御哪些网络攻击呢?
高防服务器作为一种有着高度防御能力的服务器,可以帮助网站应对分布式拒绝服务攻击,有效识别和清理一些恶意的网络流量,为用户提供安全且稳定的网络环境,那么,高防服务器一般都可以抵御哪些网络攻击呢?下面…...
C++八股 —— 单例模式
文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全(Thread Safety) 线程安全是指在多线程环境下,某个函数、类或代码片段能够被多个线程同时调用时,仍能保证数据的一致性和逻辑的正确性…...

tree 树组件大数据卡顿问题优化
问题背景 项目中有用到树组件用来做文件目录,但是由于这个树组件的节点越来越多,导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多,导致的浏览器卡顿,这里很明显就需要用到虚拟列表的技术&…...
Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信
文章目录 Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket(服务端和客户端都要)2. 绑定本地地址和端口&#x…...

sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!
简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求,并检查收到的响应。它以以下模式之一…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...