数据结构课程设计——学生成绩查询与分析系统(简单详细版,含讲解)

写在前面:欢迎来到「湫歌」的博客。我是秋秋,一名普通的在校大学生。在学习之余,用博客来记录我学习过程中的点点滴滴,也希望我的博客能够更给同样热爱学习热爱技术的你们带来收获!希望大家多多关照,我们一起成长一起进步。也希望大家多多支持我鸭,喜欢我就给我一个关注吧!

课程题目:学生成绩查询与分析系统

1、学生信息包括:学号、姓名、性别、四门课成绩

2、系统要求:分为两个版本系统,老师版和学生版,老师版需要输入密码进入老师版系统,在老师版系统中可以删除和修改学生成绩。学生版系统不需要输入密码,但不可以修改和删除学生成绩。

3、功能要求:如果选择“输入学生信息”,则显示“请输入学生姓名、学号、成绩”,并能输入;选择“学生姓名查找”,可以按照姓名查找该学生的各科成绩和平均分;选择“学生学号查找”,可以按照学号查找该学生的各科成绩和平均分,选择“按照姓名排序”,可以显示按姓名排序结果;选择“按照学号排序”,可以显示按学号排序结果;选择“按照总成绩排序”,可以显示按成绩排序结果;选择“按照学号查找学生信息”,可以按照学号输出学生姓名,学号,成绩;选择“按照姓名查找学生信息”,可以按照姓名输出学生姓名,学号,成绩;选择0,显示“谢谢使用”;选择其他则显示“输入错误,请重新输入)。

4、基本要求:用C语言实现程序设计;
利用结构体数组、链表等实现学生信息表达、查询等,充分体现数据结构的知识;
系统的各个功能模块要求用函数的形式实现;
界面友好(良好的人机交互),程序要有注释。
程序中所用到的排序查找方法需采用数据结构中所学方法实现,要求方法实用效率高。

一、结构体与链表

1、学生信息结构体

//学生信息结构体
typedef struct
{
	int num;//学号
	char name[50];//姓名
	char sex[50];
	float chengji1, chengji2, chengji3, chengji4;
	float sum, average;
	int score;
}student;

2、链表结构体

//链表的结构体
typedef struct LNode
{
	student data;
	struct LNode* next;
}LNode, * LinkList;

二、总体功能设计

1、菜单页

系统主菜单 

//主菜单
void menu() {
	system("cls");
	printf("主菜单==============\n");
	printf("0.退出系统\n");
	printf("1.选择教师版系统\n");
	printf("2.选择学生版系统\n");
	printf("===================\n");
	printf("请选择(0-2)\n");
	printf("\n");
}

 老师版系统菜单

//老师版菜单
void teachermenu() {
	system("cls");
	printf("老师版系统==========\n");
	printf("0.返回主菜单\n");
	printf("1.输入学生信息\n");
	printf("2.按姓名查询学生信息\n");
	printf("3.按学号查找学生信息\n");
	printf("4.修改学生信息\n");
	printf("5.删除学生信息\n");
	printf("6.按姓名排序\n");
	printf("7.按学号排序\n");
	printf("8.按总成绩排序\n");
	printf("9.打印学生信息\n");
	printf("===================\n");
	printf("请选择(0-9)\n");
	printf("\n");
}

学生版系统菜单 

//学生版菜单
void studentmenu() {
	system("cls");
	printf("学生版系统==========\n");
	printf("0.返回主菜单\n");
	printf("1.按姓名查询学生信息\n");
	printf("2.按学号查找学生信息\n");
	printf("3.按姓名排序\n");
	printf("4.按学号排序\n");
	printf("5.按总成绩排序\n");
	printf("6.打印学生信息\n");
	printf("===================\n");
	printf("请选择(0-6)\n");
	printf("\n");
}

2、主要功能

功能一——输入学生信息

//输入学生信息
void input(LinkList& L) {
	FILE* outfile;
	outfile = fopen("student.txt", "a+");
	float sum, average;
	printf("请输入学生信息\n");
	LNode* p = new LNode;
	p = L;
	while (p->next != NULL) {
		p = p->next;
	}
	for (;;) {
		LNode* q = new LNode;
		q->next = NULL;
		printf("请输入学生学号\n");cin >> q->data.num;
		printf("请输入学生姓名\n");cin >> q->data.name;
		printf("请输入学生性别\n");cin >> q->data.sex;
		printf("请依次输入四门课程的成绩(python,java,c++,数据结构)\n");cin >> q->data.chengji1 >> q->data.chengji2 >> q->data.chengji3 >> q->data.chengji4;
		q->data.sum = q->data.chengji1 + q->data.chengji2 + q->data.chengji3 + q->data.chengji4;q->data.average = q->data.sum / 4.0;
		if (outfile == NULL) {
			printf("不能打开文件\n");
		}
		else {
			fprintf(outfile, "%d\t%s\t%s\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\n",
				q->data.num, q->data.name, q->data.sex, q->data.chengji1, q->data.chengji2, q->data.chengji3, q->data.chengji4, q->data.sum, q->data.average);
			fclose(outfile);
		}
		p->next = q;
		p = q;
		L->data.score++;
		int j;
		printf("若继续输入学生信息则输入1,返回主菜单则输入0\n");
		scanf("%d", &j);
		//若用户输入1,则继续输入学生信息
		if (j == 1) {N++;continue;}
		//若用户输入0,则返回主菜单
		else{break;}
	}
	system("pause");
}

