Массивы в Delphi (структурные типы данных)

Рубрика: Delphi с нуля

Массивом называется упорядоченная индексированная совокупность однотипных элементов, имеющих общее имя. Элементами массива могут быть данные различных типов, включая структурированные. Каждый элемент массива однозначно определяется именем массива и индексом (номером этого элемента в массиве) или индексами, если массив многомерный. Для обращения к отдельному элементу массива указываются имя этого массива и индекс (индексы) элемента, заключенный в квадратные скобки, например, arr1 [3, 35], arr1 [3] [35] или аrr3 [7].

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

Различают массивы статические и динамические.


Статический массив

Статический массив представляет собой массив, границы индексов и, соответственно, размеры которого задаются при объявлении, т. е. они известны еще до компиляции программы. Формат описания типа статического массива:

  1. Array [Имя массива] of <Тип элементов>;

Например,

...

  1. var
  2. arr1, arr2 : tm;
  3. arr3 : Array[20 .. 100] of char;
  4. arr4 : Array['a' .. 'z'] of integer;

Переменные arr1 и arr2 являются двумерными массивами по 1000 элементов (10 строк х 100 столбцов). Каждый элемент этих массивов представляет собой число типа real. Для объявления массивов arr1 и аrr2 введен специальный тип tm. Переменные аrrЗ и аrr4 являются одномерными массивами длиной в 81 символ и 26 целых чисел соответственно.

Динамический массив

Динамический массив представляет собой массив, для которого при объявлении указывается только тип его элементов, а размер массива определяется при выполнении программы. Формат описания типа динамического массива:

Во время выполнения программы размер динамического массива задается процедурой SetLength(var S; NewLength: Integer), которая для динамического массива S устанавливает новый размер, равный NewLength. Выполнять операции с динамическим массивом и его элементами можно только после задания размеров этого массива.

После задания размера динамического массива для определения его длины, а также минимального и максимального номеров элементов используются функции Length(), Low() и High() соответственно. Нумерация элементов динамического массива начинается с нуля, поэтому функция Low() для него всегда возвращает значение 0.

Приведем пример использования динамического массива.

  1. var
  2. n : integer;
  3. m : array of real;
  4. SetLength (m, 100);
  5. for n:=0 to 99 do m[n] :=n;
  6. SetLength (m, 200);

Множества

Множество представляет собой совокупность элементов, выбранных из заранее определенного набора значений. Все элементы множества принадлежат одному порядковому типу, число элементов в множестве не может превышать 256. Формат описания множественного типа:

  1. Set of <Тип элементов>;

Переменная множественного типа может содержать любое количество элементов своего множества— от нуля до максимального. Значения множественного типа заключаются в квадратные скобки. Пустое множество обозначается как [].

Операции, допустимые над множествами:

Объединение множеств (+)  - объединение неповторяющихся элементов первого и второго множества

Вычитание множеств (-)  - Элементы первого множества, не пренадлежащие второму

Пересечение множеств (*)  - Элементы, общие для обоих множеств

Эквивалентность (=)  - True, если множества эквивалентны

Неэквивалентность (<>)  - True, если множества неэквивалентны

Проверка вхождения (<=)  - True, если первое множество входит во второе

Проверка включения (>=)  - True, если первое множество включает второе

Кроме того, есть операция in (проверка членства), которая определяет принадлежность выражения порядкового типа (первого операнда) множеству (второму операнду). Результат операции имеет тип boolean и значение True в случае, если значение принадлежит множеству.

Пример использования множеств:

  1. Type MonthDays = set of 1 . . 31;
  2. var
  3. Color:  set of (Red, Blue, White, Black); Day: MonthDays;
  4. Color := [Blue];
  5. Color := Color — [Blue, Red, White];
  6. Color := Color + [Black];
  7. Color := Color + [Black];
  8. Day := [];
  9. Day := Day�&mdash; [1];
  10. Day := [2, 4];
  11. Day := Day + [5, 12, 1];
  12. Day := Day�&mdash; [1];

Здесь определяется множественный тип MonthDays и объявляются две переменные color и Day множественного типа, над которыми выполняются операции объединения и вычитания. В четвертой инструкции присваивания ко множеству color повторно добавляется значение Black. Такое присваивание корректно, однако значение множества при этом не изменяется. В шестой инструкции присваивания из пустого множества Day вычитается элемент; в результате выполнения этой инструкции значение множества также не изменяется.

В Delphi множественные типы используются, например, для описания типов кнопок в заголовке окна TBordericons или типов параметров фильтра TFiiterOptions:

  1. type
  2. TBorderlcon = (biSystemMenu, biMinimize, biMaximize, biHelp);
  3. TBorderlcons = set of TBorderlcon;
  4. type
  5. TFilterOption = (foCaselnsensitive, foNoPartialCompare);
  6. TFilterOptions = set of TFilterOption;

"Эти описания типов содержатся в исходных модулях Forms и Db соответственно.

Записи

Записи объединяют фиксированное число элементов данных других типов. Отдельные элементы записи имеют имена и называются полями. Имя поля должно быть уникальным в пределах записи. Различают фиксированные и вариантные записи.

Фиксированная запись состоит из конечного числа полей, ее объявление имеет формат:

  1. Record
  2. <Имя поля1> : <Тип поля1>;
  3. ...
  4. <Имя поляN> : <Тип поляN>;
  5. end;

Вариантная запись, как и фиксированная, имеет конечное число полей, однако предоставляет возможность по-разному интерпретировать области памяти, занимаемые полями. Все варианты записи располагаются в одном месте памяти и позволяют обращаться к ним по различным именам. Отметим, что в данном случае термин «вариантный» не имеет ничего общего с вариантным типом (variant).  Формат объявления вариантной записи:

  1. Record
  2. case <Признак> : <Тип признака> of
  3. <Вариант1> : (<Описание варианта1>);
  4. <ВариантN> : (<Описание вариантаN>);
  5. end;

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

Пример использования записи:

  1. var
  2. Man: record
  3. Name: string;
  4. Salary: real;
  5. Note: string;
  6. end;
  7. Man.Name: = 'Иванов M.P.';
  8. Man.Salary:=500;

Переменная Man является фиксированной записью и имеет поля имени (Name), оклада (Salary) и примечания (Note), каждое своего типа.

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

  1. type
  2. TPoint = record
  3. X: Longint;
  4. Y: Longint;
  5. end;
  6. TRect = record
  7. case Integer of
  8. 0: (Left, Top, Right, Bottom: Integer);
  9. 1: (TopLeft, BottomRight: TPoint);
  10. end;

Здесь тип TPoint является фиксированной записью, а тип TRect вариантной записью.

Если Вам интересна эта запись, Вы можете следить за ее обсуждением, подписавшись на RSS 2.0 .

3 комментария к “Массивы в Delphi (структурные типы данных)”

  • Елена
    27 мая, 2012, 22:00

    полезный сайт, но очень тяжело читать с таким ужасным фоном

  • Asm
    23 июля, 2012, 23:29

    У Вас в третьем примере опечатка:

    var

    arr1, arr1 : tm;//Опечатка!Две одинаковые переменные.

    arr3 : Array[20 .. 100] of char;

    arr4 : Array['a' .. 'z'] of integer;

  • Сергей Бойко
    12 июня, 2013, 13:05

    Спасибо, исправили.

Оставить комментарий или два

*