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

Programa trava sem identificar o erro

Olá, a respeito do último exercício do curso de Lógica de programação I. Não consigo identificar o erro no código, e quando executo no Chrome ele trava a partir do momento que clico no botão. Preciso de ajuda.

Obs.: Eu tentei incrementar o código pedindo ao usuário 2 perguntas que não precisavam serem feitas, e tenho quase certeza que isso que está travando o código, então, queria arrumar para que funcionasse com essas 2 perguntas a mais..

<input/>
<button>Veja se adivinhou o número</button>

<script>

    var lista_numeros = [];

    function sorteia(n){

        var numero = false;

        numeroAleatorio = Math.round(Math.random() * parseInt(n));

        for(var posicao = 0; posicao < lista_numeros.length; posicao++) {
            if(lista_numeros[posicao] == numeroAleatorio) {
                numero = true;
                break;
            }

            else{

                lista_numeros.push(numeroAleatorio);
            }
        }
    }

    function verifica() {

        var tentativa = 1;

        while (tentativa <= 3){

            for (var quantidade = 1; quantidade <= quantidade_numero; quantidade++){

                sorteia(numero_limite);

            }

            for(var posicao = 0; posicao < lista_numeros.length; posicao++){

                if(lista_numeros[posicao] == input.value) {
                    alert("Parabéns! Você acertou um dos números secretos");
                    break;
                }

                else {
                    alert("Infelizmente você errou!");
                    tentativa++
                }

            }

        }
    }

    var quantidade_numero = prompt("Quantos números você quer adicionar na lista secreta para tentar adivinhar?");

    var numero_limite = prompt("Qual o número limite para os sorteios?");

    var input = document.querySelector("input");

    var button = document.querySelector("button");
    button.onclick = verifica;

</script>
5 respostas
solução!

Boa tarde Luiz, tudo bem?

Acredito que o que esteja fazendo o seu código travar seja a falta de um primeiro argumento na lista_numeros antes de você criar um for utilizando como critério de parada o seu comprimento e comparando no if a posição da lista com o número aleatório.

Verifique o código abaixo por gentileza:

<input/>
<button>Veja se adivinhou o número</button>

<script>

    var lista_numeros = [];

    function sorteia(n){

        var numero = false;

        numeroAleatorio = Math.round(Math.random() * parseInt(n));

        lista_numeros[0] = n;

        for(var posicao = 0; posicao <= lista_numeros.length; posicao++) {
            if(lista_numeros[posicao] == numeroAleatorio) {
                numero = true;
                break;
            }

            else{

                lista_numeros.push(numeroAleatorio);
            }
        }
    }

    function verifica() {

        var tentativa = 1;

        while (tentativa <= 3){

            for (var quantidade = 1; quantidade <= quantidade_numero; quantidade++){

                sorteia(numero_limite);

            }

            for(var posicao = 0; posicao < lista_numeros.length; posicao++){

                if(lista_numeros[posicao] == input.value) {
                    alert("Parabéns! Você acertou um dos números secretos");
                    break;
                }

                else {
                    alert("Infelizmente você errou!");
                    tentativa++
                }

            }

        }
    }

    var quantidade_numero = prompt("Quantos números você quer adicionar na lista secreta para tentar adivinhar?");

    var numero_limite = prompt("Qual o número limite para os sorteios?");

    var input = document.querySelector("input");

    var button = document.querySelector("button");
    button.onclick = verifica;

</script>

Dessa forma o código não trava mais ao clicar no botão. Porém creio que a lógica não esteja exatamente fazendo aquilo que você deseja, pelo que pude entender do código e de suas intenções com ele. Enfim, espero ter lhe ajudado a pelo menos resolver o problema do botão estar travando seu navegador. Abraços e bons estudos.

Consegui resolver o problema do botão, mas agora na verificação ele repete 3 vezes que eu errei, e depois fala que eu certei. Não consigo consertar esse loop..

<input/>
<button>Veja se adivinhou o número</button>

<script>

    var lista_numeros = [];

    function sorteia(n){

        var numero = false;

        var numeroAleatorio = Math.round(Math.random() * parseInt(n));

        for(var posicao = 0; posicao < lista_numeros.length; posicao++) {
            if(lista_numeros[posicao] == numeroAleatorio) {
                numero = true;
                break;
            }

        }

        if (numero == false){

            lista_numeros.push(numeroAleatorio);

        }

        return lista_numeros;
    }

    function verifica() {

        var tentativa = 1;

        while (tentativa <= 3){

            var input = parseInt(document.querySelector("input"));

            for (var quantidade = 1; quantidade <= quantidade_numero; quantidade++){

                sorteia(numero_limite);

            }

            for(var posicao = 0; posicao <= lista_numeros.length; posicao++){

                if(lista_numeros[posicao] == input.value) {
                    alert("Parabéns! Você acertou um dos números secretos");
                    break;
                }

                else {
                    alert("Infelizmente você errou!");
                    input.value = "";
                    tentativa++;

                }

            }

        }
    }

    var quantidade_numero = parseInt(prompt("Quantos números você quer adicionar na lista secreta para tentar adivinhar?"));

    var numero_limite = parseInt(prompt("Qual o número limite para os sorteios?"));

    var button = document.querySelector("button");
    button.onclick = verifica;

</script>

Será que esse break é legal para IFs, geralmente eu uso return, mas fica minha dúvida ai para os Professores. Break se usa em IFs?

Bom dia a todos.

O break é usado para quebrar o loop (estrutura de repetição) mais próximo. Se você faz um break em uma condição if, não estará saindo da condição if, estará na verdade saindo da estrutura de repetição. E por estar saindo da estrutura de repetição, acaba saindo do if. Mas seu questionamento é válido, a intenção do break é quebrar um loop, um laço de repetição. Há outras formas de sair de um laço de repetição, por exemplo, mudando o valor da variável de incremento para um valor que retorne false lá na condição do laço.

Exatamente, professor Flávio!!!