
本教程详细介绍了如何在Java中使用二维数组管理学生成绩,并正确地计算每位学生的平均分。文章重点讲解了如何将学生姓名与对应的成绩数据进行关联,避免常见的数组索引和数据类型错误,并提供了完整的代码示例,帮助读者构建一个功能完善的成绩管理系统。
在许多应用程序中,我们需要处理结构化的数据集合。学生成绩管理是一个典型的例子,它涉及到存储学生姓名和他们多门课程的成绩。Java中的数组,特别是二维数组,是处理这类数据的有效工具。本教程将指导您如何利用String[]存储学生姓名,以及int[][]存储对应的考试成绩,并着重解决在计算和显示每位学生平均分时,如何正确地将姓名与成绩关联起来的问题。
为了实现学生成绩管理,我们需要两种主要的数据结构:
例如,一个int[5][3]的二维数组可以表示5名学生,每名学生有3门课程的成绩。
立即学习“Java免费学习笔记(深入)”;
import java.util.Arrays;
import java.util.Scanner;
public class GradeBook {
public static void main(String[] args) {
System.out.println("Starting program\n\n");
// 声明学生姓名数组
String[] STUDENT_NAMES = new String[] {"Adams", "Baker", "Campbell", "Dewey", "East"};
// 声明学生成绩二维数组,5名学生,每人最多3门成绩
int[][] STUDENT_GRADES = new int[STUDENT_NAMES.length][3];
// 加载学生成绩数据
loadGradeArray(STUDENT_GRADES);
// 打印学生姓名和前两门成绩
System.out.println("学生姓名 成绩1 成绩2");
System.out.println("------------------------------");
for (int i = 0; i < STUDENT_NAMES.length; i++) {
// 使用printf格式化输出,确保对齐
System.out.printf("%-10s %5d %8d \n", STUDENT_NAMES[i], STUDENT_GRADES[i][0], STUDENT_GRADES[i][1]);
}
System.out.println("\n");
// 计算并打印学生平均分
getStudentAverage(STUDENT_GRADES, STUDENT_NAMES);
} //end main
// ... 其他方法将在后续章节详细介绍
}loadGradeArray方法负责将具体的成绩数据填充到STUDENT_GRADES二维数组中。在实际应用中,这些数据可能来自用户输入、文件读取或数据库。为了本教程的示例,我们将直接在方法中硬编码一些成绩。
原始loadGradeArray方法的潜在问题: 原始代码中的loadGradeArray方法在一个嵌套循环中反复为固定的索引STUDENT_GRADES[0][0]、STUDENT_GRADES[0][1]等赋值,这意味着只有最后一次赋值会生效,并且所有学生的数据都会被重复赋值多次,效率低下且逻辑不清晰。
修正后的loadGradeArray方法: 为了正确地填充数据,我们应该确保每个学生的每门成绩都被准确地赋值一次。
/**
* 加载学生成绩数据到二维数组中。
* 实际应用中,数据可能来自用户输入、文件或数据库。
* @param studentGrades 存储学生成绩的二维数组
*/
public static void loadGradeArray(int[][] studentGrades) {
// 示例:直接赋值具体的学生成绩
// 假设每个学生有两门成绩,第三列保留或未用
// Adams: 75, 75
studentGrades[0][0] = 75;
studentGrades[0][1] = 75;
// Baker: 100, 75
studentGrades[1][0] = 100;
studentGrades[1][1] = 75;
// Campbell: 84, 75
studentGrades[2][0] = 84;
studentGrades[2][1] = 75;
// Dewey: 80, 75
studentGrades[3][0] = 80;
studentGrades[3][1] = 75;
// East: 50, 75
studentGrades[4][0] = 50;
studentGrades[4][1] = 75;
}通过这种方式,每位学生的成绩都被清晰且正确地设置。
getStudentAverage方法是本教程的核心,它负责遍历每个学生,计算他们的平均分,并将结果与对应的学生姓名一起打印出来。
原始getStudentAverage方法的问题:
修正后的getStudentAverage方法: 我们将解决上述问题,确保平均分的计算准确无误,并且学生姓名能够正确地关联。
/**
* 计算并打印每位学生的平均分。
* @param grades 存储学生成绩的二维数组
* @param names 存储学生姓名的字符串数组
*/
public static void getStudentAverage(int[][] grades, String[] names) {
// Scanner in = new Scanner(System.in); // 示例中不需要用户输入,可移除
// 遍历每个学生(外层循环控制行,即学生)
for (int row = 0; row < grades.length; row++) {
double sum = 0; // 使用double类型存储总和,避免整数除法问题
// 遍历当前学生的所有成绩(内层循环控制列,即成绩)
for (int col = 0; col < grades[row].length; col++) {
sum = sum + grades[row][col];
}
// 计算平均分。确保使用浮点数除法,并考虑成绩数量的动态性
// 如果grades[row].length可能为0,需要添加检查以避免除以零错误
double average = (grades[row].length > 0) ? sum / grades[row].length : 0.0;
// 打印结果,正确关联学生姓名
// 使用 names[row] 获取当前学生的姓名
System.out.printf("The average of %s is: %.1f\n", names[row], average);
}
// in.close(); // 如果使用了Scanner,记得关闭
}关键修正点解释:
将以上所有修正和方法整合到GradeBook.java类中,形成一个完整的、可运行的程序。
import java.util.Arrays; // 引入Arrays工具类,虽然本例中直接使用了索引
import java.util.Scanner; // 引入Scanner类,如果需要用户输入
public class GradeBook {
public static void main(String[] args) {
System.out.println("Starting program\n\n");
// 声明学生姓名数组
String[] STUDENT_NAMES = new String[] {"Adams", "Baker", "Campbell", "Dewey", "East"};
// 声明学生成绩二维数组,5名学生,每人最多3门成绩
// 注意:这里定义了3列,但loadGradeArray只填充了前两列,第三列默认为0
int[][] STUDENT_GRADES = new int[STUDENT_NAMES.length][3];
// 加载学生成绩数据
loadGradeArray(STUDENT_GRADES);
// 打印学生姓名和前两门成绩的概览
System.out.println("学生姓名 成绩1 成绩2");
System.out.println("------------------------------");
for (int i = 0; i < STUDENT_NAMES.length; i++) {
// 使用printf格式化输出,确保对齐
System.out.printf("%-10s %5d %8d \n", STUDENT_NAMES[i], STUDENT_GRADES[i][0], STUDENT_GRADES[i][1]);
}
System.out.println("\n");
// 计算并打印学生平均分
getStudentAverage(STUDENT_GRADES, STUDENT_NAMES);
} //end main
/**
* 计算并打印每位学生的平均分。
* @param grades 存储学生成绩的二维数组
* @param names 存储学生姓名的字符串数组
*/
public static void getStudentAverage(int[][] grades, String[] names) {
// Scanner in = new Scanner(System.in); // 如果不需要用户输入,可以移除
// 遍历每个学生(外层循环控制行,即学生)
for (int row = 0; row < grades.length; row++) {
double sum = 0; // 使用double类型存储总和,避免整数除法问题
// 遍历当前学生的所有成绩(内层循环控制列,即成绩)
for (int col = 0; col < grades[row].length; col++) {
sum = sum + grades[row][col];
}
// 计算平均分。确保使用浮点数除法,并考虑成绩数量的动态性
// 增加对grades[row].length的检查,避免除以零错误(尽管本例中不会发生)
double average = (grades[row].length > 0) ? sum / grades[row].length : 0.0;
// 打印结果,正确关联学生姓名
// 使用 names[row] 获取当前学生的姓名
System.out.printf("The average of %s is: %.1f\n", names[row], average);
}
// in.close(); // 如果使用了Scanner,记得关闭
}
/**
* 加载学生成绩数据到二维数组中。
* 实际应用中,数据可能来自用户输入、文件或数据库。
* @param studentGrades 存储学生成绩的二维数组
*/
public static void loadGradeArray(int[][] studentGrades) {
// 示例:直接赋值具体的学生成绩
// 假设每个学生有两门成绩,第三列保留或未用
// Adams: 75, 75
studentGrades[0][0] = 75;
studentGrades[0][1] = 75;
// Baker: 100, 75
studentGrades[1][0] = 100;
studentGrades[1][1] = 75;
// Campbell: 84, 75
studentGrades[2][0] = 84;
studentGrades[2][1] = 75;
// Dewey: 80, 75
studentGrades[3][0] = 80;
studentGrades[3][1] = 75;
// East: 50, 75
studentGrades[4][0] = 50;
studentGrades[4][1] = 75;
}
} //end class程序输出示例:
Starting program 学生姓名 成绩1 成绩2 ------------------------------ Adams 75 75 Baker 100 75 Campbell 84 75 Dewey 80 75 East 50 75 The average of Adams is: 75.0 The average of Baker is: 87.5 The average of Campbell is: 79.5 The average of Dewey is: 77.5 The average of East is: 62.5
本教程通过一个学生成绩管理的具体案例,深入探讨了Java中二维数组的使用技巧。我们学习了如何正确地声明、初始化和填充二维数组,并重点解决了在遍历数组时,如何精确地将相关数据(如学生姓名和其平均分)进行关联和输出。通过修正常见的编程错误,例如不正确的数组字符串转换和硬编码的平均分计算,我们构建了一个功能更健壮、更通用的成绩管理程序。掌握这些基本概念对于处理各种结构化数据至关重要。
以上就是Java二维数组与学生成绩管理:计算并关联学生平均分的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号