**Массивы** - это структуры, созданные для хранения большого количества однотипных данных. По своему виду массивы бывают:
- одномерными
- двумерными
- многомерными
## Одномерные массивы
**Одномерный массив** представляет собой однострочную таблицу, состоящую из ячеек, в каждую из которых записывается элемент определенного типа:
```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;
}
```