1
resposta

Estava funcionando em partes, já resolvi, agora funciona, mas queria uma explicação.

<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);
        var achou = false;

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

            if (ingredientes[posicao] == ingrediente) {

                achou = true;
                break;
            }
        }

        while (achou == true) {

            ingrediente = prompt("Ingrediente já informado, por favor, digite outro ingrediente.");

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

                if (ingredientes[posicao] == ingrediente) {

                    achou = true;
                } else {
                    achou = false;
                }
            }
        }

        if (achou == false) {

            ingredientes.push(ingrediente);
            contador++;
        }

    }

    console.log(ingredientes);
</script>

O problema que eu estava enfrentando era o seguinte: Durante os testes, caso eu repitisse um ingrediente logo após tê-lo digitado, o programa fazia o esperado. Porém, se eu colocasse um ingrediente novo e, logo em seguida, colocasse o primeiro ingrediente novamente, ele reconhecia inicialmente, apresentava a mensagem de erro, mas se eu digitasse o mesmo ingrediente novamente, ele aceitava, não reconhecia que este já existia na lista e incrementava o contador de qualquer forma, passando ao item seguinte. Dessa forma, era possível fazer um array com ['Farinha', 'Ovo', 'Farinha', 'Ovo', 'Ovo'].

Eu percebi que o erro estava no fato de eu não ter quebrado o "for" com "break;", nas linhas 34, 35, porém, não achava que seria necessário, devido à condição do "while()". Queria entender por que o meu raciocínio estava errado, e por que o "break;" é necessário ali. Quero entender como o programa compreende as instruções sem esse "break;" naquela posição, por gentileza.

O código, agora funcional:

<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);
        var achou = false;

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

            if (ingredientes[posicao] == ingrediente) {

                achou = true;
                break;
            }
        }

        while (achou == true) {

            ingrediente = prompt("Ingrediente já informado, por favor, digite outro ingrediente.");

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

                if (ingredientes[posicao] == ingrediente) {

                    achou = true;
                    break;
                } else if(ingredientes[posicao] != ingrediente){
                    achou = false;                    
                }
            }
        }

        if (achou == false) {

            ingredientes.push(ingrediente);
            contador++;
        }

    }

    console.log(ingredientes);
</script>
1 resposta

Olá Roodney, tudo bem com você?

Agradeço sua paciência em aguardar por sua resposta.

Certo, no primeiro código que você compartilhou falando que funcionava só em partes, porém em uma situação que você apresentou ele deu problema, que seria nesse ponto:

while (achou == true) {

            ingrediente = prompt("Ingrediente já informado, por favor, digite outro ingrediente.");

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

                if (ingredientes[posicao] == ingrediente) {

                    achou = true;
                } else {
                    achou = false;
                }
            }
        }

Esse seu problema ocorreu porque quando ingredientes[posicao] == ingrediente você passou para variável achou o valor true , e isso não trouxe nenhuma diferença pra dentro do código já que a variável já era true. E em vez de interromper o seu laço “for” você continuou com ele.

Assim você continuou passando pela lista e como a condição não reconheceu a igualdade das informações, então foi feita a inserção dentro da lista.

Agora tomando de partida o código onde você realizou a correção temos:

while (achou == true) {

            ingrediente = prompt("Ingrediente já informado, por favor, digite outro ingrediente.");

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

                if (ingredientes[posicao] == ingrediente) {

                    achou = true;
                    break;
                } else if(ingredientes[posicao] != ingrediente){
                    achou = false;                    
                }
            }
        }

A adição do break; solucionou o problema em que eu falei anteriormente, porém você adicionou outra condição após o else, que é um pouco desnecessária pois nesse caso específico do problema apenas vão existir dois resultados, sendo eles igual ou diferente, então se caso ele não for igual logo ele vai ser diferente.

Para mais dúvidas estarei a sua disposição.

Abraços e bons estudos!