Odds, Evens, Middle, Mixed: DigitSet;
Здесь объявлен множественный тип DigitSet и четыре переменных этого типа: Odds, Evens, Middle, Mixed. Каждая
переменная типа DigitSet может содержать от 0 до 10 элементов, выбранных из диапазона целочисленных значений 0…9. Хотя память и выделяется сразу для четырѐх множеств, их содержимое первоначально не определено (память пуста). Для того, чтобы отведенную память заполнить (определить значения этого множества) каким-либо множеством (исходными данными) необходимо использовать операторы присваивания (в операторном разделе программы), например:
Odds : = [1,3,5,7,9];
Evens : = [0,2,4,6,8];
Это в продолжение предыдущего примера –описателя. Каждый из этих двух операторов присваивает переменной – множеству значения, представляющее собой множество – литерал. Множество – литерал – это перечень значений в квадратных скобках, относящихся к базовому типу.
После выполнения этих операторов, множество Odds содержит набор нечетных цифр из диапазона от 0 до 9, а
переменная Evens содержит набор четных цифр из того же диапазона. Эти два множества можно использовать, когда потребуется определить, четным или не четным числом является значение данной переменной.
С другой стороны, множество-литерал [‗0‘..‘9‘, ‗+‘, ‗-‗, ‗E‘, ‗.‘] представляет собой набор символов, встречающихся в вещественных числах. Данное множество содержит 14 элементов. В данном случае десять символов – цифр удобнее представить в виде диапазона 0..9 (TurboPascal это разрешает), чем перечислять каждый из этих символов отдельно.
Список элементов, обязательно разделенных запятыми и в обязательных квадратных скобках, присвоенных
арифметическому оператору присваивания, иногда называется
конструктором множества.
Стоит, также, отметить, что множество можно создать со значениями выбранными из ранее объявленного
перечисленного типа данных, например:
Type
Cars = (Dodge, Ford, Lincoln, Cadillak, Fiesta, Pontiac, Corvette, Blick, Chevrolet, Mercury, Mustang);
CarSet = SET, OF Cars; Var
Avis, Hertz, Merger: CarSet;
Нижеследующие операторы присваивают переменным – множеством некоторые значения:
Avis: = [Dodge, Lincoln, Fiesta];
Hertt: = [Dodge..Cadilac, Mercnry];
Merger: = [Dodge..Mustang];
Здесь множества Avis включает три элемента, которые здесь же перечислены. Множество Hertz включает пять элементов.
Наконец, множество Merger представляет универсальное множество для типа CarSet. Кроме того, справа от оператора присваивания, помимо литера, может так же стоять переменная – множество (операция переприсваивания), если обе переменные имеют совместные базовые типы. Например, следующий оператор присваивания изменяет значение переменной – множества Merger:
Merger : = Hertz;
Над множеством можно производить следующие операции: арифметические и логические:
7) Объединение множеств (+), результат содержит элемента первого множества, дополненные недостаточными элементами из второго множества:
[1,3,4] + [1,2,4] равно [1,2,3,4]
[1,3] + [2,4] равно [1,2,3,4]
[‗A‘, ‗C‘, ‗F‘] + [‗B‘, ‗C‘, ‗D‘, ‗F‘] равно [‗A‘, ‗B‘, ‗C‘, ‗D‘, ‗F‘]
[‗A‘, ‗C‘, ‗F‘] + [‗A‘, ‗C‘, ‗D‘, ‗F‘] равно [‗A‘, ‗C‘, ‗D‘, ‗F‘]
8) Разность множеств (-), результат содержит элементы из первого множества, которые не принадлежит второму:
[1,3,4] - [1,2,4] равно [3] [1,3] - [2,4] равно [1,3]
[‗A‘, ‗C‘, ‗F‘] - [‗B‘, ‗C‘, ‗D‘, ‗F‘] равно [‗A‘]
[‗A‘, ‗C‘, ‗D‘, ‗F‘] - [‗A‘, ‗C‘, ‗F‘] равно [‗D‘]
9) Пересечение множеств (*); результат содержит элементы, общие для обоих множеств:
[1,3,4] * [1,2,4] равно [1,4] [1,3] * [2,4] равно [ ]
[‗A‘, ‗C‘, ‗F‘] * [‗B‘, ‗C‘, ‗D‘, ‗F‘] равно [‗C‘, ‗F‘] [‗A‘, ‗C‘, ‗F‘] * [‗A‘, ‗C‘, ‗D‘, ‗F‘] равно [‗A‘, ‗C‘, ‗F‘]
10) Проверка эквивалентности (=) – содержат ли два множества одинаковый набор элементов; возвращает TRUE (истина), если оба множества эквивалентны:
[1,3] = [1,3] равно TRUE (истина)
[1,3] = [2,4] равно FALSE (ложь)
[1,3] = [3,1] равно TRUE (истина)
[+] = [1] равно FALSE
11)Проверка неэквивалентности (≠) – возвращает TRUE, если оба множества не эквиваленты:
[1,3] <> [1,3] равно FALSE (ложь) [1,3] <> [2,4] равно TRUE (истина) [1,3] <> [3,1] равно FALSE (ложь) [+] <> [ 1 ] равно TRUE (истина)
12)Проверка вхождения ( ); возвращает TRUE, если первое множество включено во второе:
[1,3] |
[1,2,3,4] равно TRUE |
|
[1,3] |
[1,3] равно TRUE |
|
[1,2,3,4] |
[1,3] равно FALSE |
|
[1,3] |
[ |
] равно FALSE |
[ ] |
[1,3] равно TRUE |
|
[‗A‘, ‗B‘] |
[‗A‘] равно FALSE |
|
Пусто множество [ ] является подмножеством любого множества.
7) Проверка вхождения ( ); возвращает TRUE, если второе множество включено в первое:
[1,3]
[1,2,3,4] равно FALSE [1,3]
[1,3] равно TRUE [1,2,3,4] [1,3] равно TRUE [1,3] [ ] равно TRUE
[ ] [1,3] равно FALSE
[‗A‘, ‗B‘] [‗B‘] равно TRUE
9)Проверка принадлежности (IN); в этой бинарной операции первый элемент – выражение, а второй – множество одного и того же типа; возвращает телу,
если выражение имеет значение, принадлежащее множеству:
3 in |
[1..9] равно TRUE; |
2*2 |
in [ ‗1‘, ‗2‘, ‗3‘ ] равно FALSE; |
Дополнительно к этим операциям имеются еще две дополнительные процедуры:
9) INCLUDE – включает новый элемент во множество. Обращение к процедуре:
INCLUDE (S, I);
Здесь S – множество, состоящее из элементов базового типа
Tset Base
I – элемент типа TsetBase, который необходимо включить во множество S.
10) EXCLUDE – исключает элемент из множества.
Обращение: EXCLUDE (S, I)
Здесь параметры обращения S и I такие же, как у процедуры INCLUDE ( только I исключается из S).
Отметим, что подобно мысли другим данным, принадлежащим структуированным типам, множество не может использоваться в качестве параметра стандартных процедур READ и WRITE. Элементы данных, которым предназначено стать членами множества, должны
вводиться индивидуально и вставляться (с помощью оператора объединения) в изначально пустое множество. Что касается вывода множества, то необходимо для каждого значения его базового типа осуществить проверку относительно того, входит ли это значение в выводимое множество. Выводиться должны только значения, являющимися членами множества. Как правило вывод множества оформляется в виде процедуры. Например:
Procedure PrintSet (Letters: Letterset); Var
NextLetter: ‗A‖..‘Z‖;
Begin
For NextLetter: = ‗A‘ to ‗Z‘ do
If NextLetter in Letters then Write(NextLetters)
End;
Таким образом, все множество выводится по элементно в цикле.
Данная процедура PRINNTSET выводит прописные буквы из множества, которое представлено параметром Letters. Например, если вызвать эту процедуру с множеством [‗A‘, ‗C‘, ‗Z‘] в качестве параметра, вывод с помощью этой процедуры будет: A, C, Z.
Рассмотрим две программы, в которых осуществляется обработка различных множеств по определенным алгоритмам.
Пример 1. Пусть задано три различных множества:Vowels, Uppercase и Lowetcase. Необходимо определить является ли введенное для переменной NextChar значение (символ) – гласной, строчной или прописной буквой.
Вариант программы следующий
program mnog;
type CharSet=Set of Char;
var Vowels,Uppercase,LowerCase:CharSet; NextChar:Char;