功能二——按姓名查询学生信息

//姓名查找
int xingmingchazhao(LinkList& L) {
	char ch[50];
	bool flag = true;
	printf("请输入查询学生的姓名:");
	cin >> ch;
	LNode* p = new LNode;
	p = L;
	int m;
	while (p->next != NULL) {
		if (strcmp(p->data.name, ch) == 0) {

			printf("请输入要查询的学生成绩的学科\n");
			printf("0、返回上一页面 1、Python 2、Java 3、C++ 4、数据结构 5、总成绩 6、平均分 7、所有数据信息\n");
			scanf("%d", &m);
			if (m == 0 || m == 1 || m == 2 || m == 3 || m == 4 || m == 5 || m == 6 || m == 7) {
				switch (m)
				{
				case 0:return 0;
				case 1: {printf("Python分数:%.2f\n", p->data.chengji1);break;}
				case 2: {printf("Java分数:%.2f\n", p->data.chengji2);break;}
				case 3: {printf("C++分数:%.2f\n", p->data.chengji3);break;}
				case 4: {printf("数据结构分数:%.2f\n", p->data.chengji4);break;}
				case 5: {printf("总成绩:%.2f\n", p->data.sum);break;}
				case 6: {printf("平均分:%.2f\n", p->data.average);
					break;
				}
				case 7: {printf("学号\t姓名\t性别\tPython\tJava\tC++\t数据结构\t总成绩\t平均分\n");
					printf("%d\t%s\t%s\t%.2f\t%.2f\t%.2f\t\t%.2f\t%.2f\t%.2f\n",
						p->data.num, p->data.name, p->data.sex, p->data.chengji1, p->data.chengji2,
						p->data.chengji3, p->data.chengji4, p->data.sum, p->data.average);
					break;
				}
				}
			}


			else {
				printf("输入错误请重新输入\n");
				system("pause");
			}



			flag = false;
		}
		p = p->next;
	}
	if (flag) {
		printf("系统没有该学生信息!");system("pause");
	}
	system("pause");
}

功能三——按学号查找学生信息

//学号查找
int xuehaochazhao(LinkList& L) {
	int ch;
	int m;
	bool flag = true;
	printf("请输入查询学生的学号:");
	cin >> ch;
	LNode* p = new LNode;
	p = L;
	while (p->next != NULL) {
		if (ch==p->data.num) {
			
			printf("请输入要查询的学生成绩的学科\n");
			printf("0、返回上一页面 1、Python 2、Java 3、C++ 4、数据结构 5、总成绩 6、平均分 7、所有数据信息\n");
			scanf("%d", &m);
			if (m == 0 || m == 1 || m == 2 || m == 3 || m == 4 || m == 5 || m == 6||m==7) {
				switch (m)
				{
				case 0:return 0;
				case 1: {printf("Python分数:%.2f\n", p->data.chengji1);break;}
				case 2: {printf("Java分数:%.2f\n", p->data.chengji2);break;}
				case 3: {printf("C++分数:%.2f\n", p->data.chengji3);break;}
				case 4: {printf("数据结构分数:%.2f\n", p->data.chengji4);break;}
				case 5: {printf("总成绩:%.2f\n", p->data.sum);break;}
				case 6: {printf("平均分:%.2f\n", p->data.average);
					break;
				}
				case 7: {printf("学号\t姓名\t性别\tPython\tJava\tC++\t数据结构\t总成绩\t平均分\n");
					printf("%d\t%s\t%s\t%.2f\t%.2f\t%.2f\t\t%.2f\t%.2f\t%.2f\n",
						p->data.num, p->data.name, p->data.sex, p->data.chengji1, p->data.chengji2,
						p->data.chengji3, p->data.chengji4, p->data.sum, p->data.average);}
				}
			}
			else {
				printf("输入错误请重新输入\n");
				system("pause");
			}
			
			
			
			flag = false;
		}
		p = p->next;
	}
	if (flag) {
		printf("系统没有该学生信息!");system("pause");
	}
	system("pause");
}

功能四——删除学生信息

//删除信息
void cut(LinkList& L) {
	printf("请输入要删除的学生学号:");
	int n;
	bool flag = true;
	cin >> n;
	LNode* p = new LNode;
	p = L;

	while (p->next != NULL)
	{
		if (n == p->next->data.num)
		{
			p->next = p->next->next;
			p = L;            //又从头开始遍历,避免忽略掉连续数据相同的情况
			flag = false;
			continue;

		}
		p = p->next;
	}
	if (flag) {
		printf("系统没有该学生信息!\n");
	}
	else {
		printf("删除成功!\n");
	}
	system("pause");
}

功能五——修改学生信息

//修改成绩
void change(LinkList& L) {
	printf("请输入要修改的学生学号:");
	int n;
	bool flag = true;
	cin >> n;
	LNode* p = new LNode;
	p = L;
	while (p != NULL)
	{
		if (n == p->data.num) {
			printf("请输入修改的成绩:\n");
			printf("该学生姓名为:%s\n", p->data.name);
			printf("Python成绩: %.2f,新成绩为:", p->data.chengji1);cin >> p->data.chengji1;
			printf("Java成绩: %.2f,新成绩为:", p->data.chengji2);cin >> p->data.chengji2;
			printf("C++成绩: %.2f,新成绩为:", p->data.chengji3);cin >> p->data.chengji3;
			printf("数据结构成绩: %.2f,新成绩为:", p->data.chengji4);cin >> p->data.chengji4;
			printf("修改成功!\n");
			system("pause");
			flag = false;
		}
		p = p->next;
	}
	if (flag) {
		printf("系统没有该学生信息!");
	}
	system("pause");
}

功能六——按姓名排序

//按姓名排序
void xingmingpaixu(LinkList& L) {
	LNode* Q = new LNode;
	Q->next = NULL;
	paixubeifen(L);
	duqubeifen(Q);
	LNode* p = new LNode;
	p = Q;
	LNode* max = new LNode;
	max=Q;
	if (Q->next == NULL) {
		printf("学号\t姓名\t性别\tPython\tJava\tC++\t数据结构\t总成绩\t平均分\n");
		printf("%d\t%s\t%s\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\n",
			Q->data.num, Q->data.name, Q->data.sex, Q->data.chengji1, Q->data.chengji2,
			Q->data.chengji3, Q->data.chengji4, Q->data.sum, Q->data.average);
	}
	else {
		printf("学号\t姓名\t性别\t成绩1\t成绩2\t成绩3\t成绩4\t总成绩\t平均分\n");

		for (;p != NULL;p = p->next) {
			for (max = p->next;max != NULL;max = max->next) {
				if (strcmp(p->data.name,max->data.name)<0) {
					student tmp = p->data;
					p->data = max->data;
					max->data = tmp;
				}
			}
		}
		while (Q->next != NULL) {
			Q = Q->next;
			printf("%d\t%s\t%s\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\n",
				Q->data.num, Q->data.name, Q->data.sex, Q->data.chengji1, Q->data.chengji2,
				Q->data.chengji3, Q->data.chengji4, Q->data.sum, Q->data.average);
			
		}
	}
	system("pause");
}

功能七——按学号排序

//按学号排序
void xuehaopaixu(LinkList& L) {
	LNode* Q = new LNode;
	Q->next = NULL;
	paixubeifen(L);
	duqubeifen(Q);
	LNode* p = new LNode;
	p = Q;
	LNode* max = new LNode;
	if (Q->next == NULL) {
		printf("学号\t姓名\t性别\tPython\tJava\tC++\t数据结构\t总成绩\t平均分\n");
		printf("%d\t%s\t%s\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\n",
			Q->data.num, Q->data.name, Q->data.sex, Q->data.chengji1, Q->data.chengji2,
			Q->data.chengji3, Q->data.chengji4, Q->data.sum, Q->data.average);
	}
	else {
		printf("学号\t姓名\t性别\t成绩1\t成绩2\t成绩3\t成绩4\t总成绩\t平均分\n");

		for (;p != NULL;p = p->next) {
			for (max = p->next;max != NULL;max = max->next) {
				if (max->data.num < p->data.num) {
					student tmp = p->data;
					p->data = max->data;
					max->data = tmp;
				}
			}
		}
		while (Q->next != NULL) {
			Q = Q->next;
			printf("%d\t%s\t%s\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\n",
				Q->data.num, Q->data.name, Q->data.sex, Q->data.chengji1, Q->data.chengji2,
				Q->data.chengji3, Q->data.chengji4, Q->data.sum, Q->data.average);

		}
	}
	system("pause");
}

功能八——按总成绩排序

//按总成绩排序
void zongchengjipaixu(LinkList& L) {
	LNode* Q = new LNode;
	Q->next = NULL;
	paixubeifen(L);
	duqubeifen(Q);
	LNode* p = new LNode;
	p = Q;
	LNode* max = new LNode;
	if (Q->next == NULL) {
		printf("学号\t姓名\t性别\tPython\tJava\tC++\t数据结构\t总成绩\t平均分\n");
		printf("%d\t%s\t%s\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\n",
			Q->data.num, Q->data.name, Q->data.sex, Q->data.chengji1, Q->data.chengji2,
			Q->data.chengji3, Q->data.chengji4, Q->data.sum, Q->data.average);
	}
	else {
		printf("学号\t姓名\t性别\tPython\tJava\tC++\t数据结构\t总成绩\t平均分\n");

		for (;p != NULL;p = p->next) {
			for (max = p->next;max != NULL;max = max->next) {
				if (max->data.sum > p->data.sum) {
					student tmp = p->data;
					p->data = max->data;
					max->data = tmp;
				}
			}
		}
		while (Q->next != NULL) {	
			printf("%d\t%s\t%s\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\n",
				Q->data.num, Q->data.name, Q->data.sex, Q->data.chengji1, Q->data.chengji2,
				Q->data.chengji3, Q->data.chengji4, Q->data.sum, Q->data.average);
			Q = Q->next;
		}
	}
	system("pause");
}

功能九——打印学生信息

//打印学生信息
void dayingxueshengxinxi(LinkList& L) {
	if (L->data.score == 0) {
		printf("该系统暂时没有学生信息\n");
	}
	else {
		LNode* q = new LNode;
		q = L;
		printf("学号\t姓名\t性别\tPython\tJava\tC++\t数据结构\t总成绩\t平均分\n");
		while (q->next != NULL) {

			q = q->next;
			printf("%d\t%s\t%s\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\n",
				q->data.num, q->data.name, q->data.sex, q->data.chengji1, q->data.chengji2,
				q->data.chengji3, q->data.chengji4, q->data.sum, q->data.average);
		}
	}
	system("pause");
}

//存入文件
void save(LinkList& L) {
	FILE* outfile;
	outfile = fopen("student.txt", "w+");
	LNode* q = new LNode;
	q = L;
	if (outfile == NULL) {
		printf("不能打开该文件\n");
		_getch();
	}
	else {
		while (q->next != NULL) {
			q = q->next;
			fprintf(outfile,"%d\t%s\t%s\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\n",
				q->data.num, q->data.name, q->data.sex, q->data.chengji1, q->data.chengji2,
				q->data.chengji3, q->data.chengji4, q->data.sum, q->data.average);
		}
	}
	fclose(outfile);
}

相关资源及源代码:(1条消息) 数据结构课程设计c语言学生管理系统(简单详细版)-C/C++文档类资源-CSDN文库

  • 11
    点赞
  • 190
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
《C语言课程设计——学生成绩管理系统(源代码 详细注释).zip》是一个包有源代码和详细注释的学生成绩管理系统的压缩文件。 学生成绩管理系统是一种用于管理学生的考试成绩和相关信息的软件工具。该系统基于C语言开发,通过使用源代码和详细注释来了解其内部工作原理和实现细节。 源代码是指程序员使用C语言编写的计算机程序的文本文件。它包一系列的指令和算法来实现特定的功能。通过查看源代码,我们可以了解程序是如何实现学生成绩管理的,例如如何读取和存储学生信息、计算和存储考试成绩等。同时,源代码中也包了程序的各种功能和特性的具体实现细节。 详细注释是在源代码中加入的对代码的解释和说明,用于帮助程序员和读者理解代码的逻辑和功能。注释通常以特定的标记符或特殊的注释语法来标识,并且会提供对代码行为、变量、函数和算法的解释。通过详细注释,我们可以更好地理解程序的运行逻辑和实现方式,同时也帮助我们更加容易地进行修改和维护。 压缩文件(.zip)是一种常见的文件格式,可以将多个文件或文件夹压缩成一个单独的文件。通过将源代码和详细注释压缩成一个文件,可以方便地进行存储、传输和共享。 因此,对于《C语言课程设计——学生成绩管理系统(源代码 详细注释).zip》,我们可以通过解压缩该文件并查看源代码和详细注释来了解其中的实现细节和代码逻辑。这对于学习C语言编程以及了解学生成绩管理系统的设计和实现都是非常有帮助的。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

湫歌

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值