weixin_52791965 2021-06-22 11:16 采纳率: 50%
浏览 27
已采纳

C语言 综合问题处理

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

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

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

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

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

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

要求:

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

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

  • 写回答

1条回答 默认 最新

  • qfl_sdu 2021-06-22 11:23
    关注

    代码如下:

    #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;
    }
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 目详情-五一模拟赛详情页
  • ¥15 有了解d3和topogram.js库的吗?有偿请教
  • ¥100 任意维数的K均值聚类
  • ¥15 stamps做sbas-insar,时序沉降图怎么画
  • ¥15 买了个传感器,根据商家发的代码和步骤使用但是代码报错了不会改,有没有人可以看看
  • ¥15 关于#Java#的问题,如何解决?
  • ¥15 加热介质是液体,换热器壳侧导热系数和总的导热系数怎么算
  • ¥100 嵌入式系统基于PIC16F882和热敏电阻的数字温度计
  • ¥15 cmd cl 0x000007b
  • ¥20 BAPI_PR_CHANGE how to add account assignment information for service line