Por lo que veo en tu sección de dudas me parece que específicamente tienes problemas con entender la variable booleana llamada existe.
Duda 1
Una variable que es del tipo Booleana solo puede tener 2 valores, Verdadero (True) o Falso (False), y en este caso nos sirve para que su valor cambie de falso a verdadero si es que se encuentra un ingrediente repetido.
Como puedes notar primero cuando se declara se le da un valor de false con eso estamos diciendo que aún no hay ningún ingrediente repetido, porque todavía no revisamos nuestro arreglo.
Duda 2
Ahora con el ciclo for vamos a revisar si nuestro ingrediente ya está dentro del arreglo ingredientes[ ]
Usamos un ciclo para que recorra todos los ingredientes que ya están en el arreglo y los compare con el nuevo ingrediente. Esto lo hacemos avanzando en el ciclo por las posiciones del arreglo, primero revisamos ingredientes[0]
y revisamos si es igual a ingrediente, luego si ingredientes[1]
es igual a ingrediente, y así sucesivamente por todos los índices o posiciones de nuestro arreglo.
También usamos la condicional if para que si encontramos que ya está repetido, le digamos al usuario por medio de un alert, que ese ingrediente ya está repetido.
IMPORTANTE: fíjate como dentro de ese if esta la variable existe = true; ahí es donde cambia el valor de nuestra variable booleana (que ya explicamos en la Duda 1) de false a true y eso nos indica que si se encontró un valor repetido.
Duda 3
Ahora antes de empezar a decirte como se relaciona todo junto, primero es importante decir que para que este código funcione bien el último If que vamos a analizar, es decir, el de tu Duda 3, debe estar escrito fuera del ciclo for, para este ejemplo si está bien ubicado, así que procedamos.
Recuerda que en la Duda 2 ya vimos que la variable booleana puede pasar de false a true, pero solo si encontró un ingrediente repetido, si no su valor sigue siendo false como se declaro al principio.
Ahora en nuestra condicional if(existe == false)
solo vamos a entrar si es que no se encontró ningún repetido, es decir, si nuestro valor de existe sigue siendo false como lo declaramos al principio, veamos los 2 casos:
Caso 1 existe = false
Si no se encontró ningún ingrediente repetido, tenemos 2 instrucciones, la primera es agregar el nuevo ingrediente al arreglo ingredientes[ ]
, la segunda instrucción es avanzar la variable contador en 1, esto es para avisar que ya entro 1 ingrediente más al arreglo y que faltan menos para llenar el número de ingredientes que dijo el usuario que iba a poner.
Caso 2 existe = true
Sí en el ciclo for que vimos en la Duda 2, sí se encontró un ingrediente repetido entonces la variable booleana existe ahora es igual a true y por lo tanto no podemos entrar al código de la condicional if(existe == false)
que estamos viendo en esta Duda 3, por lo que no agregamos ningún nuevo ingrediente a nuestro arreglo ingredientes [ ]
y tampoco avanza nuestra variable contador, es decir, se vuelve a hacer otra iteración del ciclo while pero sin contar está.
De este modo el usuario puede volver a escribir otro ingrediente, luego este se vuelve a comparar, y finalmente solo se agrega si es que no está repetido, además de que nuestro ciclo while también solo va avanzando si es que nuestro ingrediente no estuvo repetido. (El ciclo while es el que nos va a generar varias veces el prompt pidiendo al usuario que escriba un ingrediente)
Fíjate como la variable existe está declarada como false dentro del ciclo while para que cada vez que el ciclo se repita, es decir, cada vez que el usuario anote otro ingrediente, el valor de existe vuelve a ser false, así indicamos que no lo marque como true(ingrediente repetido) si no hasta que lo revisemos en el ciclo for que vimos en tu Duda 2, y solo cambie su valor a true si es que encuentra este nuevo ingrediente repetido, si no su valor sigue siendo false.