、
/*
输入:n和m,分别表示学生数和课程数。然后是n行数据,每行包括m个数据
输出;对于每个测试输出三行数据;
第一行包括n个数据表示n个学生的平均成绩;
第二行包括m个数据表示m门课的平均成绩;
第三行是一个整数,表示该班各科成绩均大于等于平均成绩的学生数
3 2
1 2
3 4
6 8
1.50 3.50 7.00
3.33 4.67
1
*/include <iostream>
using namespace std;
double a[51][6];
double sa[51];
double ca[6];
这里涉及到小数点所以我们用浮点型,至于求的平均值为什么用数组,因为我们需要每一行,每一列的平均数据,这是单个变量不能呈现的
int main() {
int n, m;
while (cin >> n >> m) {
for (int i = 0; i < n; ++i) {
for (int j = 0; j < m; ++j) {
cin >> a[i][j];
}
}
到这里第一个for循环完成,我们给每一个数据都输入了值
for (int i = 0; i < n; ++i) {
sa[i] = 0;
for (int j = 0; j < m; ++j) {
sa[i] += a[i][j];
}
sa[i] /= m;
}
接下来我们求每一行的平均值,第二个for循环开始,这个循环每开始一次我们都要得到每一行的平均值所以 sa[i] /= m;这个表达式放在最后,sa[i] = 0;并且这个表达式一定要放到循环里面的开头,确保每次循环都初始化一下,至此每一行的平均数都被储存在数组sa[i]里面了,接下来就可以使用for 循环将他打印出来了!在此之前我们要先把列的平均值求出来
for (int i = 0; i < m; ++i) {
ca[i] = 0;
for (int j = 0; j < n; ++j) {
ca[i] += a[j][i];
}
ca[i] /= n;
}
这时候就有意思了我们先把矩阵中的二维给固定住,并且规定范围通过循环一维的值来得到每一列的平均值。总结一下,求平均值的过程是这样的,我们首先定义一个一维的浮点型数组,将每一行的数存储到数组中得到sa[i],这个i的范围是我们自己规定的n,然后我们将这数组中的每一个数都除n,这样每个平均数就都存到数组里了,我们就可以访问了比如像这样
cout<<sa[2]<<endl;或者用for循环将他们全打印出来
接下来我们需要找出一个整数,这个整数是学生数也就是行数,我们需要将每一行的每一个元素与其相同列数的ca平均值进行判定,这时候我们依然利用for循环进行枚举就可以,并且注意判定时放在嵌套for循环里就可以了,这个有一点绕
int cnt = 0;
for (int i = 0; i < n; ++i) {
int sum = 0;
for (int j = 0; j < m; ++j) {
sum += (a[i][j] >= ca[j]); (判断符号得到的数值是1或0所以这玩意是可以直接累加的啊)
} (这里注意嵌套的使用就可以将行和列的数值区分开,因为我 们可以先在大的for循环里固定一个维度)
if (sum == m) {
++cnt;
}
}
这里面cnt 代表学生的数量因此不能放循环里面,而sum则不同,sum是用来判定每一列成绩是否达标的,只有sum值累加到跟列数相同时,cnt的数值才会累加
最后就是输出了
for (int i = 0; i < n; ++i) {
if (i) {
cout << ' '; 这里的意思是只要i不为0就输出一个空行
}
printf("%.2lf", sa[i]); 在保留两位小数是用这个printf
}
cout << endl;
for (int i = 0; i < m; ++i) {
if (i) {
cout << ' ';
}
printf("%.2lf", ca[i]);
}
cout << endl;
cout << cnt << endl;
}