大一上C语言课程综合实验——学生成绩管理系统

相信很多同仁在大学学习编程的时候都会被老师要求动手敲出一个学生成绩管理系统或图书馆管理系统之类的程序吧。
不得不说,这个程序简直就是大多数初学者的恶梦,毕竟它的内容涉及到了整一个学期学到的所有知识。
况且,对于像我这种在大学前从来没接触过编程,也不知道代码是啥的绝对萌新来说,更是一次史诗级的灾难。

你见过凌晨四点的教学楼吗?
我见过,那时候我刚从里面出来。
大一上C语言课程综合实验——学生成绩管理系统_第1张图片
话不多说,说多了都是泪。

实验要求我就不赘述了吧,无非就是录成绩、各种方式查成绩、名次排序、计算均分等。

还是直接上代码吧,大家都是爽快人!

#include 
#include 
#include 

#define N 30
#define M 10
#define X 6

/*学生信息结构体,包括学号,姓名,各学科分数,总分,均分*/
typedef struct student
{
     
  long number;
  char name[M];
  int score[X];
  int stutotal;
  float stuaverage;
}STUDENT;/*对学生信息结构体取别名“STUDENT”*/

/*实现两个结构体的交换,注意,结构体是可以直接赋值的*/
void Swap(STUDENT *a,STUDENT *b)
{
     
  STUDENT temp;
  temp=*a;
  *a=*b;
  *b=temp;
}

/*由用户用键盘依次输入学生信息*/
void Input(STUDENT stu[],int n,int x)
{
     
	printf("\n\n");
	int i,j;
	for(i=0;i<n;i++)
	{
     
		printf("Number:\t");
		scanf("%ld",&stu[i].number);
		getchar();/*清除缓冲区中的回车字符,防止被读入学生姓名*/
		printf("Name:\t");
		gets(stu[i].name);
		for(j=0;j<x;j++)
		{
     
			do{
     
			    printf("Score %d:",j+1);
			    scanf("%d",&stu[i].score[j]);
			}while(stu[i].score[j]<0||stu[i].score[j]>100);/*防止录入异常成绩*/
		}
	}
}

/*计算各学科的总分和均分*/
void SubCalculate(STUDENT stu[],int subtotal[],float subaverage[],int n,int x)
{
     
	int i,j;
	for(j=0;j<x;j++)
	{
     
		subtotal[j]=0;/*学科总成绩初始化为0*/
		for(i=0;i<n;i++)
		{
     
			subtotal[j]=subtotal[j]+stu[i].score[j];
		}
		subaverage[j]=(float)subtotal[j]/n;/*将整型数强转为浮点数后进行浮点数运算,确保数据的准确性*/
		printf("(subject %d)Total:%d\t\tAverage:%6.2f\n",j+1,subtotal[j],subaverage[j]);
	}
 }

/*计算每个学生的总分和均分*/
void StuCalculate(STUDENT stu[],int n,int x)
{
     
	int i,j;
	for(i=0;i<n;i++)
	{
     
		stu[i].stutotal=0;/*学生总成绩初始化为0*/
		for(j=0;j<x;j++)
		{
     
			stu[i].stutotal=stu[i].stutotal+stu[i].score[j];
		}
		stu[i].stuaverage=(float)stu[i].stutotal/x;/*将整型数强转为浮点数后进行浮点数运算,确保数据的准确性*/
		printf("(student %d)Total:%d\t\tAverage:%6.2f\n",i+1,stu[i].stutotal,stu[i].stuaverage);
	}
}

/*将学生成绩按从高到低的顺序排列*/
void SortStuScoreUpdown(STUDENT stu[],int n)
{
     
	for (int i = 0; i < n - 1; ++i)
    {
     
        for (int j = i + 1; j < n; ++j)
        {
     
            if (stu[i].stutotal < stu[j].stutotal) Swap(&stu[i], &stu[j]);/*如果前面的学生的总成绩小于后面的学生的总成绩,则交换两个学生信息结构体位置*/
        }
	  }
}

/*将学生成绩按从低到高的顺序排列*/
void SortStuScoreDownup(STUDENT stu[],int n)
{
     
		for (int i = 0; i < n - 1; ++i)
    {
     
        for (int j = i + 1; j < n; ++j)
        {
     
            if (stu[i].stutotal > stu[j].stutotal) Swap(&stu[i], &stu[j]);/*如果前面的学生的总成绩大于后面的学生的总成绩,则交换两个学生信息结构体位置*/
        }
	  }
}

