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

Desafio final: dúvida na comparação e validação de dados (for e if com arrays)

Meus amigos,

Estou quebrando a cabeça com dois pontos e preciso de uma força. Primeiro, segue o código completo do teste final:

    //     VARIÁVEIS PRINCIPÁIS

    var sorteados = [];
    var jogo = [];
    var totNumSorteados = 6;
    var podeInserir = true;


    //     FUNCTIONS

    var aleatorio = function() {
        for (var i = 0; i <= totNumSorteados; i++) {
            var random = Math.round((Math.random() * 20) + 1);
            if (sorteados.length > 0) {
                for (var j = 0; j < sorteados.length; j++) {
                    while (sorteados[j] == random) {
                        var random = Math.round((Math.random() * 20) + 1);
                    };                        
                };            
            };
            sorteados.push(parseInt(random));
        };
        document.write(sorteados + "<br>"); // log 
    };

    var inputJogo = function() {
        for (var i = 0; i < totNumSorteados; i++) {
            podeInserir = true;
            var aux = i + 1;
            var input = parseInt(prompt("De 1 a 60, informe seu número " + aux));
            if (jogo.length >= 1) {
                for (var h = 0; h < jogo.length; h++){
                    if (podeInserir = true){
                        alert("O for funciona.");
                    };
                    if (jogo[h] == input) {
                        alert("Você não pode informar números repetidos, tente novamente.");
                        i--;
                        podeInserir = false;
                    };
                };
                if (podeInserir == true) {
                    jogo.push(input);
                };
            };
        };
    };

    var verificar = function() {
        for (var x = 0; x < jogo.length; x++) {
            for (var y = 0; y < sorteados.length; y++) {
                if (sorteados[x] == jogo[y]) {
                    console.log("Teste de comparação = true;");
                    document.write("<p>Legal!!! Você acertou o número " + sorteados[y] + "!!! Parabéns!!!</p>");
                };
            };
        };
    };


    // EXECUÇÃO

    aleatorio();

    inputJogo();

    verificar();

Agora as dúvidas.

a. Na function verificar não estou conseguindo fazer a comparação dos arrays, e eu não entendi o motivo. Em tese era pra funcionar. Eu já testei o for e está ok, o problema esta no if mesmo. Ja converti os dados para inteiro, inverti os contadores e nada. Quem puder dar uma luz, agradeço muito :)

b. tem um bug no teste que o código faz para verificar se o número inserido pelo usuário já foi inserido anteriormente no array que também não estou conseguindo resolver. É este trecho da function inputJogo:

                for (var h = 0; h < jogo.length; h++){
                    if (podeInserir = true){
                        alert("O for funciona.");
                    };
                    if (jogo[h] == input) {
                        alert("Você não pode informar números repetidos, tente novamente.");
                        i--;
                        podeInserir = false;
                    };
                };

Os que puderem dar uma luz, fico imensamente grato.

Abraço,

Hildo Quetz

4 respostas
solução!

Olá Hildo! Então, irei responder suas dúvidas de uma vez só pois creio que é a mesma solução para as duas.

Veja bem, a comparação das arrays está correta, sua função verificar não possui nenhum erro. O problema todo está em sua função inputJogo, mais precisamente em um pequeno descuido seu no if().

Repare só vamos analisar seu if(), irei chama-lo de IF1:

            if (jogo.length >= 1) {
                for (var h = 0; h < jogo.length; h++){
                    if (podeInserir = true){
                        alert("O for funciona.");
                    };
                    if (jogo[h] == input) {
                        alert("Você não pode informar números repetidos, tente novamente.");
                        i--;
                        podeInserir = false;
                    };
                };
                if (podeInserir == true) {
                    jogo.push(input);
                };
            };

Veja bem, o bloco de código dentro desse seu IF1 só é executado quando atendida a condição dele, ou seja quando sua array tiver tamanho maio ou igual a 1. Porém perceba o seu utitmo if() dentro do IF1, irei chamar esse ultimo if() de IF2.

 if (podeInserir == true) {
      jogo.push(input);
  };

Com esse IF2 você adiciona o número informado pelo usuário à array. Porém, o erro está que esse código NUNCA está sendo executado e você pode se perguntar "Por que?".

Simples, você colocou o IF2 dentro do bloco de código do IF1, logo para ele ser executado a condição do IF1 deve ser atendida. No entanto, a condição do IF1 é que o tamanho da Array seja maior ou igual a 1 e você não está adicionando nenhum elemento a Array, pois o código que adiciona o número a Array está dentro desse IF1 que não está sendo executado pois sempre o tamanho da Array é 0.

Meio complicado né? Mas é esse o problema.

Eu não entendi bem sua segunda dúvida mas testei seu código após a alteração para consertar o problema da primeira dúvida e tudo funcionou normalmente.

Enfim, o correto seria você por o IF2 fora do IF1, ficando da seguinte forma:

