Масиви. Частина 2. Двовимірні масиви. Масиви рядків. Багатовимірні масиви

Масиви. Частина 2. Двовимірні масиви. Масиви рядків. Багатовимірні масиви

Дана тема є продовженням теми: “Поняття масиву. Одновимірні масиви”.


Зміст


1. Двовимірні масиви. Приклади опису та використання

В мові C++ є можливість використовувати двовимірні та багатовимірні масиви. Двовимірний масив – це список одновимірних масивів.

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

Приклад 1. Опис двовимірного масиву Matr цілих чисел розміром 3×4.

int Matr[3][4]; // двовимірний масив розміром 3*4

Доступ до елементів масиву (рисунок 1):

Matr[0][0] = 23;
Matr[2][3] = 41;
Matr[1][2] = -8;

C++ двовимірний масив рисунок

Рисунок 1. Доступ до елементів матриці Matr

Щоб занулити двовимірний масив Matr потрібно написати такий програмний код:

...

int Matr[3][4]; // двовимірний масив розміром 3*4
int i,j;

for (i=0; i<3; i++)
    for (j=0; j<4; j++)
        Matr[i][j] = 0;

...

Приклад 2. Опис двовимірної матриці Matrix дійсних чисел розміром 10×10.

float Matrix[10][10]; // матриця дійсних чисел розміром 10*10

Доступ до елементів матриці:

// доступ до елементів матриці
Matrix[2][4] = -90.3453;
Matrix[0][8] = 259.3;
Matrix[9][9] = 0.85;
Matrix[3][4] = -0.23;

Приклад занулення матриці Matrix:

// занулення матриці
for (i=0; i<10; i++)
    for (j=0; j<10; j++)
        Matrix[i][j] = 0.0;

2. Ініціалізація двовимірних масивів. Приклад

Ініціалізація двовимірних та багатовимірних масивів подібна до ініціалізації одновимірних масивів. В цьому випадку список ініціалізаторів кожної розмірності береться в фігурні дужки.

Ініціалізація двовимірних (багатовимірних) масивів може бути:

  • з задаванням розміру масиву;
  • без задавання розміру масиву (“безрозмірна” ініціалізація).

Приклад 1. Ініціалізація двовимірного масиву M дійсних чисел розміром 3×4. Задається розмір масиву.

// ініціалізація масиву M дійсних чисел розміром 3*4
float M[3][4] = 
    {
        { 0.5, -2.8, -1.0, 23.45 },
        { -2.3, 0.4, 10.5, 0.8 },
        { 12.5, 10.4, 5.4, 3.56 }
    };

Якщо у переліку вказати не всі елементи групи, тоді відсутні елементи будуть доповнюватись нульовими значеннями автоматично (рисунок 2).

// ініціалізація масиву M дійсних чисел розміром 3*4
// відсутні елементи доповнюються нулями
float M[3][4] = 
{
    {  0.5, -2.8 },
    { -2.3 },
    { 12.5, 10.4, 5.4, 3.56 }
};

C++ масив заповнення рисунок

Рисунок 2. Доповнення масиву нулями

Приклад 2. “Безрозмірна” ініціалізація масиву B цілих чисел.

// "безрозмірна ініціалізація масиву B
int B[][4] = 
{
    {  2, -8,   3,   4 },
    { -3, 50,  42, -77 },
    { 11, 25, -30,   4 }
};

Приклад 3. “Безрозмірна ініціалізація масиву B з доповненням нулями (рисунок 3).

// "безрозмірна ініціалізація масиву B
// з доповненням нулями
int B[][4] = 
{
    {  2, -8 },
    { -3 },
    { 11, 25, -30, 4 }
};

C++ ініціалізація двовимірний масивРисунок 3. “Безрозмірна” ініціалізація масиву B з заповненням нулями

Другий індекс масиву (стовпці) обов’язково має бути присутній. В іншому випадку компілятор видає повідомлення про помилку.

3. Ініціалізація масивів рядків. Приклади

Масив рядків також є двовимірний масив символів.

Так само як і з іншими типами даних, ініціалізація масиву рядків може бути:

  • з задаванням розміру рядка;
  • без задавання розміру рядка (“безрозмірна” ініціалізація).

Приклад 1. Ініціалізація масиву рядків з задаванням довжини рядка. Описується двовимірний масив рядків розміром 5×60 символів.

char Strings[5][60] = 
{
    "Text - 1",
    "Text - 2",
    "Text - 3",
    "Text - 4",
    "Text - 5"
};

У вищенаведеному прикладі кожен рядок може містити до 60 символів. Якщо довжина рядка менше за 60, то значення інших символів рівне 0 (рисунок 4).

C++ Двовимірний масив пам'ять

Рисунок 4. Представлення двовимірного масиву рядків у пам’яті комп’ютера

Приклад 2. “Безрозмірна” ініціалізація масиву рядків

char * Strings2[] = 
{
    "String number 1",
    "String #2",
    "Third string"
};

Вищенаведений код можна записати й іншим чином

char * Strings2[3] = 
{
    "String number 1",
    "String #2",
    "Third string"
};

При “безрозмірній” ініціалізації масиву рядків не потрібно “вручну” підраховувати довжину (кількість символів) рядка. Це здійснюється автоматично на етапі компілювання.
У вищенаведеному прикладі довжина першого рядка рівна 16 символів (рисунок 5). Довжина другого рядка рівна 10. Довжина третього рядка рівна 12 символів. В кінці кожного рядка слідує нульовий символ ‘\0’.
Таким чином, використання безрозмірної ініціалізації дозволяє економити пам’ять, виділену під масив.

C++ представлення рядків рисунок

Рисунок 5. Представлення рядків при “безрозмірній” ініціалізації

4. Багатовимірні масиви. Приклади опису та використання
// масив цілих чисел розміром 3*5*6
int MI[3][5][6];
MI[0][2][5] = 238;
MI[2][4][3] = -3994;

// масив дійсних чисел розміром 4*6*2*3
float MF[4][6][2][3];
MF[0][0][0][0] = -394.32f;
MF[3][4][1][1] = 4.4f;
MF[1][5][0][2] = 0.0f;
MF[2][2][1][1] = 555.2437f;


5. Ініціалізація багатовимірних масивів. Приклад
// ініціалізація масиву M цілих чисел розміром 2*3*4
int M[2][3][4] = 
            {
                {
                    {  8,  3, -5,  2 },
                    { -3,  2,  8,  4 },
                    {  1,  0,  3, -9 }
                },
                {
                    { -2,  9,  5,  4 },
                    {  1,  0,  2,  5 },
                    { -8,  3,  4,  2 }
                }
            };


Схожі теми