You are on page 1of 24

1

Урок № 6

Масиви

Зміст
1. Необхідність групування даних................................ 3
Поняття масиву....................................................................3
Синтаксис оголошення масиву........................................4
Розташування масиву в пам'яті........................................8
2. Створення масиву і заповнення його даними....... 12
Звернення до елементів масиву......................................12
Варіанти ініціалізації масиву..........................................13
Вивід вмісту масиву на екран.........................................15
3. Приклади програм роботи з масивом.................... 17
Задача 1.................................................................................17
Задача 2.................................................................................18
4. Домашнє завдання.................................................... 21

Додаткові матеріали уроку прикріплені до даного PDF-файлу.


Для доступу до матеріалів, урок необхідно відкрити в програмі
Adobe Acrobat Reader.

2
1. Необхідність групування даних

1. Необхідність
групування даних
Сьогодні ми поговоримо з вами на тему зберігання даних.
На одному з перших занять ми дізналися про існування
змінної і визначили її як відрізок оперативної пам'яті для
розміщення інформації. Безсумнівно, нормальна програма
не може існувати без змінних, однак, часом прості змінні
не вирішують проблеми оперування даними. Уявімо собі,
що нам необхідно порахувати середню оцінку в групі. Дуже
легко! Для цього ми в циклі запитаємо всі оцінки і додамо
їх до змінної для суми. А після виконання циклу цю змінну
розділимо на кількість студентів. Усе готово. А що, якщо нам
раптом після цього потрібно буде знайти ще й максимальну
оцінку в групі? Чи зможемо ми це зробити?! На жаль, ні.
А справа в тому, що кожна зі змінних здатна одночасно
зберігати лише один елемент інформації. І щоразу в циклі
вона перезаписувала попереднє значення оцінки. Буде дуже
незручно створювати для кожного елемента змінну. А що,
якщо потрібно працювати з багатьма сотнями елементів?
Завдання дуже швидко стає нездійсненним. Погодьтеся,
створювати кілька сотень змінних — божевілля.
Як же розв'язати таку, здавалося б, непросту задачу?! У
нашому випадку рішенням є так звані масиви. Розглянемо
визначення й особливості.
Поняття масиву
Масив — це набір однотипних даних, об'єднаний за-
гальним ім'ям. Уявімо собі масив у вигляді пасажирського
3
Урок № 6

потяга, що складається з вагонів. Припустимо, що необ-


хідно створити програму, яка зберігає в собі інформацію
про завантаженість потяга по вагонах (мал. 1).

Малюнок 1

Давайте спробуємо створити такий масив. Для цього


спочатку розберемося з основними правилами.

Синтаксис оголошення масиву

тип_даних імя_масиву[кількість_елементів];

1. Тип_даних — будь-який з існуючих, відомих вам ти-


пів даних. Саме цим типом володітиме кожен елемент
масиву.
2. Iм'я_масиву — будь-яке ім'я, яке підпорядковується
«правилам імен змінних» (ці правила ми розглядали
з вами в першому уроці).
3. Кількість_елементів — число елементів у масиві. На
цьому місці має знаходитися додатне цілочисельне кон-
стантне значення. Таким значенням може бути або ціло-
чисельний літерал, або константна цілочисельна змінна.
Примітка. Зверніть увагу, що кількість елементів
масиву має бути визначена на етапі створення
програми. Іншими словами, задати розмірність

4
1. Необхідність групування даних

такого масиву залежно від якоїсь умови або за рі-


шенням користувача неможливо. Це призведе до
помилки на етапі компіляції.
А тепер уявімо собі невеликий потяг, у складі якого
лише 3 вагони. Завантаженість вагона характеризується
кількістю вже зайнятих місць. Тобто кожний осередок
масиву зберігатиме кількість зарезервованих місць у ва-
гоні. Тому int як тип даних нам підійде найкраще.
int train[3];

Такий запис вказує, що в пам'яті було виділено три


осередки, кожен із яких займає 4 байти (мал. 2).

Малюнок 2

