C语言 综合问题处理

编写程序处理M个学生N 门课程的成绩(M,N定义为符号常量),分别用函数实现以下功能:

(1) 从键盘输入学号、姓名、课程名称、及各科成绩,并保存到文本文件“inputdata.txt"中;

(2)计算每个学生的平均分;

(3)计算每门课的平均分; 

(4)对成绩信息按学生平均分进行排序(降序,最高分排第1位)。

(5)将已排好序的成绩信息输出到文本文件“outputdata.txt"中,包括学号、姓名、课程名称、及各科成绩(注意输出信息对齐),参考效果如下:

要求:

1、相关变量及数组在主函数中定义;

2、用结构体类型的指针变量完成相应功能;

代码如下:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define M 20
#define N 3
struct Student
{
	int nmb;        //学号
	char name[20];  //姓名
	int score[N];   //N门课程的成绩
};
//录入N门课程的课程名
void InputKecheng(char b[][30])
{
	int i;
	system("cls");
	printf("请输入%d门课程的名称:\n",N);
	for (i = 0;i<N;i++)
	{
		scanf("%s",b[i]);
	}
}

//录入学生成绩
struct Student * Inputinfo(struct Student *a,int n)
{
	int i,j;
	a = (struct Student *)malloc(M*sizeof(struct Student));
	printf("输入%d个学生的学号,姓名,%d门课的成绩:\n",n,N);
	for (i = 0;i< n;i++)
	{
		scanf("%d %s",&a[i].nmb,a[i].name);
		for(j = 0;j<N;j++)
			scanf("%d",&a[i].score[j]);
	}
	return a;
}


//计算单个学生的平均成绩
float Average(struct Student a)
{
	int j;
	float avg = 0.0;
	for (j = 0;j<N;j++)
	{
		avg += a.score[j];
	}
	avg /= N;
	return avg;
}
//统计学生的平均成绩
void TongjiAvg(struct Student *a,int n)
{
	int i;
	system("cls");
	printf("学生的平均成绩分别为:\n");
	for (i = 0;i<n;i++)
	{
		printf("%d%20s\t%.2f\n",a[i].nmb,a[i].name,Average(a[i]));
	}
}


//统计课程的平均成绩
void TongjiKcAvg(struct Student *a,int n,char b[][30])
{
	int i,j;
	float avg = 0.0;
	system("cls");
	printf("%d门课程的平均成绩分别为:\n",N);
	for (i = 0;i<N;i++)
	{
		avg = 0.0;
		for (j = 0;j<n;j++)
		{
			avg += a[j].score[i];
		}
		avg = avg/n;
		printf("%s\t%.2f\n",b[i],avg);
	}
}

//按平均分从高到低排序
void Sort(struct Student *a,int n,char b[][30])
{
	int i,j;
	float avg1,avg2;
	struct Student tmp;
	char szt[] = "name";
	for (i = 0;i< n-1;i++)
	{
		for (j = 0;j< n-1-i;j++)
		{
			avg1 = Average(a[j]);
			avg2 = Average(a[j+1]);
			if(avg1 < avg2)
			{
				tmp = a[j];
				a[j] = a[j+1];
				a[j+1] = tmp;
			}
		}
	}
	system("cls");
	printf("number%10s",szt);
	for(i = 0;i<N;i++)
		printf("%10s",b[i]);
	printf("\taverage\n");
	for (i = 0;i<n;i++)
	{
		avg1 = Average(a[i]);
		printf("%d%10s",a[i].nmb,a[i].name);
		for(j=0;j<N;j++)
			printf("%10d",a[i].score[j]);
		printf("\t%.2f\n",avg1);
	}
}

//写文件
void WriteFile(struct Student *a,int n,char b[][30],const char* filename)
{
	FILE* fp;
	int i,j;
	char szt[] = "姓名";
	if((fp = fopen(filename,"w")) == 0)
	{
		printf("文件打开失败\n");
		return;
	}
	fprintf(fp,"学号%10s",szt);
	for (i =0;i<N;i++)
	{
		fprintf(fp,"%10s",b[i]);
	}
	//fprintf(fp,"\taverage"); //这一行是写平均值,如果需要,把注释放开
	fprintf(fp,"\n");

	for (i=0;i<n;i++)
	{
		fprintf(fp,"%d%10s",a[i].nmb,a[i].name);
		for(j =0;j<N;j++)
			fprintf(fp,"%10d",a[i].score[j]);
		//fprintf(fp,"\t%.2f",Average(a[i]));//这一行是写平均值,如果需要,把注释放开
		fprintf(fp,"\n");
	}
	fclose(fp);
	printf("文件写入完毕\n");
}

int main()
{
	struct Student *a = 0;
	char kecheng[N][30] = {0};
	int n = 0;
	int opt = 9;
	int bgo = 1;
	while(bgo)
	{
		system("cls");
		printf("------------学生管理系统------------\n");
		printf("|     1.录入学生信息               |\n");
		printf("|     2.统计学生的平均成绩         |\n");
		printf("|     3.统计每门课程的平均成绩     |\n");
		printf("|     4.按照平均分排序并保存到文件 |\n");
		printf("|     9.退出系统                   |\n");
		printf("------------------------------------\n");
		scanf("%d",&opt);
		switch(opt)
		{
		case 1:
			InputKecheng(kecheng);   //录入课程信息
			printf("请输入学生的数量:");
			scanf("%d",&n);
			a = Inputinfo(a,n);//录入学生信息
			WriteFile(a,n,kecheng,"inputdata.txt"); //保存文件
			printf("\n按任意键返回上一层菜单\n");
			getchar();
			getchar();
			break;
		case 2:
			TongjiAvg(a,n); //统计每个学生的平均成绩
			printf("\n按任意键返回上一层菜单\n");
			getchar();
			getchar();
			break;
		case 3:
			TongjiKcAvg(a,n,kecheng); //统计每门课程的平均成绩
			printf("\n按任意键返回上一层菜单\n");
			getchar();
			getchar();
			break;
		case 4:
			Sort(a,n,kecheng);
			WriteFile(a,n,kecheng,"outputdata.txt"); //保存文件
			printf("\n按任意键返回上一层菜单\n");
			getchar();
			getchar();
			break;
		case 9:
			bgo = 0;
			if(a){free(a);}
			break;
		}
	}
	return 0;
}