学生管理系统成绩展示模块后续if-else语句未执行问题排查
学生管理系统成绩展示问题修复
核心问题与修复方案
1. 替换else-if为独立if判断
原代码的else if链式逻辑会导致只要第一个条件满足,后续课程的判断直接被跳过。比如Wendy选了数学和英语,数学的条件满足后,英语的分支就不会执行,导致只显示第一门课的成绩。必须把每个课程的判断改成独立的if,确保所有符合条件的课程都会被处理。
2. 每次计算前重置静态平均值变量
mathAverageGrade、englishAverageGrade等是静态变量,每次点击按钮计算时会在上一次的结果上累加,导致平均值计算越来越大,结果完全错误。每次触发计算前,需要把这些变量重置为0。
3. 修正历史课的条件判断
历史课的判断条件错误地使用了courseGradeHistory[1][grStudentIndex] > 0,应该和其他课程统一判断courseGradeHistory[0][grStudentIndex] > 0(对应总分的数组维度)。
修改后的StudentGrades类代码
if (e.getSource() == gradeGetStudentIndex) { // 清空所有成绩展示标签 mathGrade.setText(""); mathAverage.setText(""); englishGrade.setText(""); englishAverage.setText(""); historyGrade.setText(""); historyAverage.setText(""); grStudentIndex = gradeStudentCombo.getSelectedIndex(); // 重置所有静态平均值统计变量,避免累加错误 MainMenu.mathAverageGrade = 0; MainMenu.mathAverageCount = 0; MainMenu.englishAverageGrade = 0; MainMenu.englishAverageCount = 0; MainMenu.historyAverageGrade = 0; MainMenu.historyAverageCount = 0; // 数学成绩与班级平均分计算 if (MainMenu.courseGradeMath[0][grStudentIndex] > 0) { mathGrade.setText(String.valueOf((MainMenu.courseGradeMath[0][grStudentIndex] / MainMenu.courseGradeMath[1][grStudentIndex]))); for (int av = 0; av <= MainMenu.studentFirstName.length - 1; av++) { MainMenu.mathAverageGrade += MainMenu.courseGradeMath[0][av]; MainMenu.mathAverageCount += MainMenu.courseGradeMath[1][av]; } mathAverage.setText(String.valueOf(MainMenu.mathAverageGrade / MainMenu.mathAverageCount)); } // 英语成绩与班级平均分计算 if (MainMenu.courseGradeEnglish[0][grStudentIndex] > 0) { englishGrade.setText(String.valueOf((MainMenu.courseGradeEnglish[0][grStudentIndex] / MainMenu.courseGradeEnglish[1][grStudentIndex]))); for (int av = 0; av <= MainMenu.studentFirstName.length - 1; av++) { MainMenu.englishAverageGrade += MainMenu.courseGradeEnglish[0][av]; MainMenu.englishAverageCount += MainMenu.courseGradeEnglish[1][av]; } englishAverage.setText(String.valueOf(MainMenu.englishAverageGrade / MainMenu.englishAverageCount)); } // 历史成绩与班级平均分计算(修正条件判断) if (MainMenu.courseGradeHistory[0][grStudentIndex] > 0) { historyGrade.setText(String.valueOf((MainMenu.courseGradeHistory[0][grStudentIndex] / MainMenu.courseGradeHistory[1][grStudentIndex]))); for (int av = 0; av <= MainMenu.studentFirstName.length - 1; av++) { MainMenu.historyAverageGrade += MainMenu.courseGradeHistory[0][av]; MainMenu.historyAverageCount += MainMenu.courseGradeHistory[1][av]; } historyAverage.setText(String.valueOf(MainMenu.historyAverageGrade / MainMenu.historyAverageCount)); } }
额外优化建议
- 避免使用大量静态变量,建议封装
Student、Course、Grade实体类,通过对象管理数据,代码更易维护,也能从根源避免静态变量的累加问题。 - 当前使用整数除法会丢失小数精度,如果需要显示精确的平均分,建议改用
double类型进行计算后再格式化输出。
内容的提问来源于stack exchange,提问作者Wendy Lawrence
相关产品推荐
相关产品推荐

