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

2022年01月15日 阅读数:1
这篇文章主要向大家介绍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班级\t\t数学\t语文\t英语\n");
	while (curNode !=NULL)
	{
		printf("%lld\t%s\t%s\t%d\t%d\t%d\n", 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班级\t\t数学\t语文\t英语\n");
	while (curNode!=NULL)
	{
		//开始比较
		if (number == curNode->number)
		{
			printf("%lld\t%s\t%s\t%d\t%d\t%d\n", 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班级\t\t数学\t语文\t英语\n");
	while (curNode!=NULL)
	{
		//比较姓名
		if (strcmp(name,curNode->name) == 0)
		{
			printf("%lld\t%s\t%s\t%d\t%d\t%d\n", 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("*\t\t1,查看全部学生\t\t*\n");
	printf("*\t\t2,添加学生\t\t*\n");
	printf("*\t\t3,删除学生\t\t*\n");
	printf("*\t\t4,查找学生\t\t*\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