mnogestva

advertisement
Множества
Определение и создание множеств.
Множество – структурированный тип данных, представляющий собой набор взаимосвязанных
по какому-либо признаку или группе признаков объектов, которые можно рассматривать как единое
целое.
Каждый объект в множестве называется элементом множества.
Все элементы множества должны принадлежать одному из скалярных типов, кроме
вещественного. Этот тип называют базовым типом множества. Базовый тип задается диапазоном (1..5;
‘a’..‘f’) или перечислением (1, 2, 3, 4 ,5; ‘a’, ‘b’, ‘c’, ‘d’, ‘f’).
Набор всевозможных подмножеств, составленных из элементов базового типа – область
значений типа множество.
В выражениях на языке Паскаль значения элементов множества указываются в квадратных
скобках: [1,2,3,4], [ ‘a’, ‘b’, ‘c’], [‘a’.. ‘z’]. Если множество не имеет элементов, оно называется пустым
и обозначается [ ]. Количество элементов множества называется его мощностью.
Общий вид задания множества:
1) type
<имя типа> = set of <элемент 1, …, элемент n>;
var
<идентификатор, …> : <имя типа>;
2) множество можно задать без предварительного описания типа:
var
<идентификатор, …> : set of <элемент 1, …, элемент n>;
Пример:
type
Simply = set of ‘a’.. ‘h’;
Number = set of 1..31;
var
Pr: Simply;
{Pr – принимает значения символов латинского алфавита от ‘a’ до ‘h’}
N: Number;
{N – любое значение в диапазоне 1..31}
Letter: set of char;
{Letter – любой символ}
Season: set of (winter, spring, summer, autumn);
{множество времен года}
Количество элементов множества не должно превышать 256, соответственно номера значений базового
типа должны находиться в диапазоне 0..255. Объем памяти, занимаемый одним элементом множества,
составляет 1 бит.
Примечание:
Иногда в программах встречается запись ‘ord(str[0])’, которая означает следующее
× s a …
0
1
2
…
В нулевую позицию записывается символ, ASCII-код которого равен длине строки (какой это будет
символ зависит от длины строки).
Вместо этого удобнее использовать функцию Length(S), которая возвращает длину строки S.
Program z1;
var gl, sogl: set of char;
text: string;
i, g, s:byte;
Begin
gl:= [‘А’, ‘а’, ‘Е’, ‘е’, ‘И’, ‘и’, ‘О’, ‘о’, ‘У’, ‘у’, ‘Э’, ‘э’, ‘Ю’, ‘ю’, ‘Я’, ‘я’];
sogl:= [‘Б’.. ‘Д’, ‘б’.. ‘д’, ‘Ж’, ‘ж’, ‘З’, ‘з’, ‘К’.. ‘Н’, ‘к’.. ‘н’, ‘П’.. ‘Т’, ‘п’.. ‘т’, ‘Ф’.. ‘Щ’, ‘ф’.. ‘щ’, ‘Ъ’, ‘ъ’,
‘Ь’, ‘ь’];
write (‘Введите предложение’);
readln(text);
g:=0;
{g – количество гласных}
s:=0;
{s – количество согласных}
for i:=1 to length(text) do
begin
if text[i] in gl then g:=g+1;
if text[i] in sogl then s:=s+1;
end;
witeln(‘в предложении “ ’, text, ‘ ” ’, g, ‘гласных и’, s, ‘согласных букв’);
end.
Операции над множествами. Объединение, пересечение и разность множеств.
При работе с множествами допускается использование операций отношения «=», «<>», «>=», «<=»,
объединения, пересечения, разности множеств и операции in. Результатом выражений с применением
этих операций являются значения True или False.
1. Операция «равно» (=).
Два множества A и B считаются равными, если они состоят из одних и тех же элементов. Порядок
следования элементов в сравниваемых множествах значения не имеет.
Пример:
Значение А
[1, 2, 3, 4]
[‘a’, ‘b’, ‘c’]
[‘a’.. ‘z’]
[1.. 4]
Значение В
[1, 2, 3, 4]
[‘c’, ‘a’]
[‘z’.. ‘a’]
[1, 2, 3, 4]
Выражение
A=B
A=B
A=B
A=B
Результат
True
False
True
True
Program d1;
Var B,A: set of char;
Begin
A:=[ ];
B:=[ ];
Writeln(A=B);
End.
2. Операция «не равно» (<>).
Два множества A и B считаются не равными, если они отличаются по мощности или по значению хотя
бы одного элемента.
Пример:
Значение А
[1, 2, 3]
[‘a’.. ‘z’]
[‘c’.. ‘t’]
Значение В
[3, 1, 2, 4]
[‘b’.. ‘z’]
[‘t’.. ‘c’]
Выражение
A<>B
A<>B
A<>B
Результат
True
True
False
Program d1;
Var B,A: set of char;
Begin
A:=[ ];
B:=[ ];
Writeln(A<>B);
End.
3. Операция «больше или равно» (>=).
Данная операция используется для определения принадлежности множеств. Результат операции
Результат операции А>=B равен True, если все элементы множества В содержатся в множестве А. В
противном случае результат равен False.
Пример:
Значение А
[1, 2, 3, 4]
[‘a’.. ‘z’]
[‘z’, ‘x’, ‘c’]
Значение В
[2, 3, 4]
[‘b’.. ‘t’]
[‘c’, ‘x’]
Выражение
A>=B
A>=B
A>=B
Результат
True
True
True
Program d1;
Var B,A: set of char;
Begin
A:=[ ];
B:=[ ];
Writeln(A>=B);
End.
4. Операция «меньше или равно» (<=).
Данная операция аналогична предыдущей, но результат выражения А<=B равен True, если все
элементы множества A содержатся в множестве B. В противном случае результат равен False.
Пример:
Значение А
[1, 2, 3]
[‘d’.. ‘h’]
[‘a’, ‘v’]
Значение В
[1? 2, 3, 4]
[‘z’.. ‘a’]
[‘a’, ‘h’, ‘v’]
Выражение
A<=B
A<=B
A<=B
Результат
True
True
True
Program d1;
Var B,A: set of char;
Begin
A:=[ ];
B:=[ ];
Writeln(A<=B);
End.
5. Операция in.
Операция in используется для проверки принадлежности какого-либо значения указанному множеству.
Обычно применяется в условных операторах.
Пример:
Значение А
2
‘v’]
X1
Выражение
If A in [1,2,3] then…
If A in [‘a’.. ‘n’] then …
If A in [x0, x1, x2, x3] then …
Результат
True
True
True
Program d1;
Var B,A: set of char;
Begin
A:=[ ];
B:=[ ];
Writeln(A in B);
End.
Операция in позволяет эффективно и наглядно производить сложные проверки условий, заменяя
иногда десятки других операций.
Например,
выражение
if (a=1) or (a=2) or (a=3) or (a=4) or (a=5) or (a=6) then …
можно заменить
if a in [1..6] then …
X not in M – писать нельзя, так как 2 операции следуют друг за другом.
not (X in M) – правильная запись.
6. Операция «объединение множеств» (+).
Объединением двух множеств является третье множество, содержащее элементы обоих множеств.
A
B
Пример:
Значение А
[1, 2, 3]
[‘a’.. ‘z’]
[ ]
Значение В
[1, 4, 5]
[‘e’.. ‘z’]
[ ]
Выражение
A+B
A+B
A+B
Результат
[1, 2, 3, 4, 5]
[‘a’.. ‘z’]
[ ]
Задание №1: Написать программу нахождения объединения двух заданных множеств и вывести его на
экран.
Program d2;
uses crt;
const m=[1,2,3,5];
n=[3,7,5];
var r:set of byte;
i: byte;
begin
clrscr;
writeln;
r:=m+n;
for i:=1 to 255 do
if i in r then write(i,’ ‘);
readln;
end.
7. Операция «пересечение множеств» (*).
Пересечением двух множеств является третье множество, содержащее элементы, входящие
одновременно в оба множества.
A
B
Пример:
Значение А
[1, 2, 3]
[‘a’.. ‘z’]
[ ]
Значение В
[3, 4, 1]
[‘b’.. ‘r’]
[ ]
Выражение
A*B
A*B
A*B
Результат
[1, 3]
[‘b’.. ‘r’]
[ ]
Задание №1: Написать программу нахождения пересечения двух заданных множеств и вывести его на
экран.
Program d2;
uses crt;
const m=[1,2,3,5];
n=[3,7,5];
var r:set of byte;
i: byte;
begin
clrscr;
writeln;
r:=m*n;
for i:=1 to 255 do
if i in r then write(i,’ ‘);
readln;
end.
8. Операция «разность множеств» (-).
Разностью двух множеств является третье множество, которое содержит элементы первого множества,
не входящие во второе множество.
A
B
Пример:
Значение А
[1, 2, 3, 4]
[‘a’.. ‘z’]
[X1, X2, X3, X4]
Значение В
[3, 4, 1]
[‘d’.. ‘z’]
[X4, X1]
Выражение
A-B
A-B
A-B
Результат
[2]
[‘a’.. ‘c’]
[X2, X3]
Задание №1: Написать программу нахождения разности двух заданных множеств m-n и вывести его на
экран.
Program d2;
uses crt;
const m=[1,2,3,5];
n=[3,7,5];
var r:set of byte;
i: byte;
begin
clrscr;
writeln;
r:=m-n;
for i:=1 to 255 do
if i in r then write(i,’ ‘);
readln;
end.
Порядок старшинства операций, предназначенных для работы с множествами:
приоритет
1
2
3
Операция
*
+, in, =, <>, <=, <, >=, >
Упражнение №1.
Даны три множества D1, D2, D3. Изобразить на диаграммах Винера (Кругами)
1) D1+D2+D3;
2) D1+D2-D3;
3) (D1+D2)*D3;
4) D1+D2*D3.
Упражнение №2.
Дано множество целых чисел от 1 до 100. Сформировать новое множество и вывести его на монитор.
Все числа нового множества должны без остатка делиться на 2.
Program d3;
const n=100;
type mn = set of 1..n;
var n1:mn;
i,k:integer;
begin
n1:=[ ];
for i:=1 to n do
if i mod 2=0 then n1:=n1+[i];
writeln(‘числа, кратные двум:’);
for i:=1 to n do
if i in n1 then write (i:4);
readln;
end.
Упражнение №3.
Составить программу выделения из множества целых чисел от 1 до 30 следующих множеств:
- множества чисел, кратных 3;
- множества чисел, кратных 6;
- множества чисел, кратных 2 или 3;
- множества чисел не больше 10;
- множества чисел не кратных 3 и 6.
Упражнение №4.
Составить программу поиска простых чисел в числовом промежутке [1..n]. Число n вводится с
клавиатуры.
Простым называется число, которое не имеет других делителей, кроме единицы и самого этого числа.
Для решения этой задачи воспользуемся методом «решета Эратосфена», идея которого заключается в
следующем: сформируем множество М, в которое поместим все числа заданного промежутка. Затем
последовательно будем удалять из него элементы, кратные 2, 3, 4 и так далее, до [n/2] (целая часть
числа), кроме самих этих чисел. После такого просеивания в множестве М останутся только простые
числа.
Program d4;
uses crt;
var m: set of byte;
i,k,n: integer;
begin
clrscr;
writeln (‘vvedite razmer promegutka (do 255)’);
readln(n);
m:=[2..n];
for k:=2 to n div 2 do
for i:=2 to n do
if (i mod k =0) and (i<>k) then m:=m-[i];
for i:=1 to n do
if i in m then wite(i:5);
readln;
end.
Задание №1.
Написать программу, которая напечатает все символы из данного текста, которые встречаются в этом
тексте не более одного раза.
* Задание №2.
Дан текст на русском языке. Написать программу, которая напечатает в алфавитном порядке все
строчные согласные буквы, входящие в этот текст (по 1 разу).
Упражнение №5.
Опишите базовый перечисляемый тип NAMES, содержащий всевозможные имена (ограничьтесь 20-ю).
Напишите программу, выполняющую следующее:
1. задание множеств друзей Dody и друзей Dolly;
2. нахождение множества друзей Dody и Dolly с одинаковыми именами;
3. выполнение вывода данного множества на экран.
Program d5;
uses crt;
type names = (Mike, Jolly, Ted, Dody, Jane, Molly, Raf, Rita, Nike, Lola, Winston, John);
d = set of names;
var i:names;
l:d;
const
dd: d = [Mike, Ted, Rita, Lola];
ln: d = [Mike, Ted, Jane, Rita, Lola, Winston];
begin
clrscr;
l:=ln*dd;
writeln(‘Общие друзья:’);
for i:=Mike to John do
if i in l then
case i of
Mike: writeln(‘Mike’);
Jolly: writeln(‘Jolly’);
Ted: writeln(‘Ted’);
Dody: writeln(‘Dody’);
Jane: writeln(‘Jane’);
Molly: writeln(‘Molly’);
Raf: writeln(‘Raf’);
Rita: writeln(‘Rita’);
Nike: writeln(‘Nike’);
Lola: writeln(‘Lola’);
Winston: writeln(‘Winston’);
John: writeln(‘John’);
end; {case}
readln;
end.
Download