使用C#开发.NET学期成绩表单时平均分计算错误问题求助
问题排查与修复方案
核心问题(直接导致总分忽高忽低)
- 计算循环重复递增索引,漏算成绩
你在buttonCalculate_Click的for循环中,for语句本身就会自动对inputCounter执行自增,但你在判断输入框有效后,又额外写了一次inputCounter++,等于每遇到一个有效输入就会跳过下一个输入框,导致部分成绩未被计入总分,最终求和结果偏低。 - 全局总分变量未在每次计算前重置
totalMarks是类级别的全局变量,仅在点击重置按钮时才会清零。如果用户多次点击计算按钮、或者第一次计算后未点击重置就再次输入成绩计算,上次的总分会被累加进新的计算结果,导致总分异常偏高。
次要优化问题
- 字母等级判断逻辑错误
GetLetterGrade函数中使用numericGrade > gradeValues[counter]作为判断条件,会导致刚好等于分界值的成绩等级匹配错误,比如50分会被判定为F而不是D-,建议修改为>=。
修复后的核心代码片段
修正后的buttonCalculate_Click方法
private void buttonCalculate_Click(object sender, EventArgs e) { double averageMarks = 0; int invalidBox = 0; int validBox = 0; // 每次计算前先重置总分,避免历史值累加 totalMarks = 0; for (int inputCounter = 0; inputCounter < inputTextBoxes.Length; inputCounter++) { if (IsTextBoxValid(inputTextBoxes[inputCounter])) { totalMarks += double.Parse(inputTextBoxes[inputCounter].Text); // 删掉原来额外的inputCounter++语句 validBox++; } else { // 如果输入框非空,判定为无效输入 if(!String.IsNullOrEmpty(inputTextBoxes[inputCounter].Text)) { inputTextBoxes[inputCounter].Focus(); textBoxOutput.Text = "请输入有效值!"; invalidBox++; } } } if (validBox >= 1 && invalidBox == 0) { // 如果你要算所有7门课的平均分,分母保持inputTextBoxes.Length即可;如果仅算已填的有效科目,分母改为validBox averageMarks = Math.Round(totalMarks / inputTextBoxes.Length, 2); textBoxSemesterMarks.Text = averageMarks.ToString(); double grade = double.Parse(textBoxSemesterMarks.Text); textBoxSemesterLetterGrade.Text = GetLetterGrade(grade); buttonCalculate.Enabled = false; SetControlsEnabled(inputTextBoxes, false); buttonReset.Focus(); } else { textBoxOutput.Text = "请输入有效值!"; } }
可选修正:GetLetterGrade方法
private string GetLetterGrade(double numericGrade) { double[] gradeValues = { 0D, 50D, 52D, 58D, 60D, 62D, 68D, 70D, 72D, 78D, 80D, 82D, 90D }; string[] gradeLetters = { "F", "D-", "D", "D+", "C-", "C", "C+", "B-", "B", "B+", "A-", "A", "A+" }; string returnLetter = "F"; for (int counter = 0; counter < gradeValues.Length; counter++) { // 将大于改为大于等于,匹配分界值成绩 if (numericGrade >= gradeValues[counter]) { returnLetter = gradeLetters[counter]; } else { return returnLetter; } } return returnLetter; }
内容的提问来源于stack exchange,提问作者Arsalan Arif Radhu
相关产品推荐
相关产品推荐

