Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Praktikum_po_programmirovaniyu.doc
Скачиваний:
23
Добавлен:
09.12.2018
Размер:
2.5 Mб
Скачать

4.3. Множества

Множество – это структурированный тип данных, представляющий набор взаимосвязанных по какому-либо признаку или группе признаков объектов, который можно рассматривать как единое целое.

Значения множественного типа строятся так же, как и массивы, из значений одного базового типа. В качестве базового типа множества используются дискретные типы не более чем с 256 различными значениями. Этим ограничениям удовлетворяют типы byte и char, а также перечисленные и ограниченные типы, образованные из них.

Под переменную типа множество отводится 256 бит. Контроль выхода за пределы диапазона осуществляется с помощью директивы компилятора {$R+}

Множество определяется двоичным вектором, в котором - й бит равен 1, если - является элементом множества. Главное преимущество такой реализации является то, что проверка принадлежности элемента множеству, включение элемента в множество и удаление элемента из множества можно выполнять за фиксированное время (независимо от размера множества) путем прямой адресации к соответствующему биту. Однако реализация операций сложения, умножения множеств и нахождение относительной разности множеств выполняются за время, пропорциональное размеру универсального множества.

Множества могут быть описаны такими способами:

1. type

c = (a, b, d);

p = set of c;

var

k: p; {Переменная типа множество}

2. type

c = set of (f, d, h);

var

65

k: c;

3. var k: set of (s,t,e);

4. var k: set of char;

5. type c =set of 0..100;

p = set of char;

var d: c;

k: p;

Множества задаются с помощью операторов присваивания:

k: = [ ]; {Задание пустого множества}

k: = [4,6,9];

k: = [‘a’...’z’, ‘0’.. ‘9’, ‘ ’]

В качестве элементов в изображении множества допускаются выражения, тип которых должен совпадать с базовым типом множества:

var k: set of byte;

x, y: byte;

begin

x: =1;

y: = 12;

k: = [x..x+10, 0, y-1, y+1];

end.

Для обработки множеств используются следующие операции:

1. Теоретико-множественное объединение, пересечение и вычитание.

2. Проверка принадлежности элемента множеству.

3. Проверка на равенство и неравенство множеств.

4. Проверка на принадлежность одного множества другому.

Объединением множеств a и b (a+b) называется множество, включающее в себя элементы множества a и множества b.

66

a b a+b

[1, 2, 3 ] [1,4,5] [1, 2, 3, 4, 5]

[‘a’..’z’] [‘e’..’z’] [‘a’..’z’]

[ ] [ ] [ ]

[1..10] [1..15] [1..15]

Пересечением множеств a и b (a*b) - называется множество, состоящее из элементов, принадлежащих одновременно множеству a и множеству b.

a b a*b

[1, 2, 3 ] [ 1, 4, 2, 6 ] [1, 2 ]

[1, 3, 5 ] [6, 8, ] [ ]

[‘a’..’z’] [‘b’..’r’] [‘b’..’r’]

[ ] [ ] [ ]

[1..10] [5..15] [5..10]

Разностью множеств a и b (a - b) называется множество, состоящее из элементов множества a, которые не входят во множество b.

a b a-b

[1, 2, 3, 4 ] [3, 4, 1 ] [2]

[‘a’..’z’] [‘d’..’z’] [‘a’..’c’]

[1..10] [5..15] [1..4]

Для проверки принадлежности элемента множеству используется операция in. Результатом этой операции является переменная логического типа.

Операция Результат

2 in [1, 2, 3, 4] - true

5 in [1, 2, 3, 4] - false

С помощью операции in следующий условный оператор

if (ch=’a’) or (ch=’b’) or (ch=’y’) then s;

можно заменить эквивалентным: if ch in [‘a’, ‘b’, ‘y’] then s;

Однако второй оператор является более компактным и выполняется гораздо быстрее.

67

Операция проверки непринадлежности элемента множеству задается следующей структурой:

if not (x in m) then s;

Проверка на равенство, неравенство и включение множества.

= равенство (совпадение) двух множеств;

< > неравенство множеств;

<= проверка на вхождение множества из левого операнда во множество из правого операнда;

>= проверка на вхождение множества из правого операнда в множество из левого операнда.

[1, 2, 3] = [1, 2] - false;

