Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Condição de validação não funcionam.

Amigos,

estou tentando refazer o exercício final mas com algumas alterações. Segue código.

<meta charset="UTF-8">

<script>

    function geraNum() {
        return Math.round(Math.random()*10);
    }

    function sorteiaNum(quantidadeMaxima) {

        var totalNumerosSorteados = 0;
        var numGerados = [];

        while(totalNumerosSorteados < quantidadeMaxima) {

            var numeroTeste = geraNum();

            for ( var i=0 ; i<numGerados.length ; i++) { 

                verifica = true;

                while(verifica) {

                    if(numeroTeste > 0 && numeroTeste <10){ // Validando somente números entre 1 ~ 9.

                        if(numeroTeste !== numGerados[i]) {

                            break;
                        }
                    }

                    numeroTeste = geraNum();
                    i=0;
                }
            }

            numGerados.push(numeroTeste);

            totalNumerosSorteados++;
        }

        return numGerados;
    }    

    var numerosSorteados = sorteiaNum(6);
    console.log(numerosSorteados.sort());

</script>

No código abaixo, na linha 24 onde há um comentário, o comportamento que eu espera obter era: a estrutura condicional "if" apenas valida um número entre 1 e 9, fazendo que, ao final do laço, apenas números não repetidos e dentro do intervalo citado farão parte do array "numGerados". Ao abrir a página verifiquei que embora os números não se repetiam, os números 0 e 10 aindam continuavam a ser inseridos no array "numGerados".

Agradeço pela força!

1 resposta
solução!

Olá, Wesley, tudo bem?

Muito legal que você tenha feito alterações no código do instrutor! Isso nos ajuda a treinar o raciocínio lógico.

Aliás, uma dica que te dou é: reflita sobre as diferenças entre o seu código e o do instrutor! Isso vai fazer você enxergar o mesmo problema através de diferentes pontos de vista.

Agora analisando seu código, eu percebi que nele há uma brecha! Você está fazendo a verificação if(numeroTeste > 0 && numeroTeste <10) dentro do for. Caso você preste bastante atenção, o bloco for não é executado quando o primeiro número é sorteado, ou seja, quando o array numGerados ainda está vazio!

A brecha que isso causa é que se o primeiro número gerado for 0 ou 10, a verificação não será feita, e o número será adicionado no array numGerados.

Mais uma dica: Depure seu código! Uma maneira de fazer isso é adicionando console.log em diferentes partes do seu código. Essa é uma prática que nos ajuda a entender o fluxo do código. Aliás, foi assim que descobri a brecha do código!

Por exemplo, algumas adições que fiz na função sorteiaNum:

function sorteiaNum(quantidadeMaxima) {

        var totalNumerosSorteados = 0;
        var numGerados = [];

        while(totalNumerosSorteados < quantidadeMaxima) {

            var numeroTeste = geraNum();

            for ( var i=0 ; i<numGerados.length ; i++) { 

                verifica = true;

                while(verifica) {
                    console.log('Número atual: ' + numeroTeste)
                    if(numeroTeste > 0 && numeroTeste <10){ // Validando somente números entre 1 ~ 9.

                        if(numeroTeste !== numGerados[i]) {

                            break;
                        }
                    }
                    console.log('Não passou nas verificações: ' + numeroTeste);

                    numeroTeste = geraNum();

                    console.log('Novo número gerado: ' + numeroTeste);

                    i=0;
                }
            }

            numGerados.push(numeroTeste);
            console.log(numeroTeste + ' adicionado.')

            totalNumerosSorteados++;
        }

        return numGerados;
    }    

Olha como fica legal o resultado disso no console:

Print do console do navegador com alguns resultados como: "10 adicionado", "Número atual: 8", "8 adicionado.", entre outros.

Inclusive, foi possível capturar o bug do 10 sendo adicionado ali no início ;)

Enfim, para resolver o problema, você pode simplesmente mudar o lugar da verificação if (numeroTeste > 0 && numeroTeste <10) para logo depois de var numeroTeste = geraNum();, antes do for:

            var numeroTeste = geraNum();
            if (numeroTeste > 0 && numeroTeste < 10) { // Validando somente números entre 1 ~ 9.

                for (var i = 0; i < numGerados.length; i++) {
                    // Restante do código...
                }
            }

Espero ter te ajudado! Qualquer dúvida estaremos aqui para te responder. Bons estudos! :)