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

输入0-100成绩时do-while循环仍执行?代码问题排查

问题排查与修正

你遇到的问题是do-while循环无论输入是否合法都会执行,核心问题出在变量作用域、循环逻辑和计算时机上,具体问题如下:

主要问题点

  • 变量作用域冲突:循环内部用let重新声明了num1-num5,导致循环条件判断的是外部第一次输入的旧值,而非循环内输入的新值。循环内用var重复声明grade1等变量,会造成不必要的变量污染。
  • do-while逻辑倒置:do-while是先执行循环体再判断条件,你的代码不管初始输入是否合法,都会先执行一次错误提示并重新输入,完全不符合“仅当输入不合法时才提示重输”的逻辑。
  • 平均分未更新:averageGrade仅用第一次输入的成绩计算,循环内重新输入的成绩不会更新这个值,导致最后评级用的还是旧数据。
  • 未处理非法输入(NaN):如果用户输入非数字内容,parseInt会返回NaN,此时数值比较会失效,无法正确判断合法性。
  • 拼写错误:代码里的Eaxam(应为Exam)、recived(应为received)属于笔误,虽不影响功能但需修正。

修正后的代码

// 初始化变量
let num1, num2, num3, num4, num5;
let grade1, grade2, grade3, grade4, grade5;
let averageGrade;

// 封装合法性检查函数
function isGradeValid(grade) {
    return !isNaN(grade) && grade >= 0 && grade <= 100;
}

// 输入并验证成绩
do {
    num1 = prompt("Enter Exam 1");
    num2 = prompt("Enter Exam 2");
    num3 = prompt("Enter Exam 3");
    num4 = prompt("Enter Exam 4");
    num5 = prompt("Enter Exam 5");

    grade1 = parseInt(num1);
    grade2 = parseInt(num2);
    grade3 = parseInt(num3);
    grade4 = parseInt(num4);
    grade5 = parseInt(num5);

    // 检查所有成绩是否合法
    const allValid = isGradeValid(grade1) && isGradeValid(grade2) && isGradeValid(grade3) && isGradeValid(grade4) && isGradeValid(grade5);
    
    if (!allValid) {
        console.log("Please enter a valid test grade!");
    }
} while (!isGradeValid(grade1) || !isGradeValid(grade2) || !isGradeValid(grade3) || !isGradeValid(grade4) || !isGradeValid(grade5));

// 计算平均分
averageGrade = (grade1 + grade2 + grade3 + grade4 + grade5) / 5;
console.log(averageGrade);

// 评级判断
switch(true) {
    case averageGrade >= 90:
        console.log("You received an A");
        break;
    case averageGrade >= 80:
        console.log("You received a B");
        break;
    case averageGrade >= 70:
        console.log("You received a C");
        break;
    case averageGrade >= 60:
        console.log("You received a D");
        break;
    default:
        console.log("You failed");
        break;
}

修正说明

  1. 将变量声明移到外部,避免作用域冲突,循环内直接更新变量值。
  2. 调整do-while逻辑:仅当输入不合法时才提示错误,循环条件判断的是转换后的数字成绩,而非原始字符串。
  3. 新增合法性检查函数,统一处理数字验证和NaN判断。
  4. 平均分在输入验证通过后再计算,确保使用最新的合法成绩。
  5. 简化switch判断(case从上到下匹配,前面条件满足后不会执行后续分支,无需冗余的<=89这类条件),同时修正拼写错误,去掉不礼貌表述。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 14:55:16