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

Dúvida no Ex. 1 da Aula 7 - Desafio final

Boa Tarde.

Tentei criar uma condição para que a máquina executasse o sorteio e fizesse a separação dos números em dois arrays. O primeiro dos números menores que 60 e que NÃO tivessem sido sorteados. O segundo array com os demais números. Acontece que os números repetidos continuam aparecendo no primeiro array. Podem me ajudar ?

<meta charset="utf-8">

<script>

var numeroSena = [];
var numeroMaior = [];

while (numeroSena.length < 6) {

  var numerosAleatorios = Math.round(Math.random() * 100);

          if(numerosAleatorios <=60 && numeroSena != numerosAleatorios) {
          numeroSena.push(numerosAleatorios);
          } else {
          numeroMaior.push(numerosAleatorios);
          }
}


console.log("Números para a Sena " + numeroSena);
console.log("Números descartados " + numeroMaior);

</script>
8 respostas

Olá vou passar algumas correções que podem resolver.

1 - nesse trecho do código if(numerosAleatorios <=60 && numeroSena != numerosAleatorios) você diz numeroSena != numerosAleatorios, porém você declarou numeroSena como sendo um vetor, então você tem que avaliar cada posição do vetor, para ver se algum valor do vetor é ou não igual ao número sorteado, para isso você deve usar um loop for parecido com esse abaixo

while (numeroSena.length < 6) {
    if(numeroSena.length==0){
        var numerosAleatorios = Math.round(Math.random() * 100);
        if(numerosAleatorios <=60){
            numeroSena.push(numerosAleatorios);
        }else{continue;}
    }else{     
        for(var i=0; i < numeroSena.length;i++){
            if(numerosAleatorios <=60 &&
             numeroSena[i] != numerosAleatorios){
                if(i+1 = numeroSena.length){
                    numeroSena.push(numerosAleatorios);
                }else{continue;}
            }else{numeroMaior.push(numerosAleatorios);
                continue;
            }
        }
    }
}

Tente dar uma analisada no loop a cima, o que ele faz é rodar até que os 6 números da mega estejam sorteados, o while garante isso, depois caso o Array que guarda os números da mega não tenha nenhum valor ainda eu faço o sorteio do número e testo se ele é menor ou igual a 60 se for eu já faço o push, ai a partir do primeiro push o teste tem que mudar. Crio um loop que garante que passa por todo o vetor dos números já sorteados para a mega, ai eu testo se o valor sorteado é igual ao número na posição do vetor atual, se não for igual eu testo se essa posição é a última para ter certeza que eu realmente verifiquei todos os sorteados, se for o último eu faço o push, se não for eu faço continue; para voltar pro restante dos números. E caso o número seja igual a um já sorteado ou maior que 60 eu faço ele continuar e também incluo no vetor que você criou para reservar esses números, e o while garante que esse loop só termine quando tiver lançado os 6 números da mega.

Espero que isso lhe ajude. Att Adriano Oliveira

Opa. Então Adriano, o conflito nesse código que você passou aconteceu na seguinte sentença :

