C语言--学习管理系统

功能分区

欢迎界面

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("*\t9.退出系统\t\t*\n");
	printf("*********************************\n");
}


录入学生信息

void InputStudent(Node *head)
{
	Node* fresh = malloc(sizeof(Node));
	fresh->next = NULL;
	printf("请录入学生的学号,姓名,成绩:\n");
	scanf("%d%s%d", &fresh->student.stuNum, fresh->student.name, &fresh->student.score);
	saveStudent(head); // 保存学生信息(录入一个保存一个)
	Node* move = head;//找到结点尾部
	while (move->next != NULL)
	{
		move = move->next;
	}
	move->next = fresh;//将学生信息放入链表尾部
	//暂停程序
	system("pause");
	//清空控制台
	system("cls");
}

打印学生信息

void PrintStudent(Node* head)
{
	Node* move = head->next;//将move定义在首结点(不是头结点)实现遍历
	while (move != NULL) {
		printf("学号:%d 姓名:%s 成绩:%d\n", move->student.stuNum, move->student.name, move->student.score);
		move = move->next;
	}
	//暂停程序
	system("pause");
	//清空控制台
	system("cls");
}

统计学生人数

void countStudent(Node* head)
{
	int count = 0;
	Node* move = head->next;//将move定义在首结点(不是头结点)实现遍历
	while (move != NULL) {
		move = move->next;
		count++;
	}
	printf("学生的总人数为:%d", count);
	// 暂停程序
		system("pause");
	//清空控制台
	system("cls");
}

查找学生信息

void findStudent(Node* head)
{
	printf("请输入需要查找的学生的学号:");
	int stuNum;
	scanf("%d", &stuNum);
	Node* move = head->next;//将move定义在首结点(不是头结点)实现遍历
	while (move != NULL)
	{
		if (stuNum == move->student.stuNum) {
			printf("学号:%d 姓名:%s 成绩:%d\n", move->student.stuNum, move->student.name, move->student.score);
			// 暂停程序
			system("pause");
			//清空控制台
			system("cls");
			return;//break只是跳出循环,用return直接跳出函数
		}
		move = move->next;
	}
	printf("未找到学生信息\n");
	// 暂停程序
	system("pause");
	//清空控制台
	system("cls");
}

修改学生信息

void modifyStudent(Node* head) {
	printf("请输入要修改的学生的学号:");
	int stuNum;
	scanf("%d", &stuNum);
	Node* move = head->next;//将move定义在首结点(不是头结点)实现遍历
	while (move != NULL) {
		if (stuNum == move->student.stuNum) {
			printf("请输入学生姓名,成绩\n");
			scanf("%s%d", move->student.name,&move->student.score);
			printf("修改成功");
			// 暂停程序
			system("pause");
			//清空控制台
			system("cls");
			return;
		}
		move = move->next;
	}
	printf("未找到学生信息");
	// 暂停程序
	system("pause");
	//清空控制台
	system("cls");
}

删除学生信息

void deleteStudent(Node* head) {
	printf("请输入需要删除的学生学号:");
	int stuNum;
	scanf("%d", &stuNum);
	Node* move = head;
	while (move->next!= NULL) {
		if (move->next->student.stuNum == stuNum) {
			Node* temp = move->next;//将需要删除额结点赋给临时结点,方便后面释放结点
			move->next = move->next->next;
			free(temp);//释放掉需要删除的结点
			temp = NULL;//临时结点内容被释放后,结点指针指向空
			saveStudent(head);//同步文件,重新存入删除后的新链表
			printf("删除成功");
			// 暂停程序
			system("pause");
			//清空控制台
			system("cls");
			return;
		}
		move = move->next;
	}
	printf("未找到学生");
}

按成绩排序

void sortStudent1(Node* head) {
	Node* move = NULL;
	Node* save = NULL;
	for (Node* turn = head->next; turn->next != NULL; turn = turn->next)//冒泡降序,控制轮数为n-1
	{
		for (move = head->next; move->next != save; move = move->next)
		{
			if (move->student.score < move->next->student.score) {
				Student temp;
				temp = move->student;
				move->student = move->next->student;
				move->next->student = temp;
			}
		}
		save = move;
	}
	PrintStudent(head);//打印排序后的学生成绩
}

按学号排序

void sortStudent2(Node* head) {
	Node* move = NULL;
	Node* save = NULL;
	for (Node* turn = head->next; turn->next != NULL; turn = turn->next)//冒泡升序,控制轮数为n-1
	{
		for (move = head->next; move->next != save; move = move->next)
		{
			if (move->student.stuNum > move->next->student.stuNum) {
				Student temp;
				temp = move->student;
				move->student = move->next->student;
				move->next->student = temp;
			}
		}
		save = move;
	}
	PrintStudent(head);//打印排序后的学生成绩
}

保存学生信息

