Множества Определение и создание множеств. Множество – структурированный тип данных, представляющий собой набор взаимосвязанных по какому-либо признаку или группе признаков объектов, которые можно рассматривать как единое целое. Каждый объект в множестве называется элементом множества. Все элементы множества должны принадлежать одному из скалярных типов, кроме вещественного. Этот тип называют базовым типом множества. Базовый тип задается диапазоном (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.