Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ОАиП Лекции ч.2 ПОИТ.pdf
Скачиваний:
43
Добавлен:
24.02.2016
Размер:
1.08 Mб
Скачать

РАЗДЕЛ 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