Масиви даних

Дуже часто виникає потреба зберігати велику кількість однотипної інформації. Наприклад, ви хочете зробити запас картоплі на зиму. Для цього купили десять мішків картоплі. Вам необхідно знати загальну вагу але можна вважити лише по одному мішку. Тому, у вас виникне список в якому зберігатиметься вага кожного мішка з картоплею. Тобто, ви маєте однотипну інформацію. Аналогічна ситуація може відбутися і під час програмування. Як ви розумієте створювати величезну кількість змінних для збереження даної інформації ідея не дуже хороша.

Отже, це певна кількість даних одного типу (наприклад, вага мішків картоплі, оцінки за контрольну з математики).

Масиви можуть бути статичними та динамічними. Статичний масив це масив розмір якого ми завчасно знаємо та вказуємо, при цьому він не змінюється під час виконання програми. Динамічний масив це масив розмір якого програма завчасно не знає (наприклад ми можемо вказати це під час виконання самої програми), при цьому розмір масиву може змінюватися.

Зараз ми розглянемо лише статичні масиви.

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


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

Тип даних – це звичайний тип змінних, які будуть зберігатися

Кількість елементів масиву – це має бути ціле, додатне число

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

    
            #include <iostream>
            int main()
            {
                //створюємо масив цілих чисел який складається з "3" елементів
                int numbers[3];
                //присвоїмо нашим елементам значення
                numbers[0] = 1;  //перший елемент
                numbers[1] = 22;  //другий елемент
                numbers[2] = 333;   //третій елемент

                //виведемо значення наших елементів
                std::cout << numbers[0] << " " << numbers[1] << " " << numbers[2] << " " << std::endl;
                
                //поміняємо значення першого елемента
                numbers[0] = 4444;  //перший елемент має нове значення

                //отримаємо від користувача нове значення для другого елементу
                std::cout << "input number\n";
                std::cin >> numbers[1];

                //виведемо значення наших елементів
                std::cout << numbers[0] << " " << numbers[1] << " " << numbers[2] << " " << std::endl;
                return 0;
            }
        
    

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

Розглянемо як це працює не практиці.

    
            #include <iostream>
            int main()
            {
                //створюємо масив цілих чисел який складається з "6" елементів
                int numbers[6];

                //створюємо цикл for для роботи з масивом
                // вказуємо «< 6» бо ми маємо «6» елементів. Як варіант можна вказати «<= 5»
                for(int i = 0; i < 6; i++)
                {
                    //демонструємо для себе який елемент (під яким номером) будемо вводити
                    std::cout << "input number № " << i << std::endl;
                    std::cin >> numbers[i];
                }

                //виводимо наший масив для того щоб пізніше його порівняти
                for(int i = 0; i < 6; i++)
                {
                    std::cout << numbers[i] << " ";
                }
                    std::cout << std::endl;

                //змінюємо "4" елемент масиву (пам´ятаємо, що його порядковий номер має бути на "1" меншим)
                numbers[3] = 17;

                //виводимо наш масив і бачимо, що "4" елемент змінився на "17"
                for(int i = 0; i < 6; i++)
                {
                    std::cout << numbers[i] << " ";
                }

                return 0;
            }
        
    

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


        Тип_даних Ім’я_масиву [Кількість_елементів_масиву] = {Значення_через_кому};
        

Наприклад:


        int numbers[6] = {2, 5, 11, 14, 17, 21};
        

Якщо ми не вказуємо розмір масиву але вказуємо значення його елементів, то масив самостійно визначить свій розмір по кількості його елементів.


        Тип_даних Ім’я_масиву [] = {Значення_через_кому};
        

Наприклад:


        int numbers[] = {2, 5, 11, 14, 17, 21};
        

В попередніх прикладах для того щоб заповнити масив значеннями або вивести значення масиву ми використовували цикл де в умові завершення вказували розмір масиву Але зараз ми не вказували розмір масиву, то невже доведеться самостійно рахувати скільки елементів має масив? Звісно ж ні. Для цього існує функція Щоб нею скористатися потрібно написати її і у круглих дужках вказати ім’я елемента розмір якого ми хочемо отримати. Варто зауважити, що це розмір пам’яті яку займає елемент. Тому, щоб знайти довжину масиву нам необхідно знайти скільки пам’яті займає весь масив та поділити на кількість пам’яті займає один елемент масиву. Виглядатиме це так:

    
            #include <iostream>
            int main()
            {
                int mas[] = {1, 2, 3};

                //дізнаємося довжину масиву
                int length = sizeof(mas)/sizeof(mas[0]);

                //демонструємо довжину щоб перевірити
                std::cout << "length mas: " << length << std::endl;

                //використовуємо знайдену довжину щоб вивести дані масиву
                for(int i = 0; i < length; i++)
                {
                    std::cout << mas[i] << " ";
                }

                return 0;
            }
        
    

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

Оскільки, розмір масиву це ціле число, то відповідно наша змінна має бути відповідного типу. У старих версіях С++ ця змінна могла бути не константною але сучасні компілятори вимагають щоб вона була константна. Це гарантуватиме, що розмір масиву залишиться не змінним.

Якщо всі дії з масивом будуть лише в одному місці (наприклад, в то цю змінну достатньо створити лише де вона використовується.

    
            #include <iostream>
            int main()
            {
                //змінна яка буде розміром масиву
                const int SIZE = 4;
                
                //створюємо масив із розміром "4" (бо "SIZE = 4")
                int mas[SIZE];
                
                //використовуємо змінну "SIZE" для циклу
                //під час роботи з масивом
                for (int i = 0; i < SIZE; i++)
                {
                    std::cout << "input number: ";
                    std::cin >> mas[i];
                }
                
                std::cout << "element mas:" << std::endl;
                for (int i = 0; i < SIZE; i++)
                {
                    std::cout << mas[i] << " ";
                }
                
                return 0;
            }
        
    

Якщо ж масиви, а відповідно їх довжину, ви використовуєте в декількох функціях. При цьому довжина є спільною для всіх! То, можна використовувати глобальну змінну.

    
            #include <iostream>

            //змінна яка буде розміром масиву
            //оскільки вона є глобальною, то її
            //ми можемо використовувати в будь-якій
            //точці програми
            const int SIZE = 4;

            //ми можемо не задавати розмір масиву окремим
            //аргументом функції
            //але якщо ви будете використовувати масиви
            //різної довжини, то краще задати це
            //окремою змінною
            //void fun(int mas[], int SIZE)
            void fun(int mas[])
            {
                std::cout << "element mas:" << std::endl;
                for (int i = 0; i < SIZE; i++)
                {
                    std::cout << mas[i] << " ";
                }
            }

            int main()
            {

                //створюємо масив із розміром "4" (бо "SIZE = 4")
                int mas[SIZE];

                //використовуємо змінну "SIZE" для циклу
                //під час роботи з масивом
                for (int i = 0; i < SIZE; i++)
                {
                    std::cout << "input number: ";
                    std::cin >> mas[i];
                }

                fun(mas);
                //якщо розмір масиву заданий окремою змінною
                //то таку функцію варто викликати передавши
                //в якості аргумента розмір масиву
                //fun(mas, SIZE);

                return 0;
            }
        
    

Це дасть можливість змінити розмір масиву лише в одному місці і не доведеться шукати у всій програмі де використовуємо розміри масиву.