Сумма и среднее
Теперь, когда вы умеете проходить по списку, посмотрим, для чего такие циклы нужны чаще всего. Первый приём — сложить все элементы. Он вам знаком по уроку о циклах: переменная, которая перед циклом равна 0 и растёт в каждой итерации. Вот сколько молока в литрах дала корова Белла за четыре дня:
local milk = {12, 15, 11, 14}
local total = 0
for _, liters in ipairs(milk) do
total = total + liters
end
print("Всего: " .. total .. " л")Выведется:
Всего: 52 лtotal начинается с 0, потому что пока вы ничего не сложили, сумма равна нулю. В каждой итерации цикл прибавляет один элемент: после первой итерации total равно 12, потом 27, 38 и, наконец, 52. print стоит после цикла, когда сумма уже готова. Внутри цикла он вывел бы каждую промежуточную сумму.
Среднее — это сумма, делённая на число элементов, то есть на #milk:
local milk = {12, 15, 11, 14}
local total = 0
for _, liters in ipairs(milk) do
total = total + liters
end
local average = total / #milk
print("В среднем: " .. average)Выведется:
В среднем: 13.0Помните из урока о переменных: / всегда даёт дробное число, даже когда результат целый, поэтому 52 / 4 — это 13.0. А когда результат не целый, цифр может получиться очень много. Для молока за целую неделю, {12, 15, 11, 14, 13, 16, 9}, среднее равно 90 / 7, и выводится оно как 12.857142857143. Чтобы округлить число при выводе, используйте string.format с %.1f — один знак после точки:
print(string.format("В среднем: %.1f л", 90 / 7))Выведется:
В среднем: 12.9 лНе используйте // для среднего: он округляет вниз до целого, и 90 // 7 — это просто 12.
Берегитесь пустого списка. Его сумма равна 0 и длина равна 0, значит, среднее было бы 0 / 0, а это вообще не число. Lua не останавливает программу: он вычисляет особое значение nan (not a number, «не число»), и на этом сайте print(0 / 0) выводит -nan. Если список может оказаться пустым, перед делением проверьте #milk > 0.
Сумма и среднее часто рождают новые вопросы, например: в какие дни молока было больше среднего? Чтобы ответить, нужно сначала знать среднее, поэтому по списку проходят второй раз, после того как первый цикл закончился.
Задание
- 1
Сложите молоко: создайте локальную переменную
totalсо значением 0, пройдите поmilkв цикле и прибавляйте каждый элемент кtotal. После цикла выведитеВсего: 90 л. - 2
Посчитайте среднее по
totalи#milkи выведите его с одним знаком после точки с помощьюstring.format:В среднем: 12.9 л. - 3
Посчитайте дни, когда Белла дала молока больше, чем в среднем. Пройдите по
milkещё раз, сравнивайте каждый элемент со средним (не с округлённым) и после цикла выведитеДней выше среднего: 4.