简单的学生成绩管理系统(C语言链表)附源码加注解

大一上学期结束,老师布置的一个小项目

项目要求:1.输入数据到文件 2.根据学号查询成绩 3.根据学号、科目名修改成绩 4.根据学号删除成绩 5.统计成绩(各科最高和平均)

1)链表的话就要先把“车厢”设置好,一个是数据域一个是指针域

struct Student
{
	char name[10];
	int num;
	int Language;
	int Math;
	int English;
};
typedef struct _Node
{
	Student stu;
	struct _Node* pNext;
}Node;

当然不能忘了“车头”

Node* g_phead = NULL;

2)写项目的开始界面(简洁)

void start()
{
	system("cls");
	for (int i = 0; i < 5; i++)
	{
		printf("\n");
	}
	printf("\t\t\t\t\t*****************************************\n");
	printf("\t\t\t\t\t*\t     学生成绩管理系统\t\t*\n");
	printf("\t\t\t\t\t*****************************************\n");
	printf("\t\t\t\t\t*\t\t1.输入成绩\t\t*\n");
	printf("\t\t\t\t\t*\t\t2.查询成绩\t\t*\n");
	printf("\t\t\t\t\t*\t\t3.修改成绩\t\t*\n");
	printf("\t\t\t\t\t*\t\t4.删除成绩\t\t*\n");
	printf("\t\t\t\t\t*\t\t5.统计成绩\t\t*\n");
	printf("\t\t\t\t\t*\t\t0.退出系统\t\t*\n");
	printf("\t\t\t\t\t*****************************************\n\n");
	printf("\t\t\t\t\t输入相应功能选项:");
}

3)数据的输入(包括savefile()函数和print()函数)

void Input()
{
	void savefile(); void print();
	Node* pNewNode = (Node*)malloc(sizeof(Node));
	pNewNode->pNext = NULL;
	if (g_phead == NULL)
	{
		g_phead = pNewNode;
	}
	else
	{
		pNewNode->pNext = g_phead;
		g_phead = pNewNode;
	}
	printf("\n\t\t\t\t\t请输入学生姓名:");
	scanf("%s", &pNewNode->stu.name);
	printf("\n\t\t\t\t\t请输入学生学号:");
	scanf_s("%d", &pNewNode->stu.num);
	printf("\n\t\t\t\t\t请输入学生语文成绩:");
	scanf_s("%d", &pNewNode->stu.Language);
	printf("\n\t\t\t\t\t请输入学生数学成绩:");
	scanf_s("%d", &pNewNode->stu.Math);
	printf("\n\t\t\t\t\t请输入学生英语成绩:");
	scanf_s("%d", &pNewNode->stu.English);
	savefile();
	print();
	system("pause");

}

savefile()函数,保存成绩进文件

void savefile()
{
	FILE* fp;
	fp = fopen("学生成绩.txt", "w");
	if (fp == NULL)
	{
		printf("打开文件失败");
		return;
	}
	Node* p = g_phead;
	while (p != NULL)
	{
		fwrite(&p->stu, 1, sizeof(Student), fp);
		p = p->pNext;
	}
	fclose(fp);
	printf("\n\t\t\t\t\t学生信息录入成功\n");
}

print()函数,在界面上打印出每名学生的各科成绩

void print()
{
	Node* p = g_phead;
	printf("\t\t\t\t\t*****************************************\n");
	printf("\t\t\t\t\t*\t     学生成绩管理系统\t\t*\n");
	printf("\t\t\t\t\t*****************************************\n");
	printf("\n\t\t\t\t\t* 学号  *姓名   *语文   *数学   *英语   *\n");
	printf("\t\t\t\t\t*****************************************\n");
	while (p != NULL)
	{
		printf("\n\t\t\t\t\t*  %d   %s     %d     %d     %d   *\n", p->stu.num, p->stu.name, p->stu.Language, p->stu.Math, p->stu.English);
		printf("\t\t\t\t\t*****************************************\n");
		p = p->pNext;
	}

}

4)数据的查找

