Java二维数组行平均分计算与等级赋值代码的作用域问题修正求助
问题分析与代码修正
你的代码存在多处逻辑错误,并非仅avg作用域问题,下面逐一说明并给出修正方案:
原代码核心问题
- sum初始化位置错误:
int sum=0;放在内部循环中,导致每次循环列时sum都会重置为0,无法累加整行分数 - 判断条件无效:
j==m永远不会触发,因为j的循环范围是0<=j<m,最大j值为m-1 - 硬编码数组尺寸:直接写
n=2,m=5,既不符合需求的2×3矩阵,也无法适配动态传入的数组 - 返回逻辑错误:循环中直接return会只返回第一个学生的等级,无法处理所有学生的结果
- avg未被正确赋值:因上述判断条件不触发,avg始终是初始值0,导致后续等级判断完全错误
修正后的代码
import java.util.Scanner; public class Solution { public static void main(String[] args) { Scanner sc = new Scanner(System.in); // 需求为2×3的学生分数矩阵:2个学生,3科分数 int studentNum = 2; int subjectNum = 3; int[][] mark = new int[studentNum][subjectNum]; // 输入矩阵并输出原始二维数组 System.out.println("输入的学生分数矩阵:"); for (int i = 0; i < studentNum; i++) { for (int j = 0; j < subjectNum; j++) { mark[i][j] = sc.nextInt(); System.out.print(mark[i][j] + " "); } System.out.println(); // 每行结束换行 } // 获取所有学生的等级结果 String[] results = grade(mark); System.out.println("\n学生等级结果:"); for (int i = 0; i < results.length; i++) { System.out.println("学生" + (i+1) + ":" + results[i]); } sc.close(); } public static String[] grade(int[][] mark) { // 动态获取学生数和科目数,避免硬编码 int studentCount = mark.length; int subjectCount = mark[0].length; String[] grades = new String[studentCount]; for (int i = 0; i < studentCount; i++) { int sum = 0; // 每个学生的总分从0开始累加 for (int j = 0; j < subjectCount; j++) { sum += mark[i][j]; } // 用double计算平均分,避免整数除法丢失精度 double avg = (double) sum / subjectCount; // 根据规则评定等级 grades[i] = avg > 40 ? "P" : "F"; // 输出每行的累加和与平均分 System.out.println("学生" + (i+1) + "总分:" + sum + ",平均分:" + avg); } return grades; } }
关键修正点说明
- 调整sum的位置:将
sum初始化移到学生循环外层,确保每个学生的分数从0开始累加 - 移除无效判断:直接在列循环结束后计算平均分,无需多余的
j==m判断 - 动态获取数组尺寸:通过
mark.length和mark[0].length获取学生数与科目数,代码适配性更强 - 返回所有学生等级:改用
String[]数组返回每个学生的等级,满足多学生的结果输出需求 - 处理精度问题:将总分转为double后再计算平均分,避免整数除法导致的精度丢失(比如总分121、3科的情况,整数除法会得到40,实际是40.333,应判定为P)
- 补充输出逻辑:输入时同步输出原始二维数组,同时输出每行的累加和与平均分,满足需求中的输出要求
内容的提问来源于stack exchange,提问作者VIJAYARAJ
相关产品推荐
相关产品推荐

