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

Ingredientes repetidos

Boa noite pessoal.

Tô precisando de uma ajuda com minha lógica, por favor.

O exercício pede pra escrever um código que armazene os ingredientes de uma receitas num vetor, com a condição de não aceitar ingredientes repetidos.

Tentei fazer sozinho aqui, mas não consegui. Eu consigo alertar o usuário que o ingrediente já está no array, mas não consigo rejeitar ingredientes repetidos. Todo ingrediente adicionado fica armazenado.

Agradeço desde já a quem puder me ajudar.

<meta charset="UTF-8">

<h1>Receitas do Yan</h1>

<script>
    var ingredientes = [];

    var quantidade = parseInt(prompt("Quantos ingredientes você vai adicionar?"));

    var contador = 1;

    while( contador <= quantidade) {

        var ingrediente = prompt("Informe o ingrediente " + contador);

        for(var contador1 = 0; contador1 <= ingredientes.length; contador1++){
           var ingredienteNovo = false;

           if(ingrediente == ingredientes[contador1]){
             alert("Ingrediente repetido.");
             ingrediente = prompt("Informe o ingrediente " + contador);
          } else{
             ingredientes.push(ingrediente);
             contador1++;
          }

       }
       contador++;
    }

    console.log(ingredientes);
</script>
4 respostas

Bom dia meu aluno. Primeiramente, quero elogiar sua tentativa e interesse.

Seu código não funciona como esperado pelo o seguinte. A questão esta aqui:

  if(ingrediente == ingredientes[contador1]){
             alert("Ingrediente repetido.");
             ingrediente = prompt("Informe o ingrediente " + contador);
          } else{
             ingredientes.push(ingrediente);
             contador1++;
          }

O problema esta no else. Se ele não encontrar o ingrediente repetido, ele cairá no else sempre. A mesma coisa acontecerá se ele não encontrar um ingrediente repetido. Então, qual deveria ser a lógica?

Para cada ingrediente lido, você deve iterar em um loop a lista e verificar apenas com uma cláusula if se o ingrediente existe ou não. Se não existir, você terá percorrido o array até o fim, excelente, se existir, você precisa parar de pesquisar no array, pois já encontrou. Você consegue isso através de um break. Então, o código que incluiu ou não um novo ingrediente tem que estar fora do seu loop for.

For do seu loop for, você precisará saber se o ingrediente existe ou não para poder encontrá-lo. Nesse caso, você pode criar uma variável chamada existe, por exemplo, começando com false declarada antes do for. Dentro do for, se você achar o elemento, joga um true para ela e faz um break. Ai, fora do for você pergunta:

if(existe == false) {
   // adiciona o ingrediente dentro do array
}

Tenta primeiro com essas sugestões que dei. Se apertar ou ainda ficar com dúvida, só dizer aqui que detalho mais. Combinado?

Professor, como forma de praticar eu tenho pego as dúvidas do pessoal aqui no fórum e estou tentando resolver. Consegui da seguinte forma, o que acha? Pode me passar sua opinião de como construi o código?

<meta charset="UTF-8">
<title>Receita</title>
<h1>Receitas do Dalton</h1>

<script>
    var ingredientes = [];

    var quantidade = parseInt(prompt("Quantos ingredientes você vai adicionar?"));

    var contador = 1;
    var auxiliar = 0;
    while( contador <= quantidade) {

        var ingrediente = prompt("Informe o ingrediente " + contador);
        console.log("Ingrediente informado " + ingrediente);

        var achou = false;        

        for (var posicao = 0; posicao < quantidade; posicao++){
            console.log("Entrei no FOR");
            if (ingredientes[posicao] == ingrediente) {
              achou = true;
              console.log(achou);
              alert("Ingrediente já foi adicionado, informe novamente o ingrediente " + contador);
              break;
            }            
        }

        if (achou == false) {
            console.log(achou);  
            ingredientes[auxiliar] = ingrediente;
            console.log(ingredientes[auxiliar]);
            contador++;
            auxiliar++;
        }       

    }

    console.log(ingredientes);
    document.write("Os ingredientes do array são: " + ingredientes);
</script>

`
solução!

No caso, você não precisa da variável auxiliar, pode fazer assim:

 ingredientes.push(ingrediente);

Todo array possui a função push que recebe como parâmetro o valor que desejamos adicionar como último elemento. Beleza meu aluno?

Show de bola professor! Me esqueci do push.

Obrigado a dica.