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

[Dúvida] Estrutura IF dentro do WHILE

Pessoal, como nao houve Copa em 1942 e 1946 devido a 2a Guerra Mundial, criei esse IF no codigo abaixo, mas nao deveria funcionar corretamente e esta funcionando. Alguem sabe me dizer por que funciona? Digo isso porque quando a variavel anoCopa eh igual a 1942 e 1946 elas deveriam ser impressas como anos que tiveram Copas, visto que a funcao mostra() esta antes dos IFs, mas o resultado saiu certo. Estou completamente confuso.

CODIGO:

<meta charset="UTF-8">

<script>

    function pulaLinha() {

        document.write("<br>");
        document.write("<br>");
}

    function mostra(frase) {

        document.write(frase);
        pulaLinha();
}

var limite = parseInt(prompt("Entre com a data limite"));

var anoCopa = 1930;

while(anoCopa <= limite) {

        mostra("Teve copa em " + anoCopa);

        anoCopa = anoCopa + 4;


    if (anoCopa == 1942) {

        mostra("Nao teve copa em " + anoCopa + " por causa da 2a Guerra Mundial");

        anoCopa = anoCopa + 4;

    }

    if (anoCopa == 1946) {

        mostra("Nao teve copa em " + anoCopa + " por causa da 2a Guerra Mundial");

        anoCopa = anoCopa + 4;

    }

}

mostra("FIM");

</script>

RESULTADO:

Teve copa em 1930

Teve copa em 1934

Teve copa em 1938

Nao teve copa em 1942 por causa da 2a Guerra Mundial

Nao teve copa em 1946 por causa da 2a Guerra Mundial

Teve copa em 1950

Teve copa em 1954

Teve copa em 1958

Teve copa em 1962

Teve copa em 1966

Teve copa em 1970

Teve copa em 1974

Teve copa em 1978

Teve copa em 1982

Teve copa em 1986

Teve copa em 1990

Teve copa em 1994

Teve copa em 1998

Teve copa em 2002

Teve copa em 2006

Teve copa em 2010

Teve copa em 2014

Teve copa em 2018

Teve copa em 2022

FIM

4 respostas

Isso ocorre por que você esta incrementando a variável anoCopa em vários lugares.

Entendi, mas acho que como o codigo esta escrito, os anos de 1942 e 1946 deveriam ter e nao ter copa como resultado. Certo?

solução!

Oi José! Tudo bem por aí?

Agradeço pela paciência em esperar a resposta!

José, seu código está correto! Inclusive, achei super legal você ter pensado nessa condição e ter aplicado conhecimento de outras aulas no exercício.

Como a condição if está dentro do bloco do laço while, cada vez que a repetição ocorrer, todas as condições serão testadas.

Por exemplo, vamos entrar no while com o ano de 1938:

  • Começa o while
  • Mostra "Teve copa em 1938"
  • Acresce 4 na variável anoCopa, ou seja, agora anoCopa tem valor igual à 1942
  • Entra na primeira condição: anoCopa é 1942? Sim, pois apesar de termos começado o loop com 1938, já adicionamos 4 no passo anterior. Portanto, mostra "Não teve copa em 1942 por causa da 2a Guerra Mundial"
  • Ainda dentro da condição, adicionamos mais 4 à variável anoCopa, portanto, agora seu valor é 1946
  • Entramos na segunda condição: anoCopa é 1946? Sim, pois nas linhas anteriores acrescentamos 4 à variável que antes era 1942, e antes disso, 1938. Portanto, mostra: "Não teve copa em 1946 por causa da 2a Guerra Mundial"
  • Ainda dentro da condição, adicionamos mais 4 à variável anoCopa, portanto, agora seu valor é 1950
  • E se dá o fim do escopo do laço, começando o próximo ciclo com a variável tendo valor de 1950.
  • Mostra “Teve copa em 1950”
  • Acresce + 4

A partir desse momento, as condições serão testadas e terão como retorno false:

  • anoCopa é 1942? Não
  • anoCopa é 1946? Não
  • Volta ao início do loop
  • Mostra “Teve copa em 1954”
  • O loop continua até anoCopa ultrapassar o limite

Tenho uma sugestão de como você pode organizar seu código de forma mais lógica e sucinta. Veja:

var limite = parseInt(prompt("Entre com a data limite"));
var anoCopa = 1930;

while(anoCopa <= limite) {

      if(anoCopa == 1942 || anoCopa == 1946){
        mostra("Não teve copa em " + anoCopa + " por causa da 2a Guerra Mundial");
      } else {
        mostra("Teve copa em " + anoCopa);
      }

      anoCopa = anoCopa + 4;
}

mostra("FIM");

O operador lógico de comparação ||, em JS, significa ou. Ou seja: com apenas uma condição if você pode testar se dois valores são ou não verdadeiros. Além disso, adicionamos +4 à variável apenas uma vez, depois de todas as condições terem sido testadas.

Espero que sua dúvida tenha sido esclarecida!

Abraços e bons estudos.

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!

Obrigado!