Множества - это наборы однотипных логически связанных друг с другом объектов. Характер связей между объектами лишь подразумевается программистом и никак не контролируется Object Pascal. Количество элементов, входящих в множество, может меняться в пределах от 0 до 256 (множество, не содержащее элементов, называется пустым). Именно непостоянством количества своих элементов множества отличаются от массивов и записей.
Два множества считаются эквивалентными тогда и только тогда, когда все их элементы одинаковы, причем порядок следования элементов в множестве безразличен. Если все элементы одного множества входят также и в другое, говорят о включении первого множества во второе. Пустое множество включается в любое другое.
В общем виде тип множества задается следующим образом:
<имя типа> = set of<базовый тип>;
где <имя типа> - имя создаваемого типа;
<базовый тип> - базовый тип элементов множества, в качестве которого может использоваться любой порядковый тип, кроме Word, Integer, Longint, Int64.
Пример определения и задания множеств:
Type
digitChar = set of'0'..'9';
digit = set of0. .9;
Var
sl,s2,s3 : digitChar;
s4,s5,s6 : digit;
Begin
s1 = ['1', '2', '3'];
s2 = ['3', '2', '1'];
s3 = ['2', '3'];
s4 = [0..3, 6];
s5 = [4, 5];
s6 = [3..9];
End.
В этом примере множества s1 и s2 эквивалентны, а множество s3 включено в s2 , но не эквивалентно ему.
Для задания множества используется так называемый конструктор множества: список спецификаций элементов множества, отделенных друг от друга запятыми; список обрамляется квадратными скобками.
Спецификациями элементов могут быть константы или выражения базового типа, а также тип-диапазон того же базового типа.
Операции, определенные над множествами представлены в табл. 3.10.
Таблица 3.10.Операции над множествами
Знак
Операция
Результат
*
пересечение множеств
результат содержит элементы, общие для обоих множеств
+
объединение множеств
результат содержит элементы первого множества, дополненные недостающими элементами из второго множества
-
разность множеств
результат содержит элементы из первого множества, которые не принадлежат второму
=
проверка эквивалентности
возвращает True, если оба множества эквивалентны
< >
проверка неэквивалентности
возвращает True, если оба множества неэквивалентны
<=
проверка вхождения
возвращает True, если первое множество включено во второе
>=
проверка вхождения
возвращает True, если второе множество включено в первое
in
проверка принадлежности
в этой бинарной операции первый элемент - выражение, а второй - множество одного и того же типа; возвращает True, если выражение имеет значение, принадлежащее множеству
Дополнительно к этим операциям можно использовать две следующие процедуры:
· include(s, i) – включает новый элемент i в множество s.
· exclude(s, i) – исключает элемент i из множества s.
Записи
В практике программирования довольно часто приходится иметь дело с данными, которые естественным образом состоят из других данных. Например, сведения о студентах содержат фамилию, имя, отчество, число, месяц и год рождения, домашний адрес и другие данные. Для представления подобной информации в языке Object Pascal используется структура, которая носит название запись (record).
Запись – это структура данных, состоящая из фиксированного количества компонентов, называемых полями записи. В отличие от массива компоненты (поля) записи могут быть различного типа. Чтобы можно было ссылаться на тот или иной компонент записи, поля именуются.
С одной стороны, запись можно рассматривать как единую структуру, а с другой – как набор отдельных элементов, компонентов. Характерной особенностью записи является то, что составляющие ее компоненты могут быть разного типа. Другая особенность записи состоит в том, что каждый компонент записи (поле) имеет имя.
В общем виде объявление типа «запись» выглядит так:
<имя_типа_записи> = record
<имя_поля_1> : тип_1;
<имя_поля_2> : тип_2;
<имя_поля_N> : тип_N;
end;
где <имя_типа_записи> - имя создаваемого типа «запись»;
<имя_поля_x> и тип_x – имя и тип компонента (поля) записи.
Примеры объявлений:
Type
TStudent = record
SurName: string[20];
Name: string[20];
Day: integer;
Month: integer;
Year: integer;
Address: string[50];
end;
После объявления типа записи можно объявить переменную-запись, например:
Var
student : TStudent;
Для того чтобы получить доступ к элементу (полю) переменной-записи (записи), нужно указать имя записи и имя поля, разделив их точкой.
выводит на экран содержимое полей Name (имя) и в следующей строке Address (адрес) переменной-записи student.
Иногда тип переменной-записи объявляют непосредственно в разделе объявления переменных. В этом случае тип записи указывается сразу за именем переменной, через двоеточие. Например, запись student может быть объявлена в разделе var следующим образом:
Var
student:record
SurName: string[20];
Name: string[20];
Day: integer;
Month: integer;
Year: integer;
Address: string[50];
end;
Специальный оператор присоединенияwithпозволяет использовать в тексте программы имена полей без указания имени переменной-записи. В общем виде оператор with выглядит следующим образом:
with<имя_записи> do <оператор>;
где <имя_записи> – имя переменной-записи;
<оператор> – произвольный оператор (в том числе составной), в котором при обращении к полям записи <имя_записи>, имя записи можно не указывать.
Например, рассмотренный выше пример вывода имени и адреса студента может быть представлен так: