While inside another While in Java

0

I'm trying to do a while within another while and after running the code within the second while I wonder if I want to continue or not, if so, the program should loop 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!");
        }


    }   

}

} 
    
asked by anonymous 03.04.2018 / 05:47

2 answers

1

The logic you are using is overly complicated, and you end up having no reason to use 2 while s with 2 different continua flags. Instead it is preferable to validate each number individually and if it is not within the desired range, ask again with the same 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 small alert that the text of the operation has become soma for all operations within switch .

In this solution, if the user fails one of the numbers, he will have to enter them again. This happens because of continue , which causes it to continue to the next iteration of while returning to the first number reading. Alternatively, you can loop through each number until it is entered correctly at the cost 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

Note that although you have while inside the other there are not two flags of continua . And even the second whiles are very small and only serve to read a new number until it is within the desired range.

In any of these two solutions has much less nesting than in its initial solution, thus emphasizing simplicity.

    
03.04.2018 / 14:47
-1
while (criteiro){
    int a = 1;
    if (a == 0){
        break;
    }
    while (a != 0){
        a++;
        if (a == 100){
            a = 0;
        }
    }
}
    
03.04.2018 / 05:56