【问题标题】:How to use one loop if input is invalid for an if statement?如果输入对 if 语句无效,如何使用一个循环?
【发布时间】:2021-05-30 14:47:46
【问题描述】:

我对 Java 编码还是很陌生。我现在正在上课学习它,但我遇到了循环问题。

我在这门课上的作业是只为一个计算 3 分加权总和的程序编写一个 while 循环。我正在使用 if else 语句和一个变量来声明它应该在什么用户输入上,但是,如果输入不在某个范围内,我需要它再次向用户询问相同的问题。到目前为止,这只适用于第一个问题,而不适用于其他两个问题。如果输入无效,我将如何再次提出相同的问题?

到目前为止,这是我的代码:

import java.util.Scanner;

public class Lab3 {
    
  public static void main(String[] args) {
    Scanner scan = new Scanner(System. in );

    double homework;
    double midterm;
    double finalGrade;
    int i = 0;

    while (i == 0) {
      if (i == 0) {
        System.out.print("Enter your HOMEWORK grade: ");
        homework = scan.nextInt();

        if (homework < 0 || homework > 100) {
          System.out.println("[ERR] Invalid input. A homework grade should be in [0, 100].");
        } else {
          i++;
        }

        if (i == 1) {
          System.out.print("Enter your MIDTERM EXAM grade: ");
          midterm = scan.nextInt();

          if (midterm < 0 || midterm > 100) {
            System.out.println("[ERR] Invalid input. A midterm grade should be in [0, 100].");
          } else {
            i++;
          }

          if (i == 2) {
            System.out.print("Enter your FINAL EXAM grade: ");
            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 * .25) + (homework * .25);

              System.out.println("[INFO] Student's Weighted Total is " + totalWeighted);
              if (totalWeighted >= 50) {
                System.out.println("[INFO] Student PASSED the class.");
              } else {
                System.out.println("[INFO] Student FAILED the class.");
              }
            }
          }
        }
      }
    }
  }
  
}

【问题讨论】:

  • 注意:在while (i == 0)的任何循环的顶部,假设条件为真,所以第一个if语句是多余的
  • 我对您的权重(如果可以指定)感兴趣,因为最终成绩已经被加权,因为它的总分可能是其他两个测试的两倍。这意味着您的totalWeighted 可以简化为:(finalGrade + midterm + homework) / 4)

标签: java loops if-statement calculation


【解决方案1】:

你的方法有很多缺陷,比如嵌套 if-else、while 条件无效、缩进和整体代码风格很差。 即使您更改了 while (i ,并且您输入了一个无效的值,比如 MIDTERM 成绩,您的循环也会陷入无限循环。

查看改进的代码并尝试理解它:

public class Main
{
    public static void main(String [] args)
    {
        final Scanner scan = new Scanner(System.in);
        final String[] questions = {
                "Enter your HOMEWORK grade: ",
                "Enter your MIDTERM EXAM grade: ",
                "Enter your FINAL EXAM grade: "
        };
        double[] scores = new double[3];
        int i = 0;

        while(i < 3) {
            System.out.print(questions[i]);
            scores[i] = scan.nextInt();

            if(i == 0) {
                if(scores[i] >= 0 && scores[i] <= 100)
                    i++;
                else
                    System.out.println("[ERR] Invalid input. A homework grade should be in [0, 100].");
            }

            else if(i == 1) {
                if(scores[i] >= 0 && scores[i] <= 100)
                    i++;
                else
                    System.out.println("[ERR] Invalid input. A midterm  grade should be in [0, 100].");
            }

            else if(i == 2) {
                if(scores[i] >= 0 && scores[i] <= 200)
                    i++;
                else
                    System.out.println("[ERR] Invalid input. A FINAL EXAM grade should be in [0, 200].");
            }

        }
        double totalWeighted = (scores[0] * 0.25) + (scores[1] * 0.25) + (scores[2] / 200 * 50);
        System.out.println("[INFO] Student's Weighted Total is " + totalWeighted);
        if (totalWeighted >= 50) {
            System.out.println ("[INFO] Student PASSED the class.");
        }
        else {
            System.out.println ("[INFO] Student FAILED the class.");
        }
    }
}

如果有帮助,请告诉我:)

【讨论】:

  • 你可以用for (int i = 0; i &lt; 3;)替换int i = 0; while(i &lt; 3)
  • 我的回答有什么问题?如果你给我一个downvote,请解释为什么会这样。如果您不给出解释,请不要对我投反对票,我的解决方案非常有效。
  • 好吧,我没有,但原因之一是它并不能真正帮助 OP 了解他们自己的方法出了什么问题。通常不鼓励提供代码来简单地复制和粘贴而不做任何解释
  • 我现在改进了我的答案。我仍在学习如何改进我的答案,谢谢:)
  • “非常差的包围”? OP的包围很好。他的缩进很糟糕,但这可能是对 SO 的编辑工具的不熟悉。
【解决方案2】:

