Применение множеств

1-й Случай: Множества используют для того, чтобы исключить большое количество последовательных проверок.

ПРИМЕР. При вводе символа с клавиатуры надо определить, является ли текущий символ символом английского алфавита. Без использования множеств это можно сделать тремя путями:

3 путь: case c of ‘a’..’z’, ;A’..’Z’: <с - буква> …………
1 путь.

26 проверок
. Var

c: char;

>> begin

if (c = 'a') or (c = 'b') or ... or (c = 'z') or (c = 'A') or ... or (c = 'Z')

then <с - буква>...

2 путь

Var

c: char;

begin

if (c >= 'a') and (c <= 'z') or (c >= 'A') and (c <= 'Z')

then <с - буква>...

С использованием множеств те же самые действия можно записать следующим образом:

if c in ['a' .. 'z', 'A' .. 'Z'] then <с - буква>...

2-й случай: Множества используются для формирования неповторяющегося набора элементов.

ПРИМЕР. Заполнить массив из 5 элементов пятью случайными неповторяющимися числами из некоторого диапазона. Без использования множеств это можно сделать следующим образом:

Var

s: array [1..5] of byte; {массив для случайных чисел}

i: byte; {случайное число}

j: byte; {количество сформированных случайных чисел}

k: byte; {параметр цикла}

exist: boolean; {сл. число уже есть в массиве}

begin

{Начальное заполнение}

fillchar (s, 5, 0);

j := 0;

{инициализация датчика случайных чисел}

randomize;

На "?" нужно поставить число, которое должно быть верхней границей диапазона случайных чисел.
{цикл, пока не заполним}

repeat

i := random (?);

exist := false;

{проверка вхождения в набор}

for k := 1 to 5 do

begin

if (s [k] = i) and (i <> 0)

then exist := true;

end;

{смотрим результаты анализа}

if (exist = false) and (i <> 0)

then begin

inc (j); что будет, если это убрать?(см. ниже)

s[j] := i;

end;

until j = 5;

end.

Замечание: Random(10) возвращает целое число в диапазоне 0 <= x < 10

Если все оставить как есть, то ноль также будет включен в число элементов формируемого массива. Для его исключения необходимо добавить проверку: (i <> 0) .

проверка – случайное число уже входит в набор

С использованием множеств та же задача решается следующим образом (более кратко):

Var

a: array[1..5] of integer;

s: set of byte;

i: byte; {случайное число }

j: byte; {количество сформированных случайных чисел}

begin

{Начальное заполнение}

s := [ ];

j := 0;

fillchar(a,5*2,0);

{инициализация датчика случайных чисел}

randomize;

{цикл, пока не заполним}

repeat

i := random (?);

if (not (i in s)) and (i <> 0) {Проверка вхождения в набор}

then

begin

s := s + [i];

inc (j);

a[j]:=i;

end;

until j = 5;

end.

Видно, что с использованием множеств та же самая задача решается без использования внутреннего цикла for и без сложных дополнительных проверок.

Примечание. Как и в предыдущем случае, используется процедура inc:

inc (j); ® j := j +1.

Использование этой процедуры влияет на ситуацию выхода из цикла.

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

Идея этого способа состоит в следующем:

- вводится вспомогательная переменная , которая в цикле принимает все возможные значения базового типа множества;

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

Var

s : set of 1 .. 100;

k : 1 .. 100; {вспомогательная переменная}

begin

{формирование множества}

...

{цикл по вспомогательной переменной}

for k := 1 to 100 do

if k in s then

writeln (k,' входит в s');

end.

Элементы множества будут распечатаны в том порядке, в котором “пробегает” свои значения переменная к.