题目描述:
软件工程2020级某班一共有L人,2020-2021学年第一学期有M门课考试。为了对软件工程2020级某班班级学生学习效果进行分析,需要对学生的考试成绩进行处理,分别用函数实现下列功能。(L和M分别用scanf函数输入,a[0][0]可以代表第1位学生的第1门课成绩,所有要求均在一个程序内实现。)
1.输入每个学生每门课的分数,计算每个学生的平均分。
2.计算每门课的平均分。
3.找出每门课程的最高分和最低分所对应的学生。
4.计算平均分(每位同学的平均分)方差。
方差计算公式如下(其中Xi为某一学生的平均分。)
代码实现
#include <stdio.h>
//输入每名同学每科成绩,并计算平均分
void scan_child_point_ave(int a[][10],double b[],int l,int m);
//计算每门课的平均分
void object_ave_point(int a[][10],double b[],int l,int m);
//找到每科最高分和最低分以及对应同学
void max_min(int child_max[10],int child_min[10],int a[][10],int max[],int min[],int l,int m);
int comp_max(int *p,int a[][10],int i,int l);//最高分数
int comp_min(int *q,int a[][10],int i,int l);//最低分数
void vaf_jisuan(double *x,double a[],int l);//方差计算
int main()
{
int L,M;
printf("请输入这个班人数:");scanf("%d",&L);
printf("请输入2020-2021学年第一学期考试门数:");scanf("%d",&M);
int child_point[100][10];
double ave_point[100];
printf("---------以下为每位同学每门课的分数---------\n");
//输入每名同学每科成绩,并计算平均分
scan_child_point_ave(child_point,ave_point,L,M);
//输出平均成绩
printf("----------以下为每位同学的平均成绩----------\n");
for(int i=0;i<L;i++)
{
printf("第%d位同学平均成绩为:",i+1);
printf("%.2f\n",ave_point[i]);
}
//计算每门课的平均分
printf("-----------以下为每门课的平均成绩-----------\n");
double ave_object[10];
object_ave_point(child_point,ave_object,L,M);
for(int i=0;i<M;i++)
{
printf("第%d门学科的平均分为:",i+1);
printf("%.2f\n",ave_object[i]);
}
//找到每科最高分和最低分以及对应同学
printf("---以下为每门课最高分和最低分以及对应同学---\n");
int max[10],min[10];
int child_max[10],child_min[10];
max_min(child_max,child_min,child_point,max,min,L,M);
for(int i=0;i<M;i++)
{
printf("第%d门考试的最高分是:%d;最低分是:%d\n",i+1,max[i],min[i]);
printf("第%d门考试最高分是第%d位同学,最低分是第%d位同学。\n",i+1,child_max[i],child_min[i]);
}
//计算平均分的方差
printf("------------以下为平均分的方差-------------\n");
double vaf;
double *x;
x=&vaf;
vaf_jisuan(x,ave_point,L);
printf("平均分的方差为%.2f\n",vaf);
return 0;
}
//以下为本次使用到的自定义函数
void scan_child_point_ave(int a[][10],double b[],int l,int m)
{
double sum[100]={0};
for(int i=0;i<l;i++)
{
printf("请输入%d位同学的成绩:",i+1);
for(int j=0;j<m;j++){
scanf("%d",&a[i][j]);
sum[i]+=a[i][j];
}
b[i]=sum[i]/m;
}
}
void object_ave_point(int a[][10],double b[],int l,int m)
{
int sum[10]={0};
for(int i=0;i<m;i++)
{
for(int j=0;j<l;j++)
{
sum[i]+=a[j][i];
}
b[i]=sum[i]/l;
}
}
void max_min(int child_max[10],int child_min[10],int a[][10],int max[],int min[],int l,int m)
{
for(int i=0;i<m;i++){
int *p;
p=&child_max[i];
int *q;
q=&child_min[i];
max[i]=comp_max(p,a,i,l);
min[i]=comp_min(q,a,i,l);
}
}
int comp_max(int *p,int a[][10],int i,int l)
{
int max=a[0][i];
*p=1;
for(int j=1;j<l;j++)
{
if(max<a[j][i]){
max=a[j][i];
*p=j+1;
}
}
return max;
}
int comp_min(int *q,int a[][10],int i,int l)
{
int min=a[0][i];
*q=1;
for(int j=1;j<l;j++)
{
if(min>a[j][i]){
min=a[j][i];
*q=j+1;
}
}
return min;
}
void vaf_jisuan(double *x,double a[],int l)
{
double sum1=0,sum2=0;
for(int i=0;i<l;i++)
{
sum1+=a[i]*a[i];
sum2+=a[i];
}
*x=1.0*sum1/l-(sum2/l);
}