Сортировка двумерных массивов конспект

Обновлено: 01.07.2024

Перечень вопросов, рассматриваемых в теме: массивы, описание массивов, заполнение массивов, типовые задачи обработки массивов.

Глоссарий по теме: массив, элемент массива, размерность массива, индекс элемента массива, сортировка.

Основная литература по теме урока:

Л. Л. Босова, А. Ю. Босова. Информатика. Базовый уровень: учебник для 11 класса. — М.: БИНОМ. Лаборатория знаний, 2017

Дополнительная литература по теме урока:

- И. Г. Семакин, Т. Ю. Шеина, Л. В. Шестакова. Информатика и ИКТ. Профильный уровень: учебник для 11 класса. — М.: БИНОМ. Лаборатория знаний, 2012

- К. Ю. Поляков, Е. А. Еремин. Информатика. Углубленный уровень: учебник для 10 класса. В 2 ч. Ч. 2 — М.: БИНОМ. Лаборатория знаний, 2013

- Андреева Е. В. Программирование — это так просто, программирование — это так сложно. Современный учебник программирования. — М.: МЦНМО, 2015

Теоретический материал для самостоятельного изучения

Рассмотрим следующую задачу: ввести с клавиатуры 20 действительных чисел и вычислить их сумму, при этом каждое из чисел сохранить в памяти для последующей обработки.

Для решения этой достаточно простой задачи мы будем вынуждены ввести 20 имен переменных, что, естественно, очень неудобно. Но ведь чисел может быть гораздо больше, чем 20!

Основное предназначение современных компьютеров — обработка большого количества данных. Очень сложно каждой переменной при этом давать собственное имя и не запутаться. Выходом их этой ситуации является использование более сложных по своей конструкции типов данных — составных (или структурированных). Одним из таких типов являются массивы.

Массив — это поименованная совокупность однотипных элементов, упорядоченных по индексам, определяющим положение элемента в массиве.

Элемент массива — отдельная переменная, входящая в массив.

Индекс элемента массива — номер элемента в этом массиве.

Размерность массива — количество элементов, которое содержит массив.

Массивы бывают одномерными и многомерными. Мы будем рассматривать только одномерные массивы. Их условно можно представлять в виде таблицы, которая состоит из множества ячеек, расположенных в одну строку или в один столбец.

Описание массивов

В языке Паскаль массивы описываются в блоке описания переменных следующим образом:

var : array [ ] of

- — описание индексации (нумерации) элементов массива. В качестве типа индекса можно использовать любые порядковые типы;

- — тип величин, непосредственно составляющих массив.

Приведем несколько примеров описаний:

  1. varday: array [1..365] of integer; — массив, состоящий из 365 целых чисел, которые пронумерованы от 1 до 365;
  2. vartem: array [0..11] of real; — массив, состоящий из 12 вещественных, пронумерованных от 0 до 11;
  3. var ocenka: array [–2..2] of char; — массив, состоящий из 5 символьных переменных с номерами от -2 до 2:
  4. const n=10; var slovo: array [1..n] of string; — n строковых величин, пронумерованных от 1 до n;

Для того, чтобы обратиться к элементу массива, нужно записать имя массива и в квадратных скобках индекс нужного элемента, например, day[100].

Рассмотрим основные приемы работы с массивами.

Заполнение одномерного массива значениями

Задать элементам массива значения мы можем:

— вводя значения с клавиатуры;

— случайным образом из некоторого диапазона;

Но какой бы способ мы ни выбрали, нам обязательно нужно организовать цикл.

Для начала договоримся, что мы имеем дело с массивом из 10 натуральных чисел (хотя тип элементов в данном случае значения не имеет).

Вывод элементов массива на экран

Вывод элементов также нужно организовывать с помощью цикла. При этом можно объединять процессы формирования массива и вывода его элементов на экран в один цикл, и выводить элементы массива либо в столбик, либо в строчку.

Воспользуемся вторым и третьим способами, рассмотренными выше:


Теперь перейдем к задачам обработки массивов.

Вычисление суммы элементов массива

Алгоритм решения практически полностью совпадает с алгоритмом нахождения суммы некоторого количества чисел, который мы уже рассматривали на третьем уроке в этой теме.