var inputJogo = function() {
        for (var i = 0; i < totNumSorteados; i++) {
            podeInserir = true;
            var aux = i + 1;
            var input = parseInt(prompt("De 1 a 60, informe seu número " + aux));
            if (jogo.length >= 1) {
                for (var h = 0; h < jogo.length; h++){
                    if (jogo[h] == input) {
                        alert("Você não pode informar números repetidos, tente novamente.");
                        i--;
                        podeInserir = false;
                    };
                };

            };
            if(podeInserir){
                jogo.push(input);
            }
        };
    };var inputJogo = function() {
        for (var i = 0; i < totNumSorteados; i++) {
            podeInserir = true;
            var aux = i + 1;
            var input = parseInt(prompt("De 1 a 60, informe seu número " + aux));
            if (jogo.length >= 1) {
                for (var h = 0; h < jogo.length; h++){
                    if (jogo[h] == input) {
                        alert("Você não pode informar números repetidos, tente novamente.");
                        i--;
                        podeInserir = false;
                    };
                };

            };
            if(podeInserir){
                jogo.push(input);
            }
        };
    };

Outro pequeno probleminha, que acho que você não percebeu, é que estão sendo sorteados 7 números. O problema está no for() da sua função aleatorio:

for (var i = 0; i <= totNumSorteados; i++)

O correto seria estar assim:

for (var i = 0; i < totNumSorteados; i++)

Enfim, espero ter ajudado! Bons Estudos! Abraços!

Bom dia Romário,

Muito obrigado meu camarada.

De fato, remover aquele primeiro if solucionou grande parte dos problemas, e a dica do for gerando 7 números eu não tinha visto mesmo, valeu !

Aproveitei para dar uma refinada no código também:

  • agora atende a todas as especificações do desafio;
  • valida números repetidos sorteados;
  • valida números repetidos inseridos pelo usuário;
  • ajuste de bug no verificar (validava números não inseridos);

Segue o código novamente:


    //    VARIÁVEIS PRINCIPÁIS

    var sorteados = [];
     var jogo = [];
     var totNumSorteados = 6;
     var totNumConcorrendo = 60;
     var podeInserir = true;
     var errouTodas = true;

     //     FUNCTIONS

     var aleatorio = function() {
         totNumSorteados--;
         for (var i = 0; i <= totNumSorteados; i++) {
             var random = Math.round((Math.random() * totNumConcorrendo) + 1);
             if (sorteados.length > 0) {
                 for (var j = 0; j < sorteados.length; j++) {
                     while (sorteados[j] === random) {
                         var random = Math.round((Math.random() * totNumConcorrendo) + 1);
                     };                        
                 };            
             };
             sorteados.push(parseInt(random));
         };
         document.write("<p>Os números sorteados foram: </>")
         document.write(sorteados + ". <br>");
     };

     var inputJogo = function() {
         for (var i = 0; i < totNumSorteados; i++) {
             podeInserir = true;
             var aux = i + 1;
             var input = parseInt(prompt("De 1 a 60, informe seu número " + aux));
             while (input > 60 || input < 1) {
                 var input = parseInt(prompt("Atenção, insira apenas números entre 1 e 60."));
             };
             for (var h = 0; h < jogo.length; h++){
                 if (jogo[h] == input) {
                     alert("Você não pode informar números repetidos, tente novamente.");
                     i--;
                     podeInserir = false;
                 };
             };
             if (podeInserir == true) {
                 jogo.push(input);
             };
         };
     };

     var texto = function(info){
         document.write(info + "<br>");
     };

     var verificar = function() {
         for (var x = 0; x < jogo.length; x++) {
             var errouTodas = true;
             for (var y = 0; y < sorteados.length; y++) {
                 if (sorteados[y] === jogo[x]) {
                     console.log("Teste de comparação = true;");
                     texto("<p>Você acertou o número " + sorteados[y] + "!!! Parabéns!!!</p>");
                     errouTodas = false;
                 };
             };
         };
         if (errouTodas = true) {
             document.write("<p>Infelizmente você errou todos os números, mais sorte da próxima vez.</p>");
         };
     };


     // EXECUÇÃO

     inputJogo();

     aleatorio();

     verificar();

Romário, super obrigado pelas dicas, ajudaram bastante !

Abraço,

Hildo Quetz

Olá Hildo! Que bom que pude te ajudar. Vou te dar mais uma dica, não precisa por a condição de seu if() dessa forma:

if (podeInserir == true)

ou

if (errouTodas == true)

Pois se torna redundante, você pode simplesmente utilizar a variável, pois ela já é um boolean então o valor dela ja traz a resposta true ou false para a condição e também facilita na leitura e compreensão do código. Ficando assim:

if (podeInserir)
if (errouTodas)

Veja que agora ficou até mais fácil de lê. Agora podemos ler "Se podeInserir então ..."

Espero ter ajudado! Bons Estudos!

Maravilha,

Valeu Romário ! De fato o código fica mais clean.

Obrigado, um abraço.

Hildo Quetz