Як бачимо, кожна така змінна в масиві є самостійною


одиницею під назвою «елемент». А кожен елемент має
свій порядковий номер — індекс. За індексом можна
звертатися до конкретного елементу масиву. Нумерація
елементів у масиві починається з нуля.
Таким чином, щоб заповнити масив значеннями, ми
маємо знати його ім'я і номер потрібного осередку.

5
Урок № 6

train[0] = 3;
train[1] = 1;
train[2] = 4;

Ці рядки вказують, що в першому вагоні (нульовий


індекс) зайнято три місця, у другому (перший індекс) —
одне, а в третьому (другий індекс) — чотири (мал. 3).

Малюнок 3

Давайте розглянемо ще один приклад. У групі на-


вчається 12 студентів. Кожен студент отримує оцінку за
виконане домашнє завдання. Необхідно вивести на екран
оцінку обраного студента.
Спочатку визначаємо, скільки осередків нам потрібно
(дванадцять студентів = дванадцять оцінок).
const int N = 12;

Припустимо, що оцінки виставлені в алфавітному по-


рядку розташування студентів у списку. До того ж, оцінки
можуть містити ціле значення від 1 до 12. Сформуємо
цілочисельний масив з оцінками і заповнимо його.

// create a digit value array of twelve elements


int mark[N];

// fill the array

6
1. Необхідність групування даних

mark[0] = 10; // 10 — mark of the first student


mark[1] = 7; // 7 — mark of the second student
mark[2] = 11; // 11 — mark of the third student
mark[3] = 10; // 10 — mark of the fourth student
mark[4] = 9; // 9 — mark of the fifth student
mark[5] = 8; // 8 — mark of the sixth student
mark[6] = 11; // 11 — mark of the seventh student
mark[7] = 12 // 12 — mark of the eighth student
mark[8] = 11; // 11 — mark of the ninth student
mark[9] = 6; // 6 — mark of the tenth student
mark[10] = 8; // 8 — mark of the eleventh student
mark[11] = 10; // 10 — mark of the twelfth student

Далі нам треба запросити номер студента в користу-


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

int number = 0;
cout << "Enter a number from the students list:" << endl;
cin >> number;

// print a mark of the selected student


cout << "Mark is " << mark[number-1] << endl;

Зауважимо, щоб вивести оцінку першого студента,


потрібно буде звертатися до нульового осередку, а для
другого студента — до осередку з індексом один і так далі.
Тому у виводі використовувався запис mark[number-1].
Крім цього, зверніть увагу, що індекс останнього
елемента ніколи не буде дорівнювати числу розмірності
масиву. Тому що індексація починається з нуля, а не з
одиниці. Давайте тепер спробуємо розібратися, чому
це саме так.

7
Урок № 6

Розташування масиву в пам'яті


Пам'ять є масивом байтів, кожен із яких має свою
унікальну адресу.
Ім'я масиву якраз і зберігає в собі адресу, що вказує на
місце його розташування. Першим у пам'яті знаходиться
нульовий, потім перший і т.д. Елементи розташовуються
за зростанням адреси. Один елемент масиву відстоїть від
іншого на кількість байт, що дорівнює базовому типу
масиву (мал. 4). Формула, за якою проводиться позиціо-
нування за масивом:
базова адреса + розмір базового типу * індекс;

Якщо вказується неправильна адреса, проводиться


позиціонування базової адреси на адресу, обчислену
за формулами. При цьому програма отримує повний
доступ до вмісту осередку пам'яті, який їй по суті не
належить. У наслідок цього може статися помилка на
етапі виконання.

Малюнок 4

На закінчення треба зазначити, що кожен елемент


масиву має свою власну розмірність, яка безпосередньо
залежить від типу всього масиву. Наприклад, якщо масив
має тип даних int, розмір кожного елемента в ньому —
4 байти. Таким чином, загальний розмір усього масиву
обчислюється за формулою:

8
1. Необхідність групування даних

