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

Não entendo como usar for () para verificar repetições no array

<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 existe = true;

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

            if(ingredientes[posicao] == ingrediente) {

                existe = false;
                break;
            }
        }

        if(existe == true) {

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

    console.log(ingredientes);
</script>

Consigo entender como o código funciona, mas não a lógica de utilizar o for () para verificar há repetições dentro do array, se puderem me explicar agradeço.

Outra coisa, não seria interessante adicionar um alerta quando ocorre a repetição ? tentei fazer, mas o alerta não era emitido quando eu repetia o ingrediente.

2 respostas

Olá Victor, tudo bom?

Então, vamos a explicação de um laço de repetição como o for para a verificação de uma coleção.

A princípio, o laço de repetição é utilizado quando se deseja varrer uma lista de objetos por algum motivo em específico. Os principais laços são:

For, Foreach e While

Podemos considerar a nível iniciante os seguintes casos de usos:

For: Varrer Arrays. Foreach: Varrer Listas. While: Persistências.

Porque utilizamos for? Simples, em sua declaração, ele possui uma variável que pode ser utilizada como índice, geralmente o "i", no seu caso chama-se "posicao". Então quando vamos tentar acessar o valor de uma posição do Array, passamos o índice, dessa forma "Array[indice]" para que possamos obter o valor daquela posição do array.

Repare que na situação do While, por exemplo, você precisaria declarar uma variável por fora do laço e incrementa-la dentro do laço e depois quebrar a persistência.

Elaborei um pequeno código fonte para que você possa testar, a propósito, ele está em JavaScript, se quiser, pode testa-lo também no fiddle:

https://jsfiddle.net/ytw9oe6g/2/


var numerosFixos = [1,2,3,4,5,6,8,9];
var numerosParaVerificar = [1, 3, 9];

for(var i = 0; i < numerosFixos.length; i++)
{
    for(var j = 0; j < numerosParaVerificar.length; j++)
    {
        if(numerosFixos[i] == numerosParaVerificar[j])
        {    
        console.log("O número: " + numerosParaVerificar[j] + " repetiu");
        }
     }
 }

Espero ter te ajudado.

Até mais.

solução!

Oi Vitor é o seguinte:

Aqui eu recebo o ingrediente

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

Eu marco ele como existe =false, ou seja pra todos os efeitos ele ainda não está na lista pois ainda não verificamos ela.Por isso modifique no seu código para ficar coerente.

var existe = false;

No código abaixo eu vou passar por todos os meus ingredientes que já foram cadastrados, verificando do primeiro ao último se existe algum ingrediente em alguma posição com o mesmo nome no ingrediente que eu recebi nas linhas acima, caso eu encontre algum ingrediente repetido eu entro dentro do if e marco que esse ingrediente já existe, portanto altere no código para existe=true para ficar coerente.Logo em seguida eu dou um break porque se eu já achei e identifiquei que existe um ingrediente com mesmo nome eu não preciso continuar verificando o restante dos ingredientes.Ao usar o comando break eu saio da estrutura de repetição for e vou pra linha imediatamente abaixo do escopo dele.

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

            if(ingredientes[posicao] == ingrediente) {

                existe = true;
                break;
            }
        }

Aqui nessa linha a verificação deve ser existe=false ou seja se ele ainda permanece com a mesma marcação dele inicial que era false e mesmo após ter percorrido toda a minha lista de ingredientes não achei nenhum igual a ele então ele é único posso adicioná-lo a lista e eu incremento o meu contador para informar que eu adicionei mais um item a lista portanto ela cresceu. Caso o valor da variável existe for true, isso significa que ele recebeu essa marcação dentro do for que verificou que la já existe um ingrediente como ele, portanto se ele já existe eu não adiciono ele passando par ao while e pedindo outro ingrediente novamente.

if(existe == false) {

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

Entendendo como funciona a execução do programa ficou mais simples agora? O que acontece que você inverteu a leitura da variável booleana e isso dificultou a leitura do programa, da forma que você alterou seria correto chamala de nãopossui ou nãoexiste.

Sobre a sua segunda observação do alert, isso é mutio importante, pensar na experiência do usuário, bastaria adicioná-lo na linha:

if(ingredientes[posicao] == ingrediente) {
    existe = true;
    alert("Item já existe na lista, por favor adicione outro ingrediente");
    break;
}

Espero ter ajudado e bons estudos.