Множества
От рассмотрения простых типов данных переходим к более сложным наборам данных. Следует вспомнить, что простые типы данных позволяют хранить одно-единственное значение в одной переменной. Структуры данных позволяют хранить сразу несколько значений, причём некоторые такие структуры теоретически вообще не имеют ограничения на количество значений — этот предел определяется лишь объёмом доступной памяти. Сегодня мы поговорим о множествах.
Математическое понятие множества
Вспомним, как определяется множество в математике. Множество — это конечный или бесконечный набор определённых объектов, мыслимый как единое целое. Множество характеризуется своими элементами, а элементы имеют лишь одно свойство — принадлежность к данному множеству. Таким образом, мы можем только сказать, принадлежит элемент данному множеству или не приналдежит. Порядок расположения элементов в множестве никакой роли не играет.
Множества в Delphi
Понятие множества в языке программирования несколько отличается от математического определения этого понятия, но смысл сохраняется. Основное отличие в том, что в программировании множество может содержать только конечное число элементов, т.е. не может состоять из бесконечного числа объектов. В математике же последнее допустимо. Например, мы можем определить множество натуральных чисел, которое бесконечно: N =
Следует понимать, что множество не предназначено для хранения каких-либо значений (чисел, символов и т.д.) — оно лишь может дать нам ответ на вопрос: присутствует конкретный элемент в множестве или его там нет.
Перейдём ближе к делу. Множество может быть построено на основе перечислимого типа данных (кто забыл — открываем предыдущий урок). Например, на основе символьного типа Char. По-английски множество называется set (набор) и именно этим словом описывается в Delphi:
В данном примере мы объявили множество A на основе символьного типа Char.
Запомните: множество не может состоять более чем из 255 элементов!
Например, следующее описание:
приведёт к ошибке "Set base type out of range".
Задание множеств
В математике множество обычно записывается в виде фигурных скобок, в которых через запятую перечисляются элементы, принадлежащие множеству. В Delphi вместо фигурных скобок используются квадратные.
Чтобы задать множество, мы можем воспользоваться операцией присваивания, где слева стоит переменная-множество, а справа — нужный нам набор. Например, в описанное выше множество A мы хотим поместить элементы-символы A, B, C, D. Тогда это запишется так:
Теперь множество A содержит 4 элемента.
Если вспомнить, что тип данных Char упорядочен, то данную запись можно сократить следующим образом:
Мы просто указали диапазон значений, который должен находиться во множестве. Результаты одинаковый, но вторая запись короче и красивее. Допустимы, конечно же, комбинации диапазонов и отдельных значений:
Помните, что множество — это виртуальный набор элементов: множество нельзя ввести с клавиатуры и точно так же нельзя вывести на экран. Поэтому добавление элементов во множество делается только программным путём. Безусловно, вы каким-либо образом можете связать элементы интерфейса программы и операцию добавления элементов во множество, но напрямую ввести множество нельзя. Аналогично, вы можете показать множество на экране с помощью каких-либо элементов (например, флажков TCheckBox), но само множество "в чистом виде" вывести нельзя.
Операции над множествами
В программировании, как и в математике, над множествами допустимы некоторые операции. Рассмотрим их.
Находится ли элемент во множестве?
Самая простая операция, для понятия смысла которой даже не нужно задумываться. Чтобы проверить, входит ли элемент во множество, следует использовать специальную конструкцию с оператором in . Слева от него указывается элемент, справа — множество. Результатом, как несложно догадаться, является логичное значение — истина или ложь. True — элемент принадлежит множеству, False — не принадлежит:
Несложно проверить, что сообщение в данном случае появится на экране.
Объединение множеств
Если есть два множества, определённые на одном и том же типе данных, то их можно объединить и получить таким образом новое множество.
Если изобразить множества в виде кругов, причём круги пересекаются в том случае, если у множеств есть одинаковые элементы, то объединение можно изобразить следующим образом:
В словесном описании операция объединения — результирующее множество содержит все те элементы, которые есть хотя бы в одном из двух исходных множеств.
Объединение записывается знаком плюс " + ". Пример:
Включение одного элемента во множество делается точно таким же образом, просто в этом случае включаемое множество содержит всего один элемент.
Пересечение множеств
Операция пересечения формирует множество только из тех элементов, которые одновременное присутствуют как в первом, так и во втором исходном множестве. Операция пересечения графически:
Пересечение обозначается звёздочкой " * ". Пример:
Разность множеств
Операция вычитания удаляет из первого множества те элементы, которые есть во втором множестве:
Следует обратить внимание, что порядок множеств в данном случае важен, т.е. X-Y и Y-X — это разные множества.
Применение множеств
Множества находят широкое применение. С помощью множеств удобно задавать набор опций, каждая из которых либо включена, либо выключена. К примеру, поместите на форму кнопку (TButton), перейдите в инспектор объектов, разверните свойство Font (шрифт) и найдите свойство Style. Вот это свойство как раз и реализовано множеством. Во множестве 4 элемента: fsBold, fsItalic, fsUnderline и fsStrikeOut, каждый из которых отвечает за стиль шрифта. Принадлежность элементов ко множеству задаётся указанием значения True или False для каждого из этих пунктов. В строке "Style" находится описание данного множества. Попробуйте изменять стиль и посмотреть, как меняется описание множества Style.
А теперь давайте сделаем простенький интерфейс для доступа к этому свойству. Пусть будет меняться стиль шрифта у этой кнопки (Button1). Поместим на форму 4 TCheckBox — для доступа ко всем значениям и дадим им соответствующие имена. Изменение стиля будем делать при нажатии на саму эту кнопку. Пример реализации:
Чтобы не повторять везде одно и то же "Button1. Font .", эту часть кода можно, что называется, вынести за скобку при помощи специального оператора with . Ранее речь о нём не шла, однако этот оператор очень удобен. Смысл его прост: то, что вынесено вперёд, автоматически применяется ко всему, что находится внутри данного блока. В нашем случае будет так:
Согласитесь, так гораздо удобнее. Используйте оператор with как можно чаще — с его помощью и код по объёму становится меньше и скорость работы увеличивается.
У большинства компонент среди свойств можно найти множества. Например, у диалога открытия файла TOpenDialog (вкладка Dialogs) множеством представлено свойство Options, которое содержит приличное число элементов:
Вы спросите — а что это за названия элементов у множеств? Ответ прост — это специально объявленный перечислимый тип данных, на основе которого и создано множество. Если немного покопать, то можно найти описание этого типа:
Заключение
Сегодня мы познакомились с множествами — наборами элементов. С помощью множеств реализованы свойства многих компонент. Множества не дают возможности хранить какие-либо значения — они просто позволяют создавать наборы из значений перечислимых типов данных. Но во многих случаях использование множеств — лучший и самый быстрый способ хранения некоторого набора параметров.
Автор: Ерёмин А.А.
Статья добавлена: 18 июля 2008
Зарегистрируйтесь/авторизируйтесь,
чтобы оценивать статьи.
Статьи, похожие по тематике
Для вставки ссылки на данную статью на другом сайте используйте следующий HTML-код:
Ссылка для форумов (BBCode):
Быстрая вставка ссылки на статью в сообщениях на сайте:
<
<<статья:123>> — полноценная HTML-ссылка на статью (текст ссылки — название статьи).
Поделитесь ссылкой в социальных сетях:
Комментарии читателей к данной статье
Цитата (antoca):
Оставлять комментарии к статьям могут только зарегистрированные пользователи.
Множество в Паскаль
Множество – это набор взаимосвязанных по какому-либо признаку или группе признаков однотипных элементов. Множественный тип в Паскаль относится к структурированным типам данных.
Каждый отдельный элемент может входить в структуру только один раз. Считается, что элементы множества являются неупорядоченными.
Для описания множественного типа используется следующая конструкция:
type < имя типа > = set of базовый тип
Множество формируется на основе базового типа. Базовым типом в PascalABC.NET может быть любой тип данных, в том числе строковой.
Множественный тип может быть задан, в том числе, без предварительного описания, например:
- type
- colorSet = set of (red, green, blue);
- strSet = set of string;
- var
- colS: colorSet;
- examS: strSet;
- digS, numS: set of integer;
- letterS: set of char;
Переменная типа множество может включать в себя несколько значений базового типа, при этом каждый элемент входит в структуру только один раз. Значение типа множество формируется с помощью конструкции следующего вида:
[список значений]
Списком значений могут быть перечисленные через запятую, выражения базового типа или их диапазоны (для порядковых типов) в виде a..b . Если список значений пуст, то множество пустое. По присваиванию пустое множество является совместимым множеством любого типа.
- examS := [‘Информатика’, ‘Математика’, ‘Физика’];
- digS := [1..7];
- numS := [1..3, 5, 7];
- colS := [];
Для добавления элементов к множеству используется:
- стандартная процедура Include (sSet, x)
- конструкция sSet += [x]
Для удаления элементов из множества используется:
- стандартная процедура Exclude (sSet, x)
- конструкция sSet -= [x]
Операции над множествами
Над множествами в в PascalABC.NET определены операции объединение, пересечение, разность, группа операций отношения, операция in .
- = (равенство): два множества считаются равными, если они совпадают, причем порядок элементов в сравниваемых множествах значения не имеет;
- <> (неравенство): два множества считаются не равными, если они не совпадают: отличаются по количеству элементов или по значению хотя бы одного элемента;
- >= (нестрого содержит): результат А >= В , равен true , если все элементы В содержатся в А;
- <= (нестрогое вложение): результат А <= В , равен true , если все элементы A содержатся в B;
- > (строго содержит): результат А > В , равен true , если все элементы В содержатся в А и при этом множество А содержит хотя бы на один элемент больше;
- < (строгое вложение): результат А < В , равен true , если все элементы A содержатся в В и, при этом, множество В содержит хотя бы на один элемент больше;
Например (в этом и следующих примерах: digS = [1..7], numS = [1..3, 5, 7] ):
writeln(digS > numS); результат True
Операция in применяется для проверки принадлежности элемента множеству. Обычно данная операция используется с условным оператором, например:
- if ‘Информатика’ in examS then
- writeln(‘YES’)
- else
- writeln(‘NO’);
Операция объединение + : результатом объединения двух множеств является множество, в котором содержаться элементы обоих множеств, например:
- numS := numS + digS;
- writeln(numS);
Операция пересечение * : результатом пересечения двух множеств является множество, в котором содержится элементы, входящие одновременно в оба множества, например:
- numS := numS * digS;
- writeln(numS);
Операция разность — : результатом разности двух множеств является множество, в котором содержится элементы первого множества, не входящие во второе множество.
Программирование. Множества Pascal-Паскаль
Еще одним фундаментальным классом данных являются данные, структурированные в виде множеств.
О перечисляемых типах
Мы уже рассматривали три скалярных типа, которые, в принципе, являются перечисляемыми типами, – это boolean, char и integer. В самом деле, ведь каждый из этих типов можно задать следующим образом:
(Представление #xxx означает, что должен быть взят символ, чей код в таблице ASCII равен xxx).
Это базовые типы, которые не требуется задавать каждый раз, уже определены в системе именно таким образом. Кроме них имеется еще несколько интервальных типов, с некоторыми из которых мы знакомы:
Переменные, имеющие эти типы, могут принимать значения, лежащие в границах соответствующих интервалов.
Для работы с перечисляемыми типами существуют следующие функции, которые хранятся в библиотеке системных функций, и программист имеет к ним доступ:
Пользователь имеет возможность описать собственный перечисляемый тип данных. В общем виде это описание выглядит так:
В скобках перечисляются все возможные значения, которые может принимать переменная данного типа. Следует запомнить, что названия значений нельзя давать по-русски(это важно!).
Например, мы можем описать тип данных color и перечислить семь основных цветов:
При этом значения получают номера в порядке их перечисления, начиная с 0. Поэтому для данного типа справедливыми будут отношения элементов:
Множественный тип данных Паскаля
Множественный тип данных Паскаля напоминает перечислимый тип данных. Вместе с тем множественный тип данных – набор элементов не организованных в порядке следования.
В математике множественный тип данных – любая совокупность элементов произвольной природы. Операции, которые производятся над множествами, по существу заключаются во включении и исключении элементов из множества.
Понятие множества в языке программирования значительно уже математического понятия.
В Паскале под множественным типом понимается конечная совокупность элементов, принадлежащих некоторому базовому типу данных.
В качестве базовых типов могут использоваться:
- перечислимые типы;
- символьный;
- байтовый;
- диапазонные на основе вышеперечисленных.
Такие ограничения связаны с формой представления множественного типа данных в Паскале и могут быть сведены к тому, чтобы функция ord() для используемого базового типа лежала в пределах от 0 до 255.
После того, как базовый тип задан, совокупность значений соответствующего множественного типа данных определяется автоматически. В нее входят все возможные множества, являющиеся произвольными комбинациями значений базового типа. Все эти множества являются отдельными значениями определенного множественного типа данных.
Описание множественного типа данных Паскаля
Для того чтобы придать переменной множественного типа значение, используют конструктор множества – перечисление элементов множества через запятую в квадратных скобках. Например,
Конструктор множества может содержать диапазон значений базового типа. Тогда во множества включаются все элементы диапазона. Например,
Обе формы конструирования множеств могут сочетаться. Например,
Конструктор вида [] обозначает пустые множества.
В программе можно использовать множественны тип как константы, в этом случае их определяют следующим способом:
Можно множественный тип определить как типизированную константу:
При описании множественного тип как констант допускается использование знака “+” (слияние множеств). Например,
Операции над множественными типами Паскаля
С множественными типами Паскаля можно выполнять действия объединения, исключения и пересечения.
Объединение множественных типов содержит элементы, которые принадлежат хотя бы одному множеству, при этом каждый элемент входит в объединение только один раз. Операция объединения множеств обозначается знаком ‘+’.
Пример множественных типов Паскаля
Возможно объединять множественные типы и отдельные элементы. Например,
Исключение определяется как разность множественных типов, в котором из уменьшаемого исключаются элементы, входящие в вычитаемое. Если в вычитаемом есть элементы, отсутствующие в уменьшаемом, то они никак не влияют на результат. Операция исключения обозначается знаком ‘-‘.
Пример исключения множественных типов Паскаля
Пресечение множественных типов– множества, содержащие элементы, одновременно входящие в оба множества. Операция пересечения множеств обозначается знаком ‘*’.
Пример пересечения множественных типов
Операции отношения множественных типов Паскаля
Наряду с рассмотренными выше операциями, над значениями множественного типа определены и некоторые операции отношения. Операндами операций над множественными значениями в общем случае являются множественные выражения. Среди операций отношения над значениями множественного типа особое место занимает специальная операция проверки вхождения элемента во множества, обозначаемая служебным словом in. В отличие от остальных операций отношения, в которых значения обоих операндов относятся к одному и тому же множественному типу значений, в операции in первый операнд должен принадлежать базовому типу, а второй – множественному типу значений, построенному на основе этого базового типа. Результатом операции отношения, как обычно, является логическое значение (true или false).
Операция сравнения на равенство множественных типов Паскаля. Множества считаются равными (эквивалентными), если все элементы одного множества присутствуют в другом и наоборот. Для операции сравнения на равенство или неравенство используются символы ‘=’ и ‘<>’.
Тогда операция A=D имеет значение true, а операция A<>D имеет значение false.
Проверка включения. Одно множество считается включенным в другое (одно множество является подмножеством другого), если все его элементы содержатся во втором множестве. Обратное утверждение может быть и несправедливым. Операции проверки включения обозначаются ‘<=’ и ‘>=’.
Исходники Pascal (127)
Справочник
Справочник по паскалю: директивы, функции, процедуры, операторы и модули по алфавиту