Є два типи масивів у D: статичні та динамічні. При доступі до
масиву будь-якого типу є перевірка на вихiд за його межі (крім випадків,
коли компілятор може довести що дана перевірка не потрібна).
Якщо це станеться, виконання програми перерветься з повідомленням про
помилку RangeError
. Якщо ви сильні духом, то можете вимкнути перевiрку
за допомогою опцiї компілятора -boundschecks=off
. Це дозволить вам
пришвидчити програму.
Статичні масиви зберігаються у стеку, якщо вони оголошені всередині функції, або у статичній пам'яті в інших випадках. Вони мають фіксовану довжину, відому ще на етапі компіляції. Статичний тип масиву включає у себе фіксований розмір:
int[8] arr;
Типом arr
є int[8]
. Зверніть увагу, що розмір масиву вказаний
за типом, а не після змінної, як це робиться у C/C++.
Динамічні масиви зберігаються у купі і можуть бути розширенi або
стиснутi під час виконання програми. Динамічний масив створюється за
допомогою ключового слова new
разом з вказанням довжини:
int size = 8; // run-time змінна
int[] arr = new int[size];
Типом arr
є int[]
, який також зветься зрiзом (slice), про який
поговоримо більш детально у наступному розділі.
Багатовимірнi масиви можуть бути легко створені за допомогою синтаксису
auto arr = new int[3][3]
.
Масиви можуть бути об'єднані за допомогою оператора конкатенації ~
,
який створить новий динамічний масив.
Математичні операції можуть застосовуватися до цілих масивів,
використовуючи наступний синтакс c[] = а[] + b[]
,
який, наприклад, додасть всі елементи a
до b
, тобто вийде
c[0] = а[0] + b[0]
, c[1] = а[1] + b[1]
і т.д. Крім того, можливе
виконання операцій з цілим масивом та одним значенням:
a[] *= 2; // помножити всi елементи на 2
a[] %= 26; // значення по модулю 26 для всіх елементів а
Ці операції можуть бути оптимізовані компілятором таким чином, щоб задіяти спеціальні інструкції процесора, які завершать ці операції за один крок.
Як статичнi, так і динамічнi масиви мають властивість .length
.
Її можна лише читати у разі статичних масивів, а у разі динамічних
масивів є можливість змінювати це значення, щоб динамічно змінювати
розмір масиву. Властивість .dup
створює копію масиву.
При індексації масиву за допомогою синтаксису arr[idx]
спеціальний
символ $
позначає довжину масиву. Наприклад, arr[$ - 1]
посилається
на останній елемент і є короткою формою запису arr[arr.length - 1]
.
Завершіть функцію encrypt
для розшифрування таємного повідомлення.
Текст повинен бути зашифрований з використанням Шифру Цезаря
(Caesar encryption), який зміщує символи в алфавіті, використовуючи
певний індекс. Текст для шифрування містить тільки символи з діапазону
а-z
, що полегшує завдання.