⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 成绩管理.c

📁 用C语言建立一个班级成绩管理系统
💻 C
字号:

# include <stdlib.h>
# include <conio.h>
# include <stdio.h>
# include <string.h>
# include <malloc.h>
# define NULL 0
# define LEN sizeof(struct student)
# define M 10
# define N 3
/*学生*/
struct student
{
		long numb;
    	char student_name[100];
    	float score[N];
    	float student_average;
		struct student *next;
};
/*功课*/
struct courses
{
	char course_name[100];
}course[N];

/*data文件的存储*/
void save(struct student *head)
{
	int j;
	FILE *fp;
	struct student *p;
	p=head;
	if((fp=fopen("data","wb"))==NULL)
	{
		printf("cannot open file\n");
		return;
	}
	for(j=0;j<N;j++)
    if(fwrite(&course[j],sizeof(struct courses),1,fp)!=1)
    printf("File write error!");
	for(p=head;p!=NULL;p=p->next)
	if(fwrite(p,LEN,1,fp)!=1)
	printf("file write error\n");
	fclose(fp);
}
/*读取data文件的数据*/
void load(struct student *head)
{
	int j=0;
	FILE *fp;
	struct student *p;
	p=head;
	if((fp=fopen("data","rb"))==NULL)
	{
		printf("\n\n\n\t\tFile cannot be opened!\n\n\t\tPlease input student data first!");
		printf("\n\n\n\n\t\tIf you have inputted data,please try again!!!");
		getch();
		exit(0);
	}
	for(j=0;j<N;j++)
	fread(&course[j],sizeof(struct courses),1,fp);
	for(p=head;p!=NULL;p=p->next)
	fread(p,LEN,1,fp);
}

/*输入单链表的相关数据*/
struct student *creat(struct student *head)
{
	int j=0;
	int i=0;
	FILE *fp;
	struct student *p;
	p=head;
	printf("\n\n\n\n**********************************数据的输入***********************************\n\n");
	printf("\n\t#######请输入这%d门课的名字:#########\n\n",N);
	for(j=0;j<N;j++)
	{
		printf("\n\t\t◎◎◎◎◎◎第%d门课是: ",j+1);
        scanf("%s",course[j].course_name);
	}
	printf("\n\n\n\t#######请输入这%d名学生的数据及成绩的名字:#########\n\n",M);
	for(p=head;p!=NULL;p=p->next)
	{
		 i++;
		 printf("\n\n\t\t◎◎◎◎◎◎第%d名学生: ",i);
		 printf("\n\t\t\t姓名:");
		 scanf("%s",p->student_name);
		 printf("\n\t\t\t学号:");
		 scanf("%d",&p->numb);
		 for(j=0;j<N;j++)
		 {
			printf("\n\t\t\t%s得分:",course[j].course_name);
			scanf("%f",&p->score[j]);
		 }
	}
	return(head);
	save(head);
}

/*输出数据列表*/
void print1(struct student *head)
{
	int i=0;
	int j;
	float s;
	struct student *p;
	printf("\n\n\n\n\n\n===============信息03-3班学生成绩列表===========================================\n\n");
    printf("\n\n\n\t学号      姓名   ");
   	for(j=0;j<N;j++)
   	printf("%-8s",course[j].course_name);
   	printf("总分     平均分");
	p=head;
	
	while(p!=NULL)
	{	
		i=i+1;
		for(j=0,s=0;j<N;j++)
		{
			s=s+p->score[j];
		}
		p->student_average=s/N;
		printf("\n\t%-10d%-7s",p->numb,p->student_name);
        for(j=0;j<N;j++)
          	printf("%-8.2f",p->score[j]);
		printf("%-9.2f",s);
        printf("%-8.2f",p->student_average);
		p=p->next;
	}
	printf("\n\n\n\n\n\n======================================================DATA TABLE================\n\n");
	getch();
}

/*输出排序列表*/
void print2(struct student *head)
{
	int i=0;
	int j;
	float s;
	struct student *p;
	printf("\n\n\n\n\n\n===============信息03-3班学生成绩排序列表=======================================\n\n");
    printf("\n\n\n\t学号      姓名   ");
   	for(j=0;j<N;j++)
   	printf("%-8s",course[j].course_name);
   	printf("总分     平均分  名次");
	p=head;
	while(p!=NULL)
	{	
		i=i+1;
		for(j=0,s=0;j<N;j++)
		{
			s=s+p->score[j];
		}
		p->student_average=s/N;
		printf("\n\t%-10d%-7s",p->numb,p->student_name);
        for(j=0;j<N;j++)
          	printf("%-8.2f",p->score[j]);
		printf("%-9.2f",s);
        printf("%-8.2f",p->student_average);
		printf("%-7d",i);
		p=p->next;
	}
	printf("\n\n\n\n\n\n=================================================DATA SORT TABLE================\n\n");
	getch();
}

/*根据平均成绩对学生进行排序*/
void sort(struct student *head)
{	
	struct student *m,*p,*s,*a;	
	int change=1;		
	a=(struct student * )malloc(LEN);
	m=a;
	m->next=head;
	p=head;
	s=p->next;
	while (change)
	{	
		change=0;	
		while(p&&s)
		{	
			if(p->student_average>=s->student_average)
			{	
				m=p;
				p=s;
				s=s->next;
			}
			else
			{
				p->next=s->next;
				s->next=p;
				m->next=s;
				if(p==head)head=s;
				change=1;
				m=s;
				s=p->next;
			}
		}
	m=a;
	m->next=head;
	p=head;
	s=p->next;
	}
	printf("排序后:\n");
	print2(head);
}

/*主菜单显示页面*/
void display()
{
	printf("\n\n\n");
	printf("\n\n\n==========================信息03-3班学生成绩管理系统=======================\n\n");
	printf("\n\t\t\t1: 信息03-3班学生成绩列表 \n");
	printf("\n\t\t\t2: 根据平均成绩进行排序 \n");
	printf("\n\t\t\t3: 重新输入学生数据及成绩\n");                              
	printf("\n\t\t\t0: 退出系统\n");
	printf("\n\n\n====================================================主菜单=================\n");
	printf("\n\t\t\t 请选择(填入0~3中的一个数字): ");
}

/*主函数*/
main(void)
{
	int c,i;
	struct student *head,*p1,*p2;
	p1=p2=(struct student * )malloc(LEN);/*建立一个单链表*/
	head=p1;
	for(i=1;i<M;i++)
	{
		p2=(struct student * )malloc(LEN);
		p1->next=p2;
		p1=p2;
	}
	p1->next=NULL;
	do
	{	display();
	  	scanf("%d",&c);
	 	switch(c)
   		{
				case 1:
			 		load(head);      
					print1(head);
					save(head);
					break;
				case 2:
					load(head);
					sort(head);
					break;
				case 3:
					creat(head);
					print1(head);
					save(head);
					break;
				case 0:
					 printf("\n\n\n\n\t\t\t谢谢使用!");
					 break;
				default:
					printf("\n\n\n\n\t\t\t 没有这个选项!");
					break;
		}
	}while(c!=0);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -