В случае, если одно из полей записи само является записью (и снова содержит поля-записи), можно распространить оператор присоединения на несколько полей вглубь, перечислив их через запятую. Но в этом случае внутри тела оператора можно обращаться только к последним полям:
WITH ИмяЗаписи, Поле_3апись Do
BEGIN
Обращения к именам полей Поля_3аписи,
т.е. к тем, которым предшествовала конструкция
ИмяЗаписи.Поле_3апись.
END; {with}
- 142 -
Так как записи естественным образом отражают табличную форму хранения данных, они очень удобны для различных приложений — от бухгалтерских задач до системного программирования.
7.3. Тип «множество» (Set). Операции с множествами
Турбо Паскаль поддерживает все основные операции с множествами. Множество, если оно не является пустым, всегда содержит что-то, и говоря «множество», необходимо указывать — «чего?». В Паскале множества определяются как наборы значений из некоего скалярного (перечислимого) типа. Скалярные типы — Byte и Char вводятся языком, они — перечислимые (их элементы можно поштучно назвать) и могут служить основой для построения множеств. Если же их станет мало, то всегда можно ввести свой скалярный тип, например:
TYPE
VideoAdapterType = (MDA, Hercules, AGA, CGA, MCGA, EGA, VGA, Other, NotDetected);
и использовать переменную
VAR
VideoAdapter : VideoAdapterType;
которая может иметь только перечисленные в задании типа значения. А далее можно ввести переменную — множество из тех же значений.
В описании множества как типа используется конструкция Set of и следующее за ней указание базового типа, т.е. того скалярного типа, из элементов которого составлено множество. Способов задания множеств несколько:
TYPE
SetOfChar = Set of Char; { множество из символов }
SetOfByte = Set of Byte; { множество из чисел }
SetOfVideo = Set of VideoAdapterType;
{ множество из названий видеоадаптеров }
SetOfDigit = Set of 0..9;
{ множество из чисел от 0 до 9 }
SetOfDChar = Set of '0'..'9';
{ множество из символов '0','1',...,'9'}
SetOfVA = Set of CGA..VGA;
{ подмножество названий видеоадаптеров }
- 143 -
Как видно из примеров, можно в задании типа множества «урезать» базовый тип, задавая поддиапазон его значений. В итоге множество сможет состоять только из элементов, вошедших в диапазон.
Если перечислимый тип вводится только для подстановки его имени в Set of, то можно на нем сэкономить и перечислить значения сразу в конструкции Set of. Не забудьте круглые скобки!
TYPE
SetOfVideo = Set of (MDA, Hercules, AGA, CGA, MCGA,
EGA, VGA, Other, NоtDetected);
SetOfGlasn = Set of ('А', 'И', 'О', 'У', 'Э');
Можно опустить фазу описания типа в разделе TYPE и сразу задавать его в разделе описания переменных:
VAR
V1 : Set of ...
В Турбо Паскале разрешено определять множества, состоящие не более чем из 256 элементов. Столько же элементов содержат типы Byte и Char, и это же число является ограничением количества элементов в любом другом перечислимом базовом типе множества, задаваемом программистом. Каждый элемент множества имеет сопоставимый номер. Для типа Byte номер равен значению числа, в типе Char номером символа является его ASCII-код. Всегда нумерация идет от 0 до 255. По этой причине не являются базовыми для множеств типы ShortInt, Word, Integer, LongInt.
Множества имеют весьма компактное машинное представление: 1 — элемент расходует 1 бит. Поэтому для хранения 256 элементов достаточно 32 байт (для меньшего диапазона значений множеств цифра будет еще меньше).
Переменная, описанная как множество, подчиняется специальному синтаксису. Элементы множества должны заключаться в квадратные скобки:
SByte := [1, 2, 3, 4, 10, 20, 30, 40];
SChar := ['а', 'б','в'];
SChar := ['г'];
SVideo = [ CGA, AGA, MCGA];
SDiap := [1..4]; {то же, что [1, 2, 3, 4]}
SComp := [1..4, 5, 7, 10..20];
SCharS := ['а..п', 'р..я']; Empty := [];
Пустое множество записывается как [].
- 144 -
Порядок следования элементов внутри скобок не имеет значения так же, как не имеет значения число повторений. Например, многократное включение элемента в множество
SetVar := ['а', 'б', 'а', 'а'];
эквивалентно однократному его упоминанию.
В качестве элементов множеств в квадратные скобки могут включаться константы и переменные соответствующих базовых типов. Более того, можно вместо элементов подставлять выражения, если тип их результата совпадает с базовым типом множества:
VAR
X : Byte; S : Set of Byte;
...
X := 3;
S := [ 1, 2, X ];
S := S + [ X+1 ]; {и т.п. }
Операции, применимые к множествам, сведены в табл. 7.2.
Таблица 7.2