/*将学生学号按从小到大排列*/
void SortNumberDownup(STUDENT stu[],int n)
{
     
		for (int i = 0; i < n - 1; ++i)
    {
     
        for (int j = i + 1; j < n; ++j)
        {
     
            if (stu[i].number > stu[j].number) Swap(&stu[i], &stu[j]);/*如果前面的学生的学号大于后面的学生的学号,则交换两个学生信息结构体位置*/
        }
	  }
}

/*将学生姓名按字典顺序排列*/
void SortName(STUDENT stu[],int n)
{
     
	for (int i = 0; i < n - 1; ++i)
    {
     
        for (int j = i + 1; j < n; ++j)
        {
     
            if (strcmp(stu[i].name,stu[j].name)>0) Swap(&stu[i], &stu[j]);/*如果前面的学生的字母序位大于后面的学生的字母序位,则交换两个学生信息结构体位置*/
        }
	  }
}

/*按学号查找学生并输出学生信息*/
void SearchNumber(STUDENT stu[],int n,int x)
{
     
	int i,j,flag=0;/*未找到学生时flag初始化为0*/
	long temp;
	printf("Input the number:\t");
	scanf("%ld",&temp);
	getchar();
	SortStuScoreUpdown(stu,n);/*将学生按照成绩从高到低排序以获得学生的排名情况*/
	for(i=0;i<n;i++)/*将录入的学生学号与待查学号进行一一比对*/
	{
     
		if(stu[i].number==temp)/*找到与待查学号一致的学号*/
		{
     
			flag=1;/*找到学号对应的学生时,flag被赋值为1*/
			printf("Name:     \tNumber:      \tPosition:\tTotalscore:\tAveragescore:\t  Subjectscores:\n");
			printf("%-10s\t%-13ld\t%9d\t%11d\t%13.2f\t",stu[i].name,stu[i].number,i+1,stu[i].stutotal,stu[i].stuaverage);
			for(j=0;j<x;j++)
			{
     
				printf("%4d",stu[i].score[j]);
			}
			printf("\n");
			break;
		}
	}
	if(flag==0)/*未找到学号对应学生时,flag的值仍为0*/
	{
     
		printf("\nNot find!\n");
    }
}

/*按姓名查找学生并输出学生信息*/
void SearchName(STUDENT stu[],int n,int x)
{
     
	int i,j,flag=0;/*未找到学生时flag初始化为0*/
	char tep[M];
	printf("Input the name:\t");
  scanf(" %s",tep);
	SortStuScoreUpdown(stu,n);/*将学生按照成绩从高到低排序以获得学生的排名情况*/
	for(i=0;i<n;i++)/*将录入的学生姓名与待查姓名进行一一比对*/
	{
     
		if(strcmp(stu[i].name,tep)==0)/*找到与待查姓名字母顺序完全一致的姓名*/
		{
     
			flag=1;/*找到学号对应的学生时,flag被赋值为1*/
			printf("Name:     \tNumber:      \tPosition:\tTotalscore:\tAveragescore:\t  Subjectscores:\n");
			printf("%-10s\t%-13ld\t%9d\t%11d\t%13.2f\t",stu[i].name,stu[i].number,i+1,stu[i].stutotal,stu[i].stuaverage);
			for(j=0;j<x;j++)
			{
     
				printf("%4d",stu[i].score[j]);
			}
			printf("\n");
			break;
		}
	}
	if(flag==0)/*未找到学号对应学生时,flag的值仍为0*/
	{
     
		printf("\nNot find!\n");
	}
}

