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

Testando os conhecimentos, encontrei um entrave que não consigo identificar!

<meta charset="UTF-8">

<script>

    function pulaLinha() {

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

    function mostra(frase) {

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

    var n = 10;
    var contador = 1;
    var limiteTentativas = 3;

    while(contador <= limiteTentativas) {

    var produto1 = Math.round(Math.random() * n);
    var produto2 = Math.round(Math.random() * n);
    var resposta = parseInt(prompt("Qual é o resultado de " + produto1 + " x " + produto2 + " ?"));
    var resultado = produto1*produto2;

        if(resposta == resultado) {

            alert("Parabéns, você acertou!");
            contador = limiteTentativas;

        } else {

            alert("Não está correto. Responda novamente!");
            contador++;
        }

    }

    mostra("Continue praticando a TABUADA!");


</script>

Minha intenção neste código foi criar uma maneira para alguém testar conhecimentos de tabuada! Todavia, minha lógica era que se a primeira resposta já fosse correta o laço deveria ser interrompido e a mensagem na função "mostra" aparecesse. Caso a resposta fosse errada, a pessoa teria mais duas tentativas (fazendo um total de 3) e então o laço seria interrompido e a mensagem na função "mostra" apareceria.

O problema é que mesmo quando a primeira resposta já é a correta, ele não interrompe o laço. Fica gerando novos números e esperando resposta ciclicamente. Só o que funcionou foi no caso de respostas erradas. Após 3 respostas erradas consecutivas, o laço é interrompido!

Eu consegui o resultado que idealizei apenas quando inseri um "break" após o "alert("Parabéns, você acertou!"), mas não quis deixar com o break por não ter intendido o motivo da estrutura "contador = limiteTentativas;" não ter funcionado.

Me ajude a entender o que está havendo, por favor!

Muito obrigado!

3 respostas

Acho que entendi! Veja se é isto mesmo:

Na condição do laço, o "<=" é o que está causando o problema, quando consideramos que a variável contador também n deveria estar declara como "1". O laço nunca fechará, uma vez que, quando a resposta é correta, a variável contador recebe o valor 3 (fato que ainda o mantém na repetição).

E a ilusão de que a lógica estava perfeita para as respostas erradas, se dá pelo fato da variável "contador" estar declarada com o valor "1". Sendo assim, quando a resposta era errada, entrava em funcionamento a estrutura do "else", de maneira que na minha terceira tentativa errada, a variável "contador" estaria recebendo valor "4" e não "3". Sendo assim, ela estaria fora das condições para o laço (que aceitaria o seu valor máximo = 3). E o laço é encerrado.

Fiz as seguintes alterações:

var contador = 0; while (contador < limiteTentativas)

e consegui atingir o resultado que idealizei desde o início.

Está correto?

solução!

Oi Daniel, tudo bem?

Pelo que vi seu raciocínio está correto, e sua solução também. Realmente quando você atribuía o valor 3 ao contador era o suficiente pra fazer mais um laço, pois 3 é menor ou igual a 3, criando assim um "loop" que só saía quando dada uma resposta errada.

Aliás, é boa prática usar o valor "0" como valor inicial no contador, pois maioria das linguagens usam o zero como valor inicial em listas ou arrays. Acho que você vai ver isso logo, já ir acostumando a usar o zero vai ajudar bastante ;)

No geral, está tudo certo. Muito bem.

Muito obrigado, Pedro!