Второй урок: Числа

Введение в Ruby [HEXLET]

Что показали в видео

Продемонстрировали примеры написания простых программ на математические операции.

Что я узнал по факту

Базовые типы данных

Базовые типы данных условно можно разделить на числа, массивы и строки. По каждому базовому типу стоит пройтись подробней:

Второй урок: Числа
Ruby — Базовые типы данных в виде схемы.

Тип данных Число

Числа бывают двух типов: Fixnum и Bignum. Упрощая могу сказать что числа бывают большие и маленькие.

Числа бывают целые (Fixnum и Bignum) и дробные (Float).

Класс Fixnum — это целые числа (Integer), которые умещаются в одно машинное слово (минус 1 бит). Если в результате какой либо операции число класса Fixnum выходит за пределы этого диапазона, то значение автоматически преобразуется к классу Bignum.

Классу Bignum принадлежат целые числа, которые не умещаются в диапазон класса Fixnum. Объекты класса Bignum создаются автоматически, когда результат вычислений превышает (по модулю) предельное значение класса Fixnum. Когда, в результате вычислений, объект класса Bignum уменьшается настолько, что его значение можно хранить в объекте класса Fixnum, то он автоматически преобразуется в Fixnum.

Как ни странно, {\displaystyle 2^{30}} определяется как Bignum

(2**30).class  #=> Bignum

Однако, целое число, меньшее (по модулю) {\displaystyle 2^{30}} определяется как Fixnum

((2**30)-1).class    #=> Fixnum
(-(2**30)+1).class  #=> Fixnum

Float (числа с плавающей точкой) — Объекты класса Float представляют собой дробные числа с плавающей точкой (числа двойной точности). Дробные числа называют числами с плавающей точкой. Куда и почему она плавающая я пока не понял. Но в будущем буду разбираться. Интересно. Скорее всего это «приплыло в Ruby» из общей теории программирования, в частности из ООП. А еще фразочка «числа двойной точности» мне не даёт покоя. Думаю в ней заложен какой то смысл про плавающую точку 🙂

Арифметические операции в Ruby

Для того что бы вы могли применять к объектам арифметические операции, нужно что бы объекты были числами. Если попытаться сложить число и строку — то возникнет ошибка.

Второй урок: Числа

Но как показал мой извращённый эксперимент, если явно привести строку к типу «Число», то в консоли в результате арифметических действий строка просто не отобразится. Что является логичным и ожидаемым результатом.

Второй урок: Числа

Из всего этого делаю вывод что складывать можно только цифры. А если у нас входные данные разных типов — нужно их стандартизировать по типу, что бы они были одинакового типа.

К примеру если привести число к типу строка, то получится что то типа конкатенации строк (объединения в одно)

Второй урок: Числа
Пример сложения объектов разного типа (строка и цифра).

Простейшие арифметические операции

  • Сложение 2 + 2
  • Вычитание 3 - 1
  • Деление 6 / 3
  • Умножение 2 * 4
  • Возведение в степень 4 ** 2
  • получение остатка от деления 6 % 5

В целом правила такие же как в математике. Для задания приоритетов (последовательности выполнения математических операций) используются круглые скобки (1 + 2) * 5

Явное преобразование типа объектов

Начну со стишка, который помогает запомнить важное правило

Одна вторая в Ruby ноль,
А три вторые — единица.
Запомнить надо эту соль,
Чтоб результату не дивиться.

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

Как же приводить к нужному типу? Для этого используются короткие и интуитивно понятные методы.

Методы преобразования типов в Ruby традиционно начинаются с приставки to_. Последующая буква — это сокращение от названия класса, в который происходит преобразование (f — Float — число с плавающей запятой, i — Integer — целое, s — String — строка, a — Array — массив). 

to_fПреобразовать в число с плавающей запятой
to_iПреобразовать в целое число
to_sПреобразовать в строку

Написано и сказано, что язык программирования Ruby является языком со строгой типизацией. Это значит что у существующих объектов есть тип по умолчанию, который меняется только явно — если мы это запрограммируем.

Однако, при работе с выражениями, например при выполнении математической операции, тип объекта — результат выражения может меняться ДИНАМИЧЕСКИ!

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

А если в выражении присутствует дробные числа (Fixnum / Float), то на выходе всегда получаем float (число с плавающей точкой).

Инкреме́нт, инкрементирование (от англ. increment «увеличение») — операция во многих языках программирования, увеличивающая значение переменной. В программе записывается как два плюсика ++.

ВАЖНО знать, что в языке программирования Ruby инкремента нет! Так как это язык со строгой типизацией. Вместо него используется выражение +=. Это выражение не противоречит принципам строгой типизации и позволяет ПЕРЕСОХРАНЯТЬ значение переменной. По сути мы проводим математическую операцию и полученный результат присваиваем переменной.

