Solucionado (ver solução)
Solucionado
(ver solução)
5
respostas

Dúvida no Ex. 9 da Aula 2 - Variáveis e fluxo

Boa tarde, gostaria de saber por que esse código funciona :

class Programa{

    public static void main(String[]args)    
    {

        int numero = 13;

        while(numero != 1)
        {
            if(numero % 2 == 0)
            {
                numero = numero/2;
                System.out.println(numero);
            } else {
                numero = 3 * numero + 1;
                System.out.println(numero);
            }
        }
    }
}

E esse não :

class Programa{

    public static void main(String[]args)    
    {

        int numero = 13;

        while(numero != 1)
        {
            if(numero % 2 == 0)
            {
                numero = numero/2;
                System.out.println(numero);
            }
            if(numero % 2 == 1)
            {
                numero = 3 * numero + 1;
                System.out.println(numero);
            }
        }
    }
}
5 respostas
solução!

Olá Igor! Aqui ambos os códigos funcionaram, a diferença é que no segundo gera um loop infinito. Talvez sua dúvida seja porque esse comportamento diferente.

Veja só, no primeiro código foi colocado um if e um else, o que acontece é que quando o código do if() é executado o código do else não é executado. O else só é executado caso a sentença do if não seja verdadeira.

No entanto, seu segundo código você utilizou dois if()o que acontece é que mesmo executando o primeiro if o segundo também pode ser executado e é por isso que gera um loop infinito.

Repare que as sequencia de números que será impressa no primeiro código é: 40, 20, 10, 5, 16, 8, 4, 2, 1. Porem eu quero que você atente para os três últimos números (4, 2 e 1). No primeiro código, quando número for 4 ele atende a condição do if() sendo então dividido por 2, passando a ser 2 e então é impresso o número 2. Perceba que 2 é diferente de 1 então o loop continua. Então quando número vale 2 também atende a condição do if() sendo então dividido por 2 novamente, passando a ser 1. Quando isso ocorre o loop para, pois 1 não é diferente de 1, encerrando a sequencia. Perceba que em nenhum momento o else foi chamado nessa pequena execução, pois todos os casos atenderam ao if().

Agora vamos analisar o segundo código. Quando numero vale 4 o que acontece é que ele atende o primeiro if() sendo então dividido por 2, passando a ser 2, porem como o código seguinte é outro if() é verificado se ele atende esse segundo if(), como não atende não é executado nada e por 2 ser diferente de 1 o loop continua. Então numero valendo 2 atende a condição do primeiro if() novamente, sendo então dividido por 2, passando a valer 1. Porém aqui que está o problema, quando número vale 1 ele atende a condição do segundo if() sendo então o código do segundo if() executado e número passando a valer 4 e como 4 é diferente de 1 o loop continua.

Se você executar passo a passo seu código em Debug, verá que é formada a seguinte sequencia:

40, 20, 10, 5, 16, 8, 4, 2, 1, 4, 2, 1, 4, 2, 1 ....

Então este é o problema, quando utilizamos dois if() ambos são verificados e se ambas as condições forem verdadeiras ambos os códigos são executados. Porém isso não ocorre com if e else, quando o if() é executado o código do else não é executado.

Enfim, espero ter ajudado! Bons estudos!

Excelente sua explicação ! Deixa eu ver se eu entendi então, quando o valor é 1, ele não quebrar o loop, e é direcionado para o if, correto ?

No caso do segundo código sim. Perceba uma coisa, o segundo if() está dentro do loop, então quando acaba a execução do primeiro if() o código de dentro do Loop continua ao final do if(). Como o próximo bloco de código é outro if(), caso atenda a condição, ele será executado. É o que acontece quando a variável passa a valer 1 após a execução do primeiro if().

Perfeito !

Que bom que te ajudei Igor! Bons Estudos!