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

O meu código funciona sem o BREAK, por que?

Pessoal, eu não entendi porque o "break;" tem que ser colocado após a variável ingredRepetido ser true, ele vai continuar percorrendo as posições do array pra verificar se existe mais algum igual e vai sair do loop do for de qualquer forma. E também não vai entrar no segundo IF porque ingredRepetido já virou true. Na opinião do instrutor fala que "O break "quebra" o for e o while", mas sem o break meu codigo funcionou normal e nao aceitou ingredientes repetidos.

<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 ingredRepetido = false;

            for(var posicao = 0; posicao < ingredientes.length; posicao++) {
                if(ingredientes[posicao] == ingrediente) {
                    ingredRepetido = true;

                }
            }

            if(ingredRepetido == false) {
                ingredientes.push(ingrediente);
                contador++;

            }

    }

    console.log(ingredientes);
</script>
2 respostas
solução!

Oi Isabela, tudo bem com você?

Realmente, nesse caso, o break não é necessário para o código funcionar. A motivação por trás do uso dele aqui, foi para agilizar o processo de procura pelo ingrediente repetido. Vamos pegar um exemplo onde queremos preparar um feijão tradicional, e já temos 5 ingredientes no array: feijão, água, cebola, alho e sal. Agora queremos adicionar um sexto elemento que já está presente no array, como uma outra cebola, por exemplo; o que aconteceria se não usássemos o break? Com certeza ele detectaria o ingrediente repetido e o programa funcionaria, como você mesma testou:

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

Mas perceba que a cebola está localizada na terceira posição do array, portanto o programa, mesmo depois de ter encontrado a cebola, continuaria varrendo o array e checaria se os últimos 2 elementos são cebolas também! Agora imagine se estivéssemos lidando com listas que contém centenas de elementos, caso o elemento repetido estivesse na primeira ou segunda posição, ainda assim o programa varreria o array inteiro sem necessidade! :c

Agora, se colocarmos um break logo após encontrarmos o ingrediente repetido, o programa logo pararia de verificar e economizamos tempo e memória da máquina (não que isso seja tão relevante considerando o hardware que temos hoje em dia). Então, no final das contas, é algo que está relacionado no que faz sentido para nós, continuar verificando o array mesmo após encontrarmos o ingrediente repetido não faz muito sentido, portanto colocamos um break ali e a vida que segue.

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

Enfim, foi uma ótima sacada. Quando eu fiz esse exercício, eu não tinha percebido que o break não era essencial para que ele funcionasse! rs

Espero ter ajudado, se ficou qualquer dúvida é só avisar!

Bons estudos!!

Muito obrigada!! Sua explicação foi esclarecedora! A questão do break está relacionada com a escalabilidade do código. Realmente... num array com centenas de elementos não faz sentido varrê-lo inteiro sempre! Obrigada ;)