Rubyrush: Программа «Поют ли соловьи»

Ruby для новичков [Rubyrush]

Дошел уже до 33 шага. Честно признаться, на пол пути начал пропадать энтузиазм. Но потом в течении недели я себя переборол и вернулся к урокам.

Вчера прошёл урок в котором нам рассказали про еще один способ ввода данных в программу — ARGV и нюансы, которые возникают в программах, которые работают с данными введенными при запуске ruby. Эт я про STandarD INput говорю и его использование с методом gets.

Задачка «Поют ли соловьи»

Условия задачи

В городском парке есть соловьи и иногда они поют.

когда температура от 22 градусов до 30 — соловьи поют в любое время года

А летом они поют при температуре от 15 до 35 градусов.

Особенности программы: текущую температуру и время года программа должна брать из аргументов командной строки, а если их не передали — спрашивать у пользователя эти данные.

Дальше нам дают какой то пример результата работы программы, для наглядности.

Моё решение

# время года 
season = nil

conditions = ARGV[0]

if conditions == nil
    puts "Добрый день, человек!",
    "Подскажи пожалуйста, какое сейчас время года?"
    puts "времена года пиши на английском: зима - winter, весна - spring, лето - summer, осень - fall"
    conditions = STDIN.gets.chomp.downcase
end

# температура воздуха
puts "Какая сейчас температура воздуха?"
air_tem = STDIN.gets.chomp.to_i

if season == "spring"
  # спрашиваем температуру воздуха 
  # проверяем температуру летом 
  if air_tem >= 15 && air_tem <= 35
   puts "Cоловьи поют" 
  else
    puts "Cоловьи не поют"
  end
else
  # проверяем температуру в остальное время года
  if air_tem >= 22 && air_tem <= 30
   puts "Cоловьи поют"
  else 
    puts "Cоловьи не поют"
  end
end

Моё решение не корректно работало. В целом эту тему я усвоил плохо. Но я понял как ребята реализовали своё решение. Нужно получше изучить Последнюю тему про работу с данными через параметры при запуске программы. Наверное нужно главу в книге по Ruby прочитать по этой теме.

Завтра займусь.

А вот образец решения из этого урока, который написали авторы курса.

Готовое решение задачи

# encoding: utf-8

# При запуске программы можно передать два аргумента: температуру в градусах
# Цельсия и индекс времени года (0 - весна, 1 - лето, 2 - осень, 3 - зима).

# Записываем в переменную temperature значение первого параметра. Если он был
# передан, в переменную temperature запишется строка. Если нет — nil.
temperature = ARGV[0]

if temperature == nil
  # Если в переменной temperature у нас оказался nil, значит при запуске в
  # консоли не передали параметр температуры, спрашиваем её у пользователя
  # преобразуем в число и записываем в переменную temperature.
  #
  # Обратите внимание, что если мы используем аргументы из командной строки, то
  # нам надо вызывать не просто gets, а STDIN.gets (особенность языка Ruby).
  puts 'Какая сейчас температура?'
  temperature = STDIN.gets.to_i
else
  # Иначе, просто преобразуем в число методом to_i
  temperature = temperature.to_i
end

# Аналогично поступаем с временем года
season = ARGV[1]

if season == nil
  puts 'Какое время года? (0 - весна, 1 - лето, 2 - осень, 3 - зима)'
  season = STDIN.gets.to_i
else
  season = season.to_i
end

# Осталось проверить все условия и вывести соответствующий текст
if season == 1
  # Летом свой диапазон температур
  if temperature >= 15 && temperature <= 35
    puts 'Скорее идите в парк, соловьи поют!'
  else
    puts 'Увы, даже летом для соловьев сейчас неподходящие условия'
  end
else
  # Любое другое время года
  if temperature >= 22 && temperature <= 30
    puts 'Скорее в парк! Там поют соловьи!'
  else
    puts 'Сейчас соловьи молчат, греются или прохлаждаются :)'
  end
end

Юрий Ронин