You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Java单While循环下实现多输入无效时重复提问的方法(作业答疑)

问题分析与修复方案

嘿,我来帮你搞定这个问题!你的核心问题出在while循环的条件嵌套逻辑的设计上,咱们一步步拆解:

原代码的问题点

  • 循环条件错误:你写的while (i == 0)意味着只要作业输入正确(i变成1),循环就直接终止了!后面的期中、期末输入只是在第一次循环里顺带着执行了一次,要是输入无效,循环已经结束,自然没法重复询问。
  • 嵌套逻辑混乱:你把三个输入的逻辑层层嵌套在一起,导致某个步骤输入无效时,后续的逻辑也跟着乱套,没法单独重复处理当前输入项。

修复后的代码

import java.util.Scanner;
public class Lab3 {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        double homework = 0;
        double midterm = 0;
        double finalGrade = 0;
        int i = 0;
        
        // 循环直到三个成绩都输入正确(i从0到2,完成后i=3退出循环)
        while (i < 3) {
            if (i == 0) {
                System.out.print("Enter your HOMEWORK grade: ");
                // 先判断输入是否为整数,避免异常
                if (scan.hasNextInt()) {
                    homework = scan.nextInt();
                    if (homework < 0 || homework > 100) {
                        System.out.println("[ERR] Invalid input. A homework grade should be in [0, 100].");
                    } else {
                        i++; // 输入有效,切换到下一个成绩输入
                    }
                } else {
                    System.out.println("[ERR] Please enter an integer value.");
                    scan.next(); // 清除无效输入,防止死循环
                }
            } else if (i == 1) {
                System.out.print("Enter your MIDTERM EXAM grade: ");
                if (scan.hasNextInt()) {
                    midterm = scan.nextInt();
                    if (midterm < 0 || midterm > 100) {
                        System.out.println("[ERR] Invalid input. A midterm grade should be in [0, 100].");
                    } else {
                        i++;
                    }
                } else {
                    System.out.println("[ERR] Please enter an integer value.");
                    scan.next();
                }
            } else if (i == 2) {
                System.out.print("Enter your FINAL EXAM grade: ");
                if (scan.hasNextInt()) {
                    finalGrade = scan.nextInt();
                    if (finalGrade < 0 || finalGrade > 200) {
                        System.out.println("[ERR] Invalid input. A FINAL EXAM grade should be in [0, 200].");
                    } else {
                        i++;
                        // 计算加权总分并输出结果
                        double totalWeighted = (finalGrade / 200 * 50) + (midterm * 0.25) + (homework * 0.25);
                        System.out.println("[INFO] Student's Weighted Total is " + totalWeighted);
                        System.out.println("[INFO] Student " + (totalWeighted >= 50 ? "PASSED" : "FAILED") + " the class.");
                    }
                } else {
                    System.out.println("[ERR] Please enter an integer value.");
                    scan.next();
                }
            }
        }
        scan.close(); // 关闭Scanner,释放资源
    }
}

关键改动说明

  • 循环条件调整:改成while (i < 3),这样只要三个成绩还没全部输入正确(i从0到2),循环就会持续运行,直到所有输入都有效。
  • 独立输入逻辑:用i标记当前要处理的输入项,每个i值对应单独的输入逻辑。只有当前输入有效时,才让i递增,进入下一个输入项;如果输入无效,i保持不变,下次循环会再次询问同一个问题。
  • 异常输入处理:增加了hasNextInt()判断,避免用户输入非整数导致程序崩溃,同时用scan.next()清除无效输入,防止死循环。
  • 变量初始化:给三个成绩变量设置初始值,避免编译器报错。
  • 资源管理:最后关闭Scanner,养成良好的编程习惯。

这样修改后,每个输入项在无效时都会重复询问,完全符合你的作业要求~

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

火山引擎 最新活动