/*统计并打印出各学科各阶段人数及占比*/
void Analysis(STUDENT stu[],int n,int x)
{
     
	int a[N]={
     0},b[N]={
     0},c[N]={
     0},d[N]={
     0},e[N]={
     0};
	int i,j;
	for(j=0;j<x;j++)
	{
     
		for(i=0;i<n;i++)
		{
     
		    if    (100>=stu[i].score[j]&&90<=stu[i].score[j])    a[j]++;
		    else if(89>=stu[i].score[j]&&80<=stu[i].score[j])    b[j]++;
		    else if(79>=stu[i].score[j]&&70<=stu[i].score[j])    c[j]++;
		    else if(69>=stu[i].score[j]&&60<=stu[i].score[j])    d[j]++;
		    else                                                           e[j]++;
		}
	}
	for(j=0;j<x;j++)
	{
     
		printf("Subject No.%d:\n",j+1);
        printf("Excellent:%d\tpercent:%.2f%%\n",a[j],(float)100*a[j]/n);
        printf("Good:     %d\tpercent:%.2f%%\n",b[j],(float)100*b[j]/n);
        printf("Medium:   %d\tpercent:%.2f%%\n",c[j],(float)100*c[j]/n);
        printf("Pass:     %d\tpercent:%.2f%%\n",d[j],(float)100*d[j]/n);
        printf("Failed:   %d\tpercent:%.2f%%\n",e[j],(float)100*e[j]/n);
        printf("\n");
	}
	printf("\n");
}

/*输出各学生的学生信息及各课程的总分和均分*/
void List(STUDENT stu[],int subtotal[],float subaverage[],int n,int x)
{
     
	int i,j;
	printf("Name:     \tNumber:      \tTotalscore:\tAveragescore:\tSub 1:Sub 2:Sub 3:Sub 4:Sub 5:Sub 6:\n");
	for(i=0;i<n;i++)
    {
     
        printf("%-10s\t%-13ld\t%11d\t%13.2f\t",stu[i].name,stu[i].number,stu[i].stutotal,stu[i].stuaverage);
        for(j=0;j<x;j++)
        {
     
            printf("%6d",stu[i].score[j]);
        }
        printf("\n");
    }
     printf("          \t             \t           \t           \t");
     for(j=0;j<x;j++)
     {
     
      printf("%6d",subtotal[j]);
     }
      printf("\n");
      printf("         \t             \t           \t          \t");
      for(j=0;j<x;j++)
      {
     
          printf("%6.2f",subaverage[j]);
      }
}

/*打印姓名,学号,总分,均分及各学科的分数*/
void Print1(STUDENT stu[],int n,int x)
{
     
	int i,j;
    printf("Name:     \tNumber:\t      Totalscore:\tAveragescore:\tSubjectscore:\n");
    for(i=0;i<n;i++)
    {
     
        printf("%-10s\t%-13ld\t%9d\t%13.2f\t",stu[i].name,stu[i].number,stu[i].stutotal,stu[i].stuaverage);
        for(j=0;j<x;j++)
        {
     
            printf("%-6d",stu[i].score[j]);
        }
        printf("\n");
    }
}

/*打印各课程的总分和均分*/
void Print2(int subtotal[],float subaverage[],int x)
{
     
  int i;
  for(i=0;i<x;i++)
  {
     
    printf("subtotal No.%d: %-6d\tsubaverage No.%d: %-6.2f\n",i+1,subtotal[i],i+1,subaverage[i]);
  }
}

/*将信息写入文件并保存*/
void WritetoFile(STUDENT stu[],int subtotal[],float subaverage[],int n,int x)
{
     
  FILE *fp;
  int i,j;
  if((fp=fopen("score.txt","w"))==NULL)/*检验文件是否打开成功*/
  {
     
    printf("Failure to open score.txt!\n");
    exit(0);
  }
  fprintf(fp,"%d\t%d\n",n,x);
  for(i=0;i<n;i++)
  {
     
    fprintf(fp,"%-10s\t%-13ld\t%11d\t%13.2f\t",stu[i].name,stu[i].number,stu[i].stutotal,stu[i].stuaverage);
     for(j=0;j<x;j++)
        {
     
            fprintf(fp,"%-6d\n",stu[i].score[j]);
        }
  }
  for(j=0;j<x;j++)
  {
     
      fprintf(fp,"%d\t%f\n",subtotal[j],subaverage[j]);
  }
  fclose(fp);
}