if(i+1 = numeroSena.length) {

Eu consegui resolver o problema de outra forma. Porem ficou muito extenso o código...rs.

O problema de repetir números em qualquer posição da array foi resolvido. Quando algum número repetido é sorteado, ele é direcionado para o array numeroErrado e pode ser conferido no console.

Se você tiver uma outra perspectiva, ou mesmo entender o que aconteceu naquela sentença acima eu agradeço.

<meta charset="utf-8">

<script>

var numeroSena = [];
var numerosErrados = [];

var sorteioValido = function() {

  var numerosAleatorios = Math.round(Math.random() * 100);

    for (var i = 0; i < 1; i++) {
        if(numeroSena[0] == numerosAleatorios) {
        numerosErrados.push(numerosAleatorios);
        return;
        }
        if(numeroSena[1] == numerosAleatorios) {
        numerosErrados.push(numerosAleatorios);
        return;
        }
        if(numeroSena[2] == numerosAleatorios) {
        numerosErrados.push(numerosAleatorios);
        return;
        }
        if(numeroSena[3] == numerosAleatorios) {
        numerosErrados.push(numerosAleatorios);
        return;
        }
        if(numeroSena[4] == numerosAleatorios) {
        numerosErrados.push(numerosAleatorios);
        return;
        }
        if(numeroSena[5] == numerosAleatorios) {
        numerosErrados.push(numerosAleatorios);
        return;
        }
    }

    if(numerosAleatorios <=60) {
      numeroSena.push(numerosAleatorios);
    }
}

while (numeroSena.length < 6) {
sorteioValido ();
}

console.log("Números para a Sena " + numeroSena);
console.log("Números descartados " + numerosErrados);


</script>

Att. Rodrigo Rodrigues

Opa Rodrigo, na sentença que postei if(i+1 = numeroSena.length) { esqueci que para comparar igualdade é ==, 1 = é para atribuir valor, tente trocar por if(i+1 == numeroSena.length) {

Desculpe minha distração.

Fiz o teste corrigindo a sentença e, apesar do console não apontar nenhum erro agora, o arquivo não consegue abrir.

<meta charset="utf-8">

<script>

var numeroSena = [];
var numerosErrados = [];

while (numeroSena.length < 6) {
    if(numeroSena.length==0){
        var numerosAleatorios = Math.round(Math.random() * 100);
        if(numerosAleatorios <=60){
            numeroSena.push(numerosAleatorios);
        }else{continue;}
    }else{
        for(var i=0; i < numeroSena.length;i++){
            if(numerosAleatorios <=60 &&
             numeroSena[i] != numerosAleatorios){
                if(i+1 == numeroSena.length){
                    numeroSena.push(numerosAleatorios);
                }else{continue;}
            }else{numerosErrados.push(numerosAleatorios);
                continue;
            }
        }
    }
}

console.log("Números para a Sena " + numeroSena);
console.log("Números descartados " + numerosErrados);

</script>

Imagina o que pode ser ?

Obrigado !

Olá, abri o código no meu Sublime e revisei, segue código corrigido funcionando.

<meta charset="utf-8">

<script>

var numeroSena = [];
var numerosErrados = [];

while (numeroSena.length < 6) {
    if(numeroSena.length==0){
        var numerosAleatorios = Math.round(Math.random() * 100);
        if(numerosAleatorios <=60){
            numeroSena.push(numerosAleatorios);
        }else{continue;}
    }else{
        for(var i=0; i < numeroSena.length;i++){
            var numerosAleatorios = Math.round(Math.random() * 100);
            if(numerosAleatorios <=60 &&
             numeroSena[i] != numerosAleatorios){
                if(i+1 == numeroSena.length){
                    numeroSena.push(numerosAleatorios);
                    break;
                }else{continue;}
            }else{numerosErrados.push(numerosAleatorios);
                break;
            }
        }
    }
}

console.log("Números para a Sena " + numeroSena);
console.log("Números descartados " + numerosErrados);

</script>

Tive que fazer 2 correções. A primeira que era o motivo do código ficar em loop eterno era que nesse trecho do código antigo

for(var i=0; i < numeroSena.length;i++){
            if(numerosAleatorios <=60 &&
             numeroSena[i] != numerosAleatorios){

Ele não havia sorteado novamente o numerosAleatorios, por que agente só colocou o sorteio no if de quando o Array dos números sorteados tava vazio, ai depois que o Array recebia o primeiro elemento ele entrava no else e não tinha mais o sorteio do número ai eu adicionei ele aqui.

for(var i=0; i < numeroSena.length;i++){
            var numerosAleatorios = Math.round(Math.random() * 100);
            if(numerosAleatorios <=60 &&
             numeroSena[i] != numerosAleatorios){

Ou seja dentro do for para ele poder sortear de novo caso de errado mas antes dele fazer as validações com o número sorteado.

A segunda correção foi algumas questões que eu não havia percebido a primeira vez que tentei lhe ajudar, eu devia ter aberto o código no sublime já desculpe. Mas foi o seguinte nesse else aqui

}else{numerosErrados.push(numerosAleatorios);
                continue;
            }

Que ele cai quando o número sorteado deu errado, agente não pode dar o continue, por que se ele continuar a variável do for já não estará com o valor 0, e não vai olhar se o próximo número sorteado é igual aos primeiros números do Array dos número da Mega, ele vai olhar só a partir do valor que a variável do for estiver, e isso poderia fazer repetir números na sua Mega, ai eu substitui o continue por break, pra forçar ele a voltar pro while e ai quando cair no for a variável do for vem zerada de novo.

E a outra correção é que depois do numeroSena.push(numerosAleatorios); eu tenho que dar break, pois o push aumentou o length do Array e vai permitir o for rodar de novo e ter a chance de sortear mais do que 6 números, ai se eu forçar o break ali caso já tenha 6 números sorteados o while não vai passar e o loop é encerrado.

Desculpe ter passando instruções erradas, da próxima vez vou abrir o código no Sublime desde de o começo.

Att Adriano Oliveira

Bom dia Adriano.

Realmente o código rodou com essas ultimas correções que você executou, porem ele ainda repete alguns números dentro do array numeroSena.

Para facilitar que isso aconteça, diminui a regra do numerosAleatorios de <=60 para <=8 ( para diminuir o campo de execução ) :

... e também adicionei // na linha no console.log dos números descartados pois esse ficou muito grande !

Se você der refresh no programa vai notar que os números ainda estão se repetindo.

Por curiosidade, faça o mesmo no código que eu postei na resposta 3 (aquele bem extenso !) , onde os números não se repetem, mesmo nesse campo menor.

<meta charset="utf-8">

<script>

var numeroSena = [];
var numerosErrados = [];

while (numeroSena.length < 6) {
    if(numeroSena.length==0){
        var numerosAleatorios = Math.round(Math.random() * 100);
        if(numerosAleatorios <=8){
            numeroSena.push(numerosAleatorios);
        }else{continue;}
    }else{
        for(var i=0; i < numeroSena.length;i++){
            var numerosAleatorios = Math.round(Math.random() * 100);
            if(numerosAleatorios <=8 &&
             numeroSena[i] != numerosAleatorios){
                if(i+1 == numeroSena.length){
                    numeroSena.push(numerosAleatorios);
                    break;
                }else{continue;}
            }else{numerosErrados.push(numerosAleatorios);
                break;
            }
        }
    }
}

console.log("Números para a Sena " + numeroSena);
//console.log("Números descartados " + numerosErrados);

</script>

Att. Rodrigo Rodrigues

solução!

Cara gostei de ver como você é minucioso em seus testes, e realmente o código tinha um erro que mais uma vez não percebi.

Seguinte note esse trecho do código.

 for(var i=0; i < numeroSena.length;i++){
            var numerosAleatorios = Math.round(Math.random() * 100);
            if(numerosAleatorios <=8 &&
             numeroSena[i] != numerosAleatorios){
                if(i+1 == numeroSena.length){
                    numeroSena.push(numerosAleatorios);
                    break;
                }else{continue;}

Ele faz o seguinte ele verifica se o número sorteado não é igual a posição atual do Array dos já sorteados, quando não é igual ele olha se o o Array dos já sorteados está em sua última posição já, por que dai quer dizer que ele já comparou com o vetor todo, mas quando não é a última posição ainda ele da um continue e volta para o próximo i do loop, só que dai ele sortia o número de novo, e não verifica mais as posições já verificadas do loop e como o número sorteado é novo ele pode muito bem ser igual a um número já sorteado e que já ficou para traz na posição i do Array, e ai acaba repetindo o número. Segue novo código.

<meta charset="utf-8">

<script>

var numeroSena = [];
var numerosErrados = [];

while (numeroSena.length < 6) {
var numerosAleatorios = Math.round(Math.random() * 100);
    if(numeroSena.length==0){
        if(numerosAleatorios <=8){
            numeroSena.push(numerosAleatorios);
        }else{continue;}
    }else{
        for(var i=0; i < numeroSena.length;i++){
            if(numerosAleatorios <=8 &&
             numeroSena[i] != numerosAleatorios){
                if(i+1 == numeroSena.length){
                    numeroSena.push(numerosAleatorios);
                    break;
                }else{continue;}
            }else{numerosErrados.push(numerosAleatorios);
                break;
            }
        }
    }
}

console.log("Números para a Sena " + numeroSena);
//console.log("Números descartados " + numerosErrados);

</script>

Quanto ao seu código ficou funcional mesmo parabéns.

Muito obrigado pela atenção e por todos os esclarecimentos Adriano ! E desculpe por encher tanto o saco....rs. Funcionou 100 % agora, e pude esclarecer muitas duvidas com essa solução que você apresentou.

Obrigado fera !