首先,让我们谈谈您的代码格式。在编码时理解正确的缩进非常重要。这是一个可以帮助您的链接:https://exlskills.com/learn-en/courses/java-basics-basics_java/java-syntax-and-style-GTarpkcPunbK/basic-syntax-iCjqNivBnjcA/indentation-ukUQyypJUiKB 适当的缩进不仅有助于提高可读性,而且有助于理解程序的流程。请参考我的代码 sn-p 查看格式差异。你会通过练习找到你的风格,但是适当的缩进真的很大,所以要注意这一点(:

现在到代码本身。在继续之前检查用户输入是正确的想法。只需进行一些更改,我相信这是一种基于您的原始代码的简单、干净的方法。看看这个:

public static void main(String [] args)
{
     Scanner scan = new Scanner(System.in);

     double homework; 
     double midterm;
     double finalGrade;
     int i = 0;

     while(i < 3)
     {   
         if (i==0) 
         {              
             System.out.print("Enter your HOMEWORK grade: ");
             homework = scan.nextInt();

             if (homework < 0 || homework > 100)
             {
                 System.out.println("[ERR] Invalid input. A homework 
                 grade enter code hereshould be in [0, 100].");

                 /*if there is an invalid input error, then we can 
                 reprompt again without running the other questions 
                 using continue keyword */

                 continue; 

             } else { i++; }
          }     
           
          if (i==1) 
          {
              System.out.print("Enter your MIDTERM EXAM grade: ");
              midterm = scan.nextInt();
    
              if (midterm < 0 || midterm > 100) 
              {
                 System.out.println("[ERR] Invalid input. A midterm grade 
                 should be in [0, 100].");
      
                 continue;
            
              } else { i++; }
          }    

          if (i==2) 
          {     
              System.out.print("Enter your FINAL EXAM grade: ");
              finalGrade = scan.nextInt();
        
              if (finalGrade < 0 || finalGrade > 200) 
              {
                  System.out.println("[ERR] Invalid input. A FINAL EXAM 
                  grade should be in [0, 200].");

                  continue;
                
              } else { i++; }
          } 
      //end while loop      
     }    
                  
            
    double totalWeighted = (finalGrade / 200 * 50) + (midterm * .25) + 
                       (homework * .25);

    System.out.println("[INFO] Student's Weighted Total is " 
                       + totalWeighted);

    if (totalWeighted >= 50) 
    {
       System.out.println ("[INFO] Student PASSED the class.");
    }
    else 
    { 
       System.out.println ("[INFO] Student FAILED the class.");
    }

 //End main   
}

现在我在这里添加了很多额外的空格,但我希望这可以帮助您了解代码间距的统一性,从而提高可读性。如果你不熟悉这里的 continue 关键字,那很简单。这里有一个链接可以帮助你:https://www.w3schools.com/java/ref_keyword_continue.asp

【讨论】:

  • 老兄,这实际上是我一小时前的回答:D
【解决方案3】:

你应该在这种情况下创建函数,然后你甚至不需要一个循环。 使用递归。

import java.util.Scanner;
public class Lab3 
{
    public static void main(String [] args)
    {
        Lab3 obj = new Lab3();
        Scanner scan = new Scanner(System.in);

        double homework; 
        double midterm;
        double finalGrade;
        
        homework = obj.hwGrade();
        midterm = obj.midGrade();
        finalGrade = obj.final_Grade();

        double totalWeighted = (finalGrade / 200 * 50) + (midterm * .25) + (homework * .25);
        System.out.println("[INFO] Student's Weighted Total is " + totalWeighted);
        if (totalWeighted >= 50) {
            System.out.println("[INFO] Student PASSED the class.");
        } else {
            System.out.println("[INFO] Student FAILED the class.");
        }
        
    }

    public double hwGrade(){
    
        Scanner scan = new Scanner(System.in);
        Lab3 obj = new Lab3();
        System.out.println("Enter your HOMEWORK grade: ");
        double homework = scan.nextDouble();
        if((homework) < 0 || (homework > 100)){
            System.out.println("[ERR] Invalid input. A homework grade should be in [0, 100].");
            homework = obj.hwGrade();
        }
        return homework;
    }
    public double midGrade(){
    
        Scanner scan = new Scanner(System.in);
        Lab3 obj = new Lab3();
        System.out.println("Enter your MIDTERM EXAM grade: ");
        double midterm = scan.nextDouble();
        if((midterm) < 0 || (midterm > 100)){
            System.out.println("[ERR] Invalid input. A midterm grade should be in [0, 100].");
                midterm = obj.midGrade();
        }
        return midterm;
    }
    public double final_Grade(){
    
        Scanner scan = new Scanner(System.in);
        Lab3 obj = new Lab3();
        System.out.println("Enter your FINAL EXAM grade: ");
        double finalGrade = scan.nextDouble();
        if((finalGrade) < 0 || (finalGrade> 200)){
            System.out.println("[ERR] Invalid input. A FINAL EXAM grade should be in [0, 200].");
            finalGrade = obj.final_Grade();
        }
        return finalGrade;
    }

}

如果你真的想创建一个循环,那么你可以使用 do...while() 循环。

喜欢,

do{
    homework = obj.hwGrade();
    midterm = obj.midGrade();
    finalGrade = obj.final_Grade();
}while(false);

这个sn-p是main函数。

如果喜欢请点赞...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-13
    • 2020-11-28
    • 1970-01-01
    相关资源
    最近更新 更多