Применение множеств.
1-й Случай: Множества используют для того, чтобы исключить большое количество последовательных проверок.
ПРИМЕР. При вводе символа с клавиатуры надо определить, является ли текущий символ символом английского алфавита. Без использования множеств это можно сделать тремя путями:
3 путь: case c of ‘a’..’z’, ;A’..’Z’: <с - буква> ………… |
26 проверок |
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.
Элементы множества будут распечатаны в том порядке, в котором “пробегает” свои значения переменная к.
Дата добавления: 2016-05-28; просмотров: 2249;