C/C++项目:超详细教程之大学一定会被布置的作业学生成绩管理系统,看到本篇不要再求别人给你抄啦,更不要花钱去买啦

相信如果你是个专业课有编程相关的大学生,一定被老师布置过令人头疼的学生成绩管理系统,它是高校各种信息管理系统中的一种。看完这篇教你轻松取得好成绩!千万不要花钱去买了!不做冤大头从看到这篇文章开始~

今天我就用C/C++带大家一步步完成学生成绩管理系统

PS:要安装easyx图形库哦 #include<easyx.h>    

开发工具为VS2019

在此之前呢,和大家说明一下,因为这是一个比较大的项目了,所以展示所有代码会有些困难,所以我裁剪了主要的大部分代码,主要目的是让大家明白实现这个项目的逻辑思路,希望大家可以理解,完整代码/编译器/图形库在文章最下方获取哦

正片开始:

第一步:定义学生结构,用结构体包装:

//学生结构 节点
typedef struct Student
{
	long long number;	//学号
	char name[10];		//姓名
	char grade[20];		//班级
	int math;			//数学
	int chinese;		//语文
	int english;		//英语
	struct Student* next;	//指向下一个节点得指针
}Student;

第二步:封装链表:

//链表得封装  单链表
typedef struct List
{
	Student* front;	//头指针
	Student* tail;	//尾指针	 方便插入
}List;

List* createList()
{
	List* list = calloc(1, sizeof(List));
	if (!list)
	{
		return NULL;
	}
	return list;
}
Student* createStudent()
{
	Student* newNode = (Student*)calloc(1, sizeof(Student));
	if (!newNode)
	{
		return NULL;
	}
	return newNode;
}

第三步:从文件中读取数据并生成一个链表返回:

List* createListFromFile(const char*filename)
{
	//创建头节点 calloc 会自动初始化申请的内存
	Student* headNode = createStudent();
	if (!headNode)
	{
		return NULL;
	}
	//如果头节点申请成功,则创建链表
	List*list = createList();
	list->front = headNode;
	list->tail = headNode;

	
	FILE* fp = fopen(filename, "r");
	//防御性编程,一定错误处理
	if (fp == NULL)
	{
		perror("open file failed~");
		return list;
	}
	//去掉表头字段
	char arr[1024] = { 0 };
	fgets(arr, 1024, fp);

	//读取文件 fscanf  p q s t h
	while (!feof(fp))
	{
		Student* newNode = createStudent();
		int ret = fscanf(fp, "%lld %s %s %d %d %d", &newNode->number, newNode->name, newNode->grade,
			&newNode->math, &newNode->chinese, &newNode->english);
		if (ret == EOF)	//如果读到了文件结尾,直接退出循环
		{
			break;
		}
		//把当前节点插入链表
		list->tail->next = newNode;
		list->tail = newNode;
	}


	fclose(fp);
	return list;
}

第四步:查看所有学生信息:

//查看所有学生信息
void printAll(List* list)
{
	//获取第一个节点的指针
	Student* curNode = list->front->next;
	//遍历
	printf("学号	t姓名t班级tt数学t语文t英语n");
	while (curNode !=NULL)
	{
		printf("%lldt%st%st%dt%dt%dn", curNode->number, curNode->name, curNode->grade,
			curNode->math, curNode->chinese, curNode->english);
		curNode = curNode->next;	//移动curNode
	}
}

第五步:查找学生信息:

//查找学生信息
//按学号查找
void searchNumber(List* list,long long number)
{
	Student* curNode = list->front->next;
	printf("学号	t姓名t班级tt数学t语文t英语n");
	while (curNode!=NULL)
	{
		//开始比较
		if (number == curNode->number)
		{
			printf("%lldt%st%st%dt%dt%dn", curNode->number, curNode->name, curNode->grade,
				curNode->math, curNode->chinese, curNode->english);
			//学号没有重复的,找到了直接结束循环
			break;
		}
		curNode = curNode->next;
	}
}

//按姓名查找
void searchName(List* list,const char*name)
{
	Student* curNode = list->front->next;
	printf("学号	t姓名t班级tt数学t语文t英语n");
	while (curNode!=NULL)
	{
		//比较姓名
		if (strcmp(name,curNode->name) == 0)
		{
			printf("%lldt%st%st%dt%dt%dn", curNode->number, curNode->name, curNode->grade,
				curNode->math, curNode->chinese, curNode->english);
		}
		curNode = curNode->next;
	}
}

第六步:删除学生:

//删除学生
void removeStudent(List* list, long long number)
{
	//1,找到要删除的学生节点
	Student* prevNode = list->front;	//让pervNext指向第一个数据节点
	while (prevNode->next != NULL)
	{
		//找到了
		if (prevNode->next->number == number)
		{
			break;
		}
		prevNode = prevNode->next;
	}
	if (prevNode->next != NULL)
	{
		//先保存要删除的节点
		Student* delNode = prevNode->next;
		//2,删除:1,先让前面的和后面的相连
		prevNode->next = delNode->next;
		//2,释放内存
		free(delNode);

		//如果删除的是最后一个
		if (prevNode->next == list->tail)
		{
			list->tail = prevNode;
		}
	}
}
oid menu()
{
	printf("********学生成绩管理系统****************n");
	printf("*tt1,查看所有学生tt*n");
	printf("*tt2,添加学生tt*n");
	printf("*tt3,删除学生tt*n");
	printf("*tt4,查找学生tt*n");
	printf("***************************************n");
}

int main()
{
	List* list = createListFromFile("assets/student.txt");
	
	int op = -1;
	while (true)
	{
		menu();
		printf("input select>");	
		scanf("%d", &op);
		switch (op)
		{
		case 1:			//查看
			printAll(list);
			break;
		case 2:			//添加
			break;
		case 3:			//删除
		{
			long long number = -1;
			printf("输入要删除的学生的学号>");
			scanf("%lld", &number);
			removeStudent(list, number);
		}
			break;
		case 4:			//查找
		{
			printf("****查找类型****n");
			printf("****1,按学号查找****n");
			printf("****2,按姓名查找****n");
			printf("inpu select>");
			scanf("%d", &op);	//n
			if (op == 1)
			{
				long long number = -1;
				printf("请输入要查询的学号>");
				scanf("%lld", &number);
				searchNumber(list, number);
			}
			else
			{
				char name[10] = { 0 };
				printf("请输入要查询的姓名>");
				getchar();				//读取并丢弃缓冲区中的n
				gets_s(name, 10);		//为什么直接跳过了
				searchName(list, name);
			}
		}
			break;
		default:
			break;
		}
		//先暂停
		system("pause");
		//再清屏
		system("cls");
	}


	return 0;
}

教程到此结束!

有兴趣的同学可以尝试写出来,后续我会发布更多的项目源码以及学习资料,希望大家可以持续关注。

想要C/C++学习资料以及完整源码素材图形库开发工具等的可以在文章末领取,希望大家可以在这里得到自己想要的知识,也希望如果对你有所帮助的话可以多多关注点赞评论,有建议也可以在评论区提出,谢谢大家的支持!


 

 获取资源神秘代码:源码资素材图形库还有大量学习资料都在这哦~icon-default.png?t=LBL2https://jq.qq.com/?_wv=1027&k=Mgs9YFRl

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>