Node* Find()
{
	int num; char name[20];
	printf("\n\t\t\t\t\t请输入目标学生学号:");
	scanf_s("%d", &num);
	printf("\n\t\t\t\t\t请输入目标学生姓名:");
	scanf("%s", name);
	Node* p = g_phead;
	while (p != NULL)
	{
		if (p->stu.num == num || 0 == strcmp(p->stu.name, name))
		{
			return p;
		}
		p = p->pNext;
	}
	return NULL;
}

5)数据的修改

void Modify()
{
	int num;
	printf("\n\t\t\t\t\t请输入目标学生学号:");
	scanf_s("%d", &num);
	Node* p = g_phead;
	while (p != NULL)
	{
		if (p->stu.num == num)
		{
			int n;
			printf("\t\t\t\t\t*****************************************\n");
			printf("\t\t\t\t\t*\t     学生成绩管理系统\t\t*\n");
			printf("\t\t\t\t\t*****************************************\n");
			printf("\t\t\t\t\t*\t\t1.英语  \t\t*\n");
			printf("\t\t\t\t\t*\t\t2.语文  \t\t*\n");
			printf("\t\t\t\t\t*\t\t3.数学  \t\t*\n");
			printf("\t\t\t\t\t*****************************************\n\n");
			printf("\t\t\t\t\t输入相应功能选项:");
			scanf("%d", &n);
			if (n == 1)
			{
				printf("\t\t\t\t\t*\t\t新成绩:  \t\t");
				scanf_s("%d", &p->stu.English);
				printf("\n\t\t\t\t\t修改成功\n");
				print();
			}
			if (n == 2)
			{
				printf("\t\t\t\t\t*\t\t新成绩:  \t\t");
				scanf_s("%d", &p->stu.Language);
				printf("\n\t\t\t\t\t修改成功\n");
				print();
			}
			if (n == 3)
			{
				printf("\t\t\t\t\t*\t\t新成绩:  \t\t");
				scanf_s("%d", &p->stu.Math);
				printf("\n\t\t\t\t\t修改成功\n");
				print();
			}
			break;
		}
		p = p->pNext;
	}
	if (p == NULL)
	{
		printf("\n\t\t\t\t\t查无此人");
	}
	system("pause");
}

6)数据的删除

void Delete()
{
	int num;
	printf("\n\t\t\t\t\t请输入删除学生学号:");
	scanf_s("%d", &num);
	Node* p1; Node* p = g_phead; Node* p2;
	if (g_phead->stu.num == num)
	{
		p1 = g_phead;
		g_phead = g_phead->pNext;
		free(p1);
		print();
		system("pause");
		return;
	}
	while (p->pNext != NULL)
	{
		if (p->pNext->stu.num == num)
		{
			p2 = p->pNext;
			p->pNext = p->pNext->pNext;
			free(p2);
			print();
			system("pause");
			return;
		}
		p = p->pNext;
		if (p->pNext == NULL)
		{
			break;
		}
	}
	if (p->pNext == NULL)
	{
		printf("\n\t\t\t\t\t查无此人\n");
		system("pause");
	}
}

7)数据的统计(每个功能我都写了一个函数去实现,最后整合在这个函数)

void Statistics()
{
	int c;
	int English(); int Math(); int Language(); int english(); int math(); int language();
	printf("\t\t\t\t\t*****************************************\n");
	printf("\t\t\t\t\t*\t     学生成绩管理系统\t\t*\n");
	printf("\t\t\t\t\t*****************************************\n");
	printf("\t\t\t\t\t*\t\t1.数学最高\t\t*\n");
	printf("\t\t\t\t\t*\t\t2.语文最高\t\t*\n");
	printf("\t\t\t\t\t*\t\t3.英语最高\t\t*\n");
	printf("\t\t\t\t\t*\t\t4.数学平均\t\t*\n");
	printf("\t\t\t\t\t*\t\t5.语文平均\t\t*\n");
	printf("\t\t\t\t\t*\t\t6.英语平均\t\t*\n");
	printf("\t\t\t\t\t*****************************************\n\n");
	printf("\t\t\t\t\t输入相应功能选项:");
	scanf_s("%d", &c);
	if (c == 1)
	{
		int Max = Math();
		printf("\t\t\t\t\t最高:\t\t %d\t\t\n", Max);
		system("pause");
	}
	if (c == 2)
	{
		int Max = Language();
		printf("\t\t\t\t\t最高:\t\t %d\t\t\n", Max);
		system("pause");
	}
	if (c == 3)
	{
		int Max = English();
		printf("\t\t\t\t\t最高:\t\t %d\t\t\n", Max);
		system("pause");
	}
	if (c == 4)
	{
		int Avg = math();
		printf("\t\t\t\t\t数学平均:\t\t %d\t\t\n", Avg);
		system("pause");
	}
	if (c == 5)
	{
		int Avg = language();
		printf("\t\t\t\t\t语文平均:\t\t %d\t\t\n", Avg);
		system("pause");
	}
	if (c == 6)
	{
		int Avg = english();
		printf("\t\t\t\t\t英语平均:\t\t %d\t\t\n", Avg);
		system("pause");
	}
}

