2014-10-17 211 views
3

请注意,尽管我对Java很满意,但我并不是特别有天赋,也不知道所有术语,因此请用非常小的编码术语和普通英语解释您的答案,或者在使用它之后解释行话的含义。此外,这是我第一次与Stackoverflow,所以让我知道这是一个体面的问题,并给我一些指针。Do-while循环问题

我在高中时期参加AP计算机科学课。我们使用Java。我们最近被教导了do-while循环,并且我刚刚完成了使用do-while循环的“实验室”,但是存在一个问题。

首先,让我解释一下实验室。该程序生成一个1-10之间的随机整数,用户必须猜测(猜测使用扫描仪存储为int),有几个整数值跟踪猜测次数,多少次猜测大于计算机整数,以及有多少太低了。当你看我的代码时,你会注意到我有一个System.out.println(compGen);//compGen is the computer generated int。目的是测试代码。

问题在于比较userGen(用户猜测)和compGen的if语句中。

if(userGen==compGen) 
{ 
//do a lot of stuff 
} 

在这个if语句,它不打印,我已经写了,如果用户猜测不止一次正确的SOP。但是,我没有把它写入程序,它似乎是自己做的。我使用了早期提到的打印compGen int的SOP,并且将其作为我的第一次猜测输入,并且完美运行。 if语句块中的所有内容都可以完美执行并正确地打印所有内容。但是,当我做了第二次猜测,第三次猜测或任何不是第一次的猜测时,没有打印任何内容。看到下面的代码并运行它。我不相信这应该有所作为,但我使用的IDE是Eclipse,因此是包声明。请帮忙。

package Chapter_3.Lab03_Chapter3; 
    import java.util.*; 

public class Guess 
{ 
    public static void main(String[] args) 
    { 
    Scanner userInput = new Scanner(System.in);//Scanner 
    int compGen = (int)(Math.random()* 10 + 1);//compGen is computer number 
    System.out.println(compGen); //USED TO VERIFY FAILURE. VALUE WAS ENTERED TO TEST CODE 
    int guessTrack = 0;//tracks number of guesses 
    int tooHighTrack = 0;//CREATING INTS TO TRACK STUFF 
    int tooLowTrack = 0; 
    System.out.println("Welcome to the integer guessing game that everyoone loves!");//PROMPT 
    System.out.println("Please enter your guess for the integer. Remeber, it is between one and ten.");//GREETING 
    int userGen = userInput.nextInt();//USER GUESS 

    do 
    { 
     guessTrack++;//Increase guess value 
     if(userGen > compGen)//checks user value in relation to computer generated int 
     { 
      System.out.println("Try again! Your guess was too high!");//inform user of bad guess 
      userGen = userInput.nextInt();//new guess 
      tooHighTrack++;//if guess is too high, this int tracker increases 
     } 
     else if(userGen < compGen)//checks user value in relation to computer generated int 
     { 
      System.out.println("Try again! Your guess was too low!");//inform user of guess 
      userGen = userInput.nextInt();//new guess 
      tooLowTrack++;//increases if user guess is too low 
     } 
     else if(userGen==compGen)//if both values are equivalent, execute THIS IS THE PROBLEM STATEMENT!! 
     { 
      System.out.println("Great job! You guessed the right number!");//congratulate 
      if(guessTrack>1) 
      { 
       System.out.println("It took you: "+guessTrack+" guess to get the right answer.");//print guess tracked int 
      } 
      else 
      { 
       System.out.println("It took you: "+guessTrack+" guesses to get the right answer.");//print guess tracked int 
      }    
      System.out.println(tooHighTrack +" guesses were too high and "+ tooLowTrack+ " were too low.");//print how many guess were too big or too low 
      System.out.println("HELLO"); //Used to verify failure of code 
      userInput.close();//close scanner object 
     } 
    } 
    while (userGen != compGen);//condition to be ultimately checked   
} 
} 

我一直无法弄清楚什么是错的。有一次,我删除了整个if语句并重新输入(我知道它不会做任何事情,但我必须尝试)。这个问题对我来说毫无意义。没有任何错误或任何东西弹出,没有任何东西弹出在控制台上,这让我感到害怕。提前致谢。

回答

5

首先,你把很多文字放在这里。也许下次尝试最小化问题作为一个建议;)否则一切都很好

到你的问题。让我最小化你的代码,然后向你解释发生了什么。

代码1.

int val = scanner.nextInt(); 
do { 
    if (val < 5) { 
     // too low 
     val = scanner.nextInt(); 
    } else if (val > 5) { 
     // too high 
     val = scanner.nextInt(); 
    } else { 
     // correct 
     // THIS CODE DOESN'T RUN?! 
    } 
} while (val != 5); 

2.什么是你的代码吗?

