logo
Программирование в среде Delphy / Программирование в среде Delphi

13. Работа со множествами

Множество представляет собой набор однотипных элементов, при этом ни один элемент множества не может входить в него дважды и порядок расположения элементов в множестве не имеет никакого значения. В Delphi размер множества не может превышать 256 значений, т.е. множество занимает в памяти компьютера всего 256/8=32 байта.

Множество определяется ключевым словом Set, за которым определяется тип элементов множества. Например, в разделе типов можно записать:

Type TLatChar=Set of ’A’..’z’; // Множество латинских букв

TSimv=Set of Char; // Множество любых символов

TColor=Set of (Red,Blue,Green,White,Black);

// Множество цветов перечисляемого типа

Теперь можно определить сами множества и проделать некоторые операции над ними:

Var L1,L2:TLatChar;

S1,S2:TSimv;

C1,C2:TColor;

Begin

L1:=[’A’,’B’,’C’]; // Множество из трех латинских букв

L2:=[’a’..’z’]; // Множество строчных латинских букв

S1:=[’z’,’ф’]; // Множество из двух символов

S2:=[]; // Пустое множество

C1:=[Red]; // Множество из одного значения Red

C2:=[Green]; // Множество из одного значения Green

C2:=C1+C2; // Множество уже из двух значений

Над множествами можно выполнять операции сложения «+» (объединения множеств), вычитания «-» (исключения из множества), умножения множеств «*» (пересечение множеств) и вхождения во множество «in». Кроме этого, можно использовать процедуры:

Include(S,i) – добавление элемента i во множество S,

Exclude(S,i) – исключение элемента i из множества S.

Над множествами можно выполнять операции сравнения, например:

S1=S2 будет равно True, если множества одинаковы;

S1<>S2 будет равно True, если множества различаются хоть немного;

S1>=S2 будет равно True, если S2 является подмножеством S1;

’z’ in S1 будет равно True, если элемент ’z’ принадлежит S1.

Рассмотрим пример работы со множествами. Допустим, что на форме находится компонент Memo1 и нам нужно, чтобы при нажатии на клавиатуре клавиши с латинскими буквами звучал сигнал одной частоты, с русскими буквами – другой частоты и с цифрами – третьей частоты. Для этого объявим глобальный тип множества символов и переменные этого типа в интерфейсной секции модуля Unit так:

Type Tc=Set of Char;

Var CL,CR,C0:Tc;

В обработчике события создания формы определим множества латинских, русских и цифровых символов следующим образом:

Procedure Tform1.FormCreate(Sender:TObject);

Begin

CL:=[’A’..’z’];

CR:=[’А’..’я’];

С0:=[’0’ ‘9’];

End;

Обработчик события нажатия любой клавиши для компонента Memo1 будет выглядеть так:

Procedure TForm1.Memo1KeyPress(Sender: TObject; var Key: Char);

Begin

if key in cl then windows.Beep(1000,100);

if key in cr then windows.beep(2000,100);

if key in c0 then windows.beep(4000,100);

end;

Здесь через параметр Key передается в процедуру код нажатой клавиши. Если это клавиша с латинским символом, то подается звуковой сигнал частотой 1000 Гц и длительностью 100 миллисекунд. Для русских букв этот сигнал будет с частотой 2000 Гц, а для цифр – 4000 Гц.