While inside other While in Java

Asked

Viewed 638 times

0

I am trying to do a while inside another while and after executing the code within the second while I ask if you want to continue or not, if yes, the program should loop from the first while. It turns out that the loop is only going to the second while and not to the first. Below is the code:

public class ExercicioCalculadora2 {

public static void main(String[] args) {
    // TODO Auto-generated method stub

    int soma, sub, div, multi, num1 = 0, num2 = 0;
    String operacao = "";
    boolean continua = true, continua2 = true;
    String pergunta = "";

    System.out.println("CALCULADORA");

    Scanner entrada = new Scanner(System.in);

    while(continua) {

    System.out.print("Digite um numero entre 1 e 4: ");
    num1 = entrada.nextInt();

        if(num1 >= 1 && num1 <=4) {


            while(continua2) {

            System.out.println();   
            System.out.print("Digite outro numero entre 1 e 4: ");
            num2 = entrada.nextInt();

            if(num2 >= 1 && num2 <= 4) {

                System.out.println();
                System.out.print("Digite qual operação deseja executar(Soma, Divisão, Subtração ou Multiplicação): ");
                operacao = entrada.next();

                switch(operacao) {

                case "Soma":
                    soma  = num1 + num2;
                    System.out.println("O resultado da soma dos dois numeros é : " + soma);
                    break;

                case "Divisão":
                    div = num1 / num2;
                    System.out.println("O resultado da soma dos dois numeros é : " + div);
                    break;

                case "Subtração":
                    sub = num1 - num2;
                    System.out.println("O resultado da soma dos dois numeros é : " + sub);
                    break;

                case "Multiplicação":
                    multi = num1 * num2;
                    System.out.println("O resultado da soma dos dois numeros é : " + multi);
                    break;

                }   


            }else {
                System.out.println("O numero digitado está fora do padrao, digite novamente!");
            }

            System.out.println("Deseja continuar calculando(S ou N)? ");
            pergunta = entrada.next();

                if(pergunta.toUpperCase().equals("N")) {
                    System.out.println("FIM DO PROGRAMA");
                    continua = false;
                    continua2 = false;
                }

            }

        }else {
            System.out.println("O numero digitado está fora do padrao, digite novamente!");
        }


    }   

}

} 
  • What’s your problem? getting an error or need an idea of how to implement?

2 answers

1

The logic you are using is too complicated, and in the end you have no reason to use 2 whiles with 2 flags of continua different. Instead it is preferable to validate each number individually and if it is not within the desired range, re-ask with the while that already has:

while(continua) {
    System.out.print("Digite um numero entre 1 e 4: ");
    num1 = entrada.nextInt();
    if(num1 <= 0 || num1 > 4) { //se estiver fora
        System.out.println("O numero digitado está fora do padrao, digite novamente!");
        continue; //passa a próxima iteração do while, pedindo tudo de novo
    }

    System.out.println();
    System.out.print("Digite outro numero entre 1 e 4: ");
    num2 = entrada.nextInt();
    if(num2 <= 0 || num2 > 4) { //se estiver fora
        System.out.println("O numero digitado está fora do padrao, digite novamente!");
        continue; //passa a próxima iteração do while, pedindo tudo de novo
    }

    System.out.println();
    System.out.print("Digite qual operação deseja executar(Soma, Divisão, Subtração ou Multiplicação): ");
    operacao = entrada.next();
    switch(operacao) {
        case "Soma":
            soma  = num1 + num2;
            System.out.println("O resultado da soma dos dois numeros é : " + soma);
            break;
        case "Divisão":
            div = num1 / num2;
            System.out.println("O resultado da soma dos dois numeros é : " + div);
            break;
        case "Subtração":
            sub = num1 - num2;
            System.out.println("O resultado da soma dos dois numeros é : " + sub);
            break;
        case "Multiplicação":
            multi = num1 * num2;
            System.out.println("O resultado da soma dos dois numeros é : " + multi);
            break;
    }

    System.out.println("Deseja continuar calculando(S ou N)? ");
    pergunta = entrada.next();
    if(pergunta.toUpperCase().equals("N")) {
        System.out.println("FIM DO PROGRAMA");
        continua = false;
    }
}

I leave here a little alert that the text of the operation was as soma for all operations within the switch.

In this solution if the user fails one of the numbers again have to enter them. This happens due to the continue, which makes it continue to the next iteration of while back to the reading of the first number. Alternatively it can loop in each number until it is entered correctly at the expense of a while for example:

while(continua) {
    System.out.print("Digite um numero entre 1 e 4: ");
    num1 = entrada.nextInt();
    while (num1 <= 0 || num1 > 4) { //enquanto não está dentro do intervalo desejado
        System.out.println("O numero digitado está fora do padrao, digite novamente!");
        num1 = entrada.nextInt(); //ler novamente
    }

    System.out.println();
    System.out.print("Digite outro numero entre 1 e 4: ");
    num2 = entrada.nextInt();

    while(num2 <= 0 || num2 > 4) { //enquanto não está dentro do intervalo desejado
        System.out.println("O numero digitado está fora do padrao, digite novamente!");
        num2 = entrada.nextInt(); //ler novamente
    }

    //resto igual

Notice that although you have one while inside the other there are no two flags of continua. And even the seconds whiles are very small and serve only to read a new number until it stays in the desired range.

In either of these two solutions there is much less nesting than in their initial solution, thus valuing simplicity.

-2

while (criteiro){
    int a = 1;
    if (a == 0){
        break;
    }
    while (a != 0){
        a++;
        if (a == 100){
            a = 0;
        }
    }
}

Browser other questions tagged

You are not signed in. Login or sign up in order to post.