Що таке масив

Масив - це складний (складений, структурований) тип даних, який характеризується наступним:

· Елементи масиву мають однаковий тип на відміну від структур, тому кожен елемент масиву займає однаковий об'єм пам'яті;

· Масив розташовується в оперативній пам'яті, а не на зовнішніх пристроях, як файли (2-й семестр);

· Елементи масиву займають поспіль йдуть осередки, на відміну, наприклад, від списків (2-й семестр).

Доступ до елементів масиву в мові С ++ здійснюється двома способами.

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

Масиви можуть мати одну або кілька розмірностей. У цьому параграфі розглядається одновимірний масив, який іноді називають вектором, маючи на увазі вектор в n-мірному просторі. Робота з двовимірними масивами (матрицями) розглядається в гл. 5. Три і більше розмірностей на практиці використовуються рідко, так як такі масиви займають великий обсяг оперативної пам'яті.

Скрізь в подальшому під словом "масив" будемо розуміти одновимірний масив.

З точки зору часу (етапу), коли розподіляється пам'ять під масив, існують два їх види. Пам'ять для динамічного масиву виділяється під час виконання програми, і якщо масив не потрібен, пам'ять для нього можна звільнити. Такі масиви розглядаються в другому семестрі.

Одновимірна масив з фіксованою розмірністю (назвемо його статичний) оголошується в загальному вигляді наступним чином:

Тут тип - тип елементів масиву. Спочатку будемо розглядати прості типи (int, float, char), але можна використовувати і складні, наприклад, структури. Ім'я записується за правилами ідентифікаторів. Кожен елемент масиву має одне і те ж ім'я, змінюється тільки індекс або номер елемента. N - розмірність (або розмір) масиву у вигляді целочисленной константи або константного виразу. Ця величина визначає кількість осередків оперативної пам'яті, зарезервованої для масиву. наприклад:

float A [10]; або const n = 10; float A [n];

На відміну від динамічного масиву, для статичного на етапі компіляції резервується пам'ять для розміщення N чисел зазначеного типу (10 дійсних чисел). Для масиву потрібно пам'ять об'ємом k * N байт (4 * 10), де k - необхідна кількість байт для розміщення одного елемента зазначеного типу (одного числа типу float). Ця пам'ять зберігається на весь час виконання програми, а точніше, функції або блоку, де описаний масив. Програмно необхідний обсяг пам'яті визначається за допомогою операції sizeof наступним чином:

M = sizeof (тип) * N; або M = sizeof (ім'я); або M = sizeof ім'я;

де M - змінна цілого типу, яка визначає розмір масиву в байтах. Тип обов'язково записується в дужках, а ім'я може бути без дужок. Наступна програма виведе удвічі більше 40.

float A [10]; int M1, M2;

M1 = sizeof (float) * 10; // але M1 = sizeof float * 10; - помилка!

M2 = sizeof (A); // або M2 = sizeof A;

У багатьох сучасних системах програмування, в тому числі і в С ++, нумерація елементів масиву починається з 0. Тоді A [n-1] - останній елемент масиву. Це пов'язано з використанням покажчиків при роботі з масивами (див. 2-й семестр). Тому в нашому прикладі індекс змінюється від 0 до 9 включно, тобто індекс останнього елемента масиву на одиницю менше його розмірності. Оголошені 10 елементів масиву позначаються наступним чином: A [0], A [1], A [2], ..., A [9]. В С ++ відсутня перевірка кордонів масивів. Можна вийти за його кордон і записати значення в деяку змінну або навіть в код програми. Про таке контролі повинен подбати програміст.

При використанні статичних масивів виникають проблеми в разі, якщо розмір масиву заздалегідь ми не знаємо. В такому випадку оголошуємо масив максимальної розмірності, яка, як правило, відома. Реальну розмірність вводимо і використовуємо далі, наприклад, в циклах і для інших цілей:

const nmax = 100; float X [nmax];

int n; cout<<”Input the size of array ”; cin>> N;

/ * Д альшой працюємо з n (а не з nmax) елементами масиву, наприклад, вводимо їх. * /

for (int i = 0; i

// Цей рядок можна опустити разом з фігурними дужками.

Такий спосіб простіше, але неефективний з точки зору розподілу пам'яті, так як "замовляємо" більше пам'яті, ніж реально використовуємо. У таких випадках професійно використовуються більш ефективні динамічні масиви (див. 2-й семестр).

6.2. Способи визначення масивів

· Введення елементів масиву з екрану (див. Вище) або із заздалегідь підготовленого файлу (2-й семестр).

де в фігурних дужках записуються константи відповідного типу, розділені комами. наприклад:

При цьому якщо в списку менше N значень, то відсутні елементи масиву приймуть нульове значення. Навпаки, якщо вказати більше N значень, "компілятору це не сподобається".

Масив символів (рядок) без явного використання покажчиків можна оголосити і форматувати по-різному. Можна вказати розмірність, достатню для розміщення тексту і символу кінця рядка ( '\ 0'). Цей символ треба явно записати в кінці списку, наприклад:

Другий спосіб простіше і зручніше: char T [11] = "математика"; В цьому випадку нульовий символ додається до кінця рядка автоматично.

Крім того, як для числових, так і для символьних масивів необов'язково вказувати розмірність. Вона буде визначена в залежності від кількості записаних елементів або довжини рядка. Наприклад, int V [] =; оголошує і ініціалізує цілочисельний масив з п'яти елементів, а
сhar S [] = "ММФ"; - рядок з чотирьох символів, так як доданий символ кінця рядка.

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

· Для деяких, але не для всіх, завдань масив можна визначити за допомогою датчика випадкових чисел:

const n = 5; int Y [n]; randomize ();

Функцію randomize () рекомендують використовувати, щоб масив був "більш випадковим". В іншому випадку масив може бути таким же, яким був при попередньому виконанні програми. Параметр функції random (в нашому прикладі 100) означає, що числа масиву будуть цілими на проміжку від 0 до 99 включно. Якщо треба, щоб числа були не тільки позитивними, можна записати, наприклад, так: Y [j] = random (100) -20; Тоді числа будуть на проміжку від -20 до 79, тобто позитивних чисел буде по теорії ймовірностей більше.

Якщо треба отримати речові числа, можна в циклі записати, наприклад, так: A [i] = random (5) /10.-0.25; При цьому масив A оголошується як float, а константу 10 треба записати обов'язково з символом ".", Тобто як дійсне число. Інакше вийдуть всі однакові числа (-0.25), так як при розподілі будь-якого цілого числа, меншого 5, на ціле число 10 вийде ціла частина результату, тобто нуль.

· Масив можна побудувати по деякому правилу. наприклад:

for (int j = 0; j

Вправа. Як працює цей фрагмент програми?