使用C语言实现学生信息管理系统

前言

在我们实现学生信息管理系统的过程中,我们几乎会使用到C语言最常用最重要的知识,对于刚学习完C语言的同学来说是一次很好的巩固机会,其中还牵扯到数据结果中链表的插入和删除内容。

实现学生信息管理系统

文件的创建与使用

·对于要实现一个大项目而言,我们要把函数进行分装,分装到头文件中,在**.c**文件中使用

cpp 复制代码
#include"//头文件名"

另外对于定义函数时还可以专门的放在另一个**.c**文件中,便于维护,在这个小项目中当然不用这样做,不过为了养成好习惯,建议大家这样做。

头文件的使用

cpp 复制代码
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>

创建存储学生信息结构体和节点信息结构体

cpp 复制代码
//学生信息
typedef struct _Student
{
	int stuNum;
	char name[30];
	int source;
}Student;

//节点信息
typedef struct _Node
{
	Student student;
	struct _Node* next;
}Node;

系统界面的初始化

cpp 复制代码
//初始化界面
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");
}

输入学生信息

cpp 复制代码
//输入学生信息
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);//学生信息持久化函数(自定义)
} 

打印学生信息

cpp 复制代码
//打印学生信息
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");
}

统计学生人数

cpp 复制代码
//统计学生人数
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");
}

查找学生信息

cpp 复制代码
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");
}

学生信息持久化

cpp 复制代码
//学生信息持久化
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);
}

读取学生信息

cpp 复制代码
//读取学生信息
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");
}

修改学生信息

cpp 复制代码
//学生信息修改
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");
}

删除学生信息

cpp 复制代码
//删除学生信息
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");
}

链表的删除操作

由于没学到数据结构,这个只是我浅薄的认识。

对学生成绩进行排序

cpp 复制代码
//对学生成绩排序
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函数中调用这些函数:

cpp 复制代码
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;
}

退出系统

总结

对于前面的函数实现而言,大多数代码的思路是相同的,对于学生信息的删除和成绩排序需要我们重点理解,愿与诸君共勉!

相关推荐
码流之上33 分钟前
【一看就会一写就废 指间算法】设计电子表格 —— 哈希表、字符串处理
javascript·算法
用户6120414922131 小时前
C语言做的文本词频数量统计功能
c语言·后端·敏捷开发
快手技术2 小时前
快手提出端到端生成式搜索框架 OneSearch,让搜索“一步到位”!
算法
CoovallyAIHub1 天前
中科大DSAI Lab团队多篇论文入选ICCV 2025,推动三维视觉与泛化感知技术突破
深度学习·算法·计算机视觉
NAGNIP1 天前
Serverless 架构下的大模型框架落地实践
算法·架构
moonlifesudo1 天前
半开区间和开区间的两个二分模版
算法
moonlifesudo1 天前
300:最长递增子序列
算法
CoovallyAIHub1 天前
港大&字节重磅发布DanceGRPO:突破视觉生成RLHF瓶颈,多项任务性能提升超180%!
深度学习·算法·计算机视觉
CoovallyAIHub1 天前
英伟达ViPE重磅发布!解决3D感知难题,SLAM+深度学习完美融合(附带数据集下载地址)
深度学习·算法·计算机视觉
聚客AI2 天前
🙋‍♀️Transformer训练与推理全流程:从输入处理到输出生成
人工智能·算法·llm