Наш чатик

Телеграм чат начинающих программистов. Общаемся и помогаем друг другу

Если ссылка не открывается, можно найти нас в поиске по чатам @rubyrush или пойти другим путем

Массивы и поток выполнения

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

Мы познакомимся с потоком выполнения программы, командой sleep, а также узнаем, что такое массивы и научимся создавать их, узнаем, какой у них класс, как добавлять в них элементы с помощью «клювиков» (<<) и команды push, а также удалять из массива элементы с помощью команд delete и delete_at.

План урока

  1. Поток выполнения программы. Как выполняется любая программа — на что это похоже.
  2. Что такое массивы, как работать с массивами, как в массивах хранить данные.

Как выполняется программа?

Если вкратце, то построчно сверху вниз.

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

Машина на дороге

И ещё он не должен нарушать ПДД.

В этой метафоре: водитель с машиной — это наш компилятор, Ruby. Дорога со всеми знаками, развилками и перекрёстками — ваша программа, правила дорожного движения — правила языка, на котором пишется программа (в нашем случае это Ruby).

Ваша роль при этом — быть создателем этой самой дороги.

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

Причём привести водителя из пункта А в пункт Б ­можно множеством разных способов.

Заковыристая развязка

Процесс движения машины-компилятора по программе-дороге называется потоком выполнения. Чаще всего в программах один поток выполнения, но есть и так называемые «асинхронные» языки программирования, в которых потоков несколько. Это только справка для любознательных. До конца этого курса у нас всегда будет только один поток выполнения и команды будут выполняться одна за другой.

Для иллюстрации потока выполнения программы напишем в нашей новой папке lesson6 (созданной, как обычно, в папке c:\rubytut\), программу road.rb:

puts "Start"
sleep 1

puts "Первый километр"
sleep 1

puts "Второй километр"
sleep 1

puts "Третий километр"
sleep 1

puts "Finish!"

gets

Обратите внимание, что мы пользуемся новой для нас командой sleep 1 — название говорит само за себя. Представьте, что водитель припарковывает машину у обочины и засыпает на одну секунду, а потом тут же продолжает свой маршрут. Для запуска программы как обычно заходим в нашу папку и запускаем эту программу

cd c:\rubytut\lesson6
ruby road.rb

Если всё написано правильно, вы увидите, как машинка неспешно проедет три километра.

Массивы

Часто нам нужно хранить в программе не одну переменную, а сразу несколько, причём одинаковых по типу (например, 10 строк, 35 чисел, 20 чисел с плавающей точкой и т.д.), отличающихся только значениями. Для таких целей в любом современном языке существует специальный тип объекта — массив. Поясним это на простом примере.

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

fruit1 = "apple"
fruit2 = "banana"
fruit3 = "orange"

Не много ли чести для каждого фрукта иметь свою переменную? И что делать, если мы не знаем заранее, сколько будет фруктов? Для этого в программировании придумали специальный тип – массивы.

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

Корзина с фруктами

Давайте сложим наши фрукты в массив на Ruby:

fruits = ["apple", "banana", "orange"]

Так в Ruby объявляются массивы.

Посмотрите, как компактно фрукты сгруппированы, они даже в программе лежат друг рядом с другом, прямо как лежали бы в корзинке. Они все лежат в одной переменной fruits. Объект, на который указывает переменная fruits, как и все объекты в Ruby имеет какой-то класс. Класс массива называется Array.

puts fruits.class.name

Выведет в консоли "Array".

Выбор элемента из массива

Теперь мы знаем, что все фрукты лежат в переменной fruits. Если нам нужен какой-то фрукт, мы можем к ней обратиться, нужно только знать номер фрукта и написать его в квадратных скобках после этой переменной.

puts fruits[0]

Выведет на экран "apple".

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

Индексация элементов массива начинается с нуля

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

Если мы хотим вывести в консоль banana, то есть второй элемент, нам надо написать

puts fruits[1]

Печать массива

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

puts fruit1 + ", " + fruit2 + ", " + fruit3

Если мы подготовили массив fruits, то вывести его на экран — проще простого, нужно только вызвать его метод to_s вот так:

puts fruits.to_s

Сравните количество символов в последних двух примерах и вы поймёте, почему массивы так популярны у программистов.

Чаще всего программы используются для оптимизации каких-то процессов, а оптимизация — совершение однотипных действий с однотипными данными. Именно поэтому хранение однотипных данных в массивах так популярно в программировании.

Добавление элемента в массив

Допустим у нас есть пустой массив (да, бывает и такое).

basket = []

Для того, чтобы добавить в этот массив первый (или правильнее сказать нулевой) элемент, есть несколько способов. Первый — «клювики».

basket << "apple"

Теперь в нашем массиве будет один элемент, содержащий строку "apple". Также для добавления можно использовать метод массива push.

basket.push("melon")

С помощью push можно запихнуть в массив и несколько элементов, для этого мы передаём ему в качестве параметров несколько строк через запятую.

basket.push("cherry", "mango")

Теперь в массиве basket четыре элемента и команда

puts basket.to_s

выведет на экран

"apple", "melon", "cherry", "mango"

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

Удаление элемента из массива

Давайте представим, что нам из нашего массива нужно удалить несколько элементов. Это также можно сделать разными способами. Например, если мы знаем, что хотим удалить из массива basket дыню ("melon"), то мы можем сделать это с помощью метода delete:

basket.delete("melon")

Тогда в массиве останется только три элемента и

puts basket.to_s

выведет на экран

"apple", "cherry", "mango"

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

basket.delete_at(0)

Таким образом мы удалим первый элемент "apple" и в корзине остается

puts basket.to_s

только

"cherry", "mango"

Вот основные действия с массивами.

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

Итак, в этом уроке мы познакомились с потоком выполнения программы, командой sleep, а также узнали, что такое массивы и научились создавать их, узнали, какой у них класс, как добавлять в них элементы с помощью «клювиков» << и команды push, а также удалять из массива элементы с помощью команд delete и delete_at.

В следующем уроке мы познакомимся с циклами, научимся их создавать с помощью операторов for и while и научимся делать однотипные действия с каждым элементом из массива.