Треки
/
Crystal
Crystal
/
Вправи
/
Навігаційний компʼютер
Навігаційний компʼютер

Навігаційний компʼютер

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

Вступ

У Crystal є різноманітні типи чисел для різних потреб. Наприклад, одні типи працюють швидше, але мають менший діапазон можливих значень, ніж інші. Інші мають ширший діапазон можливих значень, але працюють повільніше.

У Crystal існують як цілі числа зі знаком, так і беззнакові цілі числа. Цілі числа зі знаком можуть бути додатними або відʼємними. Беззнакові цілі числа можуть бути лише додатними.

Типи цілих чисел зі знаком

Ось типи цілих чисел зі знаком у Crystal:

Тип Розмір (біти) Діапазон
Int8 8 від -128 до 127
Int16 16 від -32_768 до 32_767
Int32 32 від -2_147_483_648 до 2_147_483_647
Int64 64 від -9_223_372_036_854_775_808 до 9_223_372_036_854_775_807
Int128 128 від -170_141_183_460_469_231_731_687_303_715_884_105_728 до 170_141_183_460_469_231_731_687_303_715_884_105_727

Менші типи використовують менше памʼяті й працюють швидше за більші, але мають менший діапазон можливих значень.

Коли ми знаємо, що значення перебуватимуть у певному діапазоні, найкраще використати якомога менший тип, щоб заощадити памʼять і підвищити швидкодію.

Типовим типом цілих чисел є Int32. Щоб оголосити ціле число з конкретним типом, можна додати назву типу як суфікс, дописавши <number>_I <bit>.

1_i8.class
# => Int8

Щоб перетворювати різні типи цілих чисел, можна використати метод to_i<bit>. Метод to_i перетворює значення на типовий тип цілих чисел, Int32.

1_i8.to_i16.class
# => Int16

2_i16.to_i.class
# => Int32

Типи беззнакових цілих чисел

Ось беззнакові цілі числа у Crystal:

UInt8, UInt16, UInt32, UInt64, UInt128

Єдина відмінність між цілими числами зі знаком і беззнаковими цілими числами полягає в тому, що беззнакові можуть бути лише додатними. Щоб оголосити беззнакове ціле число з конкретним типом, можна додати назву типу як суфікс, дописавши <number>_u<bit>. Щоб перетворювати різні типи беззнакових цілих чисел, можна використати метод to_u<bit>. Метод to_u перетворює значення на типовий тип беззнакових цілих чисел, UInt32.

1_u8.to_u16.class
# => UInt16

Типи чисел з плаваючою комою

Ось типи чисел з плаваючою комою в Crystal:

Тип Розмір (біти) Діапазон
Float32 32 від 1.2E-38 до 3.4E+38
Float64 64 від 2.3E-308 до 1.7E+308

Існують два різні типи чисел з плаваючою комою, один із них точніший за інший.

Типовим типом чисел з плаваючою комою є Float64.

Щоб перетворювати різні типи чисел з плаваючою комою, можна використати метод to_f<bit>. Метод to_f перетворює значення на типовий тип чисел з плаваючою комою, Float64.

Вказівки

ESA (Космічне агентство Exercism) на повній швидкості планує нову місію до Фобоса, супутника Марса. Мета місії - посадити зонд на поверхню Фобоса й надіслати назад дані про цю поверхню. ESA попросила нас допомогти створити навігаційний компʼютер для зонда. Навігаційний компʼютер має обмежену памʼять, тож нам потрібно якомога зменшити використання памʼяті. Тому нам потрібно використовувати відповідні типи даних.

1. Константи навігації

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

Визначте такі константи:

  • NEPTUNE_DISTANCE зі значенням 4_400_000_000, яке потрібно зберігати як Int64
  • MARS_DISTANCE зі значенням 227_940_000, яке потрібно зберігати як Int32
  • ATMOSPHERE_DISTANCE зі значенням 10_000, яке потрібно зберігати як Int16

2. Правильний аналіз площі

Навігаційному компʼютеру потрібно знати площу деяких обʼєктів у космосі, щоб виконувати правильні обчислення. Площа НЕ може бути відʼємною. Інженери планували, що програма генеруватиме помилку переповнення, коли площа відʼємна. Однак інженери забули змінити ціле число зі знаком на беззнакове ціле число.

Тому інженери хочуть програму, яка перетворює ціле число зі знаком на беззнакове ціле число.

Реалізуйте метод Navigation#correct_area_analysis, який приймає measurement як аргумент і повертає площу як беззнакове ціле число з 32 бітами.

Note

Надана площа завжди поміститься в беззнакове ціле число з 32 бітами.

measurement = 52554
measurement.class
# => Int32

Navigation.new.correct_area_analysis(measurement)
# => 52554

Navigation.new.correct_area_analysis(measurement).class
# => UInt32

3. Обчислення швидкості

Навігаційному компʼютеру потрібно знати швидкість зонда. Швидкість вимірюється в м/с.

Щоб обчислити швидкість, нам потрібно знати пройдену відстань і час, за який її пройдено. Далі беремо відстань і ділимо її на час.

Швидкість може бути не зовсім точною й ніколи не буде надто великим числом. Тому ми можемо використати Float32.

Реалізуйте метод Navigation#calculate_velocity, який приймає distance і time як аргументи й повертає швидкість як Float з 32 бітами.

distance = 52554
time = 2.5

Navigation.new.calculate_velocity(distance, time)
# => 21021.6

Navigation.new.calculate_velocity(distance, time).class
# => Float32
Редагувати через GitHub Посилання відкривається в новому вікні або вкладці
Crystal Exercism

Час розпочати Навігаційний компʼютер?

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