Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
+ООП_Навч_посібник.doc
Скачиваний:
8
Добавлен:
01.07.2025
Размер:
6.58 Mб
Скачать

5.4.2. Багатовимірні|багатомірні| масиви

У мові програмування C++, окрім двовимірних, можна визначати масиви трьох і більш вимірів. Ось як оголошується багатовимірний масив:

тип ім'я[розмір1][розмір2]...[розмірN];

Наприклад, за допомогою такого оголошення створюється тривимірний цілочисельний масив розміром 4103:

int multidim[4][10][3];

Як ми вже зазначали вище, пам'ять, виділена для зберігання всіх елементів масиву, використовується протягом всього часу наявності масиву. Масиви з числом вимірювань, що перевищує три, використовуються нечасто, хоча б тому, що для їх зберігання потрібен великий об'єм пам'яті. Наприклад, зберігання елементів чотиривимірного символьного масиву розміром 10694 займе 2 160 байт. А якщо кожну розмірність збільшити в 10 разів, то займана масивом пам'ять зросте до 21 600 000 байтів. Як бачимо, великі багатовимірні масиви здатні "з'їсти" великий об'єм пам'яті, а програма, яка їх використовує, може дуже швидко наштовхнутися на проблему браку пам'яті.

5.5. Ініціалізація масивів

5.5.1. Ініціалізація "розмірних" масивів

У мові програмування C++ передбачено можливість ініціалізації масивів. Формат ініціалізації масивів подібний до формату ініціалізації інших змінних:

тип ім'я_масиву[розмір] = [список_значень];

У цьому записі елемент список_значень є перелік значень ініціалізації елементів масиву, розділених між собою комами. Тип кожного значення ініціалізації повинен бути сумісний з базовим типом масиву (елементом тип). Перше значення ініціалізації буде збережено в першій позиції масиву, друге значення – в другій і т.д. Звернемо Вашу увагу на те, що крапка з комою ставиться після закритої фігурної дужки (}).

Наприклад, в такому прикладі 10-елементний цілочисельний масив ініціалізувався числами від 1 до 10:

int tMas[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

Після виконання цієї настанови елемент tMas[0] набуде значення 1, а елемент tMas[9] –значення 10.

Для символьних масивів, призначених для зберігання рядків, передбачено скорочений варіант ініціалізації, який має таку форму:

char ім'я_масиву[розмір] = "рядок";

Наприклад, такий фрагмент коду програми ініціалізує масив strMas фразою "привіт".

char strMas[7] = "привіт";

Це рівнозначно поелементній ініціалізації:

char strMas[7] = {'п', 'p', 'и', 'в'|, 'і', 'т', '\0'};

Оскільки у мові програмування C++ рядки повинні завершуватися нульовим символом, то переконайтеся, що під час оголошення масиву його розмір вказано з врахуванням ознаки кінця. Саме тому в попередньому прикладі масив strMas оголошений як 7-елементний, хоча у слові "привіт" тільки шість букв. Під час використання рядкового літерала компілятор добавляє нульову ознаку кінця рядка автоматично.

Багатовимірні масиви ініціалізуються за аналогією з одновимірними. Наприклад, такий фрагмент коду програми масив sqrMas ініціалізувався числами від 1 до 10 і квадратами цих чисел.

int sqrMas[10][2] = {

1, 1,

2, 4,

3, 9,

4, 16,

5, 25,

6, 36,

7, 49,

8, 64,

9, 81,

10, 100

};

Тепер розглянемо, як елементи масиву sqrMas розташовуються в пам'яті (рис. 5.2).

Рис. 5.2. Схематичне представлення ініціалізованого масиву sqrMas

Під час ініціалізації багатовимірного масиву перелік ініціалізацій кожної розмірності (підгрупу ініціалізацій) можна помістити у фігурні дужки. Ось, наприклад, як виглядає ще один варіант запису попереднього оголошення:

int sqrMas[10][2] = {

{1, 1),

{2, 4},

{3, 9},

{4, 16},

{5, 25},

{6, 36},

{7, 49},

{8, 64},

{9, 81},

{10, 100}

};

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

У наведеному нижче коді програми масив sqrMas використовують для пошуку квадрата числа, введеного користувачем. Програма спочатку виконує пошук заданого числа в масиві, а потім виводить відповідне йому значення квадрата.

Код програми 5.15. Демонстрація пошуку потрібного елемента у двовимірному масиві

#include <iostream> // Для потокового введення-виведення

using namespace std; // Використання стандартного простору імен

int sqrMas[10][2] = {

{1, 1},

{2, 4},

{3, 9),

{4, 16),

(5, 25},

(6, 36},

{7, 49},

(8, 64},

(9, 81},

{10, 100}

};

int main()

{

int i, j;

for(;;) {

cout << "Введіть число від 1 до 10: ";

cin >> i;

if(i>=1)(i<=10) break;

}

// Пошук значення i.

for(j=0; j<10; j++)

if(sqrMas[j][0] == i) break;

cout << "Квадрат числа " << i << " дорівнює " << sqrMas[j][1];

getch(); return 0;

}

Глобальні масиви ініціалізувалися на початку виконання програми, а локальні – під час кожного виклику функції, у якій вони містяться. Розглянемо такий приклад:

Код програми 5.16. Демонстрація ініціалізації елементів двовимірного масиву

#include <iostream> // Для потокового введення-виведення

#include <cstring> // Для роботи з рядковими типами даних

using namespace std; // Використання стандартного простору імен

void fun_1();

int main()

{

fun_1();

fun_1();

getch(); return 0;

}

void fun_1() {

char sMas[80] ="Це просто тест\n";

cout << sMas;

strcpy(sMas, "Змінено\n"); // Змінюємо значення рядка sMas.

cout << sMas;

}

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

Це просто тест

Змінено

Це просто тест

Змінено

У цій програмі масив sMas ініціалізувався під час кожного виклику функції fun_1(). Той факт, що під час її виконання масив sMas змінюється, ніяк не впливає на його повторну ініціалізацію при подальших викликах функції fun_1(). Тому під час кожного входження в неї на екрані з'являється такий текст:

Це просто тест