附录:

int English()
{
	int max(int a, int b);
	Node* p = g_phead; Node* p1 = p->pNext; int Max = p->stu.English;
	if (p1 != NULL)
	{
		while (p != NULL)
		{
			Max = max(Max, p1->stu.English);
			p = p->pNext;
		}
	}
	else return Max;
	return Max;
}
int Math()
{
	int max(int a, int b);
	Node* p = g_phead; Node* p1 = p->pNext; int Max = p->stu.Math;
	if (p1 != NULL)
	{
		while (p != NULL)
		{
			Max = max(Max, p1->stu.Math);
			p = p->pNext;
		}
	}
	else return Max;
	return Max;
}
int Language()
{
	int max(int a, int b);
	Node* p = g_phead; Node* p1 = p->pNext; int Max = p->stu.Language;
	if (p1 != NULL)
	{
		while (p != NULL)
		{
			Max = max(Max, p1->stu.Language);
			p = p->pNext;
		}
	}
	else return Max;
	return Max;
}
int max(int a, int b)
{
	if (a >= b)return a;
	else return b;
}
int english()
{
	int add(int a, int b);
	Node* p = g_phead; int Avg = 0; int n = 1; int Add = 0;
	while (p != NULL)
	{
		Add = add(p->stu.English, Add);
		Avg = Add / n;
		n = n + 1;
		p = p->pNext;
	}
	return Avg;
}
int math()
{
	int add(int a, int b);
	Node* p = g_phead; int Avg = 0; int n = 1; int Add = 0;
	while (p != NULL)
	{
		Add = add(p->stu.Math, Add);
		Avg = Add / n;
		n = n + 1;
		p = p->pNext;
	}
	return Avg;
}
int language()
{
	int add(int a, int b);
	Node* p = g_phead; int Avg = 0; int n = 1; int Add = 0;
	while (p != NULL)
	{
		Add = add(p->stu.Language, Add);
		Avg = Add / n;
		n = n + 1;
		p = p->pNext;
	}
	return Avg;
}
int add(int a, int b)
{
	int c;
	c = a + b;
	return c;
}

8)选择函数

void diagnosis(char ch)
{
	switch (ch)
	{
	case'1':Input();
		break;
	case'2':
	{
		Node* p = Find();
		if (p != NULL)
			printf("\n\t\t\t\t\t*学号:%d *姓名:%s *语文:%d *数学:%d *英语:%d\n", p->stu.num, p->stu.name, p->stu.Language, p->stu.Math, p->stu.English);
		else printf("\n\t\t\t\t\t无目标学生");
		system("pause");
	}
	break;
	case'3': Modify();
		break;
	case'4':Delete();
		break;
	case'5':Statistics();
		break;
	case'0':printf("\t\t\t\t\t感谢使用!!!\n");
		_sleep(2000);
		exit(-1);
		break;
	}
}

9)主函数

int main()
{
	char ch; void diagnosis(char ch);
	while (1)
	{
		start();
		ch = getchar();
		diagnosis(ch);
		system("cls");
	}
	return 0;
}

总结:这个项目功能并不多,但细究小细节的话也是会让人头大。写之前我听了很多老师的讲课,写完后也去看了很多大佬的成果,我这个真的只能算入门,这些代码可以直接用,但推荐还是要自己思考一下,毕竟也不算太难,逻辑关系也不难搞懂

  • 10
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值