Что такое массивы и зачем они нужны?
Массив можно интерпретировать (объяснить) как переменная с номером. Например нам нужно записать названия коктейлей. Записывать все названия в одну переменную — как тогда обращаться к какому-то одному? Можно по порядку объявить переменные и записать в каждую их них по названию, но как быть, если названий 3.500 штук? Пишем 3.500 переменных! Но мы программисты и наша задача упростить любую задачу до самого минимума.
Массив — это набор однотипных переменных следующих друг за другом.
Что это значит? А значит это то, что в один массив Вы можете положить значения только одного типа, если массив типа int, то сколько бы Вы не клали в него дробные значения, они там лежать не смогут, также вы не можете положить туда символьное значение.
Для работы с массивами зачастую используются циклы.
Существуют разные типы массивов, разница между ними в том, что положить в них значение большее, чем позволяет диапазон переменной мы не сможем. Также существуют одномерные массивы, двумерные, трёхмерные и так далее…
Зачастую используются одномерные и двумерные массивы, более мощные массивы используются редко из-за сложности работы с ними.
Сначала мы изучим одномерные, а после двумерные и немного рассмотрим трёхмерные массивы.
Над массивами можно производить различные операции, почти точно также, как и с обычными переменными.
Каждая переменная индивидуальна, а массив это «тюрьма индивидуалистов» и все переменные в нём распределяются согласно некоторым правилам:
1. В «тюрьму индивидуалистов» помещаются судимые по одной статье (в массив одного типа помещаются переменные одного типа)
2. Каждый заключённый имеет свой порядковый номер (каждая переменная массива имеет свой порядковый номер).
3. Нумерация начинается с нуля.
Одномерные массивы
Такой тип можно представить как строку: сначала первое значение, потом второе, третье, четвёртое…
Для того, чтобы использовать значение одной переменной мы должны вызвать эту переменную, а уж потом получать из неё значение.
То есть, сначала мы вызываем переменную по её номеру, а после работаем с самой переменной.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
#include <iostream> int main() { setlocale(LC_ALL, "Russian"); //подключаем русский язык const int length = 10; //задаём константой размер массива, эту же переменную будем использовать в цикле int a[length]; //объявление массива типа int с размерностью length for (int i = 0; i < length; i++) { //цикл с количеством проходов от 0 до length a[i] = i; //присваиваем переменной a[i], в которой i (порядковый номер) изменяется от 0 до length, значение i } for (int i = 0; i < length; i++) { //цикл с количеством проходов от 0 до length std::cout << "a[" << i << "] = " << a[i] << std::endl; //выводим значение каждой переменной } system("pause"); //чтобы завершалась только после нажатия return 0; } |
Обратите внимание на a[i], нельзя вызывать просто а — нельзя вызывать массив, нельзя вызывать «тюрьму», можно вызвать «заключенного».
Значения массивов можно складывать, вычитать, делить, сравнивать, умножать. Переменные массива можно переопределять (присваивать им другие значения), то есть элементами массива (переменными массива) можно оперировать как Вам заблагорассудится.
Найдем наибольшее значение в массиве типа float содержащем в себе дробные значения.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
#include <iostream> int main() { setlocale(LC_ALL, "Russian"); //подключаем русский язык const int length = 10; //задаём константой размер массива, эту же переменную будем использовать в цикле float a[length]; //объявление массива типа int с размерностью length float temp = 0.0; //дробная переменная, которая изменятся в цикле for (int i = 0; i < length; i++) { //цикл с количеством проходов от 0 до length a[i] = temp; //присваиваем переменной a[i], в которой i изменяется от 0 до length, значение i temp += 2.34; } for (int i = 0; i < length; i++) { //цикл с количеством проходов от 0 до length std::cout << "a[" << i << "] = " << a[i] << std::endl; //выводим значение каждой переменной } float comparison = a[0]; //присваиваем нашей переменной сравнения значение самого первого элемента массива //цикл для поиска наибольшего значения в массиве for (int i = 0; i < length-1; i++) { //цикл с количеством проходов от 0 до length-1, //до минус первого идём потому, что обращаемся в теле каждый раз к последующему элементу if (comparison < a[i + 1]) { //если переменная сравнения меньше следующего значения массива, то comparison = a[i + 1]; //в переменную сравнения присвоить этот следующий элемент массива } } std::cout << "\nМаксимальное значение: " << comparison << "\n\n"; //вывод наибольшего значения на экран system("pause"); //чтобы программа завершалась только после нажатия return 0; } |
Также можете ознакомиться с реализацией нахождения среднего арифметического массива, нахождения отрицательных элементов в массиве.
Двумерные массивы
Двумерные массивы также называют матрицами, это имя пошло из математики.
Матрица чисел — это в некотором роде таблица чисел.
Двумерный массив по своей сути тоже самое, что и одномерный, только он больше по размеру и обладает более сложной организацией, чем одномерный.
Такой тип массивов можно представить как таблицу, а саму таблицу как строки наслоенные друг на друга как бисквитные коржи, сверху один корж, потом второй, третий… Только у нас корж — это одномерный массив.
Представьте шахматную доску: каждое поле имеет своё имя (например, E2E4 или D2B1), фокус в том, что каждое поле имеет имя состоящее из двух значений (например, на шахматной доске имя поля E2E4 состоит из E2 и E4). Так и в случае двумерного массива, каждая переменная имеет двойной номер.
С двумерными массивами простой цикл будет не эффективен, нам придётся использовать один вложенный цикл, то есть цикл в цикле, так как необходимо менять значения двух переменных.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
#include <iostream> int main() { setlocale(LC_ALL, "Russian"); //подключаем русский язык const int length = 10; //задаём константой размер массива, эту же переменную будем использовать в цикле int a[length][length]; //объявляем двумерный массив с размерностями равными length int g = 0; //переменная, которую будем присваивать каждому элементу двумерного массива for (int i = 0; i < length; i++) { //верхний цикл for (int j = 0; j < length; j++) { //верхний цикл a[i][j] = g; //одной переменной двумерного массива присваиваем значение g++; //увеличиваем переменную, которую присваиваем в каждый элемент массива } } for (int i = 0; i < length; i++) { //верхний цикл for (int j = 0; j < length; j++) { //верхний цикл std::cout << a[i][j] << "\t"; //выводим значения двумерного массива } std::cout << std::endl; //после вывода первой строки делаем переход на другую строку } system("pause"); //чтобы программа завершалась только после нажатия return 0; } |
a[i][j]
[i] — номер строки
[j] — номер элемента строки
Обратите внимание на a[i][j], мы обращаемся к каждому полю «таблицы», к каждой переменной нашего двумерного массива. Если будем обращаться a[i], то есть без второй скобки, то мы будем обращаться к строке.
Найдём среднее арифметическое нашей незамысловатой матрицы.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
#include <iostream> int main() { setlocale(LC_ALL, "Russian"); //подключаем русский язык const int length = 10; //задаём константой размер массива, эту же переменную будем использовать в цикле int a[length][length]; //объявляем двумерный массив с размерностями равными length int g = 0; //переменная, которую будем присваивать каждому элементу двумерного массива for (int i = 0; i < length; i++) { //верхний цикл for (int j = 0; j < length; j++) { //верхний цикл a[i][j] = g; //одной переменной двумерного массива присваиваем значение g++; //увеличиваем переменную, которую присваиваем в каждый элемент массива } } for (int i = 0; i < length; i++) { //верхний цикл for (int j = 0; j < length; j++) { //верхний цикл std::cout << a[i][j] << "\t"; //выводим значения двумерного массива } std::cout << std::endl; //после вывода первой строки делаем переход на другую строку } float result = 0; //переменная в которую записываем сумму всех элементов матрицы for (int i = 0; i < length; i++) { //верхний цикл for (int j = 0; j < length; j++) { //верхний цикл result += a[i][j]; //в переменную суммируем каждое значение нашей матрицы } } //считаем среднее арифметическое (сумма всех элементов делённая на количество элементов) result = result / (length * length); //переприсваиваем переменную result std::cout << "\nСреднее арифметическое матрицы: " << result << "\n\n"; //вывод результата system("pause"); //чтобы программа завершалась только после нажатия return 0; } |
Трёхмерные массивы
Работу с более мощными массивами (трёхмерными, четырёхмерными мы рассматривать подробно не будем, так как для взаимодействия с ними требуются более глубокие познания).
Пример работы вывода значений трёхмерного массива.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
#include <iostream> int main() { setlocale(LC_ALL, "Russian"); //подключаем русский язык const int length = 5; //задаём константой размер массива, эту же переменную будем использовать в цикле int a[length][length][length]; //объявляем трёхмерный массив с размерностями равными length int g = 0; //переменная, которую будем наращивать и присваивать элементам массива for (int i = 0; i < length; i++) { //верхний цикл for (int j = 0; j < length; j++) { //первый вложенный цикл for (int k = 0; k < length; k++) { //второй вложенный цикл a[i][j][k] = g; //присваиваем переменную g++; //наращиваем переменную } } } for (int i = 0; i < length; i++) { //верхний цикл for (int j = 0; j < length; j++) { //первый вложенный цикл for (int k = 0; k < length; k++) { //второй вложенный цикл std::cout << a[i][j][k] << "\t"; //вывод значение } std::cout << "\n"; } std::cout << "\n"; } system("pause"); //чтобы программа завершалась только после нажатия return 0; } |
Как можно заметить, понять что это трёхмерный или двумерный массив невозможно.
Область применения трёхмерных массивов на данный момент очень узка, поэтому можете сейчас не задаваться вопросом о том, как же с ними работать.
В массив можно записывать целые числа, дробные значения, а также символы.
Таким образом мы познакомились с одномерными массивами и матрицами языка программирования C++ 🙂