5
respostas

0 Não existe ingrediente re

Olá bom dia. Estou tentando fazer o exercício mas estou tendo dificuldade, não quero olhar o que está pronto, até mesmo porque estou me decidindo se Desenvolvimento é para mim.

<meta charset="UTF-8">

<h1>Receitas do Yan</h1>

<script>
    //declara uma lista vazia
    var ingredientes = [];
    //pergunta ao usuário a quantidade de ingredientes
    var quantidade = parseInt(prompt("Quantos ingredientes você vai adicionar?"));
    //gera a quantidade de números para contar
    var contador = 1;

    while( contador <= quantidade) {
        var ingrediente = prompt("Informe o ingrediente " + contador);        

        var achou = false;
        for (var posicao = 0; posicao < ingredientes.length; posicao++){
            if(ingredientes[posicao] == ingrediente){
            ingredientes.push(ingrediente);
                achou = true;
                break;
            }
            if (achou == false){
                ingredientes.push(ingrediente);
            }

        }
        contador++;    
    }

    console.log(ingredientes);
</script>

Acredito que meu código está errado, pois não está fazendo o que foi pedido, seria possível me dar uma dica do que pensar na lógica para conseguir fazer o exercício?

Agradeço qualquer auxilio, obs não passe a resposta =)

5 respostas

Olá Shellen, tudo bem com você?

Antes de mais nada:

até mesmo porque estou me decidindo se Desenvolvimento é para mim.

Desenvolvimento é para todos :)

Acontece que aprender algo novo é sempre difícil e um pouco doloroso, assim como uma língua nova como inglês, ou quando começamos a ter contato com a matemática, depois que saímos desse estágio inicial as coisas vão ficando bem menos dolorosas

Agora em relação ao seu código, gostei que você está dando nomes bem específicos para as variáveis, isso ajuda muito para quem está lendo :)

Mas por que não está dando certo?

Eu vou te apresentar o fluxo do seu programa e acredito que você vai conseguir encontrar o erro :)

Vamos supor que eu quero inserir 3 ingredientes:

Então

  • Ingredientes: []
  • Quantidade: 3
  • Ingrediente: Chocolate

Vamos para o for:

var posicao = 0; posicao < ingredientes.length;

posicao = 0 e ingredientes.length = 0

Bem, como a nossa lógica do loop é de a quantidade de ingredientes ser menor, e não é o caso, não iremos entrar

  • A próxima instrução é aumentar o contador

Iremos ter o fluxo novamente, mas como não adicionamos nada, teremos que o ingredientes.length ainda é 0

Esse é o fluxo do programa e por isso o resultado final é ingredientes = []

É sempre bom fazer isso que chamamos de teste de mesa, que é executar o programa em uma folha de papel ou num bloco de notas :)

E apenas uma coisinha que precisamos reparar é que dentro do seu for:

if(ingredientes[posicao] == ingrediente){
    ingredientes.push(ingrediente);

Aqui estamos acrescentando o ingrediente mesmo que ele esteja na lista, acredito que não é o esperado :)

Mas como solucionar o problema?

Acredito que é apenas o fluxo que contém uma lógica um pouco equivocada, o ideal seria algo da seguinte maneira:

  1. Vamos percorrer de contador até a quantidade
  2. Vamos criar um loop para ver se esse elemento está na lista, utilizando uma variável de controle achou
  3. Após terminar esse loop eu verifico se ele existe ou não
  4. Se ele existe, eu não aumento o contador e peço novamente!
  5. Se ele não existe, eu adiciono e aumento o contador

Qualquer coisa eu estou a disposição :)

Abraços e Bons Estudos!

Estou tentando aqui, veja como está meu código. ele está travando.

<meta charset="UTF-8">

<h1>Receitas do Yan</h1>

<script>
    //declara uma lista vazia
    var ingredientes = [];
    //pergunta ao usuário a quantidade de ingredientes
    var quantidade = parseInt(prompt("Quantos ingredientes você vai adicionar?"));
    //gera a quantidade de números para contar
    var contador = 1;

//No while eu entendi que vai receber o contador 1 e a quantidade que vai ser colocada pelo usuário, exemplo 3
    while( contador <= quantidade) {
//Nessa primeira variável, será colocado o primeiro ingrediente
        var ingrediente = prompt("Informe o ingrediente " + contador);
//Aqui no for ele vai comparar a posição que está que é 0 e se a posição é igual (==) a alguma posição do array, lembrando que é [0] [1] [2] [3] ingredientes.        
        for (var posicao = 0; posicao == ingredientes.length; posicao++){
        var achou = false;
//Passando do for, ele vai verificar. se ingredientes na posição [] do array é igual a algum valor do array, aí aqui se for igual, fala que já existe um ingrediente
            if(ingredientes[posicao] == ingrediente){
                prompt("Já existe ");
                achou = true;
            }

            if (achou == false){
                ingredientes.push(ingrediente);
            }

        }
                contador++;

    }

    console.log(ingredientes);
