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

Duvida em relação ao contador e o for

Depois de muito quebrar a cabeça, consegui resolver o problema com o código abaixo. Onde fiquei preso por bastante tempo foi no loop do for, o meu segundo if (para repetido == false) estava dentro dele e o contador não estava saindo do 1, fazendo com que o for ficasse em um loop infinito, minha dúvida é pq isso ocorre?

<meta charset="UTF-8">

<h1>Receitas do Yan</h1>

<script type="text/javascript">

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

    function mostra(frase) {

        document.write((contador - 1) + " - " + ingrediente); 
        document.write("<br>");
    }
    while( contador <= quantidade) {

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

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

                if(ingredientes[posicao] == ingrediente) {

                    repetido = true;
                    break;

                } 
            }            
                if(repetido == false) {

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

    }

    console.log(ingredientes);


</script>
2 respostas
solução!

Olá, Francisco! Como vai?

Realmente, com o if(repetido == false) dentro do for(var posicao = 0; posicao < ingredientes.length ; posicao++) você entrará num loop infinito, já que não haverá incremente na variável contador para sair do while(contador <= quantidade).

Vamos analisar o loop do for. Quando o usuário digita o primeiro ingrediente, nota-se que ingredientes.length = 0, já que até então você não fez nenhum .push(). Então, o loop do for vai ser executado somente após fazer o primeiro push.

Então, com o segundo if (onde faz o push) dentro do for, não será adicionado nenhum ingrediente ao array.

Resumindo, o for só será executado após você adicionar um ingrediente ao array, mas o código só adiciona um ingrediente dentro do for. Entendeu? rsrs

Mas de qualquer forma, não faz sentido colocar o if(repetido == false) dentro do for, pois você precisa verificar se o ingrediente informado está no array. Então, tem que primeiro "varrer" a variável ingredientes[] para verificar se o ingrediente informado já foi inserido nesse array.

Esse foi o meu código para essa atividade:

<meta charset="UTF-8">

<h1>Receitas do Yan</h1>

<script>
    var ingredientes = [];

    var quantidade = parseInt(prompt("Quantos ingredientes você vai adicionar?"));
    while (isNaN(quantidade) || quantidade <= 0) {
        quantidade = parseInt(prompt("Insira uma quantidade válida de ingredientes que você vai adicionar!"));
    }

    var contador = 1;
    while (contador <= quantidade) {
        var ingrediente = prompt("Informe o ingrediente " + contador);
        if (ingrediente != "") {
            var repetido = false;
            for (var i = 0; i < ingredientes.length; i++) {
                if (ingrediente == ingredientes[i]) {
                    repetido = true;
                    break;
                }
            }
            if (repetido == false) {
                ingredientes.push(ingrediente);
                contador++;
            }
            else {
                alert("Ingrediente repetido!!!");
            }
        }
    }

    console.log(ingredientes);
</script>

Obrigado Rosicley, com sua ótima explicação fui capaz de compreender o funcionamento do algoritmo.