user3221816
user3221816

Reputation: 135

How to implement a for loop inside a while loop?

sorry for asking such an in depth question, but I'm very lost. I am working on a problem and I am stuck. I am supposed to make a basic menu driven calculator that add, subtract, multiply, divide, or generate a random number between an upper and lower limit. I made that without too much difficulty, but now I need to change it so that after it performs an operation it starts over again and displays the menu. Also, if I enter an invalid response, it needs to let them try again until they enter a valid one UNLESS they enter an invalid response THREE TIMES IN A ROW; then it needs to display a message about trying again later and exiting the program. This is there I am stuck. I have tried every combination of for and while in the following code but i can not get this to work. I would really appreciate any pointers.

Here are the requirements:

And here is what i have thus far.

import java.util.Scanner;

public class BasicCalculator {

public static void main(String[] args) {

    Scanner input = new Scanner(System.in);

    double numONE = 0.0;
    double numTWO = 0.0;
    double upperLimit = 0.0;
    double lowerLimit = 0.0;

    System.out.println("MENU");
    System.out.println("1. +");
    System.out.println("2. -");
    System.out.println("3. *");
    System.out.println("4. /");
    System.out.println("5. Generate a random number.");
    System.out.println("6. Quit");

    System.out.println("What would you like to do?");
    int menuSelect = input.nextInt();
    //Selects an item from the menu

    if(menuSelect == 1 || menuSelect == 2 || menuSelect == 3 || menuSelect == 4){
        System.out.println("Enter first number.");
        numONE = input.nextDouble();
        //Stores input as numONE

        System.out.println("Enter second number.");
        numTWO = input.nextDouble();
        //Stores input as numTWO
    }
    if(menuSelect == 1){
        System.out.println(numONE + numTWO);
        //Adds two numbers
    }
    else if(menuSelect == 2){
        System.out.println(numONE - numTWO);
        //Subtracts second number from first number
    }
    else if(menuSelect == 3){
        System.out.println(numONE * numTWO);
        //Multiplies two numbers
    }
    else if(menuSelect == 4){
        if(numTWO != 0){
            System.out.println(numONE / numTWO);
            //Divides first number by second number
        }
        else if(numTWO == 0){
            System.out.println("I'm sorry, you cannot divide by zero.");
        }
    }
    else if(menuSelect == 5){
        System.out.println("Enter upper limit.");
        upperLimit = input.nextDouble();
        System.out.println("Enter lower limit.");
        lowerLimit = input.nextDouble();
        double randomVal = (lowerLimit + (int)(Math.random() * ((upperLimit - lowerLimit)+1)));
        System.out.println(randomVal);
        //Displays a random integer between an upper and a lower limit
    }
    else if(menuSelect==6){
        System.out.println("Goodbye");
        System.exit(0);
    }
    else{
        System.out.println("Sorry, "+menuSelect+" is not an option.");
    }
}
}

Upvotes: 0

Views: 611

Answers (5)

ichramm
ichramm

Reputation: 6642

This isn't about a 'for loop inside a while loop', you don't even need it.

Imagine the following pseudo-code:

int invalidOptions = 0;
while ( invalidOptions < 3 ) {

    // show menu
    displayMenu();

    // read option
    int input = readInput();

    // validate input
    if ( isInputValid(input) ) {
        // check whether the user wants to exit or not
        if (input == EXIT_INPUT) {
            break;
        }

        // handle other commands
        handleInput(input);
    } else {
        // input is invalid
        invalidOptions++;
    }
}

That's all you need, it's better to split your program into smaller pieces, it will be easier to maintain and understand.

Upvotes: 2

StephenTG
StephenTG

Reputation: 2647

You probably don't want a for loop inside a while loop to handle this. I would just have a variable to track how many invalid inputs you've received, increment it when they enter something invalid, reset it to zero if they enter something valid, and kick them out if it gets too high.

eg:

import java.util.Scanner;

