ОПЕРАЦИИ НАД МНОЖЕСТВАМИ
К множественным величинам применимы операции отношения: тождественность (=), нетождественность (<>), содержится в (<=), содержит (>=). Результат выполнения этих операций имеет логический тип, например true или false.
При работе с множествами допускается использование операций объединения(+), пересечения(*) и разности(-) и операции in
Операция "равно" (=). Два множества А и В считаются равными, если они состоят из одних и тех же элементов. Порядок следования элементов в сравниваемых множествах значения не имеет.
Например:
Значение А | Значение В | Выражение | Результат |
[1,2,3] ['a','b','c'] ['a'..'z' | [1,2,3] ['c','a'] ['z'..'a'] | A=B A=B A=B | true false true |
Операция "не равно" (<>).Два множества А и В считаются не равными, если они отличаются по мощности или по значению хотя бы одного элемента.
Например:
Значение А | Значение В | Выражение | Результат |
[1,2,3] ['a',..,'z'] ['a'..'z' | [1,2,3,4] ['b','x'] ['z'..'a'] | A<>B A<>B A<>B | true true false |
Операция "больше или равно"(>=). операция "больше или равно"используется для определения принадлежности множеств. Результат операции A>= В равен true, если все элементы множества В содержатся в множестве А. противном случае результат равен false.
Например:
Значение А | Значение В | Выражение | Результат |
[1,2,3,4] ['a',..,'z'] ['a','b','z' | [1,2,3] ['b','t'] ['z'..'a'] | A>=B A>=B A>=B | true true true |
Операция "меньше или равно" (<=). Результат выражения А <= В равен True, если все элементы множества А содержатся в множестве В.
В противном случае результат равен false.
Например:
Значение А | Значение В | Выражение | Результат |
[1,2,3] ['a',..,'c'] ['a','x'] | [1,2,3,4] ['z',..,'a'] ['a','x','y'] | A<=B A<=B A<=B | true true true |
Операция in. Операция in используется для проверки принадлежности кг либо значения указанному множеству. Обычно применяется в условных операторax.
Значение А | Выражение | Результат |
'y' z1 | if a [1,2,3] then … if a in ['a','f'] then … ifain[x1,x2,y1,y2] theh | true false true |
При использовании операции in проверяемое на принадлежим значение и множество в квадратных скобках не обязательно предварительно описывать в деле описаний. Операция in позволяет эффективно и наглядно производить сложные проверки условий, заменяя иногда десятки других операций. Например, выражение
if (x=l) or (x=2) or (x=3) then...
можно заменить более коротким выражением
if x in [ 1. .3] then ...
Иногда операцию in пытаются записать с отрицанием:
X not in M.
Такая запись является ошибочной, так как две операции следуют подряд; правильная инструкция имеет вид
not (X in M) .
Объединение множеств (+). Объединением двух множеств является ретье множество, содержащее элементы обоих множеств. Няппимеп"
Например:
Значение А | Значение В | Выражение | Результат |
[1,2,3,4] ['a',..,'c'] [] | [4,5,6] ['d',..,'k'] [] | A+B A+B A+B | [1,2,3,4,5,6] ['a'..'k'] [] |
Пересечение множеств (*). Пересечением двух множеств является третье множество, которое содержит элементы, входящие одновременно в оба множества.
Например:
Значение А | Значение В | Выражение | Результат |
[1,2,3] ['a',..,'c'] [] | [1,3,4] ['b',..,'l'] [] | A*B A*B A*B | [1,3] [b] [] |
Разность множеств ( - ). Разностью двух множеств является третье множество, которое содержит элементы первого множества, не входящие во второе множество. - |
Например:
Значение А | Значение В | Выражение | Результат |
[1,2,3,4] ['a',..,'z'] [a1,a2,a3,a4] | [4,2,1] ['e',..,'z'] [a3,a4] | A-B A-B A-B | [2] ['a'..'d'] [a1,a2] |
Результат операций над двумя множествами можно наглядно представить с помощью закрашенных частей двух кругов.
Использование в программе данных множественного типа предоставляет ряд преимуществ:
упрощаются сложные операторы if,
увеличивается наглядность программы и алгоритма решения задачи,
экономятся память, время компиляции и выполнения.
Отрицательным моментом является то что в языке Pascal отсутствуют средства ввода-вывода элементов множества, поэтому программист сам должен писать соответствующие процедуры.
При использовании в программах данных множественного типа выполнение операций происходит над битовыми строками данных. Каждому значению множественного типа в памяти ЭВМ соответствует один двоичный разряд. Например, множество
['A','B','C','D']
представлено в памяти ЭВМ битовой строкой
1 1 1 1.
Подмножества этого множества представлены строками:
['A','B','D'] 1 1 0 1
['B','C'] 0 1 1 0
['D'] 0 0 0 1
Величины множественного типа не могут быть элементами списка ввода - вывода.
В языке Pascal количество элементов базового типа, на котором строится множество, ограничено и не превышает 256.
Инициализация величин множественного типа производится с помощью типизированных констант:
Const
ret: set of 'a'..'z'= [];
.
Проиллюстрируем применение данных множественного типа на примерах.
Пример .Программа описания множестви операций над ними, в которой описаны множества чисел D, Dl, D2, D3. Затем они заполнены следующим образом: множество Dl — четными числами 2,4,6,8; множество D2 — числами 0,1,2,3,5; множество D3 — нечетными числами 1,3,5,7,9. После этого над множествами выполнены операции объединения, разности и пересечения.
program Pr ; {Демонстрация операций над множествами}
Type
Digits = set of 0..9;
var
Dl, D2, D3, D : Digits;
begin
D1:=[2,4,6,8]; {Заполнение множеств}
D2:=[0..3,5];
D3:=[1,3,5,7,9];
D:=D1 + D2; {Объединение множеств Dl и D2}
D:=D -D2; {Разность множеств D и D2}
D:==D *Dl; {Пересечение множеств D и Dl}
{Вывод элементов множества}
f or i:=1 to 9 do
Begin
if i in D then write (i,' ');
End;
End.
В программе сначала описан тип Digits = set of 0..9, затем описаны переменные D1,D2,D3,D этого типа. В первой части программы осуществляется заполнение множеств, а затем над множествами выполняются операции объединения, пересечения, разности.
ПримерПрограмма заполнения множества.
Опишите множество М (1..50). Сделайте его пустым, вводя целые числа с клавиатуры. Заполните множество 10 элементами.
В разделе описания опишем множество целых чисел от 1 до 50, переменную Х целого типа будем использовать для считывания числа-кандидата в множество, целую переменную I используем для подсчета количества введенных чисел. В начале программы применим операцию инициализации множества М:= [], так как оно не имеет элементов и является пустым.
Заполнение множества элементами произведем с использованием оператора цикла for, параметр которого будет указывать порядковый номер вводимого элемента. Операцию заполнения множества запишем оператором присваивания М:=М+[Х]. Контроль заполнения множества запишем с использованием операции проверки принадлежности. Если условия Х in M выполняется, выведем сообщение о том, что число Х помещено в множество.
program Pr;
Uses WinCrt;
var
M: set of1. . 50;
x, i : integer;
Begin
M:= []; {M - пустое множество}
fori:= 1to10do
Begin
Write ('Введите ',i,' -й элемент множества:');
Readin(x);
if not (xinM) then {Если число не входит в множество М}
Begin
Writeln(x, ' помещен в множество 1..50');
М:= М+[x];
end;
End;
Writeln;
{Вывод элементов множества}
f or i:=1 to 50 do
Begin
if i in M then write (i,' ');
End;
End.
Пример . Программа и вывода на экран дисплея наборов случайных чисел для игры в "Спортлото 5 из 36". Для заполнения каждой карточки спортлото необходимо получить набор из пяти псевдослучайных чисел. К этим числам предъявляются два требования:
- числа должны находиться в диапазоне 1..36;
- числа не должны повторяться.
ProgramLotto;
UsesWinCrt;
Var
nb, k: set of 1..36;
kol, l, i, n: Integer;
Begin
Randomize;
WriteLn('Введите число наборов');
ReadLn(kol);
nb:=[1..36];
for i:=1 to kol do
Begin
k:=[];
for l:=1 to 5 do
Begin
Repeat
n:=Random(36)
until (n in nb) and not (n in k);
k:=k+[n];
Write(n:4)
End;
WriteLn
End;
End.
Пример . Программа ввода фамилии, имени отчества на русском языке.
В разделе описания переменных опишем множество Lit, включающее в себя всевозможные символы, переменную Name для хранения Ф.И.0., Ch для посимвольного ввода.
Переменная логического типа Rus будет указывать, принадлежит ли очередной вводимый символ множеству букв русского языка. Для ввода символов используется стандартная функции ReadKey чтения кода нажатой клавиши. Текст программы имеет следующий вид:
programFIORus;{Ввод Ф.И.0. только на русском языке)
uses Crt;
var
Lit : set of char;
Name : string ;
Ch : char ;
Rus : boolean;
begin
Lit:=[' ','А' .. 'п','р' .. 'я'];
Write('Введите фамилию, имя, отчество ');
repeat{Считать всю строку Name}
repeat(Считать один символ}
Ch:=ReadKey; {Считать код нажатой клавиши}
if Ch<>#13 then
Begin
Rus:=Ch in Lit;
if rus {Если символ входит в множество Lit} Then
Begin
Name:=Name+Ch;{Добавление символа к Name}
Write (Ch); {Вывод символа в строке ввода} ;
End;
else {Код клавиши не входит в множество Lit}
Begin
Writeln('Переключитесь в русский регистр');
Write('и введите Ваше имя ');
end;
end;
until Rus;{Завершить ввод символа на русском языке}
until Ch=#13; {Завершить ввод строки нажатием клавиши Enter}
Writein;
Writeln('Здравствуйте, ',Name) ;
End.
Вопросы для самопроверки
1. Тип данных множество. Элементы множества.
2. Как задается множественный тип данных.
3. Что такое пустое множество и как оно обозначается?
4. Какие операции допустимы над множествами?
6. Какие множества считаются равными, неравными?
7. Для чего применяются операции отношения ">=", "<=".
8. Для чего применяется операция in? Особенности ее применения.
9. Что называется объединением, пересечением и разностью множеств?
Дата добавления: 2015-01-13; просмотров: 2730;