思路:用二维数组存储学生的成绩,之后单独求平均成绩,各科平均成绩,大于平均成绩的学生数
vs2019运行
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
int main()
{
int n, m;
while (scanf("%d%d", &n, &m) != EOF) {
double sum1,sum2;
double **score = (double **)malloc(n * sizeof(double *)); //学生成绩,n个学生,每一个学生都是指针
double *a = (double *)malloc(sizeof(double)*n); //每个学生的平均成绩
double *b = (double *)malloc(sizeof(double)*m); //每门课的平均成绩
int num = 0; //大于平均分的人数
int flag = 0;
sum1 = sum2 = 0.0;
for (int i = 0; i < n; i++)
score[i] = (double *)malloc(sizeof(double) * m); //每个学生有m门课 , 每一门课都是指针
//初始化成绩
for(int i=0;i<n;i++)
for (int j = 0; j < m; j++)
{
scanf("%lf", &score[i][j]);
}
//求每个学生的平均成绩
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
sum1 += score[i][j]; //单独一个学生时,行标不变,列标递增
}
a[i] = sum1 / m;
sum1 = 0.0; //计算下一个平均值时,清0,避免多加上一次计算的平均值
}
//每门课的平均成绩
for (int j = 0; j < m; j++) {
for (int i = 0; i < n; i++)
sum2 += score[i][j]; //每一门课的平均分时,列标不变,行标递增
b[j] = sum2 / n;
sum2 = 0.0;
}
//各科成绩大于平均成绩(b[])学生数
for (int i = 0; i < n; i++) {
flag = 0; //太关键了,我特么的就这个问题提交了好几次都没过
for (int j = 0; j < m; j++) {
if (score[i][j] >= b[j])
flag++; //计算大于平均值的科目数
}
if (flag == m) //各科全部大于平均值
num++;
}
for (int i = 0; i < n; i++) {
if (i > 0)
printf(" %.2lf", a[i]);
else
printf("%.2lf", a[i]);
}
putchar('\n');
for (int i = 0; i < m; i++) {
if (i > 0)
printf(" %.2lf", b[i]);
else
printf("%.2lf", b[i]);
}
putchar('\n');
printf("%d\n", num);
putchar('\n');
for (int i = 0; i < n; i++)
free(score[i]);
free(score);
free(a);
free(b);
}
return 0;
}
debug: 计算平均值时sum1和sum2没求完一次清零,计算优秀学生数时flag也要清0。 mmp这个问题耗费了我1个小时左右。