使用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;
}

退出系统

总结

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

相关推荐
圣保罗的大教堂1 小时前
《算法笔记》9.3小节——数据结构专题(2)->树的遍历 问题 A: 树查找
算法
Suwg2091 小时前
【Java导出word】使用poi-tl轻松实现Java导出数据到Word文档
java·开发语言·word·poi-tl
myzzb1 小时前
python字符级差异分析并生成 Word 报告 自然语言处理断句
python·学习·自然语言处理·word·snownlp
水w1 小时前
【pyCharm Git】根据dev分支新建dev_y分支,本地也新建dev_y分支,并将代码提交到Gitlab上的新分支dev_y上。
开发语言·git·python·pycharm·pull·push·branch
范哥来了2 小时前
python 数据可视化matplotib库安装与使用
开发语言·python·信息可视化
laimaxgg2 小时前
Qt窗口控件之颜色对话框QColorDialog
开发语言·前端·c++·qt·命令模式·qt6.3
wkm9562 小时前
Ubuntu Qt: no service found for - “org.qt-project.qt.mediaplayer“
开发语言·qt·ubuntu
小画家~3 小时前
第三:go 操作mysql
开发语言·mysql·golang
修炼成精3 小时前
C#实现的一个简单的软件保护方案
java·开发语言·c#
小麦嵌入式3 小时前
Linux驱动开发实战(六):设备树升级!插件设备树点灯!
linux·c语言·驱动开发·单片机·嵌入式硬件·mcu·ubuntu