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

Não permitir valores já digitador anteriormente

Me surgiu essa seguinte situação, quero saber como eu posso resolver esse problema, aqui do desafio, cap. 7 onde, entramos com 6 números e logo depois nosso programa realiza o sorteio, tudo isso utilizando dois array, agora quero saber como eu posso fazer para impedir que números já digitador não seja permitido ex: 1,1,54,7,9,27 como não deixar que esses "1" não seja seja permitido ser digitado e guardado no array jogados[], da forma que o codigo esta escrito não previu essa situação, vlw galera agradeço pela ajuda

12 respostas

Existem diversas formas de você lidar com este problema. Em linguagens de mais alto nível, por exemplo, geralmente temos uma implementação de collection do tipo Set que impede a duplicação de elementos. Logicamente falando, sem se preocupar com a linguagem, saber se um elemento já pertence a lista ou vetor implica em percorrer essa estrutura de dados buscando a primeira ocorrência do elemento pesquisado e sinalizando sua existência. O pior caso, como é de se esperar, é quando o elemento ainda não existe e verificamos a lista toda. Formas mais eficientes de fazer isso implicam em manter o conjunto ordenado e usar o algoritmo clássico de pesquisa binária. Resumidamente, você vai precisar procurar esse elemento dentro do conjunto para saber se ele existe ou não, a forma como vai fazer isso pode ser otimizada.

Basicamente você deve percorrer o Array e verificar se o número encontrado já foi digitado. Você pode usar um FOR para isto:

   for(var i = 0; i < sorteados.length; i++) {
       if (numeroSorteado == sorteados[i]) {
             alert("Número já sorteado! Escolha outro!");
             return;
       }
   }

Algo parecido com isso. Lembre-se de chamar a função para adicionar um número no ARRAY novamente.

Nada resolvido,por favor o Prof, do curso pode dar o caminho que posso resolver esse problema quero, que o programa de alguma forma impeça que numero repetido não seja permitido ao digitar eu não entre no array do números jogados, já tentei usar o push, e tentar criar outra função mas nada

Cola seu código aqui rogério que te ajudamos a adicionar essa lógica e explicamos.

<meta charset="UTF-8">

<script>

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

    var acertoPonto = function(jogados,sorteados){
        var acertos = 0;
        for(i = 0; i < 6; i++ ){
            for(j = 0; j < 6; j++){
                if(jogados[i] == sorteados[j]){
                    acertos++
                }

            }
        } 
        return acertos;
    }

     alert("Vamos lá jogar na megaSena");
    var jogado = [];

    for( i = 0; i < 6; i++){
        jogado[i] = parseInt(prompt("Diga seu Nº " + (i + 1)));

    }


    alert("Agora vou sortear os 6 numeros clique em 'ok' para continuar ");

    var sorteado = [];
    for( j = 0; j < 6; j++){
        sorteado[j] = Math.round(Math.random()*60);
    }

    var acert = acertoPonto(jogado,sorteado);

    mostra("Você jogou os números " + jogado);
    mostra("Os números sorteados forão " + sorteado);
    mostra("Você acertou  " + acert + " número(s)");







</script>

Cara, testa isso e vê se resolve.

<script>

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

var acertoPonto = function(jogados,sorteados){
    var acertos = 0;
    for(i = 0; i < 6; i++ ){
        for(j = 0; j < 6; j++){
            if(jogados[i] == sorteados[j]){
               acertos++
            }
        }
    } 
    return acertos;
}

alert("Vamos lá jogar na megaSena");
var jogado = [];

//Aqui neste ponto tente fazer o seguinte

for( i = 0; i < 6; i++){
    do {
        var numeroInformado = parseInt(prompt("Diga seu Nº " + (i + 1)));
        var numeroJaInformado = verificarNumeroJaInformado(numeroInformado, jogados);
        if(numeroJaInformado) 
           alert("Este número já foi informado, tente outro");
        else
           jogados[i] = numeroInformado;
    } while(numeroJaInformado); 
}

