Що таке масив
Масив - це складний (складений, структурований) тип даних, який характеризується наступним:
· Елементи масиву мають однаковий тип на відміну від структур, тому кожен елемент масиву займає однаковий об'єм пам'яті;
· Масив розташовується в оперативній пам'яті, а не на зовнішніх пристроях, як файли (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 [] =; оголошує і ініціалізує цілочисельний масив з п'яти елементів, а Зазначений спосіб визначення масиву зручний для налагодження програми, так як не треба витрачати час на багатократне введення його елементів. При тестуванні досить змінити кілька елементів масиву. · Для деяких, але не для всіх, завдань масив можна визначити за допомогою датчика випадкових чисел: 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 Вправа. Як працює цей фрагмент програми?
сhar S [] = "ММФ"; - рядок з чотирьох символів, так як доданий символ кінця рядка.