В операциях над множествами могут участвовать переменные типа-множество, константы и конструкторы множеств.
Для множеств определены следующие операции.
+ объединение множеств;
- разность множеств;
* пересечение множеств;
= проверка эквивалентности двух множеств;
<> проверка неэквивалентности двух множеств;
<= проверка, является ли левое множество подмножеством правого;
>= проверка, является ли правое множество подмножеством левого;
in проверка принадлежности элемента множеству.
Результатом операций объединения, разности и пересечения является множество.
Результатом операций проверки эквивалентности и вхождения будет значение логического типа.
Некоторые важные замечания.
Элементы множества неупорядочены, т.е нельзя определить номер элемента в данном множестве, можно лишь ответить на вопрос, принадлежит ли он этому множеству. С точки зрения Паскаля множества [1, 2, 3] и [3, 1, 2] - эквивалентны.
Переменная типа множество - содержит все множество целиком. К отдельным элементам множества доступа нет (поскольку они не пронумерованы).
При формировании множества средствами программы нельзя ввести элемент множества с клавиатуры (подобно тому, как это делается с данными других типов), однако можно добавить некоторое значение к имеющемуся множеству с помощью операции объединения.
Значение переменной типа множество не может быть выведено на экран процедурой write. Для вывода множества на экран используется специальный алгоритм, который будет рассмотрен ниже.
Несмотря на перечисленные особенности (а во многом и благодаря им) использование этого типа в некоторых алгоритмах значительно упрощает программу.
Использование множеств в программах.
Рассмотрим основные алгоритмы для работы с множествами. Для этого в качестве примера определим множество целых чисел в диапазоне от 1 до 10. Объявим типы и переменные:
program sets;
type number=1..10;
chisla=set of number;
var a,b,c,d,e:chisla;
Формирование множества с клавиатуры.
procedure vvod(var x:chisla; n:integer);
var i: byte; xc: number;
begin
x:=[];
for i:=1 to n do
begin
readln(xc);
x:=x+[xc]
end;
end;
Суть следующих двух алгоритмов сводится к тому, чтобы организовать просмотр элементов множества. Если множество задано на основе некоторого диапазона, то с помощью цикла организуется проход всех элементов диапазона. Для каждого элемента диапазона проверяется принадлежность его множеству.
Вывод множества на экран.
procedure wrtln(x:chisla);
var xc:number;
begin
for xc:=1 to 10 do
if xc in x then write(xc,' ');
writeln
end;
Подсчет количества элементов множества (мощность множества).
function card(x:chisla):integer;
var c: integer; xc: number;
begin
c:=0;
for xc:=1 to 10 do
if xc in x then c:=c+1;
card:=c;
end;
Операции над множествами.
begin
a:=[1,2,3]; write('card=',card(a)); write('a='); wrtln(a);
b:=[2,5,7,10]; write('card=',card(b)); write('b='); wrtln(b);
c:=[1,7,10]; write('card=',card(c)); write('c='); wrtln(c);
d:=a+b; write('card=',card(d)); write('d='); wrtln(d);
e:=a*b; write('card=',card(e)); write('e='); wrtln(e);
b:=b-c*(d+e); write('card=',card(b)); write('b='); wrtln(b)
end.
Пример 1 задачи на массивы, красиво решаемой с использованием множеств.
Дан массив из N целых чисел в диапазоне от 5 до 12 (числа могут повторяться). Исключить из массива повторяющиеся элементы (сжать массив) и отсортировать его по убыванию.
program mas_set;
const n=10;
type diap=0..12;
mas=array[1..n] of diap;
set_mas=set of diap;
var m:mas; d:diap; s:set_mas; i,k: integer;
begin
for i:= 1 to n do
begin
m[i]:=5+random(12-5+1);
write(m[i],' ')
end;
writeln;
writeln('получили множество: ');
s:=[];
for i:=1 to n do
begin
s:=s+[m[i]];
write(m[i],' ')
end;
writeln;
writeln('получили массив: ');
k:=0;
for d:=12 downto 5 do
if d in s then
begin
k:=k+1;
m[k]:=d;
writeln('m[',k,']=',m[k]);
end;
for i:=k+1 to n do m[i]:=0;
for i:=1 to n do write(m[i],' ');
writeln
end.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.