
- •Лекция 5. Массивы.
- •Краткая справка.
- •Единственной операцией, не требующей указания индекса является присваивание однотипных массивов, все
- •Если предварительное объявление типа не вызвано необходимостью, например для локальных массивов, то переменная
- •Одномерные массивы (векторы).
- •Алгоритмы обработки одномерных массивов
- •6.Подсчет количества элементов, удовлетворяющих заданному условию.
- •Var a : Ta; buf : integer; i, imin, imax : word; BEGIN
- •Задача. Упорядочить массив по возрастанию…чего? Тривиальный ответ «по значению числа» не будет правильным,
- •При сортировке очень больших массивов затраты машинных ресурсов, особенно процессорного времени, становятся велики,
- •Кзадаче 2.4. Функция вычисления среднего арифметического
- •Задание 1.
- •Задание 2.
- •5.Из одного массива с элементами типа real сформировать два массива: в первом собрать
Лекция 5. Массивы.
1.Краткая справка.
2.Одномерные массивы.
3.Алгоритмы обработки одномерных массивов
Краткая справка.
Массивы, в отличие от простых типов, таких как целые (word, integer и т.п.), действительные (real, double), символьные и
др., относятся к структурированным типам.
Структурированные (сложные) типы всегда имеют внутреннюю структуру, т.е. состоят в общем случае из нескольких (возможно разнотипных) элементов.
Существует три признака, отличающие массив от других сложных типов:
-массив представляет собой упорядоченную совокупность элементов (один и более),
-все элементы массива имеют одно и то же имя и одинаковый тип,
-каждый элемент имеет уникальный порядковый номер (индекс) и доступ к элементу производится с помощью операции индексации по правилу <имя массива>[индекс].
Итак, необходимо различать переменную – массив и элемент этого массива, который всегда указывается с индексом в квадратных скобках.
Единственной операцией, не требующей указания индекса является присваивание однотипных массивов, все
остальные действия проводятся над отдельными
элементами с указанием индексов, "поштучно", как правило в циклах for.
При работе с массивами, кроме идентификаторов массивов, надо знать их размерность - количество элементов в массиве. Иначе говоря, массив однозначно
определяется двумя величинами: именем и размерностью.
Массивы не имеют предопределенного имени типа, такого как, например integer для целых типов. С этой точки зрения, их можно отнести к пользовательским типам или типам,
введенным пользователем (программистом).
Переменные пользовательских типов в DELPHI объявляются, в общем случае, в два этапа: сначала в разделе Type объявляется пользовательский тип, а затем в разделе Var определяется переменная этого типа.
Если предварительное объявление типа не вызвано необходимостью, например для локальных массивов, то переменная - массив определяется сразу же в разделе Var.
Формальный синтаксис с предварительным объявлением типа:
Type TArray=array[<диапазон индексов>] of <базовый тип>;
Var Arr : TArray;
Формальный синтаксис без предварительного объявления типа:
Var Arr :TArray=array[<диапазон индексов>] of <базовый тип>;
Массивы бывают одномерные (векторы), двумерные (матрицы) и многомерные. В учебном курсе будут рассматриваться только одномерные и двумерные массивы.
Одномерные массивы (векторы).
Объявление одномерных массивов производится путем указанием одного диапазона с одной парой индексов для минимального и максимального значений. Например:
Массив из 100 целых чисел
Type Tw=array[1..100] of word;
Массив из 100 действительных чисел с размерностью, заданной в виде констант
Const nmin=-50; nmax=50;
Type Ta=array[nmin..nmax] of real;
Массив символов из 26 символов малых букв английского алфавита (не путать со строкой String - это отдельный тип)
Type Tc=array[‘a’..’z’] of char;
Алгоритмы обработки одномерных массивов
Для одномерных массивов характерны алгоритмы двух видов
•Размерность массива не изменяется. Массив сохраняет свою размерность.
•С изменением (увеличением или уменьшением) размера массива.
К первой группе относятся задачи:
1.Перестановка элементов (см. «три стакана»).
2.Поиск индекса минимального (максимального) элемента с вариантами поиска.
3.Поиск первого (последнего) отрицательного (положительного) элемента.
4.Сортировка элементов по возрастанию (убыванию).
5.Вычисление некоторой характеристики массива (среднего арифметического, среднего геометрического и т.п.)
6.Подсчет количества элементов, удовлетворяющих заданному условию.
Ко второй группе относятся задачи:
1.Разбиения исходного массива на два массива меньшей размерности по какому-либо признаку.
2.Слияния двух массивов в один без пропусков.
Основная трудность в задачах этой группы заключается в определении размерности результирующего массива,
которую, в общем случае, нельзя определить до окончания формирования. Иначе говоря, текущий индекс элемента
массива на момент окончания формирования и есть актуальная размерность. Максимальную размерность
следует выбирать по соображениям здравого смысла.
Например, в первой задаче максимальную размерность каждого из результирующих массивов следует выбрать равной максимальной размерности исходного массива.

Задача. В массиве целых чисел размерностью n<17 найти минимальный элемент и поменять его местами с максимальным.
Const n=17;
Type Ta=array[1..n] of integer;

Var a : Ta; buf : integer; i, imin, imax : word; BEGIN
Randomize;
for i:=1 to n do a[i]:=-50 + random(101); for i:=1 to n do write(a[i]:4); writeln;
for i:=1 to n do write(a[i]:4); writeln; Readln;
END.
Задача. Упорядочить массив по возрастанию…чего? Тривиальный ответ «по значению числа» не будет правильным, в случае например, если требуется упорядочить по величине суммы разрядов числа.
Поскольку эта задача в общем виде не устанавливает признак, по которому можно судить больше один элемент другого или меньше, ее сразу надо рассматривать именно как общий случай, с тем, чтобы алгоритм сортировки не зависел от признака отношения между элементами.
Операцию отношения (больше, меньше) необходимо программировать отдельно в виде функции с результатом логического типа, и передавать ее в процедуру сортировки с использованием соответствующего процедурного типа.

Type TFsort=Function(a, b : integer) : Boolean;
End;