Еще один структурированный тип данных - это множество (set). В нем может содержаться не более 256 элементов.
Важное отличие множества от остальных структурированных типов состоит в том, что его элементы не являются упорядоченными.
В разделе var множества описываются следующим образом:
var <имя_множества>: set of <тип_элементов_множества>;
Элементы могут принадлежать к любому порядковому типу, размер которого не превышает 1 байт (256 элементов). Например:
var s1: set of char; {множество из 256-ти элементов}
s2: set of 'a'..'z','A'..'Z'; {множество из 52-х элементов}
s3: set of 0..10; {множество из 11-ти элементов}
s4: set of boolean; {множество из 2-х элементов}
Множество можно задать неименованной константой прямо в тексте программы. Для этого необходимо заключить список элементов создаваемого множества в квадратные скобки:
[<список_элементов>]
Список элементов может быть задан перечислением элементов нового множества через запятую, интервалом или объединением этих двух способов. Элементы и границы интервалов могут быть переменными, константами и выражениями. Если левая граница интервала окажется больше правой, результатом будет пустое множество.
Примеры конструирования и использования различных множеств:
if c in ['a','e','i','o','u']
then writeln('Гласная буква');
if set1 < [k*2+1..n,13] then set1:=[];
Множество - это структурированный тип данных, поэтому его невозможно задать нетипизированной константой.
Задать множество как типизированную константу можно в разделе const:
<имя_константы> : set of <тип_элементов> =[<список_элементов>];
Например:
type cipher = set of '0'..'9';
const odds: cipher = ['1','3','5','7','9'];
vowels: set of 'a'..'z' = ['a','o','e','u','i'];
Все теоретико-множественные операции реализованы и в языке Pascal:
1) Пересечение двух множеств s1 и s2: s:=s1*s2;
2) Объединение двух множеств s1 и s2: s:=s1+s2;
3) Разность двух множеств s1 и s2 (все элементы, которые принадлежат множеству s1 и одновременно не принадлежат множеству s2)1): s:=s1-s2;
4) Проверка принадлежности элемента el множеству s (результат этой операции имеет тип boolean): el in s
5) Обозначение для пустого множества: []
6) Создание множества из списка элементов: s:=[e1,_,eN];
7) Проверка двух множеств на равенство или строгое включение (результат этих операций имеет тип boolean):
s1 = s2
s1 > s2
s1 < s2
Не существует никакой процедуры, позволяющей распечатать содержимое множества. Это приходится делать следующим образом:
{s: set of type1; k: type1}
for k:= min_type1 to max_type1
do if k in s then write(k);
Пример. Дана не пустая последовательность символов. Требуется построить и вывести множество, элементами которого являются встречающиеся в последовательности цифры от 3 до 9, буквы от A до F и знаки препинания. Признаком окончания последовательности является символ 0.
program M;
var ch:char;
s:string;
begin
write ('Введите строку символов (0-выход): ');
s:='';
repeat
read (ch);
if (ch in ['3'..'9']) or (ch in ['A'..'F']) or (ch in [',','.',';',':','-']) then s:=s+ch;