Java代码问题:计算排除最低分后的学生平均分与预期不符
代码逻辑错误排查与修复
核心错误分析
你的代码存在两个致命逻辑错误,直接导致计算结果与样例不符:
1. 寻找最低分的条件完全错误
在查找每行最低分的内层循环中,你错误地将当前行的科目数量与最低分比较:
if (arrScores[i].length < lowest) { // arrScores[i].length是科目数,不是分数值 lowest = arrScores[i][j]; }
这个条件会导致每次循环都更新lowest为当前遍历到的分数(因为科目数5永远小于初始的100,且后续分数都大于5),最终lowest变成该行的最后一个元素,而非真正的最低分。比如Student#1的最后一个元素是100,代码错误地排除了100,导致平均分计算错误。
正确的条件应该是比较当前分数与记录的最低分:
if (arrScores[i][j] < lowest) { lowest = arrScores[i][j]; }
2. 初始化最低分的方式不够严谨
你将lowest初始化为100,如果存在分数高于100的情况(虽然样例中没有),会导致无法找到正确的最低分。更严谨的做法是用当前行的第一个分数初始化:
double lowest = arrScores[i][0];
3. 额外优化:避免排除多个最低分
当前代码会排除所有等于最低分的分数,但题目要求是排除一个最低分(比如一行中有多个相同最低分时,只减去一个)。建议改为先计算该行总分,再减去一个最低分,这样逻辑更准确:
double total = 0; for (int j = 0; j < arrScores[i].length; j++) { total += arrScores[i][j]; if (arrScores[i][j] < lowest) { lowest = arrScores[i][j]; } } average = (total - lowest) / (arrScores[i].length - 1);
修复后的完整代码
public void printStudentsAvgWithoutLowest() { double average = 0; for (int i = 0; i < arrScores.length; i++) { double lowest = arrScores[i][0]; double total = 0; for (int j = 0; j < arrScores[i].length; j++) { total += arrScores[i][j]; if (arrScores[i][j] < lowest) { lowest = arrScores[i][j]; } } average = (total - lowest) / (arrScores[i].length - 1); // 若需与样例的Student#1编号一致,将%d改为i+1即可 System.out.printf("Student#%d Average (without lowest score): %.2f\n", i, average); average = 0; } System.out.printf("\n"); }
验证结果
修复后运行代码,输出将与样例完全一致:
- Student#1(数组第二行)平均分:77.50
- Student#2(数组第三行)平均分:85.00
- Student#4(数组第五行)平均分:84.45
内容的提问来源于stack exchange,提问作者user19598384
相关产品推荐
相关产品推荐