[1, 2, 3 ] >= [1, 2 ] - true;

[3, 5, 7 ] <= [1..10] - true;

[1, 2, 3 ] <> [1, 3] - true.

Использование множеств позволяет: упростить операцию if, повысить наглядность программ, экономить время на компиляцию и выполнение программы, уменьшает требования к памяти.

В качестве примера рассмотрим программу нахождения простых чисел в заданном ряде натуральных чисел методом решета Эратосфена. Метод состоит в последовательном удалении из исходного ряда, сначала чисел, делящихся на 2, затем на 3 и так далее до значения n. Числа, оставшиеся в ряду после этих действий, будут простыми.

Program er;

const n =256;

var

im, rm:set of 2..n; {Определение типа исходного}

{и результирующего множества}

next: byte; {Определение типа элемента,}

{включаемого в множество}

j: word;

68

begin

im: = [2..n]; {Задание исходного множества}

rm: = [ ]; {Задание начального значения }

{ результирующего множества}

next: =2;

repeat

{Если элемент next не входит в множество, то }

{переходят к следующему элементу ряда next: = next+1}

while not (next in im) do

next: = next + 1;

{В противном случае элемент next включается в}

{результирующее множество}

rm:= rm + next;

j: = next;

{Удаление из исходного ряда всех чисел, кратных next}

while j <= n do

begin

im: = im- [j];

j: =j + next;

end;

until im = [ ]; {Цикл repeat будет продолжаться}

{ до полного исчерпывания исходного}

{множества}

{Вывод множества простых чисел на экран}

for j: = 2 to n do

if j in rm then write(j:6);

end.

69

Контрольные вопросы и упражнения

1. Если в базовом типе различных значений, то сколько различных значений в построенном на его основе множественном типе?

2. Какие из следующих описаний множеств являются неверными:

3. Вычислить значения отношений:

a) ; б) ;

в) ; г) ;

д) ; е) ;

ж) ; з);

и) ; к) ;

л) ; м) .

4. Написать программу, которая подсчитывает количество элементов в множестве типа:

;

5. Вычислить значения выражений:

а) ;

б) ;

в) .

6. Дан текст из цифр и строчных латинских букв, за

70

которым следует точка. Определить, каких букв – гласных () или согласных, больше в этом тексте.

7. Дан текст, за которым следует точка. В алфавитном порядке напечатать (по одному разу) все строчные русские гласные буквы (), входящие в этот текст.

8. Подсчитать количество различных (значащих) цифр в десятичной записи натурального числа (;).

9. Напечатать в возрастающем порядке все цифры, не входящие в десятичную запись натурального числа (;).

10. Дан текст из строчных латинских букв, за которым следует точка. Напечатать:

а) первые вхождения букв в текст, сохраняя их исходный порядок;

б) все буквы, входящее в текст не менее двух раз;

в) все буквы, входящие в текст по одному разу.

11. В возрастающем порядке напечатать все целые числа из диапазона , представимые в виде , где .

12. В порядке убывания вывести на экран все целые числа из диапазона , которые представимы в виде , но не представимы в виде

13. Построить множество чисел Фибоначчи. Выделить подмножество чисел Фибоначчи, кратных заданному числу. Вывести на экран количество элементов в этом подмножестве (мощность множества) и само подмножество.

14. Из множества чисел выделить подмножество составных чисел вида , где и - простые числа.

15. Из множества чисел выделить пересечение подмножеств и разность подмножеств вида и ; ().

71

16. Из множества чисел выделить подмножество совершенных чисел, то есть чисел, равных сумме своих собственных делителей (6=3+2+1).

17. Можно ли из букв слова собрать слово . Буквы можно использовать несколько раз.

18. Не используя дополнительных переменных, поменять местами значения переменных-множеств и .

19. Разработать программу для реализации основных операций над множествами для случая, если число элементов множества превосходит 256.

20. Разработать программу, которая на основе следующих данных

type город = (a, b, c, d, f, g, h);

города: = set of город;

рейсы: = array[город] of города;

по рейсам - множество городов, в которые можно за один рейс доехать автобусом из города ) определяет - множество городов, в которые можно попасть автобусом (за один рейс или через другие города) из города .

ЗАНЯТИЕ 5. ПОДПРОГРАММЫ