Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебное пособие 700269.doc
Скачиваний:
15
Добавлен:
01.05.2022
Размер:
1.78 Mб
Скачать

3.3.4. Массивы

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

Объявление статического массива имеет вид:

var <имя>: array [<ограниченный тип>,...] of <тип элементов>;

Например:

var A: array [1..10] of integer; //одномерный массив

A2: array[1..10,1..3] of integer; //двумерный массив

{массив с индексом перечислимого типа:}

Type color=(red,yellow,green);

var ACol: array [color] of integer;

Ch: array ['a'..'z'] of char; //массив символов

Доступ к элементам массива осуществляется по индексам. Например, A[i] или A2[4,3].

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

Var A1 : array[0..10] of integer =

(1,2,3,4,5,6,7,8,9,10,11);

Const A1 : array[0..10] of integer =

(1,2,3,4,5,6,7,8,9,10,11);

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

Const S:array[0..3] of char = ('A','B','C','D');

Const S:array[0..3] of char = 'ABCD';

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

type Ar3 = array[1..4,1..3,1..2] of integer;

const A3: Ar3=(((0,1),(2,3),(4,5)),

((6,7),(8,9),(10,11)),

((12,13),(14,15),(16,17)),

((18,19),(20,21),(22,23)));

Отметим, что в конструкциях, подобным объявлению константы A3, легко запутаться в открывающих (закрывающих) скобках. В Delphi существует специальное сочетание клавиш Alt+[ (Alt+]), позволяющее осуществить поиск соответствующей открывающей (закрывающей) скобки.

Многомерный динамический массив определяется как динамический массив динамических массивов и т.д. Например, определим двумерный динамический массив:

var A2: array of array of integer;

Для выделения памяти под динамический массив необходимо использовать процедуру SetLength, передавая ей в качестве параметров несколько размеров. Например, для задания динамического массива размерностью 3 на 4 для объявленной переменной A2 необходим оператор

SetLength(A2,3,4);

Отметим, что можно создавать и непрямоугольные массивы, в которых, например, второй размер не постоянен и варьируется в зависимости от номера строки [1].

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

procedure MyProc(A: array[1..10] of Integer);

будет расценено как синтаксическая ошибка и вызовет соответствующее сообщение компилятора. Правильное объявление:

type ta = array[1..10] of Integer;

procedure MyProc(A: ta);

Функции и процедуры в Object Pascal могут воспринимать в качестве параметров не только массивы фиксированного размера, но и так называемые открытые массивы, размер которых неизвестен. В этом случае в объявлении функции или процедуры они описываются как массивы базовых типов без указания их размерности. Например:

procedure SumArray(A:array of integer;

var B: array of integer);

При таком определении передаваемый в функцию первый массив будет копироваться и с этой копией – массивом A будет работать процедура. Второй открытый массив определен как var. Этот массив передается по ссылке, т.е. он не копируется, и процедура будет работать непосредственно с исходным массивом. Открытый массив воспринимается в теле процедуры или функции как массив с целыми индексами, начинающимися с нуля. Размер массива может быть определен функциями Length – число элементов и High – наибольшее значение индекса. Очевидно, что всегда High = Length - 1.

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

function Sum(const Data: array of Double): Extended;

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

Sum([1.2,4.45,0.1]);