ЗАГАЛЬНИЙ_РОЗМІР = РОЗМІР_ТИПУ_ДАНИХ *
КІЛЬКІСТЬ_ЕЛЕМЕНТІВ_У_МАСИВІ

Розглянемо, як наш масив зберігається в пам'яті:

#include <iostream>
using namespace std;

int main() {
// create a digit value array of three elements
int train[3];

// fill the array


train[0] = 3;
train[1] = 1;
train[2] = 4;

// output the array address


cout << "Start address: " << train << endl;
cout << "Array values: " << endl;
cout << "train[0] = " << train[0] << endl;
cout << "train[1] = " << train[1] << endl;
cout << "train[2] = " << train[2] << endl;
cout << endl;
return 0;
}

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


рядок cout<<endl. Після цього запустимо наш приклад і
звернемося до вікна зі змінними (мал. 5).
Як бачимо, ім'я масиву зберігає в собі адресу, де в
пам'яті вона розташована. У меню Debug (Налагодження)
виберемо пункт Windows (Вікна), далі Memory (Пам'ять),
а після — Memory1 (Пам'ять1) (мал. 6).

9
Урок № 6

Малюнок 5

Малюнок 6

10
1. Необхідність групування даних

У вікні, що відкрилося, прописуємо потрібну адресу


і переходимо на неї (мал. 7).

Малюнок 7

Можемо переконатися, що масив розташовується


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

11
Урок № 6

2. Створення масиву
і заповнення його даними
Варіант перший
Оголошено масив ar, що складається з 5 елементів,
кожен із яких має тип даних int.
int ar[5];

Варіант другий
Оголошено константу size, значення якої дорівнює 3,
а потім, масив br, що складається з 3 елементів, кожен із
яких має тип даних double.

const int size=3;


double br[size];

Примітка. Ми рекомендуємо вам використовувати


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

Звернення до елементів масиву


Розглянемо, як звернутися до конкретного елементу
масиву.

// запис значення
ім'я_масиву[індекс_елемента]=значення;
// отримання значення
cout<<ім'я_масиву[індекс_елемента];

12
2. Створення масиву і заповнення його даними

Тут на місце індексу_елемента може бути підставле-


но БУДЬ-ЯКЕ цілочисельне значення, зокрема, вираз,
результатом якого є ціле число.
Примітка. Ще раз нагадуємо — нумерація елемен-
тів у масиві починається з нуля! Таким чином, у
масиві з 5 елементів останній елемент має індекс 4.
Виходити за межі масиву не можна, це призведе до
помилки на етапі виконання.

Варіанти ініціалізації масиву


Заповнити масив даними можна двома способами:
Перший спосіб — ініціалізація при створенні.

тип_даних ім'я_масиву[кількість елементів]=


{значення1, значення2, ... значенняn};

const int size=3;


int ar[size]={1,30,2};

Така форма ініціалізації має деякі особливості:


1. Усі значення списку ініціалізації мають такий самий
тип даних, як і сам масив, тому при створенні кількість
елементів можна не вказувати.
Операційна система сама визначить розмір масиву,
зважаючи на число елементів у списку ініціалізації.

тип_даних ім'я_масиву[]={значення1, значення2,


значення3, ... значення n};
int ar[]={1,30,2};
// У цьому рядку масив автоматично отримає розмір 3.

13
Урок № 6

2. Якщо число елементів у списку ініціалізації менше ніж


число елементів масиву, то значення, що залишилися,
автоматично заповнюються нулями:
int ar[5]={1,2,3}

такий запис еквівалентний запису:


int ar[5]={1,2,3,0,0};

3. Якщо значень у списку ініціалізації більше ніж кіль-


кість елементів масиву, то відбувається помилка на
етапі компіляції:
int array[2]={1,2,3}; // помилка на етапі компіляції

4. При ініціалізації масивів можна використовувати вже


відому вам уніфіковану ініціалізацію

int arr[]{1, 2, 3};


int arr2[4]{11, 21, 31};

Другий спосіб — ініціалізація масиву за допомогою


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

#include <iostream>
using namespace std;

int main()
{
const int size = 3;
int ar[size];// створення масиву з трьох елементів
// цикл, що перебирає елементи масиву

14
2. Створення масиву і заповнення його даними

for (int i = 0; i<size; i++)


{
cout << "Enter element\n";
/ * на кожній ітерації циклу користувачеві
підставляється елемент з індексом i для
заповнення. Секрет у тому, що i — щоразу
нове значення
*/
cin >> ar[i];
}
return 0;
}

Вивід вмісту масиву на екран


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

#include <iostream>
using namespace std;
int main()
{
const int size = 3;
int ar[size]; // створення масиву з трьох елементів
// цикл, що перебирає елементи масиву
for (int i=0;i<size;i++)
{
cout << "Enter element\n";
/* на кожній ітерації циклу користувачеві
підставляється елемент з індексом i для
заповнення. Секрет у тому, що i — щоразу
нове значення */

15
Урок № 6

cin >> ar[i];


}

cout << "\n\n";


// цикл, що перебирає елементи масиву
for (int i = 0; i<size; i++)
{
// вивід елемента з індексом i на екран
cout<<ar[i]<<"\n";
}
return 0;
}

Тепер, коли ми з вами познайомилися з масивами,


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

16
3. Приклади програм роботи з масивом

3. Приклади програм
роботи з масивом
Задача 1
Написати програму, яка знаходить суму всіх від'ємних
значень у масиві.
Код реалізації

#include <iostream>
using namespace std;

int main()
{
// визначення розміру масиву
const int size=5;
// створення й ініціалізація масиву даними
int ar[size]={23,-11,9,-18,-25};
// змінна для накопичення суми
int sum = 0;
// цикл, що перебирає по порядку елементи масиву
for (int i=0;i<size;i++)
{
// якщо значення елемента від’ємне
// (меньше за нуль)
if (ar[i]<0)
sum += ar[i]; // додати його значення
// до загальної суми
}
// вивід значення суми на екран
cout<<"Sum = "<<sum<<"\n\n";
return 0;
}

17
Урок № 6

Коментар до коду
1. Цикл по черзі перебирає елементи від 0 до size. При
цьому size не входить у діапазон, що перевіряється,
тому що індекс останнього елемента — size-1.
2. На кожній ітерації циклу відбувається перевірка вмісту
елемента на від'ємне значення.
3. Якщо значення менше за нуль, воно додається до суми.
Як бачите, робота з масивом дуже схожа на аналіз
якогось діапазону. Тільки в цьому випадку мінімальна
межа діапазону — 0, а максимальна визначається кількі-
стю елементів у масиві.

Задача 2
Написати програму, яка знаходить мінімальне й мак-
симальне значення в масиві і виводить їх на екран.
Код реалізації

#include <iostream>
using namespace std;

int main()
{
// визначення кількості елементів масиву
const int size=5;
// створення та ініціалізація масиву
int ar[size] = { 23,11,9,18,25 };
int max = ar[0]; // нехай 0 елемент буде максимальним
int min=ar[0]; // нехай 0 елемент буде мінімальним
// цикл перебирає елементи
// масиву, починаючи з одиниці

18
3. Приклади програм роботи з масивом

for (int i=1;i<size;i++)


{
// якщо поточний елемент менший за мінімум
if (min>ar[i])
// перезаписати значення мінімуму
min = ar[i];

// якщо поточний елемент більший за максимум


if (max<ar[i])
// перезаписати значення максимуму
max=ar[i];
}

// вивід результату на екран


cout<<"Max = "<<max<<"\n\n";
cout<<"Min = "<<min<<"\n\n";
return 0;
}

Коментар до коду
1. Спочатку висуваємо припущення, що мінімальним
є елемент масиву з індексом 0.
2. Записуємо значення елемента з індексом 0 у змінну min.
3. Потім, щоб або підтвердити, або спростувати цей факт,
перебираємо всі елементи масиву, починаючи з еле-
мента з індексом 1 у циклі.
4. На кожній ітерації циклу порівнюємо припусканий
мінімум з поточним елементом масиву (елемент з ін-
дексом i).
5. Якщо трапляється менше значення, ніж припусканий
мінімум, значення min перезаписується на менше знай-
дене значення й аналіз триває.

19
Урок № 6

Усі вищеописані дії справедливі і для максимуму, тільки


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

20
4. Домашнє завдання

4. Домашнє завдання
1. Дана програма, яка визначає останнє додатне і перше
від'ємне число в масиві. Знайти і виправити синтак-
сичні й логічні помилки.

#include <iostream>
using namespace std;

int main()
{
double size = 8;
double arr[size]={-5.7, 6.0, 2, 0, -4.7, 6,
8.1, -4, 0};
int positive = 0;
for (int i = size; i >= 0; i++)
{
if (arr[i] > 0)
{
positive = arr[i];
break;
}
}

int negative = 0;
for (int i = 0; i < size; i++)
{
if (arr[i] < 0)
{
negative = arr[i];
break;
}
}

21
Урок № 6

cout << "Last positive number: " << positive <<


endl;
cout << "First negatine number: " << negative <<
endl;
return 0;
}

Вхідними даними у всіх описаних нижче завданнях


є масив з 10 елементів, заповнений користувачем з
клавіатури.
2. У масиві зберігається інформація про кількість меш-
канців кожної квартири п'ятиповерхового будинку
(4 під'їзди, на кожному поверсі по 2 квартири).
а) за обраним номером квартири визначити кількість
мешканців, а також їхніх сусідів, які проживають на
одному поверсі;
б) визначити сумарну кількість мешканців для кож-
ного під'їзду;
в) визначити номери квартир, де мешкають багатодітні
сім'ї. Умовно будемо вважати багатодітними сім'ї, у
яких кількість членів сім'ї перевищує п'ять осіб.
3. Дана температура повітря за кожен день січня. Ви-
значити:
а) середню температуру за місяць;
б) скільки разів температура повітря опускалася нижче
за зазначену мітку.
4. У масиві зберігається інформація про вартість 10 марок
автомобілів. Визначити суму найдорожчого автомо-
біля і дізнатися його номер. Якщо таких автомобілів
декілька, визначити:

22
4. Домашнє завдання

а) номер першого такого автомобіля;


б) номер останнього такого автомобіля.
5. Написати програму, яка знаходить у масиві значення,
що повторюються два і більше разів, і виводить їх на
екран.
6. Заповнити два цілочисельні масиви A[10] і B[10]. Сфор-
мувати третій масив X[20], елементи якого будуть взяті
з A і B в порядку:
а) чергування (A0, b0, a1, b1, a2, b2, ..., a9, b9);
б) слідування (A0, a1, a2, ..., A9, b0, b1, b2, ..., b9).

23
Урок № 6
Масиви

© Тетяна Лапшун
© Компьютерна Академія «Шаг», www.itstep.org

Усі права на захищені авторським правом фото, аудіо та відеотвори,


фрагменти яких використані в матеріалі, належать їхнім законним влас-
никам. Фрагменти творів використовуються з ілюстративною метою
в обсязі, виправданому поставленим завданням, в межах навчального
процесу і в навчальних цілях Відповідно до ст. 1274 ч. 4 ГК РФ і ст. 21 і 23
Закону України «Про авторське право й суміжні права». Обсяг і спосіб
цитованих творів відповідає прийнятим нормам, не завдає шкоди
нормальному використанню об'єктів авторського права і не обмежує
законні інтереси автора та правовласників. Цитовані фрагменти творів
на момент використання не можуть бути замінені альтернативними,
що незахищені авторським правом аналогами, і як такі відповідають
критеріям сумлінного і чесного використання.
Усі права захищені. Повне або часткове використання матеріалів
заборонено. Узгодження використання творів або їхніх фрагментів
проводиться з авторами і правовласниками. Узгоджене використання
матеріалів можливе лише за умов згадування джерела.
Відповідальність за несанкціоноване копіювання і комерційне вико-
ристання матеріалів визначається чинним законодавством України.

You might also like