alert("Agora vou sortear os 6 numeros clique em 'ok' para continuar ");

var sorteado = [];
for( j = 0; j < 6; j++){
   sorteado[j] = Math.round(Math.random()*60);
}

var acert = acertoPonto(jogado,sorteado);

mostra("Você jogou os números " + jogado);
mostra("Os números sorteados forão " + sorteado);
mostra("Você acertou " + acert + " número(s)");


function verificarNumeroJaInformado(numero, vetor){
   for(int i=0; i< vetor.lenght; i++)
   {
      if(vetor[i] == numero)
      {
         return true;
      }
   }
   return false;
}

</script>

não funciona , eu tinha pensado um um logica parecida anteriormente tambem, mas nada, esse programa aqui nos dar muito aprendisado caso funcione , vlw vou continuar aqui tentando até achar uma solucao elegante

Olá Rogério, então o código do nosso amigo Carlos aparentemente funciona só precisou de pequenos ajustes, testa aí e depois responde:

<meta charset="UTF-8">
<script>
    var mostra = function(texto){
        document.write(texto + "<br/>");
    }
    var acertoPonto = function(jogados,sorteados){
        var acertos = 0;
        for(i = 0; i < 6; i++ ){
            for(j = 0; j < 6; j++){
                if(jogados[i] == sorteados[j]){
                    acertos++
                }
            }
        } 
        return acertos;
    }
    alert("Vamos lá jogar na megaSena");
    var jogados = [];
    for( i = 0; i < 6; i++){
        do {
            var numeroInformado = parseInt(prompt("Diga seu Nº " + (i + 1)));
            var numeroJaInformado = verificarNumeroJaInformado(numeroInformado, jogados);
            if(numeroJaInformado) 
               alert("Este número já foi informado, tente outro");
            else
               jogados[i] = numeroInformado;
        } while(numeroJaInformado); 
    }
    alert("Agora vou sortear os 6 numeros clique em 'ok' para continuar ");
    var sorteado = [];
    for( j = 0; j < 6; j++){
       sorteado[j] = Math.round(Math.random()*60);
    }
    var acert = acertoPonto(jogados,sorteado);
    mostra("Você jogou os números: " + jogados);
    mostra("Os números sorteados forão: " + sorteado);
    mostra("Você acertou " + acert + " número(s).");
    function verificarNumeroJaInformado(numero, vetor){
       for(var i = 0; i < vetor.length; i++)
       {
          if(vetor[i] == numero)
          {
             return true;
          }
       }
       return false;
    }
</script>

legal resolveu , por ultimo queria saber como funcionar os return da função vericarNumeroJaInformado, e também vi que 'if' e usado if(numeroJaInformado) somente dessa forma e o while de igual maneira e função logo fica la em baixo de todo código , para mim e importante saber de todos esses detalhes já que estou começando a engatilhar no mundo dos dev , vlw galera

solução!

Então Rogério, vamos por partes.

O retorno de uma função em javascript é fracamente tipado, basta retornar "algo" e o trecho invocador deste método recebe este retorno e o manipula. No nosso caso, retornamos um booleano e o método invocador o armazenou em uma variável para verificar (usando o if) se o retorno foi verdadeiro ou falso.

Pense o seguinte, a cada novo valor digitado estamos perguntando para a função "verificarNumeroJaInformado" (função, olhe para mim se este valor já está dentro desta lista. Então ela responde SIM = true ou Não = false).

Quanto ao While, usamos o bloco do {.... } while que diz ao browser, "Browser, execute esse trecho de código enquanto a minha condição (neste caso o retorno da função "verificarNumeroJaInformado" for verdadeiro), ou seja, continue avisando meu usuário que o número já foi informado e peça um novo para ele até que o número seja um não usado ainda", cada vez que ele repete a mensagem de numero ja utilizado, o valor do i continua igual e somente vai ser incrementado a cada vez que ele informar um valor novo.