</script>

Coloquei uns comentários com umas explicações para ver se estou na linha de pensamento certa.

Então Shellen, tudo bem com você?

Sua lógica está quase 100% certa, só tem um pequeno erro que é difícil de perceber, então vou te mostrar :)

Acredito que houve uma pequena confusão apenas no for:

        for (var posicao = 0; posicao == ingredientes.length; posicao++){

Se deixarmos igual ele só irá funcionar da primeira vez, quando posicao = 0e ingredientes.length = 0 depois teremos valor diferentes e ele não entrará novamente

Podemos deixar da maneira como você deixou da posicao < ingredientes.length igual na primeira versão do seu código, o maior problema está aqui:

 if (achou == false){
    ingredientes.push(ingrediente);
}

Esse código não pode estar dentro do for, vou te explicar a razão:

Vamos supor que temos as seguintes variáveis:

  • Quantidade: 5
  • Ingredientes: [ "Chocolate", "Leite Condensado"]
  • Ingrediente: "Manteiga"

Vou supor que seu código chegou até esse ponto de rodar o for:

if( ingredientes[posicao] == ingrediente)

Primeira tentativa:

  • Chocolate == Manteiga ? Falso, então achou = false

Dentro do for temos aquele código que eu chamei de problemático, como é falso iremos inserir:

  • Ingredientes: [ "Chocolate", "Leite Condensado", "Manteiga"]

Temos agora a segunda iteração do for:

  • Leite Condensado == Manteiga ? Falso, então achou = false

Insere novamente:

  • Ingredientes: [ "Chocolate", "Leite Condensado", "Manteiga", "Manteiga"]

E apenas nessa próxima iteração teremos: Manteiga == Manteiga e sairemos do loop

E tudo isso foi apenas uma passada pelo while, agora iremos aumentar o contador em + 1, e iremos para o próximo ingrediente

Como Corrigir?

Vamos deixar o nosso for para trabalhar apenas com a variável achou e dentro do bloco while a gente verifica se pode inserir ou não :)

No primeiro exemplo que eu te dei, se o código problemático estiver fora do for, teremos que achou é false porque ele nunca entrou dentro do loop, e como ele é falso nos inserimos, e ai poderemos usar numa boa, esse trecho:

        for (var posicao = 0; posicao < ingredientes.length; posicao++){

Pois já na próxima iteração teremos que posicao=0, mas ingredientes.length será 1, então funcionará :)

Um último comentário, em relação a esse contador++; no final do while, isso quer dizer que mesmo que o elemento seja repetido iremos estar acrescentando em 1, o que não queremos, vamos deixar para aumentar o contador dentro do if que adiciona o elemento :)

Qualquer coisa estou a disposição :)

Abraços e Bons Estudos!

Olá boa tarde.

Primeiramente quero te agradecer, após bater muito a cabeça e voltar novamente, consegui fazer o código, creio que ficou diferente, mas está funcionando, ele só permite adicionar um ingrediente de cada, veja o código até mesmo para testar.

Eu testei aqui e está funcionando, na verdade não precisei criar a variável achou, mas implementei dois ifs e funcionou.

<meta charset="UTF-8">

<h1>Receitas do Yan</h1>

<script>
    //declara uma lista vazia
    var ingredientes = [];
    //pergunta ao usuário a quantidade de ingredientes
    var quantidade = parseInt(prompt("Quantos ingredientes você vai adicionar?"));
    //gera a quantidade de números para contar
    var contador = 1;

//No while eu entendi que vai receber o contador 1 e a quantidade que vai ser colocada pelo usuário, exemplo 3
    while( contador <= quantidade) {
//Nessa primeira variável, será colocado o primeiro ingrediente
        var ingrediente = prompt("Informe o ingrediente " + contador);
//Aqui no for ele vai comparar a posição que está que é 0 e se a posição é igual (==) a alguma posição do array, lembrando que é [0] [1] [2] [3] ingredientes.        
        for (var posicao = 0; posicao < ingredientes.length; posicao++){

//Passando do for, ele vai verificar. se ingredientes na posição [] do array é igual a algum valor do array, aí aqui se for igual, fala que já existe um ingrediente
            if(ingrediente == ingredientes[posicao]){
                prompt("Já existe ");
                break;
            }        
        }
        if (ingrediente != ingredientes[posicao]){
            ingredientes.push(ingrediente);
            contador++;
        }
    }

    console.log(ingredientes);
</script>

Acredito que desta forma também esteja correto, muito obrigada pelas dicas.

Fazendo alguns testes no meu código como faria para informar que o ingrediente já existe sem ele precisar digitar um valor? https://prnt.sc/sfh7if Tem como?