Ответы на экзаменационные вопросы № 1-34 по дисциплине "Программирование" (Средства модульного программирования в системе Турбо-Паскаль. ООП. Объекты в динамической памяти), страница 6

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

Для множеств определены следующие операции.

+                     объединение множеств;

-  разность множеств;

*                      пересечение множеств;

=                     проверка эквивалентности двух множеств;

<>       проверка неэквивалентности двух множеств;

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

>=       проверка, является ли правое множество подмножеством левого;

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.