<тип> < ім'я масиву>[<розмір>]

МАСИВИ

 

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

Масив складається з елементів. Кожен елемент має індек­си, за якими його можна знайти у масиві. Кількість індексів визначає розмірність масиву. Розрізняють одно- та багатови­мірні масиви. Наприклад, двовимірний масив даних - це таб­лиця, що складається з декількох рядків і стовпців. У матема­тиці поняттю масив відповідають поняття вектора та матриці.

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

 

<тип> < ім'я масиву>[<розмір>]

 

Розмір — це кількість елементів масиву. Розмір масиву необхідно знати і задавати заздалегідь, оскільки компілятор має зарезервувати для нього необхідний обсяг пам'яті. Розмі­ром може бути лише стала величина (не змінна).

Ім'я масиву у програмі змінювати не можна - це стала величина, яка містить адресу першого елемента. Отже, назва масиву є вказівником на перший елемент.

Наприклад, команда int stud[5] оголошує масив з іменем stud, який складається із п'яти цілих чисел; команда float rist[10] оголошує масив rist, який містить десять чисел дійсного типу; char alphavit[6] - оголошення масиву із 6 символів.

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

Нумерація елементів масиву завжди починається з нуля. Щоб звернутись до деякого елемента, необхідно зазначити ім'я масиву, а у квадратних дужках - його номер. Наприк­лад, змінна stud[2] є третім елементом масиву stud, a stud[4] - п'ятим, оскільки масив stud має елементи stud[0], stud[1], stud[2], stud[3] та stud[4].

Зауваження . Компілятор мови C++ не контролює належність індексу до заданого діапазону. Відповідальність за це несе програміст. Наприклад, якщо у програмі оголосити масив mas з п'ятьма дійсними числами і написати команду mas[54] = 2, то повідомлення про помилку не буде, проте невідомо, у яку ділянку пам'яті потрапить число 2 і що трапиться.

Назва масиву stud є вказівником на його перший елемент. Змінна stud містить значення першого елемента масиву (елемента stud[0]). Оскільки всі елементи масиву розміщені у послідовних комірках оперативної пам'яті комп'ютера, то вказівник (stud+1) вказуватиме на другий елемент масиву (зміщення відносно вказівника stud на одну одиницю пам'яті), а вказівник (stud+4) - на п'ятий (зміщення на чотири одиниці).

Проініціалізувати масив (надати значення елементам масиву) можна одним із способів:

· використовуючи принцип замовчування;

· безпосередньо під час його оголошення;

· застосовуючи команду присвоєння;

· під час введення даних із клавіатури.

За замовчуванням усім елементам масиву надається зна­чення 0. Масив можна ініціалізувати повністю або частково відразу під час його оголошення, записуючи значення змін­них через кому у фігурних дужках. Наприклад,

 

int Stud[] = (2, 10, 5, 7, 3);

float rist[10] = {163.4, 154.6, 170, 172,8, };

char alphavit[6] = " Абетка "

або

char alphavit[6] = {' А ', ' б ', ' є ', ' т ', ' к ', 'a').

 

Перші чотири елементи масиву rist були проініціалізовані, а решта - ні. Масиви символів детальніше розглянемо у наступному параграфі.

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

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

 

rist[3]=175.4, rist[9]=184.1 або так: (rist+2)=164.5, *(rist+7)=148.0

 

тощо. Елементи масиву також можна вводити з клавіатури під час виконання програми, як це робимо для змінних простих стандартних типів.

Масиви-сталі (значення яких змінювати у програмі не можна) оголошують так:

 

const int flag[] = {1, 2}.

 

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

Для опрацювання елементів масиву найчастіше використовують команду циклу for, хоча можна застосувати і while або d o - while.

Приклад 1. Створити масив з перших ста цілих чисел і обчислити суму всіх його значень можна одним із способів:

 

Int n[100]; // 1- й спосіб int n[100); //2- й спосіб
Int S = 0; int S = 0;
for (k = 0; k < 100;) for (k = 0; k < 100; k++)
{ {
*(n+k) = ++k; n[k] = k +1;
S += *(n+k); S += n[k];
} }

 

Задачі відшукання в масиві конкретних даних розв'язують методом сканування (перебирання, перегляду) всіх еле ментів масиву за допомогою циклу й умовної команди, де зазначають умову пошуку потрібних даних.

 

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

 

<тип вказівника> *<назва> = new <тип змінної>[<кількість>];

 

Після виконання цієї команди буде виділена неперервна ділянка пам'яті обсягом

 

sizeof (тип змінної) * <кількість> ;

 

і назва масиву вказуватиме на початок цієї ділянки.

З динамічною змінною можна виконувати операції, визначені для даних відповідного базового типу.

Після опрацювання масиву вивільнити пам'ять можна за допомогою команди

 

delete[] <назва вказівника на масив даних>;

 

Під час вивільнення пам'яті розмір масиву зазначати не потрібно.

Розв'яжемо задачу з прикладу 1, використовуючи динамічний розподіл пам'яті

 

int *n = new int [100]; // Виділяємо пам ' ять для ста цілих чисел

for (int S = 0, k = 0; k < 100;) { // Опрацьовуємо массив

*(n+k) = ++k;

S += *(n+k);

}

delete[] n; // Вивільняємо пам ' ять

 

За допомогою динамічних змінних можна розв'язати задачу почергового опрацювання одною програмою деякої кількості великих масивів (якщо всі масиви не можливо одночасно ввести у пам'ять). Задачу розв'язують так. Створюють масив, наприклад, *mas1 = new <тип>[<кількість>] і опрацьовують динамічні змінні *mas1, *(mas1+1), ... Вивільняють пам'ять delete[] masl. Створюють й опрацьовують елементи другого масиву *mas2 = new <тип> [<кількість>] і т.д.

 

Задача про АТС. Нехай уk - це число викликів, які надходять на АТС за k-ту секунду. Припустимо, що yk - ви­падкове число зі значенням від 0 до 30. Утворити масив у з десятьма елементами (k = 1, 2, ..., 10). Обчислити суму викликів за перші 10с роботи АТС. Визначити максимальну суму викликів, які надійшли за деяку одну секунду. Вивести результати обчислень.

Зауваження. Для того, щоб отримати ціле випадкове число п діапазону від 0 до n, можна скористатись функцією random(n), яка описана у модулі stdlib.h. Щоб під час виконання програми кожен раз отримувати різні значення, перед використанням функції random() треба записати функцію randomize().