(没实现,但是花了好久)3. 已知有3个班级各5名学员,请使用二维数组动态录入所有学员成绩,并计算各个班级的平均成绩,最好成绩和最差成绩。依次输出平均成绩最好的班,三个班所有学员中成绩最高的分数,最差的分数
如果有大佬指点下,这个可能循环太多导致性能比较差,但是目前只学到这么多,用目前出现的方法实现下。
太烧脑了。
private static void fun6() {
// 本来是需要控制台输入,现在手动定义一个数组
int[][] a = new int[3][];
a[0] = new int[]{1,1,1,1,1};
a[1] = new int[]{2,2,2,2,2};
a[2] = new int[]{1,1,1,1,1};
/*
* 3. 已知有3个班级各5名学员,请使用二维数组动态录入所有学员成绩,
* 并计算各个班级的平均成绩,最好成绩和最差成绩。依次输出平均成绩最好的班,
* 三个班所有学员中成绩最高的分数,最差的分数
* */
Scanner sc = new Scanner(System.in);
// 输入成绩
// int[][] a = new int[3][5];
// for (int i = 0; i < 3; i++) {
// System.out.println("请输入第 " + (i+1) + " 个班级的:");
// for (int j = 0; j < 5; j++) {
// System.out.print("请输入第 " + (j+1) + " 个学员的成绩:");
// a[i][j] = sc.nextInt();
// }
// }
// 打印
// 每个班级:
// 按照平均分从大到小依次输出每个班级的信息,解决方法为:
// 再定义一个二维数组存放已经计算出来的数据(在计算的循环中可以同时存放),
// 对于新数组进行嵌套 for 循环,找到平均数为最大的进行输出。
// 然后再输出 比上一个记录的数值小的 最大的平均值 进行输出,以此类推。
double[][] b = new double[3][4];
// 先计算各个数值。
for (int i = 0; i < 3; i++) {
double sum = 0;
double max = 0;
double min = Double.MAX_VALUE;
for (int j = 0; j < 5; j++) {
sum += a[i][j];
if (max<a[i][j]){
max = a[i][j];
}
if(min>a[i][j]){
min = a[i][j];
}
}
b[i][0] = i;
b[i][1] = (sum/5);
b[i][2] = max;
b[i][3] = min;
}
// 按照平均成绩的大小依次输出
double max = 0;
double beforeMax = Double.MAX_VALUE;
for (int i = 0; i < 3; i++) {
/* for (int j = 0; j <4 ; j++) {
if(j == 2 && max < b[i][j] && max < beforeMax){
max = b[i][j];
beforeMax = max;
}
}*/
for (int j = 0; j < 3; j++) {
if (max < b[j][1] && max < beforeMax) {
max = b[j][1];
}
}
beforeMax = max;
for (int j = 0; j < 3; j++) {
if (b[j][1] == max) {
System.out.printf("排名第 %d 的班级的 平均分为:%f,最高分为:%f,最低分为:%f%n", (j + 1), b[j][1], b[j][2], b[j][3]);
}
break;
}
}
// 三个班级里面成绩最高的分数,成绩最差的分数
int maxAll = 0;
int minAll = Integer.MAX_VALUE;
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 5; j++) {
if (maxAll < a[i][j]){
maxAll = a[i][j];
}
if (minAll > a[i][j]){
minAll = a[i][j];
}
}
}
System.out.printf("所有成绩中最高分为:%d,最低分为:%d", maxAll, minAll);
}