void saveStudent(Node* head)
{
	//打开文件
	FILE* file = fopen("./stu.info", "w");//定义一个文件类型的指针file指向打开的文件(文件名为stu.info)
	//  ./表示相对路径,即当前代码文件存在哪,那么这个被打开(创建)的文件就放在哪
	if (file == NULL) {
		printf("打开文件失败\n");
		return;
	}
	Node* move = head->next;
	while (move != NULL) {
		//将结构体写入文件
		if (fwrite(&move->student, sizeof(Student), 1, file) != 1) {
			printf("保存%s出现错误\n", move->student.name);
		}
		move = move->next;
	}
	//关闭文件
	fclose(file);
	// 暂停程序
	system("pause");
	//清空控制台
	system("cls");
}

载入学生信息

程序开始即从保存的文件中读取上次保存的信息,避免重复读入

void loadStudent(Node* head) {
	//打开文件
	FILE* file = fopen("./stu.info", "r");
	//做判断
	if (!file) {
		printf("没有学生文件,跳过读取\n");
		return;
	}
	Node* fresh = malloc(sizeof(Node));
	fresh->next = NULL;
	Node* move = head;
	while (fread(&fresh->student, sizeof(Student), 1, file)==1) {
		move->next = fresh;
		move = fresh;//move指针移动(始终在最后一个结点位置)
		fresh = malloc(sizeof(Node));//再次创捷一个新的结点fresh
		fresh->next = NULL;
	}
	free(fresh);//最后多定义了一个结点fresh,要把它释放掉
	//关闭文件
	fclose(file);
	printf("读取成功\n");
}

完整代码

头文件

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>

//学生信息
typedef struct _Student
{
	int stuNum;
	char name[20];
	int score;
}Student;

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

//界面
void Welcome();
//录入学生信息
void InputStudent(Node* head);

//打印学生信息
void PrintStudent(Node* head);

//统计学生人数
void countStudent(Node* head);

//查找学生信息
void findStudent();

//持久保存学生信息
void saveStudent(Node* head);

//程序启动时读入文件(避免重复输入)
void loadStudent(Node* head);

//修改学生信息
void modifyStudent(Node* head);

//删除学生信息
void deleteStudent(Node* head);

//按成绩排序
void sortStudent1(Node* head);

//按学号排序
void sortStudent2(Node* head);

main()

#include"学生管理系统.h"
int main()
{
	//创建头结点(只需创建一次)
	Node* head = malloc(sizeof(Node));
	head->next = NULL;
	loadStudent(head);//程序启动时读入文件(避免重复输入)
	while (1)
	{
		Welcome();//创建界面

		//从键盘接收一个字符(不用按回车)
		printf_s("请选择功能:\n");
		char ch = _getch();

		switch (ch)
		{
		/*case '0'://保存学生信息
			saveStudent(head);
			break;*/
		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'://按成绩排序
			sortStudent1(head);
			break;
		case '8'://按学号排序
			sortStudent2(head);
			break;
		case '9'://退出系统
			system("cls");
			printf("欢迎下次使用,Bye Bye");
			exit(0);//或者写returns
		default:
			break;
		}
	}
	return 0;
}

//欢迎界面
void Welcome()
{
	printf("*********************************\n");
	printf("*\t学生成绩管理系统\t\n");
	printf("*********************************\n");
	printf("*\t请选择功能列表\t\t\n");
	printf("*********************************\n");
	//printf("*\t0.保存学生信息\t\t*\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("*\t9.退出系统\t\t*\n");
	printf("*********************************\n");
}

//录入学生信息
void InputStudent(Node *head)
{
	Node* fresh = malloc(sizeof(Node));
	fresh->next = NULL;
	printf("请录入学生的学号,姓名,成绩:\n");
	scanf("%d%s%d", &fresh->student.stuNum, fresh->student.name, &fresh->student.score);
	saveStudent(head); // 保存学生信息(录入一个保存一个)
	Node* move = head;//找到结点尾部
	while (move->next != NULL)
	{
		move = move->next;
	}
	move->next = fresh;//将学生信息放入链表尾部
	//暂停程序
	system("pause");
	//清空控制台
	system("cls");
}


void PrintStudent(Node* head)
{
	Node* move = head->next;//将move定义在首结点(不是头结点)实现遍历
	while (move != NULL) {
		printf("学号:%d 姓名:%s 成绩:%d\n", move->student.stuNum, move->student.name, move->student.score);
		move = move->next;
	}
	//暂停程序
	system("pause");
	//清空控制台
	system("cls");
}

void countStudent(Node* head)
{
	int count = 0;
	Node* move = head->next;//将move定义在首结点(不是头结点)实现遍历
	while (move != NULL) {
		move = move->next;
		count++;
	}
	printf("学生的总人数为:%d", count);
	// 暂停程序
		system("pause");
	//清空控制台
	system("cls");
}

void findStudent(Node* head)
{
	printf("请输入需要查找的学生的学号:");
	int stuNum;
	scanf("%d", &stuNum);
	Node* move = head->next;//将move定义在首结点(不是头结点)实现遍历
	while (move != NULL)
	{
		if (stuNum == move->student.stuNum) {
			printf("学号:%d 姓名:%s 成绩:%d\n", move->student.stuNum, move->student.name, move->student.score);
			// 暂停程序
			system("pause");
			//清空控制台
			system("cls");
			return;//break只是跳出循环,用return直接跳出函数
		}
		move = move->next;
	}
	printf("未找到学生信息\n");
	// 暂停程序
	system("pause");
	//清空控制台
	system("cls");
}

