Problem Description
假设一个班有n(n<=50)个学生,每人考m(m<=5)门课,求每个学生的平均成绩和每门课的平均成绩,并输出各科成绩均大于等于平均成绩的学生数量。
Input
输入数据有多个测试实例,每个测试实例的第一行包括两个整数n和m,分别表示学生数和课程数。然后是n行数据,每行包括m个整数(即:考试分数)。
Output
对于每个测试实例,输出3行数据,第一行包含n个数据,表示n个学生的平均成绩,结果保留两位小数;第二行包含m个数据,表示m门课的平均成绩,结果保留两位小数;第三行是一个整数,表示该班级中各科成绩均大于等于平均成绩的学生数量。 每个测试实例后面跟一个空行。
Sample Input
2 2
5 10
10 20
Sample Output
7.50 15.00
7.50 15.00
1
题目解析:
简单来说:首先,多组数据输入,第一行输入两个整数n,m,n代表学生人数;m代表有m科学科;然后输出,每行代表每个学生的各科成绩,每列代表各个学生的该科目分数
例如
学生1第一科分数、学生1第二科分数、学生1第三科分数 … 学生1第m科分数
学生2第一科分数、学生2第二科分数、学生2第三科分数 … 学生1第m科分数
学生3第一科分数、学生3第二科分数、学生3第三科分数 … 学生1第m科分数
……
学生n第一科分数、学生n第二科分数、学生n第三科分数 … 学生n第m科分数
以此类推
要求输出三行:
第一行:输出n个学生的平均成绩,结果保留两位小数
第二行:输出m科分数的平均成绩,结果保留两位小数
第三行:输出一个整数,表示该班级中各科成绩均大于等于平均成绩的学生数量。
思路分析:
简单来说:首先,多组数据输入,第一行输入两个整数a(学生数目),b(学科科目数);然后,以此输入,一行一行的输入,表示每一个学生的各科分数;每行表示每个学生的各科分数,每列表示单独一科,每个学生的分数;
代码如下:
#include<stdio.h>
int main()
{
int a[50][50];
double x,y,aver1[50],aver2[50],sum; //aver1该数组存储每个学生的各科的平均成绩;aver2该数组存储每科学科的平均成绩
int i,j,n,m,count,p;
while(~scanf("%d%d",&n,&m))
{
count=0; //表示计数,记录那些各科都高于平均分的学生的人数
for(i=0;i<n;i++)
for(j=0;j<m;j++)
scanf("%d",&a[i][j]); //录入每个学生的各科成绩
for(i=0;i<n;i++)
{
sum=0;
for(j=0;j<m;j++)
sum+=a[i][j];
aver1[i]=sum/m; //将每个学生的各科的平均成绩给存储到aver1数组中
}
for(j=0;j<m;j++)
{
sum=0;
for(i=0;i<n;i++)
sum+=a[i][j];
aver2[j]=sum/n; //将每科学科的平均成绩给存储到aver2数组中
}
for(i=0;i<n;i++)
{
p=1;
for(j=0;j<m;j++) //这个for循环表示每个学生的所有科目的成绩进行与aver2数组存储的各科科目平均分进行比较
if(a[i][j]<aver2[j]) //如果所有学生的各科学科分数都比各个学科的平均分要低的话
{
p=0; //p=0;
break; //跳出循环
}
if(p) //如果p!=0的话,即有学生的各科成绩都比各科的平均分要高或者一样
count++; //人数加一
}
for(i=0;i<n-1;i++)
printf("%.2lf ",aver1[i]); //输出格式是保留两位小数,这里是将前n-1位学生各科学科的平均分输出,这里每一科成绩之后都会有个空格
printf("%.2lf\n",aver1[i]); //输出最后一位学生的各科学科的平均分,这里没有空格
for(i=0;i<m-1;i++)
printf("%.2lf ",aver2[i]); //同理,输出格式是保留两位小数,这里输出的是前m-1科学科的平均分,这里每一科学科的平均分最后都会有个空格
printf("%.2lf\n",aver2[i]); //输出最后一科的学科平均分,这里的最后没有空格
printf("%d\n\n",count); //输出count,也就是每科都超过各个学科的平均分的学生人数
return 0;
}