在用户输入y继续之后,为什么这个循环不会返回到开头?

时间:2016-02-15 19:07:56

标签: java

不太确定这有什么问题。我也尝试过do-while和switch,但似乎没有任何工作。有什么我想念的吗?当代码执行并且用户输入Y继续时,它就会结束,但我需要它返回到开头,以便用户可以输入另一个等级。

public static void main(String[] args) {
    Scanner input = new Scanner(System.in);
    System.out.println("Enter your grade: ");
    double grade = input.nextDouble();
    while (grade >=0 &&grade <=100)
        if(grade<=100&&grade>=90)
        {
            System.out.println("Your grade is an A"); break;
        } else if (grade <=89&&grade>=80){
            System.out.println("Your grade is a B"); break;
        } else if (grade <=79&&grade>=70) {
            System.out.println("Your grade is a C"); break;
        } else if (grade <=69&&grade>=60) {
            System.out.println("Your grade is a D"); break;
        } else if (grade <=59) {
            System.out.println("Your grade is an F");break;
        }    
        System.out.println("Do you want to continue (Y/N)?");    
        char check = input.next().charAt(0);    
    }

}

4 个答案:

答案 0 :(得分:3)

您可能希望在while之前声明char check = 'Y',然后将while之后的语句括在大括号中,如下所示:

while (check =='Y' && grade >=0 && grade <=100) { 
... 
}

此外,您需要删除break;语句,因为它将从循环中退出。

答案 1 :(得分:1)

您当前实施的问题在于,首先,您不要让用户插入多个成绩,方法是破坏每个if语句。

回到最初的单词,关于使用成绩插入重新开始的用户输入不在循环内处理。应该使用do-while循环。

public static void main(String[] args) {

 boolean flag = false;
 Scanner input = new Scanner(System.in);


 double grade;
 do {
  System.out.println("Enter your grade: ");
  grade = input.nextDouble();
  if (grade <= 100 && grade >= 90) {
   System.out.println("Your grade is an A");
  } else if (grade <= 89 && grade >= 80) {
   System.out.println("Your grade is a B");
  } else if (grade <= 79 && grade >= 70) {
   System.out.println("Your grade is a C");
  } else if (grade <= 69 && grade >= 60) {
   System.out.println("Your grade is a D");
  } else if (grade <= 59) {
   System.out.println("Your grade is an F");
  }

  System.out.println("Do you want to continue (Y/N)?");
  char check = input.next().charAt(0);
  if (check == 'Y') {flag = true;}
  else {flag = false;}
 } while (grade >= 0 && grade <= 100 && flag == true);
}

一般来说,上述(打破if-else语句)被认为是一种不好的做法,我预见到您混淆了switch语句与if-else的用法。

switch语句中,使用break,因为我们只希望满足其中一个检查条件。如果break缺席,一旦与案件匹配,执行将继续执行在匹配案例下面写下的其余案例。

另一方面,if-else代码只会​​输入匹配且不会执行任何其他if-else语句的语句,直到最后if-else结尾(或者else)语句,所以,这里没有必要使用break,因为编译器本身知道如果它在if语句上匹配,它将在结束后移动在执行匹配的if(或if-elseelse)语句后,该块的内容。

this是关于我前面提到的话语的进一步参考。

答案 2 :(得分:0)

也许试试这个:

public static void main(String[] args) {
    Scanner input = new Scanner(System.in);
    while(true) {
        System.out.println("Enter your points: ");
        double grade = input.nextDouble();

        if(grade >= 0 && grade <= 100) {
            if(grade >= 90)
            {
                System.out.println("Your grade is an A");
            }
            else if(grade >= 80)
            {
                System.out.println("Your grade is a B");
            }
            else if(grade >= 70)
            {
                System.out.println("Your grade is a C");
            }
            else if(grade >= 60)
            {
                System.out.println("Your grade is a D");
            }
            else
            {
                System.out.println("Your grade is an F");
            }
        } else {
            System.out.println("Only points between 0 and 100 are allowed.");
        }

        char check;
        do {
            System.out.println("Do you want to calculate another grade (Y/N)?");
            check = input.next().charAt(0);
        } while(Character.toUpperCase(check) != 'Y' && Character.toUpperCase(check) != 'N');
        if(Character.toUpperCase(check) == 'N')
            break;
    }
}

您可以在此处轻松使用无限循环,只要您像上次检查一样添加适当的退出点。

如果if语句的顺序正确,则无需检查每类点的两个边界。最后一个else-if也不是必需的,也可能是危险的,因为在绑定错误的情况下,你不会获得某些输入的任何输出。

我还为Y / N问题添加了Character.toUpperCase(),因为我觉得这很方便。

答案 3 :(得分:0)

作为一般经验法则,请不要break;&#39;没有循环。你的循环控件和条件应该足够强大,不需要使用break

我知道你的解决方案已经解决了,但是给一个人一条鱼,教一个人钓鱼......你知道其余的。

让我们浏览您的代码。

  • 初始化扫描仪输入
  • 提示用户输入
  • 将用户输入存储为双倍(到目前为止做得很好!)
  • 用户输入85
  • 等级在可接受的参数范围内,让我们进入while循环! (不要忘记第一次大括号!)

    while(表达式){}

  • 第一个条件=假,所以跳到第二个条件(等级&lt; = 89&amp;&amp; grade&gt; = 80)PASS!

  • 节目打印 - &#34;您的成绩是B&#34; break;

  • 程序以代码0退出。

刚刚发生了什么?我发誓我告诉它循环! break发生了sucka! break会强制你正在运行的进程停止。在这种情况下循环。 continue;将跳过循环中的其余代码,并在下一次迭代时重新启动循环。事实是,这些都不适合您的代码。

你的解决方案的另一个问题是没有办法继续循环,因为没有任何反馈到顶部。此时你应该提示用户输入(你想继续y / n)

if (y) please enter another grade
  grade = input.nextDouble();

else
  grade = -1;

通过将等级设置为-1,您将使while (grade >=0 &&grade <=100) 评估为false,从而以更自然,更易读的方式退出循环。

我认为重要的是要避免在任何不必要的地方使用休息。你以后会为自己节省很多痛苦。