🗒 Задача¶
Представь, что ты работаешь над приложением с рецептами (кстати, это приложение мы вместе будем разрабатывать на практике AndroidSprint). Напиши код, который проверяет, есть ли нужный ингредиент в рецепте.
-
создай массив, в котором будет храниться список ингредиентов для определенного блюда;
-
далее через консоль запроси у пользователя информацию об ингредиенте, который он хочет найти;
-
произведи поиск элемента по массиву, используя цикл for;
-
если ингредиент в списке есть, выведи в консоль сообщение - “Ингредиент [название] в рецепте есть”;
-
если нет, сообщать: “Такого ингредиента в рецепте нет”.
❌ Ошибки¶
-
создают не массив (arrayOf), а динамический список (arrayListOf)
-
обращаются к индексам для поиска ингредиента
-
после нахождения не выходят из цикла (или не завершают программу)
✏️ Комментарии¶
Можно обойтись без обращения к индексам. А проходить по массиву просто через `in` и в `i` будет передаваться каждый элемент для сравнения.
Можно еще короче - печатать, что элемент найден и останавливать программу. А если цикл ничего не нашел, после цикла печатать, что ничего не найдено
`indexOf` под капотом осуществляет точно такой же перебор элементов массива (чтобы убедиться, попробуй вызвать у метода `indexOf` контекстное меню и выбрать `Go To` -> `Implementation`).
Получается само по себе решение не имеет смысла - оно не эффективно с точки зрения алгоритмов.
В случаях перебора массивов обычно использую какой-то признак того, что элемент не был найден, например boolean переменную isFound. И уже за пределами цикла печатают в зависимости от значений флага
Оператор in неявно проходится по массиву, но я прошу пройтись по всем элементам, чтобы дальше перейти уже к решению без цикла )
Старый коммент по стилистике - циклы рекомендуется обосабливать пустыми строками разделителями. Иначе код выглядит довольно монолитным и плохо читается
Текущая реализация выводит сообщение "Такого ингредиента в рецепте нет" даже если ингредиент был найден. Вывод сообщения о том, что ингредиент не найден, должен происходить после цикла и только если проверка всех элементов не показала наличие ингредиента.
Конструкция else { continue } излишня, так как она не влияет на логику программы — цикл и так перейдет к следующей итерации после каждой проверки. Что, если печатать, что элемент найден и останавливать программу. А если цикл ничего не нашел, после цикла печатать, что ничего не найдено
🧾 Решение¶
fun main() {
val arrayIngredients = arrayOf("картофель", "майонез", "чеснок", "соль", "любовь")
print("Введите название ингредиента: >> ")
val userInput = readln()
for (i in arrayIngredients) {
if (i == userInput) {
println("Ингредиент $i в рецепте есть")
return
}
}
println("Такого ингредиента в рецепте нет")
}