Операции с присваиванием

Часто в программах написанных на языке Rubyможно встретить выражения на подобие такого:

number_one += number_two

Это выполнение операции сразу с присваиванием. Вышеуказанная запись равнозначна следующей:

number_one = number_one + number_two

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

string = "едем"
string += ", "
string *= 3
string               #=> "едем, едем, едем, "

array = [1, 2, 3]
array += [4, 5]
array                #=> [1, 2, 3, 4, 5]

При определении метода + метод += вы получаете в подарок. Это правило касается всех бинарных операций, обозначаемых значками.

В зависимости от типа объекта, к нему можно применять те или иные методы.

Что бы узнать к какому типу объектов относятся данные используется метод .class

Второй урок: Числа
Метод уточнения типа объекта в Ruby по средствам .class

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

Для этого в консоли нужно переключиться в режим irb и ввести данные объекта. после чего поставить точку и нажать на TAB. Ниже два примера:

Второй урок: Числа
Подсказка по методам, которые можно применить к числу.
Второй урок: Числа
Подсказка по методам, которые можно применить к переменной в которой сохранено число

Практическая часть

В завершении теоретической части урока

В итоге при прохождении мини-курса запнулся на простой задачке.

Второй урок: Числа
Задачка на Hexlet по программированию на Ruby.

Завтра буду разбираться как преобразовать значение переменной в число с плавающей точкой и как выполнить эту задачку (((

Настало «Завтра» и мне не даёт покоя этот урок с математическими операциями

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

В Ютубчике витает куча роликов от программистов и инфоцыган на тему математики в программировании. Из того что я услышал и увидел сделал следующий вывод: Программирование бывает разное и в зависимости от задач, с которыми приходится сталкиваться в работе, математика бывает нужна. Но чаще всего, если вы пишите сайты или делаете мобильные веб-приложения, математика не используется в разработке. Нет сложных вычислений и математических операций. Ну а если вам всё же приходится что то расчитывать и вычислять — чаще всего решение уже существует. Полно библиотек и готовых решений для большинства задач.

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

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

Но это не значит что у полных гуманитариев нет шансов! Я убеждён в том, что любые знания можно развить. Только вот время на это требуется и желание. Если вы что то сильно захотите — у вас всё получится. Тем более что в сети сейчас миллионы курсов, готовых решений и библиотек под любые задачи разработки. Учитесь искать ответы и впитывайте знания.

Продолжаем решать задачки.

Задание:

  • Возведите a в степень b и результат выражения присвойте переменной solution1
  • Разделите b на a и результат присвойте переменной solution2. Не забудьте про преобразование к float.
  • Сложите модуль числа a с числом b, а результат присвойте переменной solution3.

Я написал вот такое решение

require 'wrong/assert'
include Wrong::Assert

a = -4
b = 3

# BEGIN (write your solution here)
solution1 = a**b
puts solution1
# END

assert { solution1 == -64 }
# BEGIN (write your solution here)
solution2 = b / a
puts solution2
# END

assert { solution2 == -0.75 }

# BEGIN (write your solution here)
solution3 = (a).abs + b
puts solution3
# END

assert { solution3 == 7 }

И это было не правильно.

Второй урок: Числа

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

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

# BEGIN (write your solution here)
solution1 = a**b
puts solution1
# END

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

# BEGIN
solution1 = a ** b
# END

Еще я намудрил с преобразованием к float. Я запутался в этой теме, так как не достаточно внимательно изучил этот вопрос.

Иногда данные поступают из внешних источников, таких как клавиатура, API или база данных, и их нужно преобразовать, чтобы использовать в работе. Ruby предоставляет несколько методов преобразования значений из одного типа данных в другой. 

По условию задания нужно было преобразовать к float. Это значит что нужно было преобразовать числа в число с плавающей точкой. Для этого нужно использовать

# BEGIN
solution2 = b / a.to_f
# END

В третьем задании я сделал все правильно, но зря добавил команду печати на экране. Она не нужна была для прохождения тестов.

# BEGIN
solution3 = a.abs + b
# END

Полезные ссылки

Какие выводы я для себя сделал

Вы наверное удивитесь как я мог ошибиться и при этом написать две относительно не плохие обзорные статьи по этому курсу 🙂

Ответ прост, статьи я писал как раз таки после завершения ВТОРОГО урока.

Именно в тот момент я понял что многое не понял и что просмотра видосика не достаточно что бы осознать и проверить на собственной шкуре все фишки.

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

«Обучая других, обучаешься сам»

Я. А. Каменский
Юрий Ронин