Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
48
Добавлен:
10.02.2015
Размер:
105.47 Кб
Скачать

Лекция 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;