Массивы в Delphi (структурные типы данных)
Массивом называется упорядоченная индексированная совокупность однотипных элементов, имеющих общее имя. Элементами массива могут быть данные различных типов, включая структурированные. Каждый элемент массива однозначно определяется именем массива и индексом (номером этого элемента в массиве) или индексами, если массив многомерный. Для обращения к отдельному элементу массива указываются имя этого массива и индекс (индексы) элемента, заключенный в квадратные скобки, например, arr1 [3, 35], arr1 [3] [35] или аrr3 [7].
Количество индексных позиций определяется размерностью массива (одномерный, двумерный и т. д.), при этом размерность не ограничивается. В математике аналогом одномерного массива является вектор, а двумерного— матрица. Индексы элементов массива должны принадлежать порядковому типу. Разные индексы одного и того же массива могут иметь различные типы. Чаще всего индекс имеет целочисленный тип.
Различают массивы статические и динамические.
Статический массив
Статический массив представляет собой массив, границы индексов и, соответственно, размеры которого задаются при объявлении, т. е. они известны еще до компиляции программы. Формат описания типа статического массива:
- Array [Имя массива] of <Тип элементов>;
Например,
- Type tm = Array[1 .. 10, 1 .. 100] of real;
...
- var
- arr1, arr2 : tm;
- arr3 : Array[20 .. 100] of char;
- arr4 : Array['a' .. 'z'] of integer;
Переменные arr1 и arr2 являются двумерными массивами по 1000 элементов (10 строк х 100 столбцов). Каждый элемент этих массивов представляет собой число типа real. Для объявления массивов arr1 и аrr2 введен специальный тип tm. Переменные аrrЗ и аrr4 являются одномерными массивами длиной в 81 символ и 26 целых чисел соответственно.
Динамический массив
Динамический массив представляет собой массив, для которого при объявлении указывается только тип его элементов, а размер массива определяется при выполнении программы. Формат описания типа динамического массива:
- Array of <Тип элементов>;
Во время выполнения программы размер динамического массива задается процедурой SetLength(var S; NewLength: Integer), которая для динамического массива S устанавливает новый размер, равный NewLength. Выполнять операции с динамическим массивом и его элементами можно только после задания размеров этого массива.
После задания размера динамического массива для определения его длины, а также минимального и максимального номеров элементов используются функции Length(), Low() и High() соответственно. Нумерация элементов динамического массива начинается с нуля, поэтому функция Low() для него всегда возвращает значение 0.
Приведем пример использования динамического массива.
- var
- n : integer;
- m : array of real;
- SetLength (m, 100);
- for n:=0 to 99 do m[n] :=n;
- SetLength (m, 200);
Множества
Множество представляет собой совокупность элементов, выбранных из заранее определенного набора значений. Все элементы множества принадлежат одному порядковому типу, число элементов в множестве не может превышать 256. Формат описания множественного типа:
- Set of <Тип элементов>;
Переменная множественного типа может содержать любое количество элементов своего множества— от нуля до максимального. Значения множественного типа заключаются в квадратные скобки. Пустое множество обозначается как [].
Операции, допустимые над множествами:
Объединение множеств (+) - объединение неповторяющихся элементов первого и второго множества
Вычитание множеств (-) - Элементы первого множества, не пренадлежащие второму
Пересечение множеств (*) - Элементы, общие для обоих множеств
Эквивалентность (=) - True, если множества эквивалентны
Неэквивалентность (<>) - True, если множества неэквивалентны
Проверка вхождения (<=) - True, если первое множество входит во второе
Проверка включения (>=) - True, если первое множество включает второе
Кроме того, есть операция in (проверка членства), которая определяет принадлежность выражения порядкового типа (первого операнда) множеству (второму операнду). Результат операции имеет тип boolean и значение True в случае, если значение принадлежит множеству.
Пример использования множеств:
- Type MonthDays = set of 1 . . 31;
- var
- Color: set of (Red, Blue, White, Black); Day: MonthDays;
- Color := [Blue];
- Color := Color — [Blue, Red, White];
- Color := Color + [Black];
- Color := Color + [Black];
- Day := [];
- Day := Day�— [1];
- Day := [2, 4];
- Day := Day + [5, 12, 1];
- Day := Day�— [1];
Здесь определяется множественный тип MonthDays и объявляются две переменные color и Day множественного типа, над которыми выполняются операции объединения и вычитания. В четвертой инструкции присваивания ко множеству color повторно добавляется значение Black. Такое присваивание корректно, однако значение множества при этом не изменяется. В шестой инструкции присваивания из пустого множества Day вычитается элемент; в результате выполнения этой инструкции значение множества также не изменяется.
В Delphi множественные типы используются, например, для описания типов кнопок в заголовке окна TBordericons или типов параметров фильтра TFiiterOptions:
- type
- TBorderlcon = (biSystemMenu, biMinimize, biMaximize, biHelp);
- TBorderlcons = set of TBorderlcon;
- type
- TFilterOption = (foCaselnsensitive, foNoPartialCompare);
- TFilterOptions = set of TFilterOption;
"Эти описания типов содержатся в исходных модулях Forms и Db соответственно.
Записи
Записи объединяют фиксированное число элементов данных других типов. Отдельные элементы записи имеют имена и называются полями. Имя поля должно быть уникальным в пределах записи. Различают фиксированные и вариантные записи.
Фиксированная запись состоит из конечного числа полей, ее объявление имеет формат:
- Record
- <Имя поля1> : <Тип поля1>;
- ...
- <Имя поляN> : <Тип поляN>;
- end;
Вариантная запись, как и фиксированная, имеет конечное число полей, однако предоставляет возможность по-разному интерпретировать области памяти, занимаемые полями. Все варианты записи располагаются в одном месте памяти и позволяют обращаться к ним по различным именам. Отметим, что в данном случае термин «вариантный» не имеет ничего общего с вариантным типом (variant). Формат объявления вариантной записи:
- Record
- case <Признак> : <Тип признака> of
- <Вариант1> : (<Описание варианта1>);
- <ВариантN> : (<Описание вариантаN>);
- end;
Для обращения к конкретному полю необходимо указывать имя записи и имя поля, разделенные точкой, т. е. имя поля является составным. С полем можно выполнять все операции, которые допускаются для отдельной переменной этого же типа.
Пример использования записи:
- var
- Man: record
- Name: string;
- Salary: real;
- Note: string;
- end;
- Man.Name: = 'Иванов M.P.';
- Man.Salary:=500;
Переменная Man является фиксированной записью и имеет поля имени (Name), оклада (Salary) и примечания (Note), каждое своего типа.
Система Delphi предоставляет также большое количество уже описанных типов записей, например:
- type
- TPoint = record
- X: Longint;
- Y: Longint;
- end;
- TRect = record
- case Integer of
- 0: (Left, Top, Right, Bottom: Integer);
- 1: (TopLeft, BottomRight: TPoint);
- end;
Здесь тип TPoint является фиксированной записью, а тип TRect — вариантной записью.
3 комментария к “Массивы в Delphi (структурные типы данных)”
полезный сайт, но очень тяжело читать с таким ужасным фоном
У Вас в третьем примере опечатка:
var
arr1, arr1 : tm;//Опечатка!Две одинаковые переменные.
arr3 : Array[20 .. 100] of char;
arr4 : Array['a' .. 'z'] of integer;
Спасибо, исправили.