Треки
/
Crystal
Crystal
/
Вправи
/
Список мов
Список мов

Список мов

Навчальна вправа

Вступ

Масив - це змінна структура даних, яка зберігає набір елементів певного типу. Масив - це індексована структура даних. Те, що масиви змінні, означає: якщо викликати метод масиву, який його змінює, масив буде змінено. Тобто метод не створює новий масив, а змінює наявний.

Щоб створити масив, використайте синтаксис літерала масиву ([]) і вкажіть усередині елементи масиву, розділені комою.

[1, 2, 3] # => [1, 2, 3]

Crystal визначить тип масиву за його елементами.

[1, 2, 3].class # => Array(Int32)

Масиви з кількома типами

Хоча раніше ми згадували, що масив - це набір елементів певного типу, можна створити масив із кількома типами за допомогою обʼєднаних типів. Це дозволяє масиву містити елементи будь-якого з типів, зазначених в обʼєднаному типі. Crystal визначить тип масиву за його елементами.

[1, "2", 3.0] # => [1, "2", 3.0]

[1, "2", 3.0].class # => Array(Int32 | Float64 | String)

Багатовимірні масиви

Багатовимірний масив - це масив масивів. Тобто кожен елемент такого масиву сам є масивом. Це може стати в пригоді, коли потрібно зберегти дані у вигляді таблиці. Щоб визначити багатовимірний масив, можна або записати літерал масиву масивів, або скористатися конструктором Array.new.

[[1, 2], [3, 4]]                    # => [[1, 2], [3, 4]]
numbers = Array(Array(Int32)).new() # => []
numbers << [1, 2]                   # => [[1, 2]]

Додавання елемента до масиву

Щоб додати елемент до масиву, використайте оператор << (додавання в кінець).

[1, 2, 3] << 4 # => [1, 2, 3, 4]

Тип елемента, який ми додаємо, має збігатися з типом масиву; якщо це не так, буде викликано помилку.

numbers : Array(Int32 | Float64) = [1, 2, 3]
numbers << 4.0
numbers # => [1, 2, 3, 4.0]

numbers << "5" # => Error: no overload matches 'Array(Int32 | Float64)#<<' with type String

Розмір масиву

Як і з String, розмір масиву можна отримати за допомогою методу size.

[1, 2, 3].size # => 3

Порожні масиви

Компілятор не може визначити тип масиву, коли ми створюємо порожній масив. Тому тип масиву потрібно вказати. Це можна зробити, вказавши тип масиву за допомогою ключового слова of, або скориставшись синтаксисом ініціалізації масиву Array(T).new.

[] of (Int32 | Float64 | String)    # => []
Array(Int32 | Float64 | String).new # => []

Доступ до елементів

Як і з String, до елементів масиву можна звертатися за допомогою оператора [] (індексація), передавши йому індекс потрібного елемента. Якщо індекс виходить за межі, буде викликано IndexError.

[1, 2, 3][0] # => 1

[1, 2, 3][3] # => Index out of bounds (IndexError)

Також до елементів можна звертатися за допомогою діапазону.

[1, 2, 3][0..1] # => [1, 2]

Створення масиву з діапазону

Щоб створити масив із діапазону, використайте метод to_a. Це стане в пригоді, коли потрібно створити масив чисел.

(1..3).to_a # => [1, 2, 3]

Створення масиву з рядка тексту

Щоб створити масив із рядка тексту (англ. string), використайте метод split. Він дозволяє розбити рядок тексту на масив рядків тексту за допомогою роздільника.

"1,2,3".split(",") # => ["1", "2", "3"]

Також із рядка тексту можна отримати масив символів за допомогою методу chars.

"123".chars # => ['1', '2', '3']

Щоб перетворити масив Char або String на String, можна скористатися методом join, який приймає роздільник як аргумент.

['1', '2', '3'].join(".") # => "1.2.3"

Видалення елемента з масиву

Коли потрібно видалити елемент із кінця масиву, можна скористатися методом pop, який приймає необовʼязковий аргумент: скільки елементів видалити з кінця масиву. Метод повертає видалений елемент. Якщо масив порожній, буде викликано IndexError.

numbers = [1, 2, 3]
numbers.pop # => 3
numbers     # => [1, 2]

empty_numbers = [] of Int32
empty_numbers.pop # => Index out of bounds (IndexError)

Коли потрібно видалити елемент із певним індексом, можна скористатися методом delete_at, який приймає індекс елемента для видалення як аргумент. Якщо масив порожній, буде викликано IndexError.

numbers = [1, 2, 3]
numbers.delete_at(1) # => 2
numbers              # => [1, 3]

empty_numbers = [] of Int32
empty_numbers.delete_at(0) # => Index out of bounds (IndexError)

Зміна значень у масиві

Коли потрібно змінити елемент із певним індексом, можна скористатися оператором []= (присвоєння за індексом), який приймає індекс елемента для зміни та нове значення як аргументи. Якщо індекс виходить за межі, буде викликано IndexError.

numbers = [1, 2, 3]
numbers[1] = 4
numbers # => [1, 4, 3]

numbers[3] = 5 # => Index out of bounds (IndexError)

Вказівки

У цій вправі нам потрібно реалізувати кілька методів для роботи з масивом мов програмування.

1. Визначте метод, який повертає порожній масив мов

Визначте метод LanguageList.list, який не приймає аргументів і повертає порожній масив типу Array(String).

LanguageList.list()
# => []

2. Визначте метод, який додає мову до масиву

Визначте метод LanguageList.add, який приймає 2 аргументи (масив мов і літерал рядка тексту (англ. string) з назвою мови). Метод має повернути масив із новою мовою, доданою в кінець масиву.

language_list = LanguageList.list()
# => []
language_list = LanguageList.add(language_list, "Crystal")
# => ["Crystal"]
language_list = LanguageList.add(language_list, "Ruby")
# => ["Crystal", "Ruby"]

3. Визначте метод, який видаляє мову з масиву

Визначте метод LanguageList.remove, який приймає 1 аргумент (масив мов). Метод має повернути масив без останнього елемента. Вважайте, що в масиві завжди буде принаймні один елемент.

language_list = LanguageList.list()
# => []
language_list = LanguageList.add(language_list, "Crystal")
# => ["Crystal"]
language_list = LanguageList.add(language_list, "Ruby")
# => ["Crystal", "Ruby"]
language_list = LanguageList.remove(language_list)
# => ["Crystal"]

4. Визначте метод, який повертає n-й елемент масиву

Визначте функцію LanguageList.at, яка приймає 2 аргументи (масив мов і індекс). Метод має повернути мову за індексом n у масиві. Вважайте, що за цим індексом завжди буде мова.

language_list = LanguageList.new()
# => []
language_list = LanguageList.add(language_list, "Crystal")
# => ["Crystal"]
language_list = LanguageList.add(language_list, "Ruby")
# => ["Crystal", "Ruby"]
LanguageList.at(language_list, 1)
# => "Ruby"

5. Визначте метод, який розбирає рядок тексту з мовами

Визначте метод LanguageList.parse, який приймає 1 аргумент (літерал рядка тексту з мовами, розділеними комою). Метод має повернути масив мов.

LanguageList.parse("Crystal, Ruby")
# => ["Crystal", "Ruby"]
Редагувати через GitHub Посилання відкривається в новому вікні або вкладці
Crystal Exercism

Час розпочати Список мов?

Зареєструйтеся на Exercism, щоб вивчати й опановувати Crystal, а також 26 концепцій142 вправи та справжнє наставництво від людей, і все це безкоштовно.