**Массивы** - это структуры, созданные для хранения большого количества однотипных данных. По своему виду массивы бывают: - одномерными - двумерными - многомерными ## Одномерные массивы **Одномерный массив** представляет собой однострочную таблицу, состоящую из ячеек, в каждую из которых записывается элемент определенного типа: ```cpp тип имя[количество элементов] ``` Описание: ```cpp int a[100]; ``` ```cpp const int n = 100; int a[n]; ``` ```cpp int a[] = { 1, 2, 3, 4, 5 }; ``` Нумерация элементов начинается с нуля, а значит в массиве из `n` элементов номер последнего - `n - 1`. Обращение к отдельному элементу производится указанием имени массива и номера элемента в квадратных скобках: `a[3]`, `a[i]`. #### Ввод элементов массива ```cpp srand(time(0)); const int n = 10; int a[n]; for (int i = 0; i < n; i++) a[i] = rand() % 100; ``` #### Вывод элементов массива ```cpp for (int i = 0; i < n; i++) cout << a[i] << " "; ``` #### Поиск максимального (минимального) элемента Введем переменную `max` (`min`) для максимального (минимального) элемента. Запомним в нее в начале нулевой. Далее будем сравнивать `max` (`min`) с 1, 2, ... элементами. И если `max` (`min`) меньше (больше) некоторого элемента `a[i]`, запомним в нее `a[i]`. ```cpp int max = a[0], min = a[0], nmax = 0, nmin = 0; for (int i = 1; i < n; i++) { if (max < a[i]) { max = a[i]; nmax = i; } if (min > a[i]) { min = a[i]; nmin = i; } } cout << "max=" << max; cout << endl; cout << "min=" << min; cout << endl; ``` #### Сортировка массива 0 элемент будем сравнивать со всеми остальными и если некоторый меньше, менять их местами. В результате в начале массива окажется наименьший элемент. После этого процедуру повторяем с 1, 2, и т. д. элементами. ```cpp for (int i = 0; i < n - 1; i++) for (int j = i + 1; j < n; j++) if (a[i] > a[j]) swap(a[i], a[j]); ``` ## Двумерные массивы **Двумерный массив** представляет собой таблицу однотипных данных, состоящую из строк и столбцов. Описание и инициализация аналогичны одномерным массивам, только добавляется второй индекс: ```cpp тип имя[количество строк][количество столбцов] ``` Описание: ```cpp const int n1 = 5, n2 = 7; int a[n1][n2]; ``` ```cpp int a[][] = {{1, 2}, {3, 4}, {5, 6}} ``` #### Ввод элементов массива ```cpp srand(time(0)); const int n1 = 5, n2 = 7; int a[n1][n2]; for (int i = 0; i < n1; i++) for (int j = 0; j < n2; j++) a[i][j] = rand() % 100; ``` #### Вывод элементов массива ```cpp for (int i = 0; i < n1; i++) { for (int j = 0; j < n2; j++) { cout.width(4); cout << a[i][j]; } cout << endl; } ``` #### Примеры 1. Дан двумерный массив `n1 * n2`. Поменять местами первую строку с последней, вторую с предпоследней и т. д. ``` 0 <-> n1 - 1 1 <-> n1 - 2 ... i <-> n1 - i - 1 ``` ```cpp for (int i = 0; i < n1/2; i++) for (int j = 0; j < n2; j++) swap(a[i][j], a[n1 - i - 1][j]); ``` 2. Седловой точкой матрицы называется переменная, которая является минимальной в своей строке и одновременно максимальной в столбце. Найти седловую точку прямоугольного массива, у которого все элементы различны. ```cpp for (int i = 0; i < n1; i++) { int min = a[i][0], nmin = 0; for (int j = 0; j < n2; j++) if (min > a[i][j]) { min = a[i][j]; nmin = j; } bool flag = true; for (int i = 0; i < n1; i++) if (a[i][nmin] < a[i - 1][nmin]) flag = false; if (flag) cout << "a[" << i << "][" << nmin << "]=" << a[i][nmin] << endl; } ```