C语言期末大作业-学生成绩管理系统(完整源码+设计报告)

时间:2024-10-29 21:41:32

C语言-学生成绩管理系统

  • 一、学生成绩管理系统源码(完整)
  • 二、程序设计报告
    • 1、课程设计目的
    • 2、课程设计任务与要求:
    • 4、课程设计成果(运行截图)
    • 5、课程设计心得

一、学生成绩管理系统源码(完整)

C语言期末作业(15个)-货物管理系统、歌曲信息管理系统、职工信息管理系统源码、学生打卡系统、小学生计算机辅助教学系统、门禁系统、银行管理系统等等

C语言期末大作业15个(附源码)成绩管理系统、图书馆管理系统、学生打卡系统、超市信息管理系统、学生考勤系统、职工信息管理系统源码、歌曲信息管理系统、超市收款系统等等

#include <>
#include <>
#include <>
#define LEN sizeof(struct Student)
struct Student 
{
	int clas;
	int num;
	char name[20];
	char cou[20];
	int score;
	struct Student *next;
};

struct Student *creat(void)
{
	struct Student *head;
	struct Student *p1,*p2;
	int n=0;
	printf("班级 学号 姓名 课程 得分(输入0 0 0 0 0结束):\n");
	p1=p2=(struct Student*)malloc(LEN);
	scanf("%d%d%s%s%d",&p1->clas,&p1->num,p1->name,p1->cou,&p1->score);
	head=NULL;
	while(p1->num!=0)
	{
		n=n+1;
		if(n==1)head=p1;
		else p2->next=p1;
		p2=p1;
		p1=(struct Student*)malloc(LEN);
		scanf("%d%d%s%s%d",&p1->clas,&p1->num,p1->name,p1->cou,&p1->score);
	}
	p2->next=NULL;
	return(head);
}

void shuchu(struct Student *pt)
{
	printf("\n");
	printf("班级 学号 姓名 课程 得分:\n");
	while (pt!=NULL)
	{
	printf("%-5d%-5d%-5s%-5s%-5d\n",pt->clas,pt->num,pt->name,pt->cou,pt->score);
	pt=pt->next;
	}
	printf("\n");
}

void add(struct Student *pt)
{
	struct Student *p1,*p2,*head;
	head=pt;
	printf("请输出你要添加的学生信息:\n");
	while(pt->next!=NULL)
	{
		pt=pt->next;	
	}
	p1=p2=pt;
	printf("班级 学号 姓名 课程 得分(输入0 0 0 0 0结束):\n");
	do
	{
		p1=(struct Student*)malloc(LEN);
		scanf("%d%d%s%s%d",&p1->clas,&p1->num,p1->name,p1->cou,&p1->score);
		p2->next=p1;
		p2=p1;
	}while(p1->num!=0);
	p2->next=NULL;
	shuchu(head);	
}

void del(struct Student *pt)
{
	int n;	
	printf("请输入你要删除的学生的学号:\n");
	scanf("%d",&n);
	if(n==pt->num)
	{
		pt->next=pt->next->next;
		printf("已删除学生信息\n");
	}
	while(n!=(pt->next)->num)
	{
		pt=pt->next;
	}
	pt->next=pt->next->next;
	printf("已删除学生信息\n");
	printf("\n");
}


void order(struct Student *pt)
{
	struct Student *first,*t,*p,*q;

	first=pt->next;
	pt->next=NULL;
	while(first!=NULL)
	{
		for(t=first,q=pt;((q!=NULL)&&(q->score<t->score));p=q,q=q->next);
		first = first->next;
		if(q==pt)
			pt=t;
		else
			p->next=t;
		t->next=q;
	}
	shuchu(pt);
}


void max(struct Student *pt)
{
	struct Student *max;
	max=pt;
	while(pt->next!=NULL)
	{
		if((max->score)<(pt->next->score))
		{
			max=pt->next;
		}
			pt=pt->next;
	}
	printf("\n");
	printf("班级 学号 姓名 课程 得分:\n");
	printf("%-5d%-5d%-5s%-5s%-5d\n",max->clas,max->num,max->name,max->cou,max->score);
	printf("\n");
}

void min(struct Student *pt)
{
	struct Student *min;
	min=pt;
	while(pt->next!=NULL)
	{
		if((min->score)>(pt->next->score))
		{
			min=pt->next;
		}
		pt=pt->next;
	}
	printf("\n");
	
	printf("班级 学号 姓名 课程 得分:\n");
	
	printf("%-5d%-5d%-5s%-5s%-5d\n",min->clas,min->num,min->name,min->cou,min->score);
	printf("\n");
}

void aver(struct Student *pt)
{
	int n=0;
	float aver,sum=0.0;
	while(pt!=NULL)
	{
		sum+=pt->score;
		n++;
		pt=pt->next;
	}
	aver=(float)sum/n;
	printf("\n");
	printf("平均分:%f\n",aver);
	printf("\n");
}

void jigelv(struct Student *pt)
{
	int n=0;
	float jigelv=0.0,s=0.0;
	while(pt!=NULL)	
	{
		if((pt->score)>=60)
		{
			n++;
		}
		s++;
		pt=pt->next;
	}
	jigelv=n/s*100;
	printf("\n");
	printf("及格率:百分之%f",jigelv);
	printf("\n");
}

void search(struct Student *pt)
{
	void num(struct Student *pt);
	void name(struct Student *pt);
	void cou(struct Student *pt);
	int n;
	printf("\n");
	printf("请输入你要查询学生的 1 学号 2 姓名 3 课程名:\n");
	scanf("%d",&n);
	switch(n)
	{
	case 1:num(pt);break;
	case 2:name(pt);break;
	case 3:cou(pt);break;
	default:printf("error!\n");
	}
}

void num(struct Student *pt)
{
	int n;
	printf("\n");
	printf("请输入你要查询学生的学号:\n");
	scanf("%d",&n);
	while(pt->num!=n)
	{
		pt=pt->next;
	}
	printf("班级 学号 姓名 课程 得分:\n");
	printf("\n");
	printf("%-5d%-5d%-5s%-5s%-5d\n",pt->clas,pt->num,pt->name,pt->cou,pt->score);
}

void name(struct Student *pt)
{
	char name[20];
	scanf("%s",name);
	printf("\n");
	printf("请输入你要查询学生的姓名:\n");
	while(strcmp(pt->name,name)!=0)
	{
		pt=pt->next;
	}
	printf("班级 学号 姓名 课程 得分:\n");
	printf("\n");
	printf("%-5d%-5d%-5s%-5s%-5d\n",pt->clas,pt->num,pt->name,pt->cou,pt->score);
}

void cou(struct Student *pt)
{
	char cou[20];
	scanf("%s",cou);
	printf("\n");
	printf("请输入你要查询学生的课程名:\n");
	while(strcmp(pt->cou,cou)!=0)
	{
		pt=pt->next;
	}
	printf("班级 学号 姓名 课程 得分:\n");
	
	printf("\n");
	
	printf("%-5d%-5d%-5s%-5s%-5d\n",pt->clas,pt->num,pt->name,pt->cou,pt->score);
}

void save(struct Student *pt)
{
	FILE *fp;
	if((fp=fopen("D:\\student ","w"))==NULL)
	{
		printf("can't open file!\n");
		exit(0);
	}
	while(pt!=NULL)
	{
		if(fwrite(pt,sizeof(struct Student),1,fp)!=1)
			printf("file write error\n");
		pt=pt->next;
	}
	printf("存储完成\n");
	fclose(fp);
}

void main()
{
	FILE *fp;
	int i;
	struct Student *pt;
	pt=creat();
	
	if((fp=fopen("D:\\","w"))==NULL)
	{
		printf("can't open file!\n");
		exit(0);
	}

	shuchu(pt);
	printf("请输入你想要实现的功能的序号\n1 添加学生信息\n2 删除学生信息\n3 学生成绩排序\n4 最高分\n5 最低分\n6 平均分\n7 及格率\n8 查询学生\n9 退出\n");
	for(;;)
	{
		scanf("%d",&i);
		switch(i)
		{
		case 1:add(pt);break;
		case 2:del(pt);break;
		case 3:order(pt);break;
		case 4:max(pt);break;
		case 5:min(pt);break;
		case 6:aver(pt);break;
		case 7:jigelv(pt);break;
		case 8:search(pt);break;
		case 9:exit(0);break;
		default:printf("error!\n");
		}
	}
	save(pt);
}

二、程序设计报告

1、课程设计目的

