Наибольшее значение
Следующий приём — поиск наибольшего значения. Представьте Эмму на деревенской ярмарке: она ищет самую тяжёлую тыкву. Сначала она поднимает первую. Потом идёт от тыквы к тыкве, и если очередная тяжелее самой тяжёлой из виденных, запоминает уже её. В конце Эмма знает самую тяжёлую тыкву. В коде «самая тяжёлая из виденных» — это переменная:
local pumpkins = {8, 12, 7, 15, 10}
local heaviest = pumpkins[1]
for i = 2, #pumpkins do
if pumpkins[i] > heaviest then
heaviest = pumpkins[i]
end
end
print("Самая тяжёлая: " .. heaviest .. " кг")Выведется:
Самая тяжёлая: 15 кгheaviest начинается с первого элемента, поэтому цикл можно начать с индекса 2: сравнивать первую тыкву с самой собой не нужно (с 1 тоже получилось бы). 12 больше 8, поэтому heaviest становится 12. 7 не больше 12, а 15 больше, и 10 не больше 15, так что 15 остаётся до конца.
Почему бы не начать с 0? Потому что 0 может не быть среди значений. Если все значения отрицательные, например зимние температуры {-5, -2, -8}, начальный 0 так и остался бы наибольшим, и программа вывела бы температуру, которой в списке вообще нет. Первый элемент — всегда безопасное начало.
Наименьшее значение ищут так же, только с < вместо >.
Возможно, вы помните math.max, которая даёт наибольшее из нескольких чисел: math.max(8, 12, 7) равно 12. Но ей нужны сами числа, а не список. math.max(pumpkins) в список не заглядывает: получив одно значение, она просто возвращает его же, поэтому print(math.max(pumpkins)) выводит table: 0x…. Для списка нужен цикл.
Часто нужно знать ещё и то, где лежит наибольшее значение. Тогда храните его индекс во второй переменной и меняйте обе вместе. Здесь ipairs даёт и индекс, и элемент сразу:
local pumpkins = {8, 12, 7, 15, 10}
local heaviest = pumpkins[1]
local heaviestIndex = 1
for i, weight in ipairs(pumpkins) do
if weight > heaviest then
heaviest = weight
heaviestIndex = i
end
end
print("Тыква номер " .. heaviestIndex .. " весит " .. heaviest .. " кг")Выведется:
Тыква номер 4 весит 15 кгПоскольку Lua считает с 1, индекс — это прямо номер тыквы, как его считают люди: у четвёртой тыквы индекс 4. По индексу можно заглянуть и в другой список, элементы которого относятся к тем же позициям, например в список имён фермеров, вырастивших тыквы: growers[heaviestIndex].
Если две тыквы весят одинаково, > оставляет первую из них, потому что тыква такого же веса её не заменяет. С >= вы получили бы последнюю.
Задание
- 1
Найдите, сколько монет Эмма заработала за один день больше всего. Создайте локальную переменную
bestс первым элементомcoins, пройдите по списку и каждый раз, когда элемент большеbest, сохраняйте его вbest. После цикла выведитеБольше всего монет: 52. - 2
Узнайте, что это был за день. Рядом с
bestсоздайте локальную переменнуюbestIndexсо значением 1 и в цикле сохраняйте в неё индекс всякий раз, когда меняетеbest. После цикла возьмите по нему название дня изdaysи выведитеЛучший день: вторник. - 3
Во втором цикле так же найдите худший день: тот, в который монет меньше всего. Выведите его название и монеты:
Худший день: среда (монеты: 18).