Циклы

Предпосылки: вывод (if/else, логические выражения, puts/gets).

вывод | Функции

В маркетплейсе по итогам месяца пяти продавцам нужно начислить бонус — одинаковое действие, только каждый раз с новым продавцом. В лоб это выглядит так:

puts "Бонус начислен: seller_1"
puts "Бонус начислен: seller_2"
puts "Бонус начислен: seller_3"
puts "Бонус начислен: seller_4"
puts "Бонус начислен: seller_5"

Пять строк, почти совпадающих буква в букву. Пока продавцов пять — терпимо. Станет пятьдесят — так уже никто не пишет. Компьютер хорошо повторяет одно и то же действие; не хватает способа сказать ему: что именно повторять и когда остановиться.

while: повторяй, пока условие истинно

Самый простой цикл — while:

seller_id = 1
 
while seller_id <= 5
  puts "Бонус начислен: seller_#{seller_id}"
  seller_id = seller_id + 1
end

Программа напечатает те же пять строк, что и руками. На каждом шаге seller_id увеличивается на 1. Когда он становится равным 6, условие seller_id <= 5 перестаёт выполняться, и цикл останавливается.

У любого цикла есть три части:

  • начальное состояние — seller_id = 1
  • условие продолжения — seller_id <= 5
  • изменение состояния — seller_id = seller_id + 1

Если забыть третью часть, условие может никогда не измениться. Тогда программа зациклится.

Сумма нескольких шагов

Цикл полезен не только для печати. Он позволяет накапливать результат:

total_bonus = 0
seller_id = 1
 
while seller_id <= 5
  total_bonus = total_bonus + 100
  seller_id = seller_id + 1
end
 
puts total_bonus    # 500

Здесь одно и то же действие — прибавить 100 к общей сумме — выполняется пять раз. Без цикла пришлось бы писать пять почти одинаковых строк вручную.

Цикл снимает повторение однотипных шагов. Следующая боль приходит быстро: один и тот же расчёт начинают копировать в разные места программы. Повторение внутри одного шага закрыто, повторение целых кусков логики — ещё нет. За это отвечают функции.

Sources

  • Dijkstra, E., 1968, Go To Statement Considered Harmful. Communications of the ACM.
  • Thomas, D. et al., 2023, Programming Ruby 3.3. Pragmatic Bookshelf.

вывод | Функции