You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于平均分的学生成绩等级计算代码问题排查求助

代码存在的问题分析
  • 函数未接收传入的数组参数:调用calculateGrade(marks)时传入了数组,但函数定义function calculateGrade()未声明参数,导致函数内部使用的是全局marks变量,而非传入的参数,违背了“将数组传入函数”的设计意图。

  • 循环边界错误:循环条件i<=marks.length会触发索引越界。数组索引从0开始,到marks.length-1结束,当i等于marks.length时,marks[i]为undefined,累加后summ会变成NaN,最终平均分计算完全错误。

  • 全局变量summ导致重复调用异常:summ定义在函数外部,属于全局变量。多次调用calculateGrade时,summ会保留上一次的累加值,导致后续计算的总分和平均分彻底失真。

  • 平均分计算位置错误:avg = (summ/marks.length)放在循环内部,每次循环都会用当前的部分和除以数组长度,得到的不是最终的平均分。应当在循环结束后,用总分除以数组长度计算平均分。

  • 函数无返回值却被打印:calculateGrade内部通过console.log输出等级,但函数本身没有return语句。调用console.log(calculateGrade(marks))时,会额外打印undefined(函数默认返回值)。

  • var的作用域问题:在循环内部用var定义avg,由于var的函数级作用域特性,会引发变量提升问题,逻辑上不够严谨,建议改用let或const并放在合适的作用域中。

修正后的代码示例
const marks = [100, 100, 80];

function calculateGrade(studentMarks) {
    let summ = 0;
    // 修正循环边界,避免索引越界
    for(let i = 0; i < studentMarks.length; i++){
        summ += studentMarks[i];
    }
    // 循环结束后计算最终平均分
    const avg = summ / studentMarks.length;  

    if(avg <= 59){
        return 'F';
    } else if(avg >= 60 && avg <= 69){
        return 'D';
    } else if(avg >= 70 && avg <= 79){
        return 'C';
    } else if(avg >= 80 && avg <= 89){
        return 'B';
    } else if(avg >= 90 && avg <= 100){
        return 'A';
    }
}

// 打印函数返回的成绩等级
console.log(calculateGrade(marks)); // 输出 'A'

内容的提问来源于stack exchange,提问作者Dulanjali Senarathna

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 10:25:22