假设一个班有n(n<=50)个学生,每人考m(m<=5)门课,求每个学生的平均成绩和每门课的平均成绩,并输出各科成绩均大于等于平均成绩的学生数量。


/*
输入: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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值