您在循环之前阅读您的第一个数字。没关系。然后,你输入一个if-elseif-else语句。请注意,一旦进入其中一个块,其他块将不会执行。 现在的问题是,你阅读你的下一个用户输入内部的if-elseif!该程序读取下一个值并留下整个if-elseif-else。您的代码不会执行,因为循环会在下一次迭代之前结束,因此正确的用户输入没有经过if-elseif-else。

3.解决方案

删除所有nextInt()读取,只是有一个作为第一件事循环:

int val; 
do { 
    val = scanner.nextInt(); 
    if (val < 5) { 
     // too low 
    } else if (val > 5) { 
     // too high 
    } else { 
     // correct 
     // THIS CODE RUNS NOW! 
    } 
} while (val != 5); 

这样的事情,结构需要至少做些什么一次在检查环路状况之前,通常使用do while环路而不是while环路

+0

感谢您提出减少问题的建议。这是我的第一篇文章,并希望说清楚,我没有这个网站的经验。现在到你的答案,我赞赏按积分分组,这绝对有帮助。下面的用户指出,如果提交了正确的答案,则由于while条件将是错误的,因此do-while将终止。你的答案不会有同样的问题吗?即使'nextInt()'在块的顶部? – Ungeheuer 2014-10-17 00:56:32

+1

不,因为用户输入在if-elseif-else进入之前被读取。因此,输入始终在相同的迭代过程中完成,并在之后结束。 – Felk 2014-10-17 01:01:34

+0

哦!现在我明白了!通过在顶部输入用户输入,答案将过滤到if/else-if块,保留该值并允许'userGen == compGen'代码正确执行。而且我仍然可以得到“猜得太高”的代码,因为我在循环中得到了int。你先生非常聪明。 :) – Ungeheuer 2014-10-17 01:02:26

3

您正在循环中设置用户输入,然后再检查它。尝试这样的循环后的else if(userGen==compGen)块的体移动到:

public static void main(String[] args) 
    { 
    Scanner userInput = new Scanner(System.in);//Scanner 
    int compGen = (int)(Math.random()* 10 + 1);//compGen is computer number 
    System.out.println(compGen); //USED TO VERIFY FAILURE. VALUE WAS ENTERED TO TEST CODE 
    int guessTrack = 0;//tracks number of guesses 
    int tooHighTrack = 0;//CREATING INTS TO TRACK STUFF 
    int tooLowTrack = 0; 
    System.out.println("Welcome to the integer guessing game that everyoone loves!");//PROMPT 
    System.out.println("Please enter your guess for the integer. Remeber, it is between one and ten.");//GREETING 
    int userGen = userInput.nextInt();//USER GUESS 

    do 
    { 
     guessTrack++;//Increase guess value 
     if(userGen > compGen)//checks user value in relation to computer generated int 
     { 
      System.out.println("Try again! Your guess was too high!");//inform user of bad guess 
      userGen = userInput.nextInt();//new guess 
      tooHighTrack++;//if guess is too high, this int tracker increases 
     } 
     else if(userGen < compGen)//checks user value in relation to computer generated int 
     { 
      System.out.println("Try again! Your guess was too low!");//inform user of guess 
      userGen = userInput.nextInt();//new guess 
      tooLowTrack++;//increases if user guess is too low 
     } 
    } 
    while (userGen != compGen);//condition to be ultimately checked 

    //The numbers have matched since it exited the loop. 
    System.out.println("Great job! You guessed the right number!");//congratulate 
    if(guessTrack>1) 
    { 
     System.out.println("It took you: "+guessTrack+" guess to get the right answer.");//print guess tracked int 
    } 
    else 
    { 
     System.out.println("It took you: "+guessTrack+" guesses to get the right answer.");//print guess tracked int 
    }    
    System.out.println(tooHighTrack +" guesses were too high and "+ tooLowTrack+ " were too low.");//print how many guess were too big or too low 
    System.out.println("HELLO"); //Used to verify failure of code 
    userInput.close();//close scanner object 
} 
+1

我明白你的意思了。我甚至没有想到,在userGen和compGen相等时,循环停止。有时我觉得很蠢。谢谢!! – Ungeheuer 2014-10-17 00:52:49

+1

@JohnnyCoder别担心,每个人都会遇到这种情况。当你回顾它时,错误是显而易见的。 – Pokechu22 2014-10-17 01:05:04

1

while条件只要程序到达循环内的代码的结束进行检查。所以假设他们输入了错误的数字;该程序说它太低或太高,然后要求另一个号码:

userGen = userInput.nextInt();//new guess 

现在假设这个新号码是正确的。该程序完成您的if语句,然后进入循环结束。那么,在那一点上,userGen等于compGen。因此,while条件失败,程序立即退出循环,而没有进入打印结果的代码。

解决此问题的一种方法是将userGen == compGen的逻辑移动到循环的外部 - 即在循环结束后打印结果。那样,只要循环退出,它就会被执行。请注意,当您退出循环时,我们知道userGen == compGen,因为如果它不是,循环会返回。

+0

你和@ Pokechu22说同样的事情,所以非常感谢你。我不知道我的错在哪里。我其实是一个相当不错的编码器,但有时候我可能只是愚蠢的。 – Ungeheuer 2014-10-17 00:54:37

+0

@JohnnyCoder是的,我可以告诉你,你是一个体面的编码器。我也是如此,我已经这样做了37年了,我仍然犯了愚蠢的错误。你没什么问题,我们都有偶尔的盲点。如果你决定从事编程工作,我认为你会很擅长。 – ajb 2014-10-17 01:09:54

1

比方说,计算机生成的数量为3个,你猜5 5> 3,所以如果(userGen> compGen)语句执行:

 System.out.println("Try again! Your guess was too high!");//inform user of bad guess 
     userGen = userInput.nextInt();//new guess 
     tooHighTrack++;//if guess is too high, this int tracker increases 
您打印的消息

,得到一个新的猜测,然后增加你的计数器......但是当你得到新的猜测时,说这是正确的答案3,userGen现在等于CompGen(均为3),现在等于 ,同时评估条件:

while(userGen!= compGen)

这现在是错误的,因为userGen == compGen(都是3)。您的代码永远不会有机会打印正确的消息 ,因为循环在它发生之前退出。希望有帮助

+0

谢谢瑞克,你和其他2人指出了同样的事情。你们都很棒。非常感谢您的帮助。尤其是你所有的快速反应。 – Ungeheuer 2014-10-17 00:55:42

0

您的userGen在每次用户输入后都没有被检查。 问题是你有一个else-if块的内部检查,它会在再次循环前检查while语句的结束。

如果更改

else if(userGen==compGen) 

if(userGen==compGen) 

然后因为它不是分开的if-else块,它会在每次输入后进行检查(之前检查while条件)

或者,您可以将您的用户输入移动到do-while块的起始位置,如下所示:

package Chapter_3.Lab03_Chapter3; 
import java.util.*; 

public class Guess 
{ 
    public static void main(String[] args) 
    { 
    Scanner userInput = new Scanner(System.in);//Scanner 
    int compGen = (int)(Math.random()* 10 + 1);//compGen is computer number 
    System.out.println(compGen); //USED TO VERIFY FAILURE. VALUE WAS ENTERED TO TEST CODE 
    int guessTrack = 0;//tracks number of guesses 
    int tooHighTrack = 0;//CREATING INTS TO TRACK STUFF 
    int tooLowTrack = 0; 
    System.out.println("Welcome to the integer guessing game that everyoone loves!");//PROMPT 
    System.out.println("Please enter your guess for the integer. Remeber, it is between one and ten.");//GREETING 
    int userGen = -1;//USER GUESS 

    do 
    { 
     userGen = userInput.nextInt(); 
     guessTrack++;//Increase guess value 
     if(userGen > compGen)//checks user value in relation to computer generated int 
     { 
      System.out.println("Try again! Your guess was too high!");//inform user of bad guess 
      userGen = userInput.nextInt();//new guess 
      tooHighTrack++;//if guess is too high, this int tracker increases 
     } 
     else if(userGen < compGen)//checks user value in relation to computer generated int 
     { 
      System.out.println("Try again! Your guess was too low!");//inform user of guess 
      userGen = userInput.nextInt();//new guess 
      tooLowTrack++;//increases if user guess is too low 
     } 
     else if(userGen==compGen)//if both values are equivalent, execute THIS IS THE PROBLEM STATEMENT!! 
     { 
      System.out.println("Great job! You guessed the right number!");//congratulate 
      if(guessTrack>1) 
      { 
       System.out.println("It took you: "+guessTrack+" guess to get the right answer.");//print guess tracked int 
      } 
      else 
      { 
       System.out.println("It took you: "+guessTrack+" guesses to get the right answer.");//print guess tracked int 
      }    
      System.out.println(tooHighTrack +" guesses were too high and "+ tooLowTrack+ " were too low.");//print how many guess were too big or too low 
      System.out.println("HELLO"); //Used to verify failure of code 
      userInput.close();//close scanner object 
     } 
    } 
    while (userGen != compGen);//condition to be ultimately checked   
} 
} 

这将导致您的if-else块被检查,每次用户输入数据之前,检查do-while的条件。

+0

谢谢。另一位用户指出,将'nextInt()'移动到块的顶部。我喜欢将if-else改为if的想法。它创建了另一个IDE,IDE必须检查哪个也会使代码运行。好主意的人。谢谢! – Ungeheuer 2014-10-17 01:13:21