Як перевірити в С++ чи заповнений масив?
Свої особливості мають символьні масиви. При ініціалізації ми можемо передати символьному масиву як набір символів, так і рядок:
char hello1 []; char hello2 []; //
На перший погляд обидва масиви мають один і той же набір символів, нехай у першому випадку це просто набір окремих символів, а в другому рядок. Але в першому випадку масив hello1 буде мати п'ять елементів. А в другому випадку масив hello2 матиме не 5 елементів, а 6, оскільки при ініціалізації рядком символьний масив автоматично додається нульовий символ '\0'.
Спосіб визначення символьного масиву впливає роботу з ним. Так, при виведенні на консоль оператор count відобразить весь рядок до символу \0. В кінці обов'язково повинен бути символ '\0', інакше на консоль будуть виводитись символи з послідовних осередків пам'яті, які містять сміття, доки не зустрінеться або нульовий символ, або не відбудеться неприпустимий доступ до пам'яті. Наприклад, порівняємо виведення трьох символьних масивів:
#include int main() < char hello1[]; char hello2 []; char hello3 []; std::cout
Приклад консольного виведення:
hello╨J:╕╗☻ hello hello
У першому випадку консольний висновок не детерміновано, оскільки символьний масив не закінчується нульовим символом.
Двовимірні масиви символів
Вище ми розглядали, що рядок можна у вигляді масиву символів. Як тоді нам уявити масив рядків? Для цього можна використовувати двомірний масив символів:
#include int main() < const int max_length; // максимальна довжина рядка (включаючи нульовий байт \0) char langs[][max_length] < "C++", "C#", "Python", "Java", "Kotlin", "Go", "Dart", "PHP ">; std::cout
Тут масив langs містить 8 елементів (8 рядків).Максимальна кількість символів (умовно стовпчиків) у кожному рядку задається за допомогою константи max_length . Але безпосередньо самі рядки масиву необов'язково мають досягати цієї довжини. Наприклад, у рядку "C++" тільки чотири символи (3 + нульовий символ, що автоматично додається). Всі інші елементи одержують за замовчуванням нульові значення.
І оскільки кожен елемент масиву langs представляє рядок, ми можемо отримати за індексом потрібний рядок і вивести на консоль.
Перебір двомірних символьних масивів
Оскільки вкладені масиви є рядками або масивами символів, то кожен такий масив ми можемо ввести на консоль у вигляді рядка:
#include int main() < char langs[][20] < "C++", "Python", "JavaScript">; for(auto lang : langs) < std::cout >
Тут при переборі масиву langs кожен його окремий елемент - масив символів буде поміщатися в змінну lang. І далі ми можемо вивести цей масив у вигляді рядка на консоль.
Введення символьних масивів/рядків з консолі
Функція getline() потоку cin зчитує послідовність символів, включаючи пробіли. За замовчуванням введення закінчується, коли зчитується символ перекладу рядка '\n' (наприклад, при натисканні клавіші Enter). Функція getline() має дві версії. Перша версія приймає два параметри: перший параметр вказує на масив символів для зберігання введених даних, а другий параметр вказує на максимальну кількість символів, які треба зберегти масив. Ця кількість включає символ завершення рядка - нульовий байт '\0', який автоматично додаватиметься в кінець введення:
#include int main() < const int max_length; // максимальна кількість символів, що зчитуються char text [max_length] <>; // масив для зчитування рядка std::cout << "Enter some text:" << std::endl; // зчитуємо символи, включаючи прогалини std::cin.getline(text, max_length); std::cout
В даному випадку зчитуємо не більше 100 символів масив text. Приклад введення:
Enter some text: Hello METANIT.COM You entered: Hello METANIT.COM
Інша форма функції getline() також приймає третій параметр - символ, який виступатиме сигналом завершення введення. Наприклад
#include int main() < const int max_length; // максимальна кількість символів, що зчитуються char text [max_length] <>; // масив для зчитування рядка std::cout << "Enter some text:" << std::endl; // зчитуємо символи, включаючи прогалини std::cin.getline(text, max_length, '!'); std::cout
Тут як символ закінчення введення виступає знак оклику !, тому при зчитуванні він не буде включатися в рядок:
Enter some text: Hello World! You entered: Hello World
Як перевірити в С++ чи заповнений масив?
Масив представляє набір однотипних даних. Формальне визначення масиву виглядає так:
тип_змінної назва_масиву [довжина_масиву]
Після типу змінної йде назва масиву, а потім у квадратних дужках його розмір. Наприклад, визначимо масив із 4 чисел:
Число елементів масиву також можна визначати через константу:
const int n = 4; int numbers[n]; // містить 4 елементи
Деякі компілятори (наприклад, G++) також підтримують налаштування розміру за допомогою змінних.
Цей масив має чотири числа, але ці числа мають невизначене значення. Щоб встановити значення елементів масиву, вказуються фігурні дужки (ініціалізатор), усередині яких перераховуються значення елементів масиву:
В даному випадку фігурні дужки порожні, тому всі елементи масиву набувають нульових значень.
Також ми можемо вказати конкретні значення для всіх елементів масиву:
В даному випадку в пам'яті виділяється деяка область з чотирьох осередків по 4 байти (розмір типу int), де кожен осередок містить певний елемент масиву:
Якщо значень в ініціалізаторі менше, ніж елементів у масиві, значення передаються першим елементам, а інші отримують нульові значення:
Якщо значень в ініціалізаторі більше, ніж елементів у масиві, при компіляції виникне помилка:
int numbers[4]; //! Помилка
Тут масив має розмір 4, але йому передається 6 значень.
Якщо розмір масиву не вказано явно, він виводиться з кількості переданих значень:
У разі в масиві є 6 елементів.
При цьому не допускається присвоєння одному масиву іншого масиву:
int nums1 []; int nums2[] = nums1; // помилка
Індекси. Отримання та зміна елементів масиву
Після визначення масиву ми можемо звернутися до окремих елементів за індексом. Індекси починаються з нуля, тому для звернення до першого елемента необхідно використовувати індекс 0. Звернувшись до елемента індексу, ми можемо отримати його значення, або змінити його. Наприклад, отримаємо другий елемент (індекс 1):
Зміна значення другого елемента:
Наприклад, отримаємо та змінимо значення елементів:
#include int main() < int numbers[4]; int first = numbers [0]; // отримуємо перший елемент std::cout
При зверненні за індексом слід враховувати, що ми не можемо звернутися за неіснуючим індексом. Так, якщо в масиві 4 елементи, ми можемо використовувати індекси з 0 до 3 для звернення до його елементів. Використання будь-якого іншого індексу призведе до помилки:
int numbers[4]; int forth = numbers [4]; // !Помилка - в масиві лише 4 елементи
Константні масиви
Якщо необхідно, щоб не можна було змінювати значення елементів масиву, такий масив можна визначити як константний за допомогою ключового слова const
const int numbers[4]; // numbers[1] = 23; // Помилка - значення елементів масиву змінити не можна
Довжина масиву
Довжина масиву не завжди відома. Однак може знадобитися отримати її. Для цього можна використати декілька способів. Перший спосіб, який прийшов з мови С, представляє застосування оператора sizeof:
#include int main() < int numbers[]; std::cout
По суті, довжина масиву дорівнює сукупній довжині його елементів. Всі елементи представляють той самий тип і займають один і той же розмір у пам'яті. Тому за допомогою виразу sizeof(numbers) знаходимо довжину всього масиву в байтах, а за допомогою виразу sizeof(numbers[0]) – довжину одного елемента у байтах. Розділивши два значення, можна отримати кількість елементів у масиві.
Другий спосіб представляє застосування вбудованої бібліотечної функції std::size() :
#include int main() < int numbers[]; int count = std::size(numbers); std::cout
Перебір масивів
Використовуючи цикли, можна пробігтися по всьому масиву і через індекси звернутися до його елементів:
#include int main() < const int n = 4; int numbers [n]; for(int i=0; i < n; i++) < std::cout >
Щоб пройтися масивом у циклі, треба знати його довжину. Тут довжина задана константою n. Спочатку треба знайти довжину масиву. І в циклі for перебираємо всі елементи, доки лічильник i не стане рівним довжині масиву. У результаті на консоль будуть виведені всі елементи масиву:
Інший приклад - обчислимо суму елементів масиву:
#include int main() < int numbers[]; int sum <>; for (int i <>; i < std::size(numbers); sum += numbers[i++]); std::cout
Тут довжина масиву обчислюється динамічно – за допомогою функції std::size() .
Перебір елементів у стилі for-each
Використовуємо іншу форму циклу for , яка призначена спеціально для перебору послідовностей, у тому числі для масивів
#include int main() < int numbers[4] ;
При переборі масиву кожен елемент, що перебирається, буде поміщатися в змінну number, значення якої в циклі виводиться на консоль.
Якщо нам невідомий тип об'єктів у масиві, ми можемо використовувати специфікатор auto для визначення типу:
for(auto n : numbers)
Введення значень масиву з консолі
Подібно до того, як вводяться дані для окремих змінних, можна вводити значення окремих елементів масиву. Наприклад, нехай користувач вводить значення числового масиву:
#include int main() < const int max ; // максимальна довжина масиву - не більше 6 чисел int numbers[max]; // масив для введення чисел int i<>; // лічильник введених чисел std::cout > numbers i]; // вводимо число i++; > // виводимо масив for (i = 0; std::cout std::cout
Тут у циклі спочатку вводяться шість чисел кожного елемента масиву, потім виводимо цей масив.