2023.求平均成绩
解题思路:
求每人平均成绩、每科平均成绩和各科成绩均大于等于平均成绩的学生数量。题目样例中,一行代表一个学生的各科成绩,所以把每行数据加起来除m就可以得到每个学生的平均成绩;同理,每列代表的是每科的所有成绩,所以把每列相加除n就可以得到每科的平均值。可以把每个学生的平均成绩和每科的平均成绩分别存在数组里,单独输出;也可以在计算时边计算边输出。本文以第一种为例,最后计算各科成绩均大于等于平均成绩的学生数量,如果该生每科均大于等于该科的平均值,则+1;最终输出结果即可。注意输出格式,本题要求每个测试实例后面跟一个空行。
实现代码:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNext()){
int n = sc.nextInt(); //学生数
int m = sc.nextInt(); //课程数
int[][] grade = new int[n][m]; //存放学生各科成绩
double[] avgStu = new double[n]; //存放每个学生的平均成绩
double[] avgSub = new double[m]; //存放每门课的平均成绩
double sumStu = 0; //每个学生各科总成绩
double sumSub = 0; //每科成绩的总和
int count = 0; //各科成绩均大于等于平均成绩的学生数量
boolean flag = true; //标记该学生是否各科都大于平均成绩
//接收数据并计算每个学生的平均成绩
for (int i = 0; i < n; i++) {
sumStu = 0;
for (int j = 0; j < m; j++) {
grade[i][j] = sc.nextInt();
sumStu += grade[i][j];
}
avgStu[i] = (double) sumStu / m;
}
//计算每科的平均成绩
for (int j = 0; j < m; j++) {
sumSub = 0;
for (int i = 0; i < n; i++) {
sumSub += grade[i][j];
}
avgSub[j] = (double) sumSub / n;
}
//计算各科成绩均大于等于平均成绩的学生数量
for (int i = 0; i < n; i++) {
flag = true;
for (int j = 0; j < m; j++) {
if(grade[i][j] < avgSub[j]){
flag = false;
break;
}
}
if(flag){
count++;
}
}
//输出每个学生的平均成绩
for (int i = 0; i < n; i++) {
if(i == n - 1){
System.out.printf("%.2f",avgStu[i]); //结果保留两位小数
System.out.println();
}else{
System.out.printf("%.2f",avgStu[i]);
System.out.print(" ");
}
}
//输出每科的平均成绩
for (int i = 0; i < m; i++) {
if(i == m - 1){
System.out.printf("%.2f",avgSub[i]);
System.out.println();
}else{
System.out.printf("%.2f",avgSub[i]);
System.out.print(" ");
}
}
System.out.println(count);
System.out.println();
}
}
}
补充:
本题要求输出结果保留两位小数,除了以上代码中提到的写法,还有一种写法,如下:
System.out.printf(String.format("%.2f", Mave)); //输出无效果
System.out.printf(String.format("%.2f", Mave) + " "); //输出时后有空格不换行
System.out.print(String.format("%.2f", Mave) + "\n"); //输出时换行