
4.2. Множества
4.2.1. Объявление типа множества
Значениями типа множества, так же, как и массива, являются значения одного базового типа, однако, в отличие от массива множество может содержать любое количество различных элементов базового типа. Рассмотрим множество, состоящее из трех элементов [1, 2, 5]. В этом множестве можно выделить восемь подмножеств:
- с одним элементом: [1], [2], [5]; - с двумя элементами: [1, 2], [1, 5], [2, 5]; - с тремя элементами: [1, 2, 5]; - пустое: [].
В общем случае для множества, содержащего N элементов, можно выделить 2N подмножеств. Паскаль позволяет определить переменную типа множества, значением которой может быть одно из рассмотренных подмножеств базового типа [1, 2, 5], следующим образом:
var X : set of (1, 2, 5);
При объявлении типа множества всегда указывается тип базового множества, т.е. тот скалярный тип, из элементов которого составлено множество. Обычно используются перечисляемые и интервальные типы. Количество элементов базового множества может меняться в пределах от 0 до 255, например:
type Tbm1 = set of 0..63; Tbm2 = set of 'A'..'Z'; var X1, X2: Tbm1; Y1, Y2: Tbm2; . . . X1 := [0..3, 5, 20, 40]; {подмножество состоит из элементов 0, 1, 2, 3, 5, 20, 40} X2 := [5, 7]; Y1 := ['A', 'D', 'Z']; Y2 := []; {пустое множество} |
Как следует из примера, подмножество в программе задается перечислением входящих в него элементов базового множества, заключенных в квадратные скобки. В качестве элементов базового множества можно указывать переменные и выражения, значения которых имеют тип базового множества, например: пусть I = 3, J = 6, тогда [I..J-1, J+1..20] - подмножество [3..5, 7.. 20] базового множества типа Tbm1.
4.2.2. Операции над множествами
В Паскале определены следующие операции, позволяющие получить новое подмножество из двух данных:
+ |
- |
объединение; результат содержит все элементы объединяемых подмножеств, одинаковые элементы не повторяются, например: |
|
|
X1 + X2 содержит [0, 1, 2, 3, 5, 7, 20, 40]; |
* |
- |
пересечение; результат содержит элементы, принадлежащие одновременно обоим подмножествам, например: |
|
|
X1 * X2 содержит [5]; |
- |
- |
разность; результат содержит элементы первого подмножества, которые не входят во второе, например: |
|
|
X1 - X2 содержит [0, 1, 2, 3, 20, 40]. |
Существуют операции, позволяющие сравнивать подмножества. Результатом являются значения TRUE и FALSE.
= |
- |
проверка на равенство; два подмножества считаются равными, если они состоят из одних и тех же элементов, например: |
|
|
['A'..'C'] = ['B', 'C', 'A'] возвращает TRUE; |
|
|
['A'..'C'] = ['A'..'D'] возвращает FALSE; |
<> |
- |
проверка на неравенство, например: |
|
|
['A'..'C'] <> ['B', 'C', 'A'] возвращает FALSE; |
|
|
['A'..'C'] <> ['A'..'D'] возвращает TRUE; |
<= |
- |
проверка принадлежности, например: |
|
|
[1..4] <= [0..21] возвращает TRUE; |
|
|
[0..21] <= [1..4] возвращает FALSE; |
>= |
- |
проверка принадлежности, например: |
|
|
[1..4] >= [0..21] возвращает FALSE; |
|
|
[0..21] >= [1..4] возвращает TRUE; |
in |
- |
проверка принадлежности символа подмножеству, например: |
|
|
20 in X1 возвращает TRUE; |
|
|
'D' in ['A'..'C'] возвращает FALSE. |
Используя рассмотренные операции, можно записывать выражения. Установлен следующий порядок выполнения операций по убыванию приоритетов:
*, +, -, in, =, <>, <=, >=.
Рассмотрим пример выражения:
C1 in (['A'..'D']+['I'..'N']) * ['B', C2, 'M']
Значение этого выражения зависит от значений переменных C1, C2 типа Char:
для C1 = 'B' выражение всегда возвращает TRUE; для C1 = 'A' выражение возвращает FALSE, если C2 <> 'A' и TRUE , если C2 = 'A'.
Заметим, что выражение
C1 in ['A'..'Z'] эквивалентно выражению ( C1 >= 'A' ) and ( C1 <= 'Z' ).