Множества

Lazarus IDE: Основы программирования в Windows Lazarus IDE: Основы программирования в Windows

Несмотря на то, что всё потихоньку уходит в сеть, программирование для настольных компьютеров остаётся востребованным. И будет таковым ещё долго. Ну а самая распространённая операционная система для настольных компьютеров – это по-прежнему Windows. Поэтому любой программист, даже если он собирается стать веб-разработчиком, должен знать хотя бы основы создания программ для Windows. Подробнее...

Множество есть совокупность различных элементов, мыслимая как единое целое (Бертран Рассел). Согласно Википедии множество принимается за одно из исходных понятий, поэтому у него нет определения.

Однако мы должны с вами понимать, что это такое. Примером множества может служить алфавит - множество букв. То есть множество М - это некое количество определённых предметов. Эти предметы называются элементами множества М.

Если хотите знать больше о множествах, то вспоминайте математику. Или хотя бы прочитайте соответствующую статью в Википедии. Как я уже говорил, основы математики я объяснять не буду. И здесь буду рассказывать только о том, как работать с множествами в Паскале.

Может показаться, что множество похоже на массив, однако это не так, потому что принципы работы с множествами отличаются от принципов работы с массивами.

Когда я только изучал программирование, я никак не мог понять, зачем нужны множества в программировании. Вроде бы и без них можно обойтись. Однако со временем понял, что нужны. Так как в некоторых случаях работать с множествами проще и удобнее, чем с другими типами данных.

Итак, в общем случае множество в Паскале объявляется так:

ИмяМножества = set of ТипЭлементов;

Здесь ИмяМножества - это идентификатор переменной, с которой связано данное множество. ТипЭлементов - это тип элементов множества. Тип элементов множества может быть любым порядковым типом данных в диапазоне 0...255. Множество в Паскале не может содержать более 255 элементов. Пример:

type TMyChar = set of Char;
type TSeasons = (Winter, Spring, Summer, Autumn);

var Season : set of TSeasons;
    chm     : TMyChar;

нечто подобное вы уже видели, если изучали перечисления.

Множеству можно присваивать значения. Например:

Season := [Winter, Spring, Summer];

После этого действия в переменной Season будет храниться множество из трёх элементов, хотя тип TSeasons позволяет хранить четыре элемента.


Операторы для работы с множествами

Надеюсь, что из школьного курса математики вы помните, какие операции можно выполнять с множествами. Для этих операций в Паскале используются следующие операторы:

Таблица 23.1. Операции с множествами.

Оператор Операция
+ Объединение множеств
- Разность (дополнение)
* Пересечение
>< Симметрическая разность
<= Содержит
include Включить элемент
exclude Исключить элемент
in Проверить, есть ли элемент в множестве

А теперь примеры.

type TMyChar = set of Char;
type TSeasons = (Winter, Spring, Summer, Autumn);

var Season  : set of TSeasons;
    M1, M2  : set of TSeasons;
    chm     : TMyChar;  

begin
  M1 := [Winter, Spring];
  M2 := [Summer, Autumn];
  if Summer in M1 then WriteLn('Лето будет жарким')
  else WriteLn('Лета не будет');
end.

Этот код выведет на экран строку “Лета не будет”, так как значения Summer нет в множестве М1. То есть выражение

Summer in M1

является ложным.

Теперь попробуем объединить множества М1 и М2 и записать результат в М1:

M1 := M1 + M2;  //Объединяем множества
if Summer in M1 then WriteLn('Лето будет жарким')
else WriteLn('Лета не будет');

Теперь будет выведена строка “Лето будет жарким”. Потому что после объединения множеств в переменной М1 содержатся все четыре элемента типа TSeasons (в том числе и Summer).

Ещё пример

chm := ['a'..'z'];
  if 'x' in chm then
    WriteLn('Символ х есть в множестве')
  else
    WriteLn('Символа х нет в множестве');
  chm := chm - ['x'];   //Удаляем символ х из множества
  if 'x' in chm then
    WriteLn('Символ х есть в множестве')
  else
    WriteLn('Символа х нет в множестве');
  Include(chm, 'x');  //Добавляем символ х в множество
  if 'x' in chm then
    WriteLn('Символ х есть в множестве')
  else
    WriteLn('Символа х нет в множестве');
  Exclude(chm, 'x');  //Удаляем символ х из множества
  if 'x' in chm then
    WriteLn('Символ х есть в множестве')
  else
    WriteLn('Символа х нет в множестве');

Как видите, удалить элемент из множества можно как минимум двумя способами. Добавить тоже.


Как перебрать все элементы множества

Это приходится делать редко. Однако такая необходимость может возникнуть. Перебрать элементы множества можно в цикле, например, так:

i       : TSeasons;

for i := Low(Tseasons) to High(TSeasons) do
    Write(i, ' ');


Пересечение множеств

Пересечение множеств - это набор элементов, общих для двух и более множеств. Например, у нас есть два множества:

M1 = [Winter, Spring, Summer]

и

M2 := [Summer, Autumn]

У этих множеств есть один общий элемент - Summer. Результатом операции пересечения множеств М1 и М2 будет именно этот элемент. Ниже приведён код программы, который позволяет на практике проверить это утверждение.

M1 := [Winter, Spring, Summer];
M2 := [Summer, Autumn];
M1 := M1 * M2;      //M1 = [Summer]
for i := Low(Tseasons) to High(TSeasons) do
  if i in M1 then Write(i, ' ');

Этот код выведет на экран только одно слово - Summer.

Как я уже говорил, множества - это тема довольно сложная для новичков, особенно если вы плохо знаете математику. Так что если вы мало что поняли - не огорчайтесь. Вернётесь к этой теме, когда будет нужно.

Однако не советую откладывать эту тему в долгий ящик. Поверьте на слово, не редко использование множеств существенно упрощает работу программиста.

Остальные операции с множествами рассматривать пока не будем.


Инфо-МАСТЕР ®
Все права защищены ©
e-mail: mail@info-master.su

Яндекс.Метрика