C语言程序设计课程设计是计算机科学与技术专业重要的实践性教学环节之一,本次设计结合实际应用的要求,使课程设计既覆盖C语言的知识点,又接近工程实际需要。目的是通过课程设计的综合训练,培养学生实际分析问题、解决问题的能力,以及编程和动手能力,最终目标是通过课程设计这种形式,帮助学生系统掌握C语言程序设计这门课程的主要内容,养成良好的编程习惯,更好的完成教学任务。

2、课程设计任务与要求:

本次课程设计利用《C语言程序设计》课程中所学到的编程知识和编程技巧,完成具有一定难度和工作量的程序设计题目,帮助学生掌握编程、调试的基本技能,独立完成所布置的任务。

要求:
1、对系统进行功能需求分析
2、设计合理的数据结构和系统框架
3、编程简练,程序功能齐全,能正确运行
4、说明书、流程图要清楚
5、课题完成后必须按要求提交课程设计报告

任务:
设计一个学生成绩排名系统
实现功能:

  1. 具备对成绩的管理功能(添加、删除、排序)
  2. 具备对成绩的统计功能(最高分,最低分,平均分,及格率等)
  3. 具备按学号、姓名、或课程名查询成绩的功能。
    4)学生成绩应该保存在文件中。
    备注:成绩记录以下信息:班级,学号,姓名,课程名,成绩(百分制)。可以用能表示学生成绩的结构体数组存储数据。

概要设计
首先拿到这个课程题,学生成绩管理系统,数组或动态链表都可以去解决,我选择了动态链表,在主函数中调用函数来达到功能的实现。函数包括添加,删除,排序,最高分。最低风,及格率,平均分,查询。都将以输入的学生信息作为传参。

详细设计
1、因为不知道具体的学生人数,所以我选择了去使用动态链表去实现输入学生信息的功能。
使用动态链表的时候,对于添加个人信息,删除,排序等问题的难度比较大,需要好好思考问题的难点,再去设计算法解决。
2、题目所蕴含的功能包括添加,删除,排序,最高分。最低风,及格率,平均分,查询。这些功能选择使用switch函数去进行分类输入,分类调用。尽量使功能齐全方便。对于最高分,最低分,平均分,及格率这些问题。平时解决的也比较多一些常用办法即可。对于添加个人信息,需要在动态链表的最后再加上个人信息,删除和查询感觉是一类问题,需要一一去匹配个人信息。排序在这里是个比较麻烦的问题,因为使用的是动态链表。所以比数组处理起来要麻烦一点。
3、以上的知识点大概要用到stdio,stdlib,string三个头文件即可。
4、界面美观简洁即可。

图1:

在这里插入图片描述

ADD函数: 将动态链表指向最后一个,然后在链表末尾创建新的空间去连接,再输出新的链表。

图2:

在这里插入图片描述

DEL函数:输入学号 让它和链表中的学号一一对比,

图3:

在这里插入图片描述

MAX函数:擂台算法 将第一个赋值给max 然后让max与后面的比较,这样可以不破坏原函数。

图4:

在这里插入图片描述

平均数函数:这个算法比较简单就建立一个循环,在其中计算人数的多少,利用累加算出总分数有多少,再算出平均分。

图5:

在这里插入图片描述

及格率函数:和平均值函数差不多,只需要循环将满足条件的选出来,最后将数值计算出来即可。

在这里插入图片描述

图9:

在这里插入图片描述

4、课程设计成果(运行截图)

在这里插入图片描述

5、课程设计心得

通过这次课程设计,我意识到了c语言在程序设计中的重要性,和它的实用性,在一个学年的学习中,从一开始的输入,输出。到后面的函数,指针,链表。不断地学习和实践让我的c语言技术有了一个较好的基础,这也归功于戴老师的教导。此次课程设计,是我第一次去编写的一个较大的程序。在其中我意识到了自己的不足,即动态链表的使用,但是在设计中,我抛弃自己擅长的数组,去使用动态链表在一次次调试中,理清楚动态链表的操作方法。但还是在链表排序的问题上遇到了麻烦,通过上网查找资料,和同学进行讨论后终于将问题解决。我觉得此次课程设计十分有意义,它是对我们c语言学习的一次总结,让我们将所学知识融会贯通,去用于实践。我觉得c语言是基础,只有打好基础才能在以后的程序语言学习中有一个较好的发展。回顾起此次单片机课程设计,至今我仍感慨颇多,的确,从理论到实践,可以说得是苦多于甜,但是可以学到很多很多的的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。

喜欢的点个赞收藏一下呗!感谢支持!