2014-12-07 57 views
2

这是我的代码。这很简单,我只是要求用户猜测,并告诉他们他们是正确的,高或低的数字。要不断问,我做了一段时间循环。为什么/如何设置整数为-1使我的while循环工作?

虽然,我不确定它为什么或如何工作的方式。我将int初始化为-1作为猜测,并且它似乎工作。为什么不根本初始化这个工作,为什么一开始就是一个负数。这样做似乎有点不合适。我猜这是不常见的做法?

再次感谢! :)

import java.util.Scanner; 
public class numGuess 
{ 
public static void main(String[] args) 
{ 
    //generate random number between 1 and 100 
    int number = (int)(Math.random() * 101); 

    Scanner input = new Scanner(System.in); 
    System.out.println("Guess a number between 1 and 100"); 

    int guess = -1; 
    while (guess != number) 
    { 
     System.out.print("\nEnter your guess: "); 

     guess = input.nextInt(); 


     if (guess == number) 
      System.out.println("you are correct, the number is " + number); 
     else if (guess > number) 
      System.out.println("your guess is too high"); 
     else 
      System.out.println("your guess is too low"); 
    } 
} 

}

+0

因为您将变量猜测与while循环中的数字进行比较,所以编译器强制您为该变量设置默认值。 – MinusInfinity 2014-12-07 17:36:56

+0

由于这个问题已经得到解答,我想指出的是,类名应该以大写字母开头,而不是像字段和方法这样的camelCase。因此'numGuess'应该是'NumGuess'。 – Juxhin 2014-12-07 17:37:43

+0

你能告诉我你想如何比较'number'的值和* nothing *吗?编译器也是如此,因此他需要'guess'中的值。 – Tom 2014-12-07 17:38:24

回答

2

Java是一种强类型语言,因此在使用之前需要定义一个变量。

您必须定义guess才能使用它。只要guess最初被定义为不是数字的任何东西,循环就会工作。

您可以像这样定义guess以确保它不同。你永远不会想这样做。我只想表明几乎所有的初始值都可以用来初始化guess

int guess = number - 1; 

您也可以使用do..while循环来初始分配它。这是做这件事的首选方式,因为你没有做出任何假设。

int guess; 
do { 
    System.out.print("\nEnter your guess: "); 

    guess = input.nextInt(); 


    if (guess == number) 
     System.out.println("you are correct, the number is " + number); 
    else if (guess > number) 
     System.out.println("your guess is too high"); 
    else 
     System.out.println("your guess is too low"); 
}while(guess != number); 

此循环运行一次,并从所述用户输入具有自己之前分配给它的分配guess直接代替。

+1

int guess =数字-1是一个kludge。这在语义上不正确。它只是恰好工作。如果您打算使用标志值,请不要在没有充分理由的情况下将其随机化。您的维护开发人员会感谢您。 – CandiedOrange 2014-12-07 17:47:34

+0

那么在这里,你首先通过循环来运行用户的猜测?所以 int guess = -1; while(guess!= number) 所以在条件中的猜测不是来自用户的猜测? – jpX 2014-12-07 17:50:04

+0

@CandiedOrange,我同意。这只是一个例子,可以使用几乎任何价值,只要它与初始数值不同即可。不是我永远不会做的事情。 – 2014-12-07 17:50:53

1

没有硬性规定有-1作为你的情况的猜测值。你甚至可以把它初始化为大于101或任意数量的其他价值比在0 - 或者101

,你可以用做while循环如下图所示,如果你不想将其初始化:

int guess; 
do { 
    System.out.print("\nEnter your guess: "); 

    guess = input.nextInt(); 


    if (guess == number) 
     System.out.println("you are correct, the number is " + number); 
    else if (guess > number) 
     System.out.println("your guess is too high"); 
    else 
     System.out.println("your guess is too low"); 
} while (guess != number); 
0

- 1是哨点的值。也就是说,对于程序的目的来说这是一个无效的值,特别是,它不是由(int) (Math.random() * 101)(顺便说一句,它产生0到100之间的数字,而不是1和100)返回的任何值。避免guess的“双重责任”


的方法之一是改变环无条件循环,然后用break跳出循环,如果猜测是正确的。像这样:

while (true) { 
    System.out.print("\nEnter your guess: "); 

    int guess = input.nextInt(); 

    if (guess == number) { 
     System.out.println("you are correct, the number is " + number); 
     break; 
    } else if (guess > number) { 
     System.out.println("your guess is too high"); 
    } else { 
     System.out.println("your guess is too low"); 
    } 
} 

(请注意,我已经添加了括号您if段,使得可以在分支机构多个语句。)这可能是做最彻底的方法。

+0

好的。所以后续将是,为什么我必须事先说明?我是否告诉循环:“嘿,他们会猜测0-100之间的东西,但我首先将值设置为-1,因为它不是我设置的参数的一部分”?有点失落。 – jpX 2014-12-07 17:39:29

+0

@ user3457747你不需要。你可以使用'do' /'while'循环,正如Kassym的回答中所解释的那样。 – 2014-12-07 17:40:02

+0

我想我只是混淆了用于条件的猜测和来自if语句内部用户的'猜测' – jpX 2014-12-07 17:56:10

0

您正在使用-1作为标志(sentinel)值。这是一个值,用户不允许猜测,因此它表明没有猜测发生。如果你没有初始化它,那么它将从零开始,标志值将为零,不应允许用户猜测零,并且该随机数不应该为零。

换句话说,您应该可以使用零作为标志值。但是,你是Math.random()似乎不排除零。看看Math.random() explained

//generate random number between 1 and 100 
int number = (int)(Math.random() * 101); 

应该是

int number = (int)(Math.random() * 100) + 1; 

Math.random()具有从[0,范围1)。这意味着包含0,但1不包含。您现有的代码会选择0到100之间的数字。您告诉用户您将选择1到100.除非您打算欺骗需要修复。

这也是一个噩梦般的错误来测试,因为它只发生1%的时间。仔细阅读Math.random()的文档。

如果你编写一个测试,运行的直到value已经每个数字都应该能够,它只会停止,当你没有一个错误。正如那样的噩梦,事实证明,如果你编程正确,并让它循环459次,那么它只有1%的机会,它只是偶然地选择了0。所以你不必等待测试。如果你在意,我可以告诉你背后的数学。

此外,您不妨考虑一个do-while循环,因此您首先不需要标志。但是,不管你是否需要修理你的Math.random()系列。

相关问题