void saveStudent(Node* head)
{
	//打开文件
	FILE* file = fopen("./stu.info", "w");//定义一个文件类型的指针file指向打开的文件(文件名为stu.info)
	//  ./表示相对路径,即当前代码文件存在哪,那么这个被打开(创建)的文件就放在哪
	if (file == NULL) {
		printf("打开文件失败\n");
		return;
	}
	Node* move = head->next;
	while (move != NULL) {
		//将结构体写入文件
		if (fwrite(&move->student, sizeof(Student), 1, file) != 1) {
			printf("保存%s出现错误\n", move->student.name);
		}
		move = move->next;
	}
	//关闭文件
	fclose(file);
	// 暂停程序
	system("pause");
	//清空控制台
	system("cls");
}

void loadStudent(Node* head) {
	//打开文件
	FILE* file = fopen("./stu.info", "r");
	//做判断
	if (!file) {
		printf("没有学生文件,跳过读取\n");
		return;
	}
	Node* fresh = malloc(sizeof(Node));
	fresh->next = NULL;
	Node* move = head;
	while (fread(&fresh->student, sizeof(Student), 1, file)==1) {
		move->next = fresh;
		move = fresh;//move指针移动(始终在最后一个结点位置)
		fresh = malloc(sizeof(Node));//再次创捷一个新的结点fresh
		fresh->next = NULL;
	}
	free(fresh);//最后多定义了一个结点fresh,要把它释放掉
	//关闭文件
	fclose(file);
	printf("读取成功\n");
}

void modifyStudent(Node* head) {
	printf("请输入要修改的学生的学号:");
	int stuNum;
	scanf("%d", &stuNum);
	Node* move = head->next;//将move定义在首结点(不是头结点)实现遍历
	while (move != NULL) {
		if (stuNum == move->student.stuNum) {
			printf("请输入学生姓名,成绩\n");
			scanf("%s%d", move->student.name,&move->student.score);
			printf("修改成功");
			// 暂停程序
			system("pause");
			//清空控制台
			system("cls");
			return;
		}
		move = move->next;
	}
	printf("未找到学生信息");
	// 暂停程序
	system("pause");
	//清空控制台
	system("cls");
}

void deleteStudent(Node* head) {
	printf("请输入需要删除的学生学号:");
	int stuNum;
	scanf("%d", &stuNum);
	Node* move = head;
	while (move->next!= NULL) {
		if (move->next->student.stuNum == stuNum) {
			Node* temp = move->next;//将需要删除额结点赋给临时结点,方便后面释放结点
			move->next = move->next->next;
			free(temp);//释放掉需要删除的结点
			temp = NULL;//临时结点内容被释放后,结点指针指向空
			saveStudent(head);//同步文件,重新存入删除后的新链表
			printf("删除成功");
			// 暂停程序
			system("pause");
			//清空控制台
			system("cls");
			return;
		}
		move = move->next;
	}
	printf("未找到学生");
}

void sortStudent1(Node* head) {
	Node* move = NULL;
	Node* save = NULL;
	for (Node* turn = head->next; turn->next != NULL; turn = turn->next)//冒泡降序,控制轮数为n-1
	{
		for (move = head->next; move->next != save; move = move->next)
		{
			if (move->student.score < move->next->student.score) {
				Student temp;
				temp = move->student;
				move->student = move->next->student;
				move->next->student = temp;
			}
		}
		save = move;
	}
	PrintStudent(head);//打印排序后的学生成绩
}

void sortStudent2(Node* head) {
	Node* move = NULL;
	Node* save = NULL;
	for (Node* turn = head->next; turn->next != NULL; turn = turn->next)//冒泡升序,控制轮数为n-1
	{
		for (move = head->next; move->next != save; move = move->next)
		{
			if (move->student.stuNum > move->next->student.stuNum) {
				Student temp;
				temp = move->student;
				move->student = move->next->student;
				move->next->student = temp;
			}
		}
		save = move;
	}
	PrintStudent(head);//打印排序后的学生成绩
}
全部评论
刚刚学,菜鸟一枚,别嫌弃
1 回复 分享
发布于 2023-08-21 23:42 湖北
1 回复 分享
发布于 2023-08-21 23:41 湖北
编译不对
点赞 回复 分享
发布于 2024-06-11 17:40 河南
可以啊
点赞 回复 分享
发布于 2023-12-22 22:02 吉林

相关推荐

白火同学:能。我当初应届沟通了1200,收简历50,面试10左右吧,加油投吧
点赞 评论 收藏
分享
05-20 13:59
门头沟学院 Java
米黑子米黑子:你这个成绩不争取下保研?
点赞 评论 收藏
分享
评论
3
3
分享

创作者周榜

更多
牛客网
牛客企业服务