Масиви. Частина 2. Багатовимірні масиви. Ступінчаті масиви

Масиви. Частина 2. Багатовимірні масиви. Ступінчаті масиви


Зміст



1. Який масив називається багатовимірним?

Багатовимірний масив – це масив, що має два і більше вимірів. Для доступу до елементу багатовимірного масиву використовується комбінація з двох і більше індексів.

 

2. Яка загальна форма оголошення багатовимірного масиву?

Загальна форма оголошення багатовимірного масиву наступна:

тип[,...,] ім’я_масиву = new тип[розмір1, розмір2, ..., розмірN];

де

  • тип – безпосередньо тип елементів масиву;
  • розмір1, розмір2, розмірN – розмірність кожного виміру масиву. Значення N означає, що масив N-вимірний.

 

3. Приклад оголошення та використання двовимірного масиву дійсних чисел розміром 3×4

У прикладі оголошується двовимірний масив дійсних чисел, які мають тип float

// оголошення та використання масиву дійсних чисел розміром 3*4
float[,] M = new float[3, 4]; // виділити пам'ять для масиву

// заповнення масиву довільними значеннями
for (int i = 0; i < 3; i++)
    for (int j = 0; j < 4; j++)
        M[i, j] = (float)(i * 0.2 + j * 0.3);

// запис значень в окремі комірки масиву
M[0, 1] = 0.35f;
M[2, 2] = 1.45f;

 

4. Приклад оголошення та використання тривимірного масиву цілих чисел розміром 3×4×5
// оголошення тривимірного масиву цілих чисел розміром 3*4*5
ulong[, ,] A; // описати змінну (посилання) типу "тривимірний масив цілих чисел"

A = new ulong[3, 4, 5]; // виділити пам'ять для масиву

// записати в окремі комірки масиву значення
A[0, 2, 3] = 232;
A[0, 0, 1] = 300;
A[2, 3, 1] = 20000;

 

5. Як виглядає загальна форма ініціалізації багатовимірного масиву?

Ініціалізація масиву дозволяє записати значення в комірки масиву в момент його оголошення в програмі.

Загальна форма ініціалізації багатовимірного масиву має такий вигляд:

тип[,] ім’я_масиву = { { значення, значення, ..., значення },
                       { значення, значення, ..., значення },
                       ...
                       { значення, значення, ..., значення } };

де

  • тип – тип елементів масиву;
  • значення – значення, якими ініціалізуються елементи масиву.

 

6. Приклад ініціалізаціїї двовимірного масиву розміром 5×3. Елементи масиву мають тип char
// ініціалізація двовимірного масиву
char[,] M = { { 'A', 'B', 'C', 'D', 'E' },
              { '8', '-', '=', '>', '+' },
              { '~', 'U', '&', '\\', '@' } };

 

7. Приклад ініціалізації тривимірного масиву цілих чисел розміром 2×3×4
// ініціалізація тривимірного масиву цілих чисел
short[, ,] B = {
                   {
                       { 1, 2, 3, 4 },
                       { 5, 6, 7, 8 },
                       { 9, 10, 11, 12 }
                   },
                   {
                       { 13, 14, 15, 16 },
                       { 17, 18, 19, 20 },
                       { 21, 22, 23, 24 }
                   }
               };

 

8. Що таке ступінчатий масив? Яка загальна форма оголошення ступінчатого масиву?

Двовимірні масиви можуть бути двох видів:

  • прямокутний масив у вигляді таблиці;
  • ступінчатий масив. У цьому масиві кількість елементів кожного рядка (масиву) може бути різною. Ступінчатий масив ще називають масивом масивів.

Загальна форма оголошення ступінчатого масиву:

тип [][] ім’я_масиву = new тип[розмір][];

де

  • тип – тип елементів масиву;
  • розмір – кількість рядків у масиві.

 

9. Приклад оголошення та використання ступінчатого масиву
// ступінчаті масиви
// оголошення масиву з 4-х рядків, елементи якого мають тип ulong
ulong[][] A = new ulong[4][];

// виділення пам'яті для кожного рядка
A[0] = new ulong[5]; // у рядку з індексом 0 є 5 елементів
A[1] = new ulong[3]; // у рядку з індексом 1 є 3 елементи
A[2] = new ulong[6];
A[3] = new ulong[4];

// демонстрація доступу до елементів масиву A
A[0][0] = 2003;
A[0][4] = 199008;
A[1][2] = 302909;
A[3][3] = 10000000;

for (int i = 0; i < 6; i++)
    A[2][i] = (ulong)(i * i * i);

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

 

10. В яких випадках доцільно використовувати ступінчаті масиви?

Ступінчаті масиви є ефективними у випадках, коли у двовимірних прямокутних масивів є багато елементів, які взагалі не використовуються. Це дозволяє заощадити пам’ять за рахунок виділення тільки необхідного об’єму пам’яті (кількості елементів) для кожного рядка ступінчатого масиву.

На рисунку 1 відображено переваги застосування ступінчатих масивів у порівнянні з прямокутними. Продемонстровано можливу економію пам’яті у випадку, якщо дані представити прямокутним масивом в якому усі елементи деяких рядків (0, 2, 3, 4) не використовуються.

Варіант 1. Оголошення прямокутного масиву з іменем M.

// оголошення прямокутного масиву
int[,] M = new int[5,100]; // виділяється 500 комірок типу int

Варіант 2. Оголошення ступінчатого масиву.

// оголошення ступінчатого масиву
int[][] M = new int[5][];

// виділяється 50+100+30+60+40 = 280 комірок типу int
M[0] = new int[50];
M[1] = new int[100];
M[2] = new int[30];
M[3] = new int[60];
M[4] = new int[40];

C# приклад ступінчатий масив

Рис. 1. Приклад економії пам’яті з допомогою ступінчатого масиву з 5 рядків у порівнянні з прямокутним масивом розміром 5×100

 

11. Яким чином реалізувати масив двовимірних масивів? Приклад

У прикладі реалізується масив двовимірних масивів з іменем M. Масив має 10 рядків. У кожному рядку формується двовимірний масив розміром 3×4.

// оголошення масиву з 10 двовимірних масивів дійсних чисел, кожен з яких має розмір 3*4
float[][,] M; // оголошення змінної типу масив двовимірних масивів

// виділення пам'яті для 10 двовимірних масивів типу float
M = new float[10][,];

// виділення пам'яті для кожного масиву розміром 3*4
for (int i = 0; i < 10; i++)
    M[i] = new float[3, 4];

// заповнення масивів довільними значеннями
for (int i = 0; i < 10; i++)
    for (int j = 0; j < 3; j++)
        for (int k = 0; k < 4; k++)
            M[i][j, k] = i * 10 + j * 3 + k;

// заповнити конкретні комірки
M[0][2, 1] = 20.44f;
M[2][0, 2] = 100.08f;

 


Зв’язані теми