Тип данных set - множество.
В математике часто приходится решать различные задачи с подмножествами некоторого фиксированного множества объектов – учеников класса, букв, чисел, кроликов, домов и т.д. В языке Паскаль для задач подобного рода предусмотрен специальный тип данных - set. Значения переменных этого типа - всевозможные подмножества некоторого базового множества элементов.
Формат описания в разделе var
<имя>:set of <базовое множество>;
Где <имя> – произвольное имя переменной, <базовое множество> перечисляет элементы, которые могут быть включены в множество <имя>.
Примеры объявления переменных типа set и типизированных констант, которые в программе можно использовать так же, как переменные:
Var
a,b:set of char;
d:set of 'A'..'Z'
C:set of 0..9;
E:set of byte;
Const
Alph=['A'..'Z','a'..'z'];
Digits=[0..9];
В разделе объявления переменных после слова of следует указание базового типа - из каких элементов может состоять подмножество. В частности, переменная a может содержать подмножество любых символов, с - любых цифр, d - любые заглавные буквы латинского алфавита, E - любые числа от 0 до 255 и т. д.
В программе переменной - множеству можно присвоить какое - нибудь значение (подмножество), при этом элементы подмножества следует записать по правилам записи констант через запятую, поместив их в квадратные скобки. Вообще в Паскале все подмножества заключаются в квадратные скобки.
Над множествами определены операции '+' (объединение), '-' (исключение), '*'(пересечение).
В логических выражениях можно использовать операции отношения: '<=','>='("'меньшее" - подмножество "большего"), '=', '<>'. '[]' обозначает пустое множество.
Например:
a:=['a'..'d','g','z']; {A: ‘a’,’b’,’c’,’d’,’g’,’z’}
a:=a+['h']; {A: ‘a’,’b’,’c’,’d’,’g’,’z’,’h’}
ch:='j'; {ch имеет тип char}
a:=a+[ch]; {A: ‘a’,’b’,’c’,’d’,’g’,’z’,’h’,’j’}
b:=a*['a','e','f']; {B: ‘a’}
Если необходимо включить в множество один элемент, то вместо операции ‘+’, рекомендуется использовать процедуру Include. Вторую строчку в примере можно переписать так
include(a,’h’);
Аналогично если необходимо исключить из множество один элемент, то вместо операции ‘-’, рекомендуется использовать процедуру exclude, например
exclude(a,’h’);
Можно проверить, принадлежит ли элемент множеству при помощи операции in. Например
if ‘a’ in A then writeln(‘символ а принадлежит множеству A’)
else writeln(‘символ а не принадлежит множеству A’)
Для того, чтобы вывести на экран все элементы, принадлежащие множеству, необходим цикл вида.
For ch:=chr(0) to chr(255) do
if ch in A then writeln(ch);
В данном случае ch – переменная символьного типа, A – set of char.
Пример решения задачи.
Прочитать с клавиатуры 2 строки и вывести на экран все цифры, которые встречаются в каждой из строк, причем ровно по одному разу.
Решение. Сначала удобно найти вообще все такие символы, а затем вывести на экран только цифры. В тексте программы (см. ниже) множество first содержит символы строки, которые встретились в ней ровно один раз, а множество second – символы, которые встретились не менее, чем два раза. Множество x содержит все символы строк, удовлетворяющие заданному условию.
var
ch:char;
i:integer;
s:string;
first,second,x:set of char;
begin
readln(s); first:=[]; second:=[];
for i:=1 to length(s) do
if s[i] in first then include(second,s[i])
else include(first,s[i]);
x:=first-second;
readln(s); first:=[]; second:=[];
for i:=1 to length(s) do
if s[i] in first then include(second,s[i])
else include(first,s[i]);
x:=x*(first-second);
for ch:='0' to '9' do
if ch in x then write(ch);
end.
Задачи:
Задача . Какие символы присутствуют в обеих заданных строках?
Задача . Какие цифры присутствуют в обеих заданных строках?
Задача . В строке через пробел записаны двузначные числа. Сколько различных двузначных чисел записано в строке?
Задача . Какие символы латинского алфавита присутствуют в первой из заданных строк строк и отсутствуют во второй и третьей?
Задача . Какие простые числа, лежащие в интервале 0..200, присутствуют в текстовом файле?
Задача . Задана текстовая строка. Какие символы встречаются в каждом слове?
Задача . Задан массив, содержащий целые числа из интервала 0..100. Какие числа встречаются в массиве лишь один раз?
Задача . Вывести наименьшее число (больше 1) такое, что в его записи и в записи его квадрата используются одни и те же цифры.
Задача . *Решить ребус МУХА+МУХА=СЛОН, в котором различные буквы соответствуют различным цифрам.
Задача . *Реализовать хранение подмножеств тридцати двух элементов в переменной типа WORD. Реализовать операции сложения, вычитания, умножения, отношений наиболее простым из возможных способов при помощи подпрограмм.
Задача . ***Дана головоломка вида: X+Y=Z, где X, Y, Z, - строки из произвольного числа заглавных латинских букв и цифр (длины строк могут быть разными). Одинаковым буквам соответствуют одинаковые цифры, разным - разные.
ЗАДАНИЕ: Написать программу, решающую головоломку.
ТЕХНИЧЕСКИЕ ТРЕБОВАНИЯ:
1. Вводится с клавиатуры строка из трех слов, разделенных пробелами.
2. Выводится на экран одно из решений в виде головоломки с подставленными в нее числами.
3. При отсутствии решений выводится сообщение "Решений нет".
ПРИМЕР: После ввода строки "ABC AEEE АAВС" программа выводит на экран
строку "149 + 1000 = 1149".
Вопросы:
-
Сколько байт занимает set of char? Set of 0..9?
-
Как хранится множество в ОЗУ?
-
Каковы два основных недостатка типа set?