Следующая группа задач очень часто встречается нам в реальной жизни. Это задача поиска в массиве. Например, поиск нужного слова в словаре, поиск времени отправления нужного поезда в расписании и т. д.

В программировании поиск — одна из наиболее часто встречающихся задач вычислительного характера.

В алгоритмах поиска существуют два возможных варианта окончания их работы: поиск может оказаться удачным — заданный элемент найден в массиве и определено его месторасположение, либо поиск может оказаться неудачным – необходимого элемента в данном объеме информации нет. Кроме того, искомый элемент может встретиться в массиве неоднократно.

Рассмотрим несколько типовых задач, которые уже знакомы вам из курса основной школы.

Поиск в массиве элемента, удовлетворяющего некоторому условию

Например, требуется найти в массиве элемент, значение которого равно значению переменной p, или сообщить, что такого элемента в массиве нет.

Мы построим алгоритм, идея которого следующая:


Можно заметить, что наш алгоритм решает еще одну часто встречающуюся задачу обработки массивов — подсчет количества элементов, удовлетворяющих некоторому условию.

Поиск максимального (минимального) элемента массива

Подумаем, какие операции нужно выполнить, если требуется найти максимальный элемент. Естественно, как и в предыдущей задаче, операцию сравнения. Но с чем нам сравнивать очередной элемент массива?

Введем дополнительную переменную max, которой присвоим значение, равное значению элемента массива a[1]. Теперь будем сравнивать все элементы, начиная со 2-го, с max, и если найдем больший элемент, то присвоим его значение переменной max. Конечное значение этой переменной и будет значением наибольшего элемента массива.


Поиск максимального (минимального) среди всех элементов массива, удовлетворяющих некоторому условию

Допустим, нужно найти наибольшее среди всех четных чисел, входящих в массив произвольных натуральных чисел.

Прием, которым мы воспользовались в задаче 5, здесь может привести к ошибке. Например, на первом месте в массиве будет стоять НЕЧЕТНОЕ число, которое окажется больше всех четных. Здесь переменной max лучше присвоить начальное значение, заведомо меньшее всех элементов массива. Например, если наш массив составлен из натуральных чисел, то присвоить max значение -2. Если после окончания программы значение max останется таким же, это будет означать, что в массиве нет четных чисел. Если же они будут, max изменит значение.

Сдвиг элементов массива

Сдвиг элементов массива необходимо выполнять при удалении или вставке элементов. Если происходит удаление, то элементы, расположенные после удаленного, сдвигаются на одну ячейку влево. Если же происходит добавление, то элементы, расположенные после места вставки, сдвигаются вправо. При этом нужно учитывать, что размерность массива уже указана при его описании и измениться не может.

Таким образом при удалении элемента из массива мы можем получить, например, такую ситуацию. Допустим, имеется массив:


Удалим из него элемент с индексом i=4, т. е. a[1]=a[1], a[2]=a[2], a[3]=a[3], a[4]=a[5], a[5]=a[6], a[6]=a[7]. А вот для последнего элемента a[7] новое значение взять неоткуда. Он сохранит свое значение. Получим:


Чтобы избежать такого дублирования последнего элемента обычно на его место ставят число 0.

Программа удаления элемента из массива на языке Паскаль может выглядеть следующим образом:


Сложнее обстоит дело со вставкой элемента внутрь массива. Как мы сказали, при вставке все элементы, расположенные справа от места вставки, сдвигаются вправо. Последнему же элементу сдвигаться некуда, и он пропадет. Чтобы этого не произошло, нужно увеличить размерность массива на 1. Но учесть это надо при описании массива. Второй важный момент заключается в том, что сдвиг значений мы будем производить справа налево до заявленной позиции вставки:


Реверс массива

Реверс массива — это перестановка его элементов в обратном порядке: первый элемент становится последним, а последний — первым.


Из примера видно, что местами меняются 1-й элемент с N-м, второй — с (N–1)-м и т. д. Замечаем, что сумма индексов элементов, участвующих в обмене, равна N+1, поэтому элемент с номером i должен меняться местами с (N+1–i)-м элементом.

Теперь разберемся с организацией цикла. Если мы организуем цикл по всем элементам, то получим:


Все вернулось в исходное состояние, потому что реверс выполнился дважды. Чтобы этого не произошло, нужно остановить процесс обмена на середине массива, т.е. на элементе с индексом (N div 2).


Сортировка массива

Сортировка — один из наиболее распространенных процессов обработки данных.

Под сортировкой массива понимают расстановку элементов массива в заданном порядке.

Порядок сортировки может быть любым, для чисел обычно рассматривают сортировку по возрастанию или убыванию значений.

Цель сортировки — ускорить последующий поиск элементов, т. к. нужный элемент легче искать в упорядоченном массиве.

Существует много различных алгоритмов сортировки. Мы рассмотрим некоторые из них на примере сортировки массива целых чисел в порядке неубывания (a[i] 2 , где n — число элементов в массиве.

Цель: закрепление изученного материала по массивам, развитие навыка решения задач на обработку и сортировку двумерных массивов, развитие мышления, умения применять полученные знания при решении задач различной направленности.

Задачи:

  • Воспитательная – развитие познавательного интереса, логического мышления.
  • Учебная – совершенствование навыков составления программ на языках Pascal и Basic.
  • Развивающая – развитие алгоритмического мышления, памяти, внимательности.

План урока.

Ход урока.

1. Организационный момент.

Объявление целей, задач и плана урока.

2. Самостоятельная работа (Приложение 1).

Работа предполагает проверку знаний учащихся по описанию массивов, расположению элементов матрицы, умение читать программный код и решать задачи по вводу и выводу элементов массива в определенной последовательности.

3. Решение задач

В Приложении 2 находятся: тестирование программы, исполнение алгоритма и блок-схема к задачам, программные коды на языках программирования Pascal и Basic. Разны цвета кода обозначают исполнение отдельного цикла.

Пример 3.1. Вычислить суммы элементов столбцов заданной матрицы A(N, M).

Пример 3.2. Подсчитать, сколько раз встречается в заданной целочисленной матрице A(N, M) максимальное по величине число.

Пример 3.3. В заданной матрице A(N, M) поменять местами строки с номерами P и Q (1 10, они меняются местами, в ре­зультате элемент 20 оказывается на 2-м месте. Затем сравнива­ются 2-й и 3-й элементы массива, а именно 20 и 8, и они меня­ются местами. В результате элемент 20 оказывается уже на 3-м месте и т.д. Последними сравниваются 5-й и 6-й элементы массива (на 5-м месте к этому моменту находится 20) и также меняются местами. После выполнения 1-го шага элемент 20 пе­ремещается на последнее место. Запомним, что на первом шаге выполнялось сравнение следующих элементов: 1-го и 2-го, 2-го и 3-го, 3-го и 4-го, 4-го и 5-го, 5-го и 6-го.

На втором шаге все действия первого шага повторяются, но последними сравниваются 4-й и 5-й элементы, т.е. 10 и 2, и они меняются местами: 5-й и 6-й элементы сравнивать не имеет смысла, так как на предыдущем шаге на 6-е место был передви­нут самый большой элемент.

На третьем шаге выполняется сравнение элементов 1-го и 2-го, 2-го и 3-го, 3-го и 4-го, так как 5-й и 6-й элементы уже сто­ят на своих местах.

На четвертом шаге выполняется сравнение элементов только в двух парах, а именно 1-го и 2-го, 2-го и 3-го.

На пятом шаге сравниваются и переставляются первый и второй элементы массива - 5 и 2, остальные элементы, начиная с третьего, уже располагаются в порядке возрастания.

Итак, для сортировки массива из 6 элементов понадобилось выполнить 5 шагов. Легко догадаться, что отсортировать мас­сив, состоящий из п чисел, можно, выполнив п — 1 шагов.

Перейдем к построению алгоритма. Задан массив А[1..n] из п элементов. Обозначим переменной i номер шага выполнения сортировки, а переменной j - номер первого элемента в паре элементов A[j], A[j +1], которые надо сравнивать.

i = 1: просматриваются пары, в которых номер j изменяется от 1 до п -1 (последними сравниваются элементы, A[n-1],A[n]).

i = 2: просматриваются пары, в которых номер j изменяется от 1 до n-2 (последними сравниваются элементы A[n-2], А[п-1]).

i= 3 : просматриваются пары, в которых номер j изменяется от 1 до п — 3 (последними сравниваются элементы A[n —3], А[п-2]).

i = n-1: просматриваются пары, в которых номер j изменя­ется от 1 до п - (п -1) = 1 (сравниваются только элементы А [1], A[2]).

Из описанного выше можно сделать следующие выводы:

  1. всего выполняется (п —1) шагов, то есть переменная i из­меняется от 1 до (n -1);
  2. на i-м шаге просматриваются пары, в которых номеру из­меняется от 1 до (n-1) .

Опишем алгоритм в словесно-пошаговой форме (t - пере­менная для обмена значений элементов).

  1. Задать массив A[1..n] (элементы массива можно ввести с клавиатуры, задать с помощью генератора псевдослучайных чи­сел или прочитать из файла).
  2. i:=1.
  3. Если i A[ j + 1], то поменять их местами: t:=A[j]; A[j]: =A[j + 1];A[j +1l]: =t.
  4. Увеличить номеру (j:=j+1) и перейти к пункту 5.
  5. Увеличить номер / (i:=i+1) и перейти к пункту 3.
  6. Сортировка массива завершена. Вывод массива.

Для перехода к программной реализации обратим внимание на то, что пункты 4, 5, 6, 7 составляют внутренний цикл, в кото­ром переменная j изменяется от 1 до (п -1), а в пунктах 2, 3 и 8 записаны условия выполнения внешнего цикла, в котором пе­ременная iизменяется от 1 до (n—1).

  • Для учеников 1-11 классов и дошкольников
  • Бесплатные сертификаты учителям и участникам

Выберите документ из архива для просмотра:

Выбранный для просмотра документ Конспект.doc

образовательные: способствовать формированию представления о двумерном массиве и основных свойств квадратных матриц; рассмотреть алгоритмы сортировки двумерных массивов; создать условия для формирования умения решать алгоритмы с двумерными массивами;

развивающие: создать условия для развития умений работать за ограниченный промежуток времени, развиить у учащихся логическое мышление, учить анализировать и сравнивать.

воспитательные: содействовать созданию на уроке психологического комфорта для работы, воспитанию собранности, ответственного отношения к своему труду, повышения мотивации к учебной деятельности.

Тип урока : комбинированный.

Методы обучения: лекция, самостоятельная работа.

Формы организации: фронтальная работа, индивидуальная работа.

Оборудование: интерактивная доска, компьютеры.

Организационный момент

Актуализация полученных знаний

Давайте с Вами вспомним, алгоритмы сортировки в одномерном массиве (простая, пузырьком, вставками). Какой сортировкой мы будем пользоваться сегодня? (пузырьком) …… выходи к доске. У нас есть одномерный массив из 5 чисел 9 5 4 2 8, нужно отсортировать его в порядке возрастания.

Ответ: 2 4 5 8 9

А теперь давайте попробуем записать алгоритм сортировки на языке программирования Pascal . У меня есть заготовка задачи, но, к сожалению, в ней есть ошибки. Ваша задача найти эти ошибки. Есть одно условие, если один человек находит 5 ошибок, у него автоматически появляется 5 в журнале. Итак , начнем :

const m= 10 ;

var a: array [ 1. .m] of integer ;

readln( 'vvedite massiv: ' );

for i:= 1 to m do

for i:= 1 to m- 1 do

for j:= 1 to m-i do;

if a[j] 1 ] then begin

write( 'otsortirovanni massiv: ' );

for i:= 1 to m do

Молодцы! С этим заданием Вы справились хорошо.

Объяснение нового материала

А теперь давайте попробуем переделать задачу сортировки одномерного массива на задачу сортировки строк по возрастанию в двумерном массиве. Чем является строка в двумерном массиве? (одномерным массивом). Итак, задача. Дан двумерный массив 3 x 3. Отсортировать строку массива в порядке возрастания.

const m =3; (количество строк, величина постоянная)

n =3; (количество столбцов, величина постоянная)

var a : array [1.. m ,1.. n ] of integer ; (описание двумерного массива, описывается сколько элементов будет в столбцах и строках, и их тип)

i , j , k , l : integer ; (описание переменных необходимых в задаче, i , j -счетчик строки и столбца соответственно, тип переменных – целый!)

for i :=1 to m do (массив вводится по строкам, сначала одна строка, затем другая)

for j:=1 to n do

read(a[i,j]); ( массив вводится с клавиатуры )

readln ( l ); (вводим номер сортируемой строки с клавиатуры)

for i:=1 to m-1 do

(если элемент, стоящий в сортируемой строке, больше следующего элемента в этой же строке, то эти элементы меняются местами)

for j:=1 to m-i do

if a[l,j]>a[l,j+1] then begin

writeln; ( пустая строка )

for i :=1 to m do begin (массив выводится по строкам)

for j :=1 to n do

write ( a [ i , j ],' '); (вывод элемента стоящего в i -ой строке на j -ом месте, в апострофах пробел, для разделения элементов)

1. Повторение.
Двумерные массивы. Описание. Ввод и вывод. Поиск максимального и минимального элемента массива.
2. Двумерный массив. Сортировка двумерного массива.
Одна из основных задач по обработке двумерных массивов – сортировка (как правило, любые данные в таблице для оптимизации поиска предварительно сортируются, например, телефонный справочник, классный журнал и т.д.).
Существует два основных вида сортировки двумерного массива: сортировка отдельной строки (столбца) и сортировка по конкретной строке (столбцу).

Массив до сортировки: Массив после сортировки 2 строки по убыванию:

37592 37592
61843 8 6 4 3 1
09531 09531
64283 64283
75924 75924

Алгоритм такой сортировки сводится к сортировке одномерного массива (действительно, строка или столбец двумерного массива – одномерный массив с фиксированной второй координатой).
Например: Отсортировать вторую строку двумерного массива по убыванию:
Программа сортировки готова.
Обратите внимание, что это та же самая сортировка одномерного массива, только при указании индексов для массива во всех случаях фиксируется строка (указывается [2. ] ).
Если бы надо было отсортировать столбец, то фиксировался бы второй индекс, например [. 2] .
Для сортировки указанной строки, в начале программы номер строки вводился бы в указанную переменную (например, nn), а далее при сортировке вместо конкретного значения (в нашем примере цифра 2) указывалась бы эта переменная (для сортировки строки: [nn. ] , для столбца: [. nn] ).
Гораздо чаще встречается сортировка массива по столбцу (строке), в этом случае после сортировки сохраняются данные в строках (столбцах). Например, при сортировке учащихся по среднему баллу переставляются не только средние баллы, но и номера учеников в журнале, чтобы средний балл не записался кому-то другому.

Массив до сортировки: Массив после сортировки 2 строки по убыванию:

37592 09531
61843 37592
09531 75924
64283 64283
75924 61843

Самое главное, что принцип сортировки практически сохраняется, только на каждом шаге не просто определяется максимальный (минимальный) элемент и меняется местами с первым, вторым и т.д., а происходит перестановка соответствующих строк (столбцов), например, строки с максимальным элементом в нужном столбце с первой, затем строки с максимальным элементом из оставшихся со второй и т.д.
Например: Отсортировать двумерный массив по третьему столбцу по убыванию:

3. Задачи.
1. Отсортировать третий столбец двумерного массива по возрастанию.
2. Отсортировать двумерный массив по убыванию по пятой строке.
3. Отсортировать двумерный массив по возрастанию k-го столбца.

Аннотация: В лекции рассматриваются типовые задачи на обработку двумерных массивов, приводятся примеры алгоритмизации задач сортировок и перестановок в двумерных массивах.

Цель лекции: изучить особенности применения алгоритмов сортировок и перестановок в двумерных массивах, научиться решать задачи сортировок и перестановок в двумерных массивах на языке C++.

В виде двумерных массивов удобно представлять объекты, элементы которых принадлежат одному типу и расположены в виде таблицы. Например, матрицы коэффициентов систем линейных уравнений , функциональные зависимости , линейные операторы , матрицу системы ограничений в задачах минимизации или максимизации, экспериментальные данные и т.д. При решении прикладных задач над элементами двумерных массивов бывает необходимо выполнить однотипные действия. Например, при решении систем линейных уравнений методом Гаусса требуется производить многократные перестановки строк. Для выполнения поиска в двумерных массивах данные бывает удобно упорядочить по определенному ключу, что также предполагает перестановки.

Однако, по сравнению с одномерными массивами, в матрицах перестановки и сортировки имеют немного другой смысл и алгоритм выполнения.

В силу особенности представления двумерных массивов в виде таблиц смысл сортировки такого массива сводится к упорядочиванию элементов, объединенных в столбцы или строки. Например, сортировка по убыванию элементов столбцов означает, что элементы следует расположить по убыванию сверху вниз в каждом столбце отдельно. При этом, рассматривая строку или столбец как одномерный массив , к ним применяют алгоритмы сортировок одномерных массивов.

Пример 1. Сортировка в двумерном целочисленном массиве элементов k-той строки по невозрастанию.

Для поиска максимальных (минимальных) элементов с целью их дальнейшего упорядочивания удобно выделять отдельно одномерный массив , в котором хранить не значения элементов, а номера столбцов или строк, в которых они располагаются. Например, чтобы найти минимальные элементы в каждом столбце массива n x m отдельно, удобно выделить одномерный массив min[m] , в котором число элементов равно числу столбцов. Значениями элементов такого массива будут номера строк, в которых располагаются минимальные элементы каждого столбца. Если же минимальных элементов в столбце несколько, то будет найден первый (или последний) минимальный, что не скажется на значении.

Пример 2. Поиск номеров минимальных элементов в каждом столбце двумерного массива.

В данном примере min[max_y] – это массив , значениями которого будут номера строк, в которых располагается первый минимальный элемент столбца. Так для min[j] начальное значение инициализируется как 0, то есть предполагается, что минимальный элемент расположен в строке с номером 0. Обращение m[min[j]][j] понимается так: элемент массива m , расположенный в строке с номером min[j] и столбце с номером j . Но в строке min[j] для столбца j как раз и находится минимальный элемент.

В задачах на перестановку отдельных элементов массива, столбцов или строк используется алгоритм обмена значениями двух переменных через третью переменную (возможны и другие способы обмена значениями двух переменных).

Пример 3. Обмен значениями элементов диагоналей квадратной матрицы, расположенных в одной строке.

Пример 4. Дана квадратная матрица размера n x n , заполненная с клавиатуры целыми числами так, что в каждой строке и каждом столбце ровно по одному нулевому элементу. Переставьте строки матрицы так, чтобы нулевые элементы были расположены вдоль главной диагонали. Выведите массив на экран в виде таблицы дважды – до и после перестановки. Оформите генерацию, вывод массива и перестановку строк с помощью функций.

В данном примере zero[max] – это массив , значениями которого будут номера столбцов, в которых располагается нулевой каждой строки (по условию задачи, такой элемент в каждом столбце и каждой строке единственный). Обращение x[zero[i]][j] понимается так: элемент массива x , расположенный в строке с номером zero[i] и столбце с номером j . Но для строки с номером i нулевой элемент располагается в столбце с номером zero[i] . Для каждого элемента главной диагонали индексы строки и столбца равны, поэтому нулевой элемент из столбца zero[i] должен быть перемещен в строку с аналогичным номером (вместе со всеми элементами этой же строки). Обращение zero[zero[i]] означает, что после перестановки строк с номерами i и zero[i] нулевой элемент строки zero[i] будет находиться в столбце с номером zero[zero[i]] .

В языке С++ могут объявляться и использоваться в программах массивы, измерение которых больше двух. Такие массивы называют многомерными. Ограничения на число измерений массива зависит от реализации. Индексация многомерных массивов производится по каждому измерению в отдельности. Например, объявление трехмерного вещественного массива оформляется так:

При объявлении многомерного массива формируется массив указателей на массивы, измерение которых на единицу меньше. Такое объявление рекурсивно сводится к массивам указателей на одномерные массивы.

Инициализация многомерных массивов во многом аналогична инициализации двумерных массивов и производится с учетом всех измерений. Обращение к элементам таких массивов возможна также через индексированное имя или с помощью адресной арифметики с указателями.

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

Массивы слишком больших измерений неудобны в использовании, так как громоздки в объявлении и обращении, их индексация требует дополнительных затрат памяти, что увеличивает время выполнения программы.

Ключевые термины

Задачи перестановок в двумерных массивах – это тип задач , предполагающий обмен значениями элементов массива в зависимости от условия.

Задачи сортировок в двумерных массивах – это тип задач , предполагающий упорядочивание по указанному ключу одномерных массивов, из которых построен двумерный массив .

Читайте также: