РАЗДЕЛ 4. МНОЖЕСТВА
4.1. Общие сведения
Множественный тип (тип Set) соответствует понятию множества в математике.
В Паскале допускаются только конечные множества. Максимальное количество элементов в множестве – 256. Все элементы множества должны быть значениями одного типа. Тип элементов множества называется базовым типом множества.
Базовым типом множества может быть любой скалярный тип, за исключением вещественных типов. Целочисленные типы в качестве базового типа могут использоваться только в виде диапазона 0 .. 255 или его поддиапазонов.
Данные типа Set хранятся в памяти в унитарном коде и могут занимать от одного до 32-х байтов. Объем памяти, занимаемый одним элементом множества, равен одному биту. Каждому элементу во множестве жестко соответствует свой номер бита.
Пример 4.1.
Пусть множество может содержать набор элементов 0..7, а его конкретное значение равно множеству элементов 0, 3, 4. В памяти компьютера оно будет представлено в виде, который иллюстрирует таблица 4.1.
Таблица 4.1 – Представление множества в памяти компьютера
0-й бит |
1-й бит |
2-й бит |
3-й бит |
4-й бит |
5-й бит |
6-й бит |
7-й бит |
|
|
|
|
|
|
|
|
1 |
0 |
0 |
1 |
1 |
0 |
0 |
0 |
|
|
|
|
|
|
|
|
Таким образом, элементу 0 соответствует 0-й бит поля памяти, занимаемого множеством, элементу 1 – 1-й бит и т.д. Если в значении множества элемент присутствует, то соответствующий бит устанавливается в единицу, в противном случае – в ноль.
69
4.2. Конструктор множества
Значением переменной множественного типа является множество. Конкретные значения множественного типа задаются с помощью конструктора множества. Его синтаксис определяет рисунок 4.1.
<Конструктор_множества> ::=
[ <Выражение> ]
.. <Выражение>
,
Рисунок 4.1 – Синтаксическая диаграмма конструктора множества
Как следует из синтаксической диаграммы, конструктор множества – это список разделенных запятой выражений или диапазонов, заключенный в квадратные скобки. При указании диапазона все значения из диапазона входят в результирующее множество. Все значения из списка должны быть одинакового типа – любого скалярного, кроме вещественных. Множество не может содержать более 256 элементов.
Пример 4.2.
Примеры множеств.
[] |
– пустое множество (не содержит элементов); |
[2, 3, 5, 7, 11] |
– множество простых чисел от 2 до 11. |
[‘A’ .. ‘Z’] |
– множество латинских букв. |
[1..10, 100..110] |
– множество целых чисел от 1 до 10 и от 100 до 110. |
[Pn, Vt, Sr] |
– множество из 3-х элементов перечислимого типа. |
[X .. 5*X] |
– множество целых чисел от текущего значения X до |
значения выражения 5*X.
70
Конструктор множества – это фактически множественная константа. Порядок перечисления элементов в множестве не играет роли. Каждый
элемент учитывается только один раз.
Например, множества [1, 2, 3] и [1, 3, 2] – это одно и тоже множество.
4.3. Задание множественного типа
При задании множественного типа необходимо задать базовый тип. В совокупность значений множественного типа входят все возможные множества, являющиеся произвольными комбинациями значений базового типа.
Синтаксис задания множественного типа имеет вид, который представляет рисунок 4.2.
<Тип_Set>::=
Set Of <Базовый_скалярный_тип>
Рисунок 4.2 – Синтаксическая диаграмма задания множественного типа
Как уже отмечалось, <Базовый_скалярный_тип> - это любой перенумерованный тип, значения которого попадают в диапазон 0 .. 255.
Например:
Set Of 1..3 – значениями этого множественного типа могут быть множества [], [1], [2], [3], [1, 2], [1, 3], [2, 3], [1, 2, 3].
Set Of Boolean – значениями этого множественного типа могут быть множества [True], [False], [True, False], [].
В качестве базового типа может быть использовано имя типа или задание
типа.
Задание типа Set аналогично представлению множества с помощью массива:
Array [<Базовый_скалярный_тип>] Of Boolean.
Обработка таких массивов в Паскале неэффективна, поэтому используется тип Set.
71
Пример 4.3.
Объявление множественного типа.
Type
Ned = (Pn, Vt, Sr, Ch, Pt, Sb, Vs);
Denned = Set Of Ned; |
{Используется имя базового типа} |
Log = Set Of Boolean; |
{Используется имя базового типа} |
Var |
|
Den: Denned; |
|
L1, L: Log; |
|
I1, I2, I: Set Of 1..10; |
{Используется задание базового типа} |
B:Boolean;
Вданном примере Den, L1, L, I1, I2, I – это множественные переменные (переменные-множества).
Для присваивания значений множественным переменным используются множественные выражения.
Множественное выражение – это выражение, значением которого является множество. Частным случаем множественных выражений являются множественные переменные и конструкторы множества.
Пример 4.4.
Использование множественных выражений. Для переменных, объявленных в примере 4.3, можно записать:
L1 := [True];
L := L1; {Значение L1 к этому моменту должно быть определено}
I := [1, 3, 5];
Den := [Sub, Vos];
4.4. Операции над множествами
Над множествами определены операции, которые представляет таблица
4.2.
72
Таблица 4.2 – Операции над множествами
Операция |
Описание операции |
Тип результата |
|
|
|
|
|
= |
Равно |
|
|
|
|
|
|
<> |
Не равно |
|
|
|
|
|
|
<= |
Результат операции равен True, если левое |
|
|
множество является подмножеством правого |
Boolean |
||
|
|||
>= |
Результат операции равен True, если правое |
|
|
множество является подмножеством левого |
|
||
|
|
||
|
Результат операции равен True, если некоторое |
|
|
In |
скалярное значение (левый операнд) является |
|
|
|
элементом множества (правый операнд) |
|
|
Not *) |
Дополнение множества (одноместная операция) |
|
|
+ |
Объединение множеств |
|
|
|
|
|
|
* |
Пересечение множеств |
Set |
|
|
|
|
|
– |
Разность множеств A – B = A * Not B |
|
|
|
|
|
|
Xor *) |
Исключающее объединение множеств |
|
|
|
A Xor B = A + B – A * B |
|
Здесь *) – операции, определенные не во всех версиях языка Паскаль.
Над множественными переменными определена одна встроенная функция – Sizeof(X), указывающая количество байт для представления значения X множественной переменной.
Операция In представляет собой операцию проверки вхождения элемента в множество. Левый операнд должен принадлежать базовому типу, правый операнд – множественному типу, построенному на основе этого базового типа.
Пример 4.5.
Операции над множествами. Пусть имеются объявления, приведенные в примере 4.3.
I := [1, 3, 5]; |
|
B := 2 In I |
{в B значение False} |
B := [3, 5]<=I |
{в B значение True} |
B := [4, 5]<=I |
{в B значение False} |
73
I := Not I |
{в I значение [2, 4, 6..10] – дополнение множества} |
В двухместных операциях оба операнда должны принадлежать одному и тому же множественному типу значений.
Объединение множеств (I2 := I + I1) – это множество, состоящее из элементов, входящих хотя бы в одно из исходных множеств I и I1. Объединение множеств иллюстрирует рисунок 4.3.
Рисунок 4.3 – Объединение множеств
Пересечение множеств (I2 := I * I1) – это множество, состоящее из элементов, входящих в оба исходных множества I и I1. Пересечение множеств иллюстрирует рисунок 4.4.
Рисунок 4.4 – Пересечение множеств
Разность множеств (I2 := I – I1) – это множество, состоящее из элементов множества I, не входящих в множество I1. Разность множеств иллюстрирует рисунок 4.5.
74
Рисунок 4.5 – Разность множеств
Пример 4.6.
Операции над множествами. Пусть имеются объявления, приведенные в примере 4.3.
I1 |
:= [1, 2, 3]; |
|
|
I := [1, 3, 5]; |
|
|
|
I2 |
:= I1 + I; |
{в I2 |
значение [1, 2, 3, 5]} |
I2 |
:= I1*I; |
{в I2 |
значение [1, 3]} |
I2 |
:= I – I1; |
{в I2 |
значение [5]} |
|
|
|
|
Выражения, |
приведенные |
в примере 4.6, представляют собой |
множественные выражения.
Старшинство операций в множественных выражениях аналогично старшинству в арифметических выражениях: вначале вычисляются выражения в скобках, затем операция *, после этого операции + и – в порядке их следования слева направо.
Например, результатом вычисления множественного выражения
[1, 2, 5, 6, 7] * [2 .. 6] + [3, 9]
является множество
[2, 3, 5, 6, 9].
75
Пример 4.7.
Использование множественного типа. Подсчитать общее количество букв X, Y, Z в исходном тексте, оканчивающемся точкой.
Program Mno; Var
Kol: Integer; B: Char;
Begin
Kol := 0;
Read (B); {Чтение первой буквы текста}
While B<>’.’ Do Begin
If B In [‘X’, ‘Y’, ‘Z’] Then {Если значение буквы входит в множество [‘X’, ‘Y’, ‘Z’]}
Kol := Kol + 1;
Read (B); {Чтение очередной буквы текста}
End; Writeln (Kol);
End.
4.5.Ввод / вывод значения множественной переменной
Для ввода значения множественной переменной используется операция объединения множеств.
Пример 4.8.
Ввод значения переменной типа множества больших латинских букв из входного файла. Признак окончания ввода множества – точка.
Var
B: Char;
Mn: Set Of ‘A’..‘Z’; {Тип элементов вводимого множества}
Begin |
|
Mn := []; |
{Начальное значение множества – пустое множество} |
Repeat |
|
Read (B); |
{Чтение очередного элемента множества} |
76
Mn := Mn + [B] {Объединение множеств} Until B = ’.’; {‘.’ – признак конца текста}
...
Во входном файле необходимо подряд записать все значения, составляющие значение данной множественной переменной.
Если очередное значение переменной B не относится к базовому типу множества, то оно в множество Mn не занесется.
Для вывода значения множественной переменной используется операция проверки вхождения элемента в множество.
Пример 4.9.
Продолжение примера 4.8. Вывод значения переменной типа множества латинских букв.
For B := ’A’ To ‘Z’ Do {Организация цикла по базовому типу множества} If B In Mn Then {Анализ вхождения очередного значения базового
типа в значение множественной переменной}
Write (B: 5);
…
4.6.Типизованные константымножества
Типизованная константа-множество представляет собой, с точки зрения синтаксиса, конструктор множества, то есть значение множественной величины.
Синтаксис константы-множества определяет рисунок 4.6. Синтаксическая диаграмма <Константы_элемент> (см. рисунок 4.6) имеет
вид, который иллюстрирует рисунок 4.7.
Таким образом, <Константа_элемент> представляет собой значения или диапазоны значений базового типа множества.
Константа-множество может использоваться как инициированная переменная типа множество.
77
<Константа_множество>::=
[ ] <Константа_элемент>
,
Рисунок 4.6 – Синтаксическая диаграмма константы-множества
<Константа_элемент>::=
<Константа>
.. <Константа>
Рисунок 4.7 – Синтаксическая диаграмма константы-элемента
Пример 4.10.
Объявление типизованной константы-множества.
Const
Dig: Set Of 0..9 = [1, 3, 5];
Dig1: Set Of 0..9 = [];
Ch: Set Of ‘A’..‘Z’ = [‘A’..‘E’, ‘I’, ‘P’, ‘T’];
78