# Newbie Nested Loop Problem

• 03-06-2012, 12:35 AM
xcaldk74
Newbie Nested Loop Problem
Hi Java Masters,

So I was introduced to nested loops (loops inside the loops). My program will ask the user to pick a number from which pc will pick a number(guess game) and ask you to guess. After you guess it will tell you how many times it took for you to guess and "HERE IS MY PROBLEM" ask you if you want to play again.

So far I was able to create the guess game BUT having troubles with getting to work yes/no. Please see my code below for any clues. I really wish NOT to get a straight answer.... Thank you in advance for all the inputs..... :)

Code:

```import java.util.Scanner; import java.util.Random; public class hw7 {         public static void main(String[] args)         {                 Scanner keyboard = new Scanner(System.in);                 Random rand = new Random();                                 int n;//number of the max guess options                 int guess;//computer magic number of options                 String reply, input;//asks user if want to play again                 int count = 0;//number which will tell us how many times took to guess                                                         System.out.print("How big of number can I use? ");                 n = keyboard.nextInt();                                 guess = rand.nextInt(n)+1;//generate n amount of options to guess                                 while (reply == 'Y')                 {                 do                 {                         System.out.print("Guess a number from 1 to " + n + " ");                         guess = keyboard.nextInt();                                                 if(guess>n)                                 System.out.println("Try a lower number. ");                                                 else if(guess<n)                                 System.out.println("Try a higher number. ");                                                         else                                   System.out.println("Correct");                                                 count ++;                                         }while (guess!=n);//end of do                                 System.out.print("You guessed the number on attempt # " + count);                                 System.out.print("Do you want to play again? (Y/N) : ");                 input = keyboard.nextLine();                 reply = input.chartAt(0);                                 }//end of while                                                         } }```
OUTPUT:

without second loop program works but after adding second these are my 2 ERROR MESSAGES:

hw7.java:23: incomparable types: java.lang.String and char
^
hw7.java:47: cannot find symbol
symbol : method chartAt(int)
location: class java.lang.String
^
2 errors

OUTPUT WITHOUT 2ND LOOP:

----jGRASP exec: java hw7
How big of number can I use? 3
Guess a number from 1 to 3 1
Try a higher number.
Guess a number from 1 to 3 2
Try a higher number.
Guess a number from 1 to 3 3
Correct
You guessed the number on attempt # 3
----jGRASP: operation complete.
• 03-06-2012, 02:28 AM
Jeff_H
Re: Newbie Nested Loop Problem
reply is a String variable; 'Y' is a character literal. There's a handful of ways to compare the contents of a String variable. You could use reply.equals("Y"), or you could test a single character using reply.charAt(0) == 'Y'

There's another slight issue I can see off-the-bat as well. The while loop is a pretest loop, meaning that if the condition doesn't exist from the start, the loop will never iterate. You could either initialize reply with "Y", or you could change the while loop to a do-while.

I hope this helps.
• 03-06-2012, 03:33 AM
xcaldk74
Re: Newbie Nested Loop Problem
Quote:

Originally Posted by Jeff_H
reply is a String variable; 'Y' is a character literal. There's a handful of ways to compare the contents of a String variable. You could use reply.equals("Y"), or you could test a single character using reply.charAt(0) == 'Y'

There's another slight issue I can see off-the-bat as well. The while loop is a pretest loop, meaning that if the condition doesn't exist from the start, the loop will never iterate. You could either initialize reply with "Y", or you could change the while loop to a do-while.

I hope this helps.

Hi Jeff,

Thanks for your input. I've tried both reply.charAt(0) == 'Y' ^ reply.equals("Y") and in both cases getting this error:

Do you want to play again? (Y/N) : Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 0
at java.lang.String.charAt(String.java:686)
at hw7.main(hw7.java:47)

What am I doing wrong? After the inner loop is done I print outcome of x amount of times till guessed and NOW asking the user to put yes/no where outer loop will go till reply == 'y'? Is the outer group constructed in a bad way or I'm missing something else?

CODE:
Code:

```  import java.util.Scanner;   import java.util.Random;   public class hw7   {       public static void main(String[] args)       {         Scanner keyboard = new Scanner(System.in);         Random rand = new Random();               int n;//number of the max guess options         int guess;//computer magic number of options         String input;//asks user if want to play again         int count = 0;//number which will tell us how many times took to guess               char reply;                     System.out.print("How big of number can I use? ");         n = keyboard.nextInt();               guess = rand.nextInt(n)+1;//generate n amount of options to guess               do         {             do             {               System.out.print("Guess a number from 1 to " + n + " ");               guess = keyboard.nextInt();                           if(guess>n)                   System.out.println("Try a lower number. ");                             else if(guess<n)                   System.out.println("Try a higher number. ");                             else                   System.out.println("Correct");                           count ++;                         }while (guess!=n);//end of inner do                     System.out.println("You guessed the number on attempt # " + count);             System.out.print("Do you want to play again? (Y/N) : ");             input = keyboard.nextLine();             reply = input.charAt(0);                                  }while (reply == 'Y');//outside loop```
• 03-06-2012, 03:54 AM
xcaldk74
Re: Newbie Nested Loop Problem
just traced through my code and it appears that my main guess game is incorrect
• 03-06-2012, 04:03 AM
Jeff_H
Re: Newbie Nested Loop Problem
move the lines:
Code:

```System.out.print("How big of number can I use? "); n = keyboard.nextInt();     guess = rand.nextInt(n)+1;//generate n amount of options to guess count = 0; //reset the counter after every game```
into the outer loop, but before the inner loop. You want the question "How big of a number can I use? " to be displayed every time, as well as the other three lines.

I also changed line 46 to: input = keyboard.next();

After those quick changes, the loops were working well for me :(happy): Well, except for the slight logic error that makes the correct answer the highest possible number.

Quote:

How big of number can I use? 4
Guess a number from 1 to 4 4
Correct

How big of number can I use? 3494
Guess a number from 1 to 3494 3994
Correct
You're using n as the basis for comparison, and to determine the limiting number of the guessing game. n will always equal the number the user enters.
• 03-06-2012, 04:05 AM
xcaldk74
Re: Newbie Nested Loop Problem
NOW ive fixed the main code BUT still getting the same error with outside loop ? what am I missing?!?! can I do "do loop in do loop"?

Code:

```import java.util.Scanner;   import java.util.Random;   public class hw7   {       public static void main(String[] args)       {         Scanner keyboard = new Scanner(System.in);         Random rand = new Random();               int n;//number of the max guess options         int guess;//computer magic number of options         String input;//asks user if want to play again         int count = 0;//number which will tell us how many times took to guess               int userGuess;         char reply;                     System.out.print("How big of number can I use? ");         n = keyboard.nextInt();               guess = rand.nextInt(n)+1;//generate n amount of options to guess               do         {             do             {               System.out.print("Guess a number from 1 to " + n + " ");               userGuess = keyboard.nextInt();                           if(userGuess>guess)                   System.out.println("Try a lower number. ");                             else if(userGuess<guess)                   System.out.println("Try a higher number. ");                             else                   System.out.println("Correct");                           count ++;                         System.out.println("You guessed the number on attempt # " + count);                         }while (userGuess!=guess);//end of inner do                             System.out.print("Do you want to play again? (Y/N) : ");             input = keyboard.nextLine();             reply = input.charAt(0);                                  }while (reply == 'Y');//outside loop```
• 03-06-2012, 04:06 AM
xcaldk74
Re: Newbie Nested Loop Problem
Quote:

Originally Posted by Jeff_H
move the lines:
Code:

```System.out.print("How big of number can I use? "); n = keyboard.nextInt();     guess = rand.nextInt(n)+1;//generate n amount of options to guess count = 0; //reset the counter after every game```
into the outer loop, but before the inner loop. You want the question "How big of a number can I use? " to be displayed every time, as well as the other three lines.

I also changed line 46 to: input = keyboard.next();

After those quick changes, the loops were working well for me :(happy): Well, except for the slight logic error that makes the correct answer the highest possible number.

You're using n as the basis for comparison, and to determine the limiting number of the guessing game. n will always equal the number the user enters.

yes Jeff, while I was tracing through the code I found out this was an issue. got it fixed now... what is wrong with my outside looP?
• 03-06-2012, 04:09 AM
xcaldk74
Re: Newbie Nested Loop Problem
Code:

``` System.out.print("Do you want to play again? (Y/N) : ");             input = keyboard.nextLine();             reply = input.charAt(0);                          }while (reply == 'Y');//outside loop```
isn't that should ask the user to put y OR n and the DO LOOP will run till reply == 'y' where is the logic i'm missing.... new to loops :(
• 03-06-2012, 04:12 AM
Jeff_H
Re: Newbie Nested Loop Problem
Code:

```import java.util.Scanner;   import java.util.Random;     public class hw7   {       public static void main(String[] args)       {         Scanner keyboard = new Scanner(System.in);         Random rand = new Random();               int n;//number of the max guess options         int guess;//computer magic number of options         String input;//asks user if want to play again         int count = 0;//number which will tell us how many times took to guess         int userGuess;         char reply;               do         {             System.out.print("How big of number can I use? ");             n = keyboard.nextInt();                   guess = rand.nextInt(n)+1;//generate n amount of options to guess             count = 0; //reset the counter after each game             do             {               System.out.print("Guess a number from 1 to " + n + " ");               userGuess = keyboard.nextInt();                           if(userGuess>guess)                   System.out.println("Try a lower number. ");                               else if(userGuess<guess)                   System.out.println("Try a higher number. ");                               else                   System.out.println("Correct");                           count ++;                         System.out.println("You guessed the number on attempt # " + count);                         }while (userGuess!=guess);//end of inner do                                 System.out.print("Do you want to play again? (Y/N) : ");             input = keyboard.next();             reply = input.charAt(0);                          }while (reply == 'Y');//outside loop       }   }```
I moved a few lines and added count = 0; to the outer loop to reset after each game. I also changed input = keyboard.nextLine(); to input = keyboard.next();. It's working for me.

I understand your frustration completely :(happy): if you need me to explain why I made the changes I did, feel free to ask.
• 03-06-2012, 04:24 AM
xcaldk74
Re: Newbie Nested Loop Problem
Jeff,

Why did you change input = keyboard.nextLine(); to input = keyboard.next(); ???? - my wild guess would be since I've specified that input is String I don't need "Line" or what???
• 03-06-2012, 04:30 AM
xcaldk74
Re: Newbie Nested Loop Problem
I also had to move System.out.println("You guessed the number on attempt # " + count); OUTSIDE of the while because otherwise it would print SOP where it NOT supposed to. so why did nextLine VS next makes a difference?
• 03-06-2012, 04:32 AM
xcaldk74
Re: Newbie Nested Loop Problem
My Final Code:

Code:

```  import java.util.Scanner;   import java.util.Random;   public class hw7   {       public static void main(String[] args)       {         Scanner keyboard = new Scanner(System.in);         Random rand = new Random();               int n;//number of the max guess options         int guess;//computer magic number of options         String input;//asks user if want to play again         int count = 0;//number which will tell us how many times took to guess         int userGuess;         char reply;                     do         {             System.out.print("How big of number can I use? ");             n = keyboard.nextInt();              guess = rand.nextInt(n)+1;//generate n amount of options to guess             count = 0;                               do             {               System.out.print("Guess a number from 1 to " + n + " ");               userGuess = keyboard.nextInt();                           if(userGuess>guess)                   System.out.println("Try a lower number. ");                             else if(userGuess<guess)                   System.out.println("Try a higher number. ");                             else                   System.out.println("Correct");                           count ++;                                     }while (userGuess!=guess);//end of inner do             System.out.println("You guessed the number on attempt # " + count);                         System.out.print("Do you want to play again? (Y/N) : ");             input = keyboard.nextLine();             reply = input.charAt(0);                                  }while (reply == 'Y');//outside loop                                         }   }```
• 03-06-2012, 04:37 AM
Jeff_H
Re: Newbie Nested Loop Problem
Because keyboard.nextLine() sees the white space (the enter, return, or carriage return. whichever term you prefer) that occurs when the user enters a guess. I might be a little off on my explanation, but if you would like a visual example of this, try running:

Code:

```import java.util.Scanner;   import java.util.Random;     public class HW7   {       public static void main(String[] args)       {         Scanner keyboard = new Scanner(System.in);         Random rand = new Random();               int n;//number of the max guess options         int guess;//computer magic number of options         String input;//asks user if want to play again         int count = 0;//number which will tell us how many times took to guess         int userGuess;         char reply;               do         {             System.out.print("How big of number can I use? ");             n = keyboard.nextInt();                   guess = rand.nextInt(n)+1;//generate n amount of options to guess             count = 0; //reset the counter after each game             do             {               System.out.print("Guess a number from 1 to " + n + " ");               userGuess = keyboard.nextInt();                           if(userGuess>guess)                   System.out.println("Try a lower number. ");                               else if(userGuess<guess)                   System.out.println("Try a higher number. ");                               else                   System.out.println("Correct");                           count ++;                         System.out.println("You guessed the number on attempt # " + count);                         }while (userGuess!=guess);//end of inner do                                 System.out.print("Do you want to play again? (Y/N) : ");             input = keyboard.nextLine(); //replaced keyboard.next() with two .nextLine()'s             input = keyboard.nextLine();             reply = input.charAt(0);                        }while (reply == 'Y');//outside loop       }   }```
You'll find that it runs the same as a single .next()
• 03-06-2012, 06:03 PM
xcaldk74
Re: Newbie Nested Loop Problem
[QUOTE=Jeff_H;269824]Because keyboard.nextLine() sees the white space (the enter, return, or carriage return. whichever term you prefer) that occurs when the user enters a guess. I might be a little off on my explanation,/QUOTE]

yes still little bit confused.... :( Thx a bunch for all of your HELP JEFF