Множество в ТП является типом данных, диапазон значений которого является мощностью множества для определенного порядкового (базового) типа. Каждое возможное значение типа множества является подмножеством базового типа. Переменная типа множество может принимать как все значения множества, так и не одного. Множество не может содержит повторяющихся элементов. Размер любой переменной множественного типа составляет 32 байта.
Тип_множество::= "set" "of" порядковый тип.
Базовый тип не должен иметь более 256 значений, нижняя и верхняя границы типа не должны выходить из промежутка от 0 до 255.
Например:
type MySet = set of char;
var S:set of byte;
Создание множества получается путем записи выражений, заключенных в []. Пустое множество описывается как [].
Описатель_множества::= "[" [группа {"," группа}] "]"
группа::= выражение [".." выражение]
Значение выражения не должно выходить за пределы базового типа.
Например:
var x:set of byte;
c: set of char;
k:byte;
begin
...
x:=[1,5,100..145, K div 10];
c:=[‘A’ .. ‘Z’, ‘a’ .. ’z’];
...
end.
Над множествами можно проводить операции объединения, разности и пересечения по алгебраическим правилам действий над множествами, а также определять, содержит ли множество некоторый элемент, или является ли одно множество подмножеством (надмножеством) другого (см. параграф 1.4.3).
Например:
Объединение:
Операция [1,2,5,12]+[0,2,5,7,34] возвратит множество [0,1,2,5,7,12,34] (состоящее из первого и второго множеств)
Разность:
Операция [1,2,5,12]-[0,2,5,7,34] возвратит множество [1,12] (состоящее из тех элементов первого множества, которые отсутствуют во втором)
Пересечение:
Операция [1,2,5,12]*[0,2,5,7,34] возвратит множество [2,5] (состоящее из тех элементов первого множества, которые имеются и во втором)
Вхождение во множество:
Операция 1 in [0,3,5] возвратит false.
Операция ‘x’ in [‘A’, ‘k’..’z’] возвратит true.
Надмножество и подмножество:
Операция [1,2,5,12]>=[0,1,2,5,7,12,34] возвратит false
Операция [1,2,5,12]<=[0,1,2,5,7,12,34] возвратит true
Задача 36. Создать фильтр ввода ответа на вопрос (типа "Да"/"Нет")
Решение:
uses crt;
var c:char;
begin
writeln('Вы уверены?(Д/Н)');
repeat {начало фильтра}
c:=readkey;
until c in ['Д', 'д', 'Н', 'н']; {фильтр пропускает только требуемый для ответа символ}
writeln;
if c in ['Д','д'] then writeln(' На вопрос Вы ответили "ДА"')
else writeln('На вопрос Вы ответили "НЕТ"');
readln;
end.
Для добавления и исключения элемента из множества в ТП предусмотрены две процедуры:
procedure Include(var S: set of T; I:T);
procedure Exclude(var S: set of T; I:T);
Процедура Include включает во множество S значение I.
Процедура Exclude исключает из множества S значение I.
В предыдущих версиях ТП и стандартном Паскале добавить элемент во множество можно было с помощью операции объединения, а удалить - с помощью операции разности множеств.
Например:
Если S - множество натуральных чисел, то операция [3]+S и функция Include(s,3) имеют один и тот же результат. Аналогичным образом можно оценить операцию S-[7] и функцию Exclude(s,7). Однако функции Include и Exclude выполняются значительно быстрее.