- •Тема: Массивы. Двумерные массивы Краткий обзор языка
- •Одномерные массивы
- •Действия над массивами
- •Двумерные массивы Паскаля – матрицы
- •Описание двумерного массива Паскаля.
- •Пример описания двумерного массива Паскаля
- •Основные действия с двумерными массивами Паскаля
- •Ввод двумерного массива Паскаля
- •I, j: integer; { индексы массива }
- •Вывод двумерного массива Паскаля на экран
- •Представление двумерного массива Паскаля в памяти
- •Примеры решения задач с двумерными массивами Паскаля
- •Методы доступа к элементам массивов
- •Динамическое размещение массивов
- •Индексный массив
- •Специфические типы массивов Динамические массивы
- •Гетерогенные массивы
- •Массивы массивов
- •Примеры задач "Переворот" массива
- •Сдвиг массива на k элементов влево или вправо
- •Поиск минимума/максимума и их индексов
- •Поиск минимума/максимума и их индексов в двумерном массиве (матрице)
- •Работа с элементами выше/ниже/на главной/побочной диагоналях
- •Транспонирование матрицы относительно главной и побочной диагоналей
- •Поворот двумерного массива на 90° по часовой стрелке
- •Поворот на 90 градусов по часовой стрелке и против без использования дополнительного массива
- •Удаление элемента в одномерном массиве
- •Вставка элемента в одномерный массив
- •Удаление всех строк и столбцов, содержащих хоть 1 ноль.
- •Цифровая сортировка (DigidalSort)
- •Двоичный (бинарный) поиск
- •Работа с матрицей одним циклом
- •Заполнение массива случайными неповторяющимися значениями
- •Удалить все элементы, которые встречаются больше 1 раза
- •Удаление элементов в одномерном несортированном массиве по условию
- •Заполнение массива по спирали
- •Построение синусоиды на двумерном массиве(матрице) из точек(.)
- •Вставка нового столбца в матрицу со сдвигом исходных элементов
- •Переворот матрицы на 90° по часовой стрелке
- •Заполнение массива неповторяющимися значениями
Гетерогенные массивы
Гетерогенным называется массив, в разные элементы которого могут быть непосредственно записаны значения, относящиеся к различным типам данных. Массив, хранящий указатели на значения различных типов, не является гетерогенным, так как собственно хранящиеся в массиве данные относятся к единственному типу — типу «указатель». Гетерогенные массивы удобны как универсальная структура для хранения наборов данных произвольных типов. Отсутствие их поддержки в языке программирования приводит к необходимости реализации более сложных схем хранения данных. С другой стороны, реализация гетерогенности требует усложнения механизма поддержки массивов в трансляторе языка. Гетерогенный массив как встроенный тип данных присутствует в языке PHP.
Массивы массивов
Многомерные массивы, как правило, реализованные как одномерные массивы, каждый элемент которых является ссылкой на другой одномерный массив.
Реализация
Стандартным способом реализации статических массивов с одним типом элементов является следующий:
Под массив выделяется непрерывный блок памяти объёмом S*m1*m2*m3…mn, где S — размер одного элемента, а m1…mn — размеры диапазонов индексов (то есть количество значений, которые может принимать соответствующий индекс).
При обращении к элементу массива A[i1, i2, i3, … in] адрес соответствующего элемента вычисляется как B+S*(i1p*m1+i2p*m2+…+i(n-1)p*mn-1+inp), где B —
27
база (адрес начала блока памяти массива), ikp-значение k-го индекса, приведённое к целому с нулевым начальным смещением.
Таким образом, адрес элемента с заданным набором индексов вычисляется так, что время доступа ко всем элементам массива одинаково.
Первый элемент массива, в зависимости от языка программирования, может иметь различный индекс. Различают три основных разновидности массивов: с отсчетом от нуля (zero-based), с отсчетом от единицы (one-based) и с отсчетом от специфического значения заданного программистом (n-based). Отсчет индекса элемента массивов с нуля более характерен для низкоуровневых ЯП, однако этот метод был популяризирован в языках более высокого уровня языком программирования С.
Более сложные типы массивов — динамические и гетерогенные — реализуются сложнее.
Достоинства
легкость вычисления адреса элемента по его индексу (поскольку элементы массива располагаются один за другим)
одинаковое время доступа ко всем элементам
малый размер элементов: они состоят только из информационного поля
Недостатки
для статического массива — отсутствие динамики, невозможность удаления или добавления элемента без сдвига других
для динамического и/или гетерогенного массива — более низкое (по сравнению с обычным статическим) быстродействие и дополнительные накладные расходы на поддержку динамических свойств и/или гетерогенности.
при работе с массивом в стиле C (с указателями) и при отсутствии дополнительных средств контроля — угроза выхода за границы массива и повреждения данных
Примеры задач "Переворот" массива
было
|
|||
|
|
||
Стало
|
|||
|
|
||
var
a:array[1..100] of integer;
i,r,n:integer;
begin
readln(n); {Г·ГЁГІГ*ГҐГ¬ Г°Г*çìåð Г¬Г*Г±Г±ГЁГўГ*}
for i:=1 to n do
read(a[i]);
for i:=1 to n div 2 do {Г±Г*Г¬ "ïåðåâîðîò"}
begin
r:=a[i];
a[i]:=a[n-i+1];
a[n-i+1]:=r;
end;
for i:=1 to n do
write(a[i],' ');
readln
end.
