Циклы

Циклы - это механизм циклического выполнения кода. В этой части мы разберем все возможные способы создания циклов

Цикл for

Начать стоит с такого вида данных как Range. Range - это последовательность создающаяся с помощью обозначения начала и конца. Приведем сразу пример:

  1_to_10 = 1..10 # = 1, 2, 3, 4, 5, 6, 7, 8, 9, 10

В данном примере мы указываем начало последовательности (1) и ее конец (10), при этом сразу получаем генерацию остальные чисел. Важно понимать, что в таких конструкциях как и в любых других мы можем указывать переменные тоже, так как при работе с переменными мы работаем с ними как с обычными данными

  start = 1
  finish = 100
  1_to_100 = start..finish # = 1, 2, 3, 4 ... 99, 100

А теперь посмотрим как можно применить Range на практике

  # В данном случае мы с помощью цикла обходим последователньость чисел от 1 до 10
  # В первом цикле x будет равен 1, после того как код внутри for ... end завершится, начнется новый цикл, 
  # где значение x будет равно 2 и тд, до тех пор пока последовательность не завершится
  for x in 1..10 
    puts x
  end

  # Второй момент нужно понимать, что повторяться будет только код внутри for .. end
  # все что происходит после цикла, начнет выполняться только тогда, когда все циклы отработают
  puts 'Finish'

Кроме того у нас есть специальные ключевые слова, с помощью которых мы можем либо выходить из цикла полностью, либо пропускать текущий этап

for x in 1..10 
  # если число текущей итерации делится на 2 без остатка, 
  # то выполнение кода после этого для текущего цикла прекращается 
  if x % 2 == 0
    next
  end

  # если число больше 8, то цикл полностью прекращает свою работу
  if x > 8
    break
  end

  puts x
end

Цикл while

Ранее мы научились создавать циклы с заранее известным первым элементом и последним. А что если нам неизвестна эта информация ? Что если мы хотим, чтобы наш цикл работал до определенного условия ?

Здесь нам на помощь приходит цикл while. Давайте перепишем наш пример выше

x = 1
# пусть цикл повторяется до тех пор, пока x меньше 10
while x < 10
  # на первом цикле мы распечатаем 1
  puts x
  # после этого мы увеличим значение x на единицу и на втором круге цикла x будет равен уже 2
  x += 1
end 

# Пока все круги цикла (итерации) не завершаться, данное действие не начнет выполняться
puts 'Finish'

Казалось бы, что данный пример гораздо проще выглядит с использованием цикла for, но все становится более понятно, когда наше условие усложняется

x = 1
y = 10

# пусть цикл повторяется до тех пор, пока x не равен y
while x != y
  puts "x равен #{x}"
  puts "y равен #{y}"
  # теперь на следующей итерации x будет равен 2
  x += 1
  # а y на следующей итерации будет равен 9
  y -= 1
end

# Пока все круги цикла (итерации) не завершаться, данное действие не начнет выполняться
puts 'Finish'

Вопрос для самостоятельной работы: на каких значениях x и y цикл перестанет выполняться и начнет работу код после него ?

цикл loop

А теперь представим, что нам нужен бесконечный цикл, который будет выполняться до тех пор, пока мы самостоятельно не захотим из него выйти

Для этого давайте напишем простейшую игру по угадыванию магического числа


from = 1
to = 10

# Бесконечный цикл будет выполняться бесконечно до тех пор, пока мы изнутри итерации не завершим его 
loop do
  # просим пользователя ввести любое число от заранее заданного диапазона
  puts "Введите любое число от #{from} до #{to}"
  # превращаем строку в число
  user_input = gets.to_i

  # проверка на дурака, на случай, если пользователь ввел неверное число 
  if user_input > to || user_input < from
    puts 'Вы ввели неверное число'
    # Если пользователь действительно ввел неверное число, 
    # то мы заканчиваем на этом моменте итерацию
    # и цикл начнется заново
    next
  end

  # в случае если число валидное, то с помощью функции rand мы создаем случайное число в нашем диапазоне
  rand = rand(from..to)

  # Проверяем, что числа загаданное пользователем и компьютером равны
  if rand == user_input
    # Если числа равны, то мы заканчиваем игру
    break
  end

  # Если условие выше не сработало, значит числа не равны, значит пользователь проиграл, значит цикл начнется заново
  puts 'Вы проиграли, попробуйте еще раз'
end

# Так как выйти из цикла мы можем только в случае равенства пользовательского числа и рандомного
# значит логично предположить, что любой код после цикла выполнится, только если цикл будет завершен
puts 'Поздравляем вы победили'

Задание for_as_while

  • Напишите код, используя цикл for, который будет последовательно распечатывать в консоли номера билетов от 200 000 до 210 000 и от 220 000 до 235 000.

  • Распечатайте такие же номера билетов, используя цикл while.

Задание swimming_pool

  • Создайте переменную volume, в которой будет храниться объём бассейна, и установите её равной 1200.

  • Создайте переменные filling_speed, равная 30 и devastation_speed, равная 10. Первая переменная - скорость наполнения, вторая - опустошения.

  # объем бассейна
  volume = 1200 # litres
  # скорость наполнения
  filling_speed = 30 # 30 litres per minute
  # скорость опустошения
  devastation_speed = 10 # 10 litres per minute
  • Напишите программу с использованием цикла while, которая рассчитает и выведет в консоль время наполнения бассейна с учётом скоростей наполнения и опустошения.

Рекомендации по выполнению:

Создайте переменную, в которой будет храниться текущий объём бассейна, и каждую итерацию цикла добавляйте к нему filling_speed и вычитайте из него devastation_speed. Как только текущий объём бассейна станет равен значению переменной volume, выполните команду break. В процессе выполнения цикла считайте количество итераций — это и будет время наполнения бассейна.

Задание boxes

Вы доставляете гуманитарную помощь в ящиках одинакового размера. У вас есть грузовики и контейнеры. В каждый грузовик помещается максимум 12 контейнеров. В каждый контейнер — не более 27 ящиков. Ящики, контейнеры и грузовики пронумерованы.

Принцип работы программы:

Указываем число ящиков — получаем результат в виде строк в консоль:

Грузовик 1:
    Контейнер 1:
        Ящик 1
        Ящик 2
        Ящик 3
        ...
    Контейнер 2:
        Ящик 1
        Ящик 2
        ...
    ...
...

Необходимо:
грузовиков — 1 шт.
контейнеров — 10 шт.

Рекомендации:

Для добавления отступа в строке вы можете использовать символ табуляции «\t».

Обратите внимание на арифметическую операцию «Остаток от деления»

  puts 45 % 10 # = 5

Дополнительный материал

Last updated