Rubyrush: простые задачки и простой конвертер валют

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

Задание №17: Среднее арифметическое трех чисел

Следующий урок состоял из одного простого задания — запрограммировать вычисление среднего арифметического трёх чисел. Числа вводятся в консоли по средствам метода gets, а среднее арифметическое высчитываем по стандартной формуле (a+b+c)/3

Программка получилась не сложная:


puts "Введите первое число"
number_1 = gets.chomp.to_i

puts "Введите второе число"
number_2 = gets.chomp.to_i

puts "Введите третье число"
number_3 = gets.chomp.to_i

result = (number_1 + number_2 + number_3) / 3

puts "Среднее арифметическое чисел будет: " + result.to_s

Но при написании была заминка с арифметическим оператором сложения в выводе результата. Я хотел что бы объект строка и объект число суммировались, но получал ошибку. Надо было привести результат вычисления и строку к одному типу.

Для ввода данных использовался метод gets, а он, как мы уже поняли, всегда возвращает объект число.

В выводе я складывал строку и число. Следовательно нужно было число привести к типу строка. Решил по средствам применения метода .to_s.

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

Задание № 18: Конвертор рублей в доллары

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

При написании программы для решения задачи я подглядывал в предыдущие уроки, описанные на моём блоге. Надо было вспомнить как обрезать нежелательный пробел у входящих данных — это был метоl .chomp.

Затем я вспоминал, как пишется маска при интерполяции и сомневался над оптимальным решением — использовать интерполяцию и маркер, или обойтись конкатенацией строк по средствам плюсика. В итоге интерполяция победила. Собственно вы и сами видите в моём решении ниже:

today = Time.now
puts "Сколько сейчас стоит 1 доллар на бирже?"
rate = gets.chomp

puts "Курс $ на #{today} составляет: " + rate.to_s
puts "\n"

puts "А сколько к вас с собой рублей?"

stock = gets.chomp
purchase = (stock.to_i / rate.to_i)

puts "Ваших денег хватит на покупку: #{purchase.floor} $"

Потом я полез в google для поиска способов округления числа в меньшую сторону, что бы вывести правильный результат деления налички на курс доллара — это был метод .floor.

Ну и на вкусненькое я решил добавить в программу подстановку точного времени в развёрнутом виде. Для полноты картины 🙂 Сделал это при помощи класса Time и его метода .now.

Округление чисел в языке программирования Ruby

В Ruby существует целых три метода для округления числа:

  • #ceil,
  • #floor,
  • #round.

#round занимается тем, что по нормальным правилам округляет число до заданной степени точности, по умолчанию до целого, однако в качестве аргумента ему можно передать разряд, до которого следует округлить число. Метод #floor округляет число всегда до ближайшего меньшего целого числа, а #ceil, наоборот, до ближайшего большего целого, примеры:

1.978.round #=> 2
1.978.round(2) #=> 1.98
1.978.ceil #=> 2
1.978.floor #=> 1 

Подсказки, которые были в уроке

После того как я написал своё решение, я посмотрел подсказки и эталонное решение, которое идёт к уроку.

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

С одной стороны это круто, потому что на бирже копейки важны. Особенно если у вас не 10 долларов а миллионы. А вот по поводу того нужны ли копейки в результатах расчёта возможности покупки я сомневаюсь. Зачем это знать? Какая в этом польза для пользователя?

В их решении я отметил для себя пару интересных конструкций:

Для того что бы округлить результат выполненной арифметической операции они оборачивают эту операцию в круглые скобки. Так метод округления будет работать с итоговым числом. Это логично, но возможно я бы до этого не додумался. так что учту: usd = (rub / usd_rate).round(2)

К тому же в аргументе метода округления числа они передают двойку, говоря о том, что нужно округлить результат деления до двух десятых. Это тоже запомню. Хотя что мне это запоминать. Доработаю ка я свою программку:

today = Time.now
puts "Сколько сейчас стоит 1 доллар на бирже?"
rate = gets.to_f.round(2)

puts "на сегодня #{today}",
"Курс $ по отношению к ₽ составляет: #{rate}"
puts "\n"

puts "А сколько к вас с собой рублей?"

stock = gets.to_f
purchase = (stock / rate).round(2)

puts "Ваших денег хватит на покупку: #{purchase} $"

Теперь у меня программка как у серьёзного банкира 😉

Задание № 19: Конвертор с выбором валюты

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

puts "Какая валюта у вас в наличии?"

puts "1. Рубли"
puts "2. Доллары"
currency = gets.chomp

if currency == "1"
today = Time.now
puts "Сколько сейчас стоит 1 доллар на бирже?"
rate = gets.to_f.round(2)

puts "на сегодня #{today}",
"Курс $ по отношению к ₽ составляет: #{rate}"
puts "\n"

puts "А сколько к вас с собой рублей?"

stock = gets.to_f
purchase = (stock / rate).round(2)

puts "Ваших денег хватит на покупку: #{purchase} $"

else today = Time.now
puts "Сколько сейчас стоит 1 доллар на бирже?"
rate = gets.to_f.round(2)

puts "на сегодня #{today}",
"Курс $ по отношению к ₽ составляет: #{rate}"
puts "\n"

puts "А сколько к вас с собой долларов?"

stock = gets.to_f
purchase = (stock * rate).round(2)

puts "Продав #{stock}$ выполучите: #{purchase} ₽"
end

На сегодняшний день я закончил 20 уроков из курса Rubyrush. Это только начало 😉

Rubyrush: простые задачки и простой конвертер валют
Пройденные уроки.
Юрий Ронин