/*从文件中读取出信息*/
void ReadfromFile(STUDENT stu[],int subtotal[],float subaverage[],int *n,int *x)
{
     
  FILE *fp;
  int i,j;
  if((fp=fopen("score.txt","r"))==NULL)/*检验文件是否打开成功*/
  {
     
    printf("Failure to open score.txt!\n");
    exit(0);
  }
   fscanf(fp,"%d\t%d\n",n,x);
  for(i=0;i<*n;i++)
    {
     
      fscanf(fp,"%10s",stu[i].name);
      fscanf(fp,"%13ld",&stu[i].number);
      fscanf(fp,"%11d",&stu[i].stutotal);
      fscanf(fp,"%f",&stu[i].stuaverage);
      for(j=0;j<*x;j++)
      {
     
        fscanf(fp,"%6d",&stu[i].score[j]);
      }
    }
    for(j=0;j<*x;j++)
    {
     
        fscanf(fp,"%d\t%f",&subtotal[j],&subaverage[j]);
    }
    fclose(fp);
}

int main()
{
     
	int m,n,x;
	int subtotal[X];
	float subaverage[X];
	STUDENT stu[N];
	do{
     
        printf("Input the total number of students:");
        scanf("%d",&n);
        printf("Input the total number of subjects:");
        scanf("%d",&x);
    }while(n<=0||n>30||x<1||x>6);/*检测学生总人数及学科总数是否符合要求*/
 KG:printf("\n\n1.Input record\n2.Calculate total and average score of every course\n3.Calculate total and average score of every student\n");
      printf("4.Sort in descending order by total score of every student\n5.Sort in ascending order by total score of every student\n");
      printf("6.Sort in ascending order by number\n7.Sort in dictionary order by name\n8.Search by number\n");
      printf("9.Search by name\n10.Statistic analysis for every course\n11.List record\n");
      printf("12.Write to a file\n13.Read from a file\n0.Exit\n\nPlease enter your choice:");
      scanf("%d",&m);/*打印出菜单栏以供用户选择操作*/
    switch(m)/*利用switch语句实现菜单中的各个功能*/
    {
     
      case 1: Input(stu,n,x);
               break;
      case 2: SubCalculate(stu,subtotal,subaverage,n,x);
               break;
      case 3:StuCalculate(stu,n,x);
               break;
      case 4: SortStuScoreUpdown(stu,n);
               Print1(stu,n,x);
              break;
      case 5: SortStuScoreDownup(stu,n);
              Print1(stu,n,x);
             break;
      case 6: SortNumberDownup(stu,n);
              Print1(stu,n,x);
            break;
      case 7: SortName(stu,n);
              Print1(stu,n,x);
            break;
      case 8: SearchNumber(stu,n,x);
            break;
      case 9: SearchName(stu,n,x);
            break;
      case 10: Analysis(stu,n,x);
            break;
      case 11: List(stu,subtotal,subaverage,n,x);
            break;
      case 12:WritetoFile(stu,subtotal,subaverage,n,x);
            break;
      case 13:ReadfromFile(stu,subtotal,subaverage,&n,&x);
                Print1(stu,n,x);
                Print2(subtotal,subaverage,x);
            break;
      case 0: exit(0);
    }
   if(m!=0||m<0||m>13) goto KG;/*检测用户选择是否出错,并利用goto语句实现跳转*/
   return 0;
}

以上就是该实验的全部代码。(毫无保留,直接裸奔!!!

大一上C语言课程综合实验——学生成绩管理系统_第2张图片

实验数据我就不给了吧。

本人王者荣耀迷和KPL迷,实验数据全是英雄名和选手名(说实话,选手们的ID确实好听),估计助教在看实验的时候都笑出猪叫了。(助教笑出猪叫??? 啪,又来套娃!)

有相同兴趣的小伙伴们可以找我一起观赛掉分。本人厨艺精湛,饭多管饱!!!

大一上C语言课程综合实验——学生成绩管理系统_第3张图片

敲黑板!!!

如果大佬们不幸看了我的代码,欢迎指导!!!(毕竟这时大一刚学的时候写的,估计bug一堆,很多代码也不是最优的)
如果萌新们不幸看了我的代码,欢迎交流!!!(如果你也备受这个实验困扰,希望这篇文章能够帮助到你)

最后,有被学生成绩管理系统和图书馆管理系统折磨过的同仁,举个爪子示意一下,让我知道我并不孤单!

大一上C语言课程综合实验——学生成绩管理系统_第4张图片

你可能感兴趣的:(C语言,c语言)