public class BasicCalculator {

public static void main(String[] args) {

    Scanner input = new Scanner(System.in);

    double numONE = 0.0;
    double numTWO = 0.0;
    double upperLimit = 0.0;
    double lowerLimit = 0.0;
    int invalid = 0;

    System.out.println("MENU");
    System.out.println("1. +");
    System.out.println("2. -");
    System.out.println("3. *");
    System.out.println("4. /");
    System.out.println("5. Generate a random number.");
    System.out.println("6. Quit");

    System.out.println("What would you like to do?");
    int menuSelect = input.nextInt();
    //Selects an item from the menu

    while(invalid < 3){
    if(menuSelect == 1 || menuSelect == 2 || menuSelect == 3 || menuSelect == 4){
        System.out.println("Enter first number.");
        numONE = input.nextDouble();
        //Stores input as numONE

        System.out.println("Enter second number.");
        numTWO = input.nextDouble();
        //Stores input as numTWO
        invalid = 0;
    }
    if(menuSelect == 1){
        System.out.println(numONE + numTWO);
        //Adds two numbers
    }
    else if(menuSelect == 2){
        System.out.println(numONE - numTWO);
        //Subtracts second number from first number
    }
    else if(menuSelect == 3){
        System.out.println(numONE * numTWO);
        //Multiplies two numbers
    }
    else if(menuSelect == 4){
        if(numTWO != 0){
            System.out.println(numONE / numTWO);
            //Divides first number by second number
        }
        else if(numTWO == 0){
            System.out.println("I'm sorry, you cannot divide by zero.");
        }
    }
    else if(menuSelect == 5){
        System.out.println("Enter upper limit.");
        upperLimit = input.nextDouble();
        System.out.println("Enter lower limit.");
        lowerLimit = input.nextDouble();
        double randomVal = (lowerLimit + (int)(Math.random() * ((upperLimit - lowerLimit)+1)));
        System.out.println(randomVal);
        //Displays a random integer between an upper and a lower limit
        invalid = 0;
    }
    else if(menuSelect==6){
        System.out.println("Goodbye");
        System.exit(0);
    }
    else{
        System.out.println("Sorry, "+menuSelect+" is not an option.");
        invalid++;
    }
    }
    System.out.println("Too many invalid inputs. Try again later");
}
}

Upvotes: 0

Jorge
Jorge

Reputation: 1634

First things first, you don't really need four variables for this program. Since you are always taking two numbers as input you can easily store them in two variables, instead of having different variable names for each case. As mentioned above, you don't need such complex loop nesting. A simple while that checks the number of errors is less than 3 will do just fine. Also, you seem to work well with the System.out.println() command, but for some applications, like input, it may be better to work with System.out.print(), it's basically the same but does not start a new line. Try the code below to see the results. Another thing you might consider is using a switch sentence instead of the if, else if, else if statements.

import java.util.Scanner;

public class BasicCalculator {

  public static void main(String[] args) {

    Scanner input = new Scanner(System.in);

    double firstNumber = 0.0;
    double secondNumber = 0.0;

    //New variable
    int errors = 0;

    while (errors < 3) {
        System.out.println("MENU");
        System.out.println("1. +");
        System.out.println("2. -");
        System.out.println("3. *");
        System.out.println("4. /");
        System.out.println("5. Generate a random number.");
        System.out.println("6. Quit");

        System.out.println("What would you like to do?");
        System.out.print("> ");
        int menuSelect = input.nextInt();
        //Selects an item from the menu

        if(menuSelect == 1 || menuSelect == 2 || menuSelect == 3 || menuSelect == 4) {
            errors = 0;
            System.out.print("Enter first number: ");
            firstNumber = input.nextDouble();
            //Stores input as the firstNumber

            System.out.print("Enter second number: ");
            secondNumber = input.nextDouble();
            //Stores input as the secondNumber
        }
        if(menuSelect == 1){
            System.out.println(firstNumber + secondNumber);
            //Adds two numbers
        }
        else if(menuSelect == 2){
            System.out.println(firstNumber - secondNumber);
            //Subtracts second number from first number
        }
        else if(menuSelect == 3){
            System.out.println(firstNumber * secondNumber);
            //Multiplies two numbers
        }
        else if(menuSelect == 4){
            if(secondNumber != 0){
                System.out.println(firstNumber / secondNumber);
                //Divides first number by second number
            }
            else if(secondNumber == 0){
                System.out.println("I'm sorry, you cannot divide by zero.");
            }
        }
        else if(menuSelect == 5){
            errors = 0;
            System.out.print("Enter upper limit: ");
            firstNumber = input.nextDouble();
            System.out.print("Enter lower limit: ");
            secondNumber = input.nextDouble();
            double randomVal = (firstNumber + (int)(Math.random() * ((firstNumber - secondNumber)+1)));
            System.out.println(randomVal);
            //Displays a random integer between an upper and a lower limit
        }
        else if (menuSelect==6){
            System.out.println("Goodbye");
            System.exit(0);
        }
        else{
            errors++;
            System.out.println("Sorry, "+ menuSelect + " is not an option.");
        }
    }       
    input.close();
    System.out.println("Program will exit now");
  }
}

Upvotes: 1

Christian
Christian

Reputation: 7320

Look at lines I added ( // <- new code )

import java.util.Scanner;

public class BasicCalculator {

public static void main(String[] args) {

    int counter_WrongAttempts = 0;    // <- new code
    boolean flag_Quit = false;        // <- new code
    while (!flag_Quit) {              // <- new code
        boolean wrongAttempt = false; // <- new code


        Scanner input = new Scanner(System.in);

        double numONE = 0.0;
        double numTWO = 0.0;
        double upperLimit = 0.0;
        double lowerLimit = 0.0;

        System.out.println("MENU");
        System.out.println("1. +");
        System.out.println("2. -");
        System.out.println("3. *");
        System.out.println("4. /");
        System.out.println("5. Generate a random number.");
        System.out.println("6. Quit");

        System.out.println("What would you like to do?");
        int menuSelect = input.nextInt();
        //Selects an item from the menu

        if(menuSelect == 1 || menuSelect == 2 || menuSelect == 3 || menuSelect == 4){
            System.out.println("Enter first number.");
            numONE = input.nextDouble();
            //Stores input as numONE

            System.out.println("Enter second number.");
            numTWO = input.nextDouble();
            //Stores input as numTWO
        }
        if(menuSelect == 1){
            System.out.println(numONE + numTWO);
            //Adds two numbers
        }
        else if(menuSelect == 2){
            System.out.println(numONE - numTWO);
            //Subtracts second number from first number
        }
        else if(menuSelect == 3){
            System.out.println(numONE * numTWO);
            //Multiplies two numbers
        }
        else if(menuSelect == 4){
            if(numTWO != 0){
                System.out.println(numONE / numTWO);
                //Divides first number by second number
            }
            else if(numTWO == 0){
                System.out.println("I'm sorry, you cannot divide by zero.");
            }
        }
        else if(menuSelect == 5){
            System.out.println("Enter upper limit.");
            upperLimit = input.nextDouble();
            System.out.println("Enter lower limit.");
            lowerLimit = input.nextDouble();
            double randomVal = (lowerLimit + (int)(Math.random() * ((upperLimit - lowerLimit)+1)));
            System.out.println(randomVal);
            //Displays a random integer between an upper and a lower limit
        }
        else if(menuSelect==6){
            System.out.println("Goodbye");
            System.exit(0);
            flag_Quit = true;                                  // <- new code
        }
        else{
            System.out.println("Sorry, "+menuSelect+" is not an option.");
            wrongAttempt = true;                               // <- new code
        }


        if (wrongAttempt)                                      // <- new code
            counter_WrongAttempts++;                           // <- new code
        else                                                   // <- new code
            counter_WrongAttempts = 0;                         // <- new code
        flag_Quit = flag_Quit || (counter_WrongAttempts >= 3); // <- new code

    }
}
}

Upvotes: 2

Yannic Welle
Yannic Welle

Reputation: 207

int unvalid = 0;
while (unvalid < 3)
{
  //read stuff
  if ([stuff is valid])
  {
    unvalid = 0;
  }
  else
  {
    unvalid++;
  }
}

Upvotes: 0

Related Questions