Архив содержит лекцию с презентацией по теме "Перечисляемый тип. Тип-диапазон. Множества." на примере языка программирования Delphi по дисциплине "Основы алгоритмизации и программирования"

Просмотр содержимого документа

Сабақтың оқу-әдістемелік жоспары

Учебно-методический план занятия

Топ\ Группа

Күні\ Д ата

Пән

Предмет Основы алгоритмизации и программирования

Тақырып

Тем а

Саба қтың типі

Тип занятия комбинированный урок

Саба қтың мақсаты

Цели занятия:

Оқыту

Учебная Ознакомить учащихся с перечислимым типом, типом-диапазоном и множествами.

Дамыту

Развивающая Развитие алгоритмического мышления, памяти, внимательности.

Тәрбиелеу

Воспитательная Формирование научного мировоззрения, привитие интереса к предмету.

Пәнаралық байланыс

Межпредметные связи Технология и разработка программного обеспечения, основы объектно-ориентированного программирования.

Сабақтың жабдықтары (көрнекілік, үлестіру, дидактикалық материалдар )

Обеспечения занятий: (наглядные пособия, раздаточный материал, ТСО) интерактивная доска

Сабақтың барысы

Ход занятия

1. Ұйымдастыру кезеңі

Организационный момент Взаимное приветствие, определение отсутствующих, внешнего вида, состояния аудитории, организация внимания. Сообщение темы и цели урока.

2. Өткен тақырыпты тексеру және сұрау

Опрос и проверка пройденного материала

3. Жаңа тақырыпты түсіндіру

Изучение нового материала

Перечисл яе мый тип.

Перечисляемые типы в Delphi позволяют создавать упорядоченный перечень элементов. Каждый элемент именуется некоторым идентификатором (имя идентификатора должно быть без пробелов и состоять из букв латинского алфавита) и находиться в списке, по краям обрамленном круглыми скобками. Элементы отделяются друг от друга запятой. Перечисляемые типы в программе делают код нагляднее и понятнее. Также они повышают надежность программ из-за возможности контроля значений, получаемых переменными.

Пример:

type

var

col: Color;

Month: TypeMonth;

col:= red;

Month:= feb;

var

Значения перечисляемого типа и порядковые номера этих значений имеют соответствие согласно порядку перечисления. Первое значение имеет порядковый номер 0, второе 1, и т.д. Максимальное возможный порядковый номер равен 65536.

Функция Ord(X) возвращает порядковый номер значения выражения X.

C порядковыми типами применяют еще 2 функции Pred(X) и Succ(X).

Pred(X) - возвращает предыдущее значение.

Succ (X) - возвращает следующее значение.

Расположим на форме кнопку и напишем следующий код:

var

Nalog: Currency;

Country: (Russia, France, USA, Poland, Germany, Italy);

begin

Country:= USA;

case Country of

Russia: Nalog:= 99;

France: Nalog:= 36;

USA: Nalog:= 75;

Poland: Nalog:= 76;

Germany: Nalog:= 92;

Italy: Nalog:= 45;

end;

ShowMessage(FloatToStr(Nalog)+ " $");

ShowMessage(IntToStr(Ord(Country)));

end;

Нажмем на кнопку и получим два сообщения. Первое 75 $ (пусть это будет цена визы в данную страну), второе - 2 (USA по порядку идет третьей, но счет элементов начинается с 0).

Тип-диапазон.

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

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

Интервальный тип является отрезком или частью другого типа, называемого базовым. В качестве базового обычно используют целый тип данных (integer).

Над переменными, относящимися к интервальному типу, могут выполняться все операции и применяться все стандартные функции, которые допустимы для соответствующего базового типа.

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

Множества.

Математическое понятие множества

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

Множества в Delphi

Понятие множества в языке программирования несколько отличается от математического определения этого понятия, но смысл сохраняется. Основное отличие в том, что в программировании множество может содержать только конечное число элементов, т.е. не может состоять из бесконечного числа объектов. В математике же последнее допустимо. Например, мы можем определить множество натуральных чисел, которое бесконечно: N = {1, 2, 3, ...}

Следует понимать, что множество не предназначено для хранения каких-либо значений (чисел, символов и т.д.) - оно лишь может дать нам ответ на вопрос: присутствует конкретный элемент в множестве или его там нет.

Перейдём ближе к делу. Множество может быть построено на основе перечислимого типа данных (кто забыл - открываем предыдущий урок). Например, на основе символьного типа Char. По-английски множество называется set (набор) и именно этим словом описывается в Delphi:

var A: set of Char;

В данном примере мы объявили множество A на основе символьного типа Char .

Например, следующее описание:

var N: set of Integer;

приведёт к ошибке "Set base type out of range".

Задание множеств

В математике множество обычно записывается в виде фигурных скобок, в которых через запятую перечисляются элементы, принадлежащие множеству. В Delphi вместо фигурных скобок используются квадратные.

Чтобы задать множество, мы можем воспользоваться операцией присваивания, где слева стоит переменная-множество, а справа - нужный нам набор. Например, в описанное выше множество A мы хотим поместить элементы-символы A , B , C , D . Тогда это запишется так:

A:=["A","B","C","D"];

Теперь множество A содержит 4 элемента.

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

A :=[" A ".." D "];

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

A:=["A","B","K".."N","R","X".."Z"];

Помните, что множество - это виртуальный набор элементов: множество нельзя ввести с клавиатуры и точно так же нельзя вывести на экран. Поэтому добавление элементов во множество делается только программным путём. Безусловно, вы каким-либо образом можете связать элементы интерфейса программы и операцию добавления элементов во множество, но напрямую ввести множество нельзя. Аналогично, вы можете показать множество на экране с помощью каких-либо элементов (например, флажков TCheckBox ), но само множество "в чистом виде" вывести нельзя.

Операции над множествами

В программировании, как и в математике, над множествами допустимы некоторые операции. Рассмотрим их.

Находится ли элемент во множестве?

Самая простая операция, для понятия смысла которой даже не нужно задумываться. Чтобы проверить, входит ли элемент во множество, следует использовать специальную конструкцию с оператором in. Слева от него указывается элемент, справа - множество. Результатом, как несложно догадаться, является логичное значение - истина или ложь. True - элемент принадлежит множеству, False - не принадлежит:

var A: set of Char;

A:=["A".."E","X"];

if "D" in A then ShowMessage("Элемент В находится во множестве A.");

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

Объединение множеств

Если изобразить множества в виде кругов, причём круги пересекаются в том случае, если у множеств есть одинаковые элементы, то объединение можно изобразить следующим образом:

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

var A,B,C: set of Char;

{...}

A:=["A","B","C"];

B:=["X","Y","Z"];

C:=A+B;

//C = ["A","B","C","X","Y","Z"]

Включение одного элемента во множество делается точно таким же образом, просто в этом случае включаемое множество содержит всего один элемент.

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

var X,Y,Z: set of Byte;

Разность множеств

Пример:

var X,Y,Z: set of Char;

{...}

X:=["A".."D"];

Y:=["D".."F"];

Z:=X-Y;

//Z = ["A".."C"]

Следует обратить внимание, что порядок множеств в данном случае важен, т.е. X-Y и Y-X - это разные множества.

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

Множества находят широкое применение. С помощью множеств удобно задавать набор опций, каждая из которых либо включена, либо выключена. К примеру, поместите на форму кнопку (TButton), перейдите в инспектор объектов, разверните свойство Font (шрифт) и найдите свойство Style. Вот это свойство как раз и реализовано множеством. Во множестве 4 элемента: fsBold, fsItalic, fsUnderline и fsStrikeOut, каждый из которых отвечает за стиль шрифта. Принадлежность элементов ко множеству задаётся указанием значения True или False для каждого из этих пунктов. В строке "Style" находится описание данного множества. Попробуйте изменять стиль и посмотреть, как меняется описание множества Style.

А теперь давайте сделаем простенький интерфейс для доступа к этому свойству. Пусть будет меняться стиль шрифта у этой кнопки (Button1). Поместим на форму 4 TCheckBox - для доступа ко всем значениям и дадим им соответствующие имена. Изменение стиля будем делать при нажатии на саму эту кнопку. Пример реализации:

procedure TForm1.Button1Click(Sender: TObject);

Button1.Font.Style:=; //Сделали множество пустым

if CheckBox1.Checked then Button1.Font.Style:=Button1.Font.Style+;

if CheckBox2.Checked then Button1.Font.Style:=Button1.Font.Style+;

if CheckBox3.Checked then Button1.Font.Style:=Button1.Font.Style+;

if CheckBox4.Checked then Button1.Font.Style:=Button1.Font.Style+;

Чтобы не повторять везде одно и то же "Button1.Font.", эту часть кода можно, что называется, вынести за скобку при помощи специального оператора with. Ранее речь о нём не шла, однако этот оператор очень удобен. Смысл его прост: то, что вынесено вперёд, автоматически применяется ко всему, что находится внутри данного блока. Внашемслучаебудеттак:

begin

with Button1.Font do

begin

Style:=; //Сделали множество пустым

//Теперь смотрим состояния флажков и добавляем нужные стили

if CheckBox1.Checked then Style:=Style+;

if CheckBox2.Checked then Style:=Style+;

if CheckBox3.Checked then Style:=Style+;

if CheckBox4.Checked then Style:=Style+;

Согласитесь, так гораздо удобнее. Используйте оператор with как можно чаще - с его помощью и код по объёму становится меньше и скорость работы увеличивается.

Вы спросите - а что это за названия элементов у множеств? Ответ прост - это специально объявленный перечислимый тип данных, на основе которого и создано множество. Если немного покопать, то можно найти описание этого типа:

TOpenOption = (ofReadOnly , ofOverwritePrompt , ofHideReadOnly , ofNoChangeDir , ofShowHelp , ofNoValidate , ofAllowMultiSelect , ofExtensionDifferent , ofPathMustExist , ofFileMustExist , ofCreatePrompt , ofShareAware , ofNoReadOnlyReturn , ofNoTestFileCreate , ofNoNetworkButton , ofNoLongNames , ofOldStyleDialog , ofNoDereferenceLinks , ofEnableIncludeNotify , ofEnableSizing , ofDontAddToRecent , ofForceShowHidden );

TOpenOptions = set of TOpenOption ;

4. Өткен тақырыпты бекіту (сұрақтар, тапсырмалар)

Закрепление изученного (вопросы, задания)

3) Что такое множества?

6) Где применяются множества?

5. Үй тапсырмасын орындау туралы нұсқаулық

Инструктаж о проведении домашнего задания

6. Сабақтың қорытындысын шығару

Подведение итога занятия Выставление оценок

Оқытушы

Преподаватель Кеклис Александра Васильевна

Просмотр содержимого презентации
«1.4 Перечисляемый тип. Тип-диапазон. Множества»



Перечисляемый тип .

Пример:

TypeMonth = (jan,feb,mar,apr);

Color = (red, green, blue, white);

Объявив перечисляемый тип, мы можем задавать переменные данного типа.

col: Color;

Month: TypeMonth;

Для того чтобы присвоить значения переменным напишем операторы:

col:= red;

Month:= feb;

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

Country: (Russia, France, USA, Poland, Germany, Italy);


Тип-диапазон.

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

Тип = НижняяГраница..ВерхняяГраница;

тип - имя объявляемого интервального типа данных;

НижняяГраница - наименьшее значение, которое может принимать переменная объявляемого типа;

верхняяГраница - наибольшее значение, которое может принимать переменная объявляемого типа.


Множества.

Множество может быть построено на основе перечислимого типа данных. Например, на основе символьного типа Char. По-английски множество называется set (набор) и именно этим словом описывается в Delphi:

var A: set of Char;

В данном примере мы объявили множество A на основе символьного типа Char.

Запомните: множество не может состоять более чем из 255 элементов!

Например, следующее описание:

var N: set of Integer;

приведёт к ошибке "Set base type out of range".


Операции над множествами

Объединение множеств

Если есть два множества, определённые на одном и том же типе данных, то их можно объединить и получить таким образом новое множество.

Результирующее множество содержит все те элементы, которые есть хотя бы в одном из двух исходных множеств.


Операции над множествами

Объединение множеств

Объединение записывается знаком плюс "+". Пример:

var A,B,C: set of Char;

A:=["A","B","C"];

B:=["X","Y","Z"];

//C = ["A","B","C","X","Y","Z"]


Операции над множествами

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

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


Операции над множествами

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

Пересечение обозначается звёздочкой "*". Пример:

var X,Y,Z: set of Byte;


Операции над множествами

Разность множеств

Операция вычитания удаляет из первого множества те элементы, которые есть во втором множестве:


Операции над множествами

Разность множеств

Расность обозначается звёздочкой «-». Пример:

var X,Y,Z: set of Char;

//Z = ["A".."C"]


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

procedure TForm1.Button1Click(Sender: TObject);

Button1.Font.Style:=; // Сделали множество пустым

//Теперь смотрим состояния флажков и добавляем нужные стили

if CheckBox1.Checked then Button1.Font.Style:=Button1.Font.Style+;

if CheckBox2.Checked then Button1.Font.Style:=Button1.Font.Style+;

if CheckBox3.Checked then Button1.Font.Style:=Button1.Font.Style+;

if CheckBox4.Checked then Button1.Font.Style:=Button1.Font.Style+;


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

procedure TForm1.Button1Click(Sender: TObject);

with Button1.Font do

Style:=; // Сделали множество пустым

//Теперь смотрим состояния флажков и добавляем нужные стили

if CheckBox1.Checked then Style:=Style+;

if CheckBox2.Checked then Style:=Style+;

if CheckBox3.Checked then Style:=Style+;

if CheckBox4.Checked then Style:=Style+;


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

У большинства компонент среди свойств можно найти множества. Например, у диалога открытия файла TOpenDialog (вкладка Dialogs) множеством представлено свойство Options, которое содержит приличное число элементов:

TOpenOption = (ofReadOnly, ofOverwritePrompt, ofHideReadOnly, ofNoChangeDir, of-ShowHelp, ofNoValidate, ofAllowMultiSelect, ofExtensionDifferent, ofPathMustExist, ofFileMustExist, ofCreatePrompt, ofShareAware, ofNoReadOnlyReturn, ofNoTestFileCreate, ofNoNetworkButton, ofNoLongNames, ofOldStyleDialog, ofNoDereferenceLinks, ofEnableIncludeNotify, ofEnableSizing, ofDontAddToRecent, ofForceShowHidden);

TOpenOptions = set of TOpenOption;


Вопросы:

1) Что представляет собой перечисляемый тип? Синтаксис.

2) Что такое тип-диапазон? Как он записывается?

3) Что такое множества?

4) Как записываются множества?

5) Какие операции можно производить над множествами?

6) Где применяются множества?


Домашнее задание:

Осипов Д. Л. Delphi XE2. - СПб.: БХВ-Петербург, 2012. – стр. 26-27;

М.В. Сухарев Основы Delphi. Профессиональный подход - СПб.: Наука и Техника, 2004. – стр. 30-33.

При создании любой серьёзной программы не обойтись без дополнительных, более сложных, чем числа и строки, типов данных. В Delphi программист может для своих целей конструировать собственные типы данных. Чтобы ввести в программу (описать) новый тип данных, применяется оператор с ключевым словом type :
type название_типа = описание_типа;

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

type FootballTeam = (Spartak, Dinamo, CSKA, Torpedo, Lokomotiv);
var MyTeam: FootballTeam;
begin
MyTeam:=Spartak;
end;

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

  • все целочисленные типы, для которых всегда можно указать число, следующее за числом N;
  • символьные типы (Char): за символом "a" всегда следует "b", за "0" следует "1", и так далее;
  • логические типы - тип Boolean также представляет собой перечислимый тип: type Boolean = (false, true);
Структурные типы данных используются практически в любой программе. Это такие типы, как
  • массивы
  • записи
  • множества
Массив - это структура данных, доступ к элементам которой осуществляется по номеру (или индексу ). Все элементы массива имеют одинаковый тип.
Описание массива имеет вид:

type имя_типа_массива = array [диапазон] of тип_элемента;

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

type TMyArray = array of Integer;

Теперь можно описать переменные типа TMyArray:

var A, B: TMyArray;

Вместо присвоения типа можно явно описать переменные как массивы:

var A, B: array of Integer;

Для доступа к элементу массива нужно указать имя массива и индекс элемента в квадратных скобках. В качестве индекса может выступать число, идентификатор или выражение, значение которых должно укладываться в диапазон, заданный при описании массива:

var N: Integer;
begin
N:= 65;
A := 101;
A[N] := 165;
A := 200;
B:= A;
end;

Иногда требуется узнать верхнюю или нижнюю границу массива . Для этого служат встроенные функции:

High() - вернёт число, являющееся верхней границей массива;
Low() - вернёт число, являющееся нижней границей массива.

В скобки нужно подставить массив, границы которого требуется узнать .

Выражение B:= A означает, что каждый элемент массива B будет равен элементу с таким же индексом массива A . Такое присвоение возможно только если оба массива объявлены через некий поименованный тип, или перечислены в одном списке. И в случае:

var A: array of String;
B: array of String;

Его использовать невозможно (но возможно поэлементное присвоение B := A; и т.д.).

Массивы могут иметь несколько измерений, перечисляемых через запятую. Например, таблицу из четырёх столбцов и трёх строк:

1 2 3 4
5 6 7 8
9 10 11 12
можно описать в виде массива с двумя измерениями:

type MyTable = array of Integer;
var X: MyTable;
Y: Integer;
begin
Y:=X;
end;

Теперь в результате операции присвоения Y будет равен 7 .
Многомерный, например, двумерный массив можно описать как массив массивов:

type TMyArray = array of array of Integer;

Результат будет аналогичен предыдущему примеру.
Каждое измерение многомерного массива может иметь свой собственный тип, не обязательно целый.
Кроме вышеописанных, так называемых статических массивов, у которых количество элементов неизменно, в Delphi можно использовать динамические массивы, количество элементов в которых допускается изменять в зависимости от требований программы. Это позволяет экономить ресурсы компьютера, хотя работа с такими массивами происходит гораздо медленнее. Описываются динамические массивы аналогично статическим, но без указания диапазона индексов:

type TDinArray = array of Integer;
var A: TDinArray;

После создания в динамическом массиве нет ни одного элемента. Необходимый размер задаётся в программе специальной процедурой SetLength . Массив из ста элементов:

begin
SetLength(A, 100);
end;

Нижняя граница динамического массива всегда равна нулю. Поэтому индекс массива A может изменяться от 0 до 99 .
Многомерные динамические массивы описываются именно как массивы массивов . Например, двумерный:

type T3DinArray = array of array of Integer;
var A: T3DinArray;

В программе сначала задаётся размер по первому измерению (количество столбцов):

Чтобы освободить память, выделенную динамическому массиву, нужно массиву как целому присвоить значение nil :
A:=nil;
Ключевое слово nil в Delphi означает отсутствие значения.

Записи очень важный и удобный инструмент. Даже не применяя специальные технологии, с его помощью можно создавать собственные базы данных . Записи - это структура данных, каждый элемент которой имеет собственное имя и тип данных. Элемент записи иначе называют поле . Описание записи имеет вид:
type имя_типа_записи = record
название_поля: тип_поля;
. . .
название_поля: тип_поля;
end;
Названия полей, имеющих одинаковый тип, можно, как и в случае описания переменных, указывать в одну строку через запятую. Для обращения к полю записи сначала указывают имя записи, затем точку, затем имя поля. Например, данные о персонале предприятия могут быть организованы таким типом записи:

type TPers = record
Fam, Name, Par: String;
Year: Integer;
Dep: String;
end;
var Pers: TPers;
begin
Pers. Fam:="Иванов";
Pers. Name:="Иван";
Pers. Par:="Иванович";
Pers. Year:=1966;
Pers. Dep:="Цех №1";
end;

Теперь осталось записать эти данные в файл, предварительно объявив и его тип как TPers , и база данных готова. С файлом в Delphi также ассоциируется переменная, называемая файловой переменной, которая описывается так:
VFile : file of тип_файла;
В качестве типа может использоваться любой ограниченный тип Delphi. При этом не допускается тип String , так как он допускает переменный размер до 2 ГБайт. Его необходимо ограничивать: String[N] , где N - количество символов. Тип TPers из предыдущего примера должен быть описан, например, так:

type TPers = record
Fam, Name, Par: String;
Year: Integer;
Dep: String;
end;

Теперь переменная такого типа занимает строго определённое место в памяти, и может быть записана в файл. Как это сделать, рассказывается во 2-й части Урока №7.

Множество - это группа элементов, объединённая под одним именем, и с которой можно сравнивать другие величины, чтобы определить, принадлежат ли они этому множеству. Количество элементов в одном множестве не может превышать 256. Множество описывается так:

type имя_множества = set of диапазон_значений_множества;

В качестве диапазона может указываться любой тип, количество элементов в котором не больше 256. Например:

type TMySet = set of 0 .. 255;
type TMySet = set of Byte;

Конкретные значения множества задаются в программе с помощью перечисления элементов, заключённых в квадратные скобки. Допускается использовать и диапазоны:

var MySet: TMySet;
begin
MySet:=;
end;

Чтобы проверить, является ли некое значение элементом множества, применяется оператор in в сочетании с условным оператором:

var Key: Char;
Str: String;

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

Если проводить аналогию с математическим термином, то в программировании понятие множества имеет несколько особенностей. Например, оно конечно, то есть множество не может содержать бесконечное число элементов. Общее количество объектов, принадлежащих множеству, находится в пределах от 0 до 256. Если множеству не принадлежит ни один элемент, то оно называется пустым.

Стоит отметить тот факт, что в Delphi множества нельзя использовать для хранения каких-либо элементов (символов, чисел). Оно может лишь ответить на вопрос, принадлежит ли определенный элемент данному множеству или нет.

Delphi множества

На английском языке множество звучит, как set. Именно эта команда и используется в Delphi для его описания.

Например:

Type <имя типа> = set of <базовый тип>;
В этом случае <имя типа> выступает в качестве идентификатора. А <базовый тип> является одним из скалярных типов, он задается перечислением или определенным диапазоном. Среди стандартных типов в качестве базового можно использовать char, byte, boolean. Задать тип можно как в части описания программы, так и путем прямого указания в описании множества.

Например: Первый вариант.

Type abc = "c" .. "q"; // Описание типа abc type FG = set of abc; // Описание множественного типа FG с базовым типом abc
Второй вариант.

Type FGH = set of "c" .. "q"; // Прямое включение определения базового типа "c’ .. "q" в описание множественного типа FGH
Рассматривая в delphi множества, стоит отметить тот фат, что нет смысла говорить об упорядоченности. Например, если в определенное множество входит всего три объекта, то общее количество разных вариаций будет равно восьми.

После того, как множество будет определено, с ним можно выполнять разные операции. В delphi множества можно объединить, пересекать. Помимо этого, доступны такие операции, как разность и IN.

Сравнивая в Delphi множества нет смысла обращать внимание на порядок расположения элементов. Два множества будут равными, если в их состав входят одни и те же элементы.

В Delphi можно использовать операции принадлежности. Одно множество принадлежит другому, если все его элементы входят в состав другого множества.

Например, A >= B равно True, если все элементы множества В есть и во множестве А.

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

Помимо всего вышеперечисленного, в Delphi множества могут быть объединены в одно . В результате, получается третье множество, в состав которого входят элементы, как из А, так и из В.

Применение множеств в реализации той или иной программы, дает возможность программистам в значительной степени улучшить наглядность алгоритма, упростить оператор if, а также сэкономить немного времени. Использовать множества в Delphi очень просто, особенно, если брать за сравнение администрирование linux.

Введение

От рассмотрения простых типов данных переходим к более сложным наборам данных. Следует вспомнить, что простые типы данных позволяют хранить одно-единственное значение в одной переменной. Структуры данных позволяют хранить сразу несколько значений, причём некоторые такие структуры теоретически вообще не имеют ограничения на количество значений - этот предел определяется лишь объёмом доступной памяти. Сегодня мы поговорим о множествах.

Математическое понятие множества

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

Множества в Delphi

Понятие множества в языке программирования несколько отличается от математического определения этого понятия, но смысл сохраняется. Основное отличие в том, что в программировании множество может содержать только конечное число элементов, т.е. не может состоять из бесконечного числа объектов. В математике же последнее допустимо. Например, мы можем определить множество натуральных чисел, которое бесконечно: N = {1, 2, 3, ...}

Следует понимать, что множество не предназначено для хранения каких-либо значений (чисел, символов и т.д.) - оно лишь может дать нам ответ на вопрос: присутствует конкретный элемент в множестве или его там нет.

Перейдём ближе к делу. Множество может быть построено на основе перечислимого типа данных (кто забыл - открываем предыдущий урок). Например, на основе символьного типа Char. По-английски множество называется set (набор ) и именно этим словом описывается в Delphi:

var A: set of Char ;

В данном примере мы объявили множество A на основе символьного типа Char.

Запомните: множество не может состоять более чем из 255 элементов!

Например, следующее описание:

var N: set of Integer ;

приведёт к ошибке "Set base type out of range ".

Задание множеств

В математике множество обычно записывается в виде фигурных скобок, в которых через запятую перечисляются элементы, принадлежащие множеству. В Delphi вместо фигурных скобок используются квадратные.

Чтобы задать множество, мы можем воспользоваться операцией присваивания, где слева стоит переменная-множество, а справа - нужный нам набор. Например, в описанное выше множество A мы хотим поместить элементы-символы A, B, C, D. Тогда это запишется так:

A:=[ "A" ,"B" ,"C" ,"D" ] ;

Теперь множество A содержит 4 элемента.

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

A:=[ "A" .."D" ] ;

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

A:=[ "A" ,"B" ,"K" .."N" ,"R" ,"X" .."Z" ] ;

Помните, что множество - это виртуальный набор элементов: множество нельзя ввести с клавиатуры и точно так же нельзя вывести на экран. Поэтому добавление элементов во множество делается только программным путём. Безусловно, вы каким-либо образом можете связать элементы интерфейса программы и операцию добавления элементов во множество, но напрямую ввести множество нельзя. Аналогично, вы можете показать множество на экране с помощью каких-либо элементов (например, флажков TCheckBox), но само множество "в чистом виде" вывести нельзя.

Операции над множествами

В программировании, как и в математике, над множествами допустимы некоторые операции. Рассмотрим их.

Находится ли элемент во множестве?

Самая простая операция, для понятия смысла которой даже не нужно задумываться. Чтобы проверить, входит ли элемент во множество, следует использовать специальную конструкцию с оператором in . Слева от него указывается элемент, справа - множество. Результатом, как несложно догадаться, является логичное значение - истина или ложь. True - элемент принадлежит множеству, False - не принадлежит:

var A: set of Char ; {...} A:=[ "A" .."E" ,"X" ] ; if "D" in A then ShowMessage("Элемент В находится во множестве A." ) ;

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

Если есть два множества, определённые на одном и том же типе данных, то их можно объединить и получить таким образом новое множество.

Если изобразить множества в виде кругов, причём круги пересекаются в том случае, если у множеств есть одинаковые элементы, то объединение можно изобразить следующим образом:

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

Объединение записывается знаком плюс "+ ". Пример:

var A,B,C: set of Char ; {...} A:=[ "A" ,"B" ,"C" ] ; B:=[ "X" ,"Y" ,"Z" ] ; C:=A+B; //C = ["A","B","C","X","Y","Z"]

Включение одного элемента во множество делается точно таким же образом, просто в этом случае включаемое множество содержит всего один элемент.

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

Пересечение обозначается звёздочкой "* ". Пример:

var X,Y,Z: set of Byte ; {...} X:=[ 1 ,2 ,3 ,4 ,5 ] ; Y:=[ 4 ,5 ,6 ,7 ,8 ] ; Z:=X*Y; //Z =

Операция вычитания удаляет из первого множества те элементы, которые есть во втором множестве:

var X,Y,Z: set of Char ; {...} X:=[ "A" .."D" ] ; Y:=[ "D" .."F" ] ; Z:=X-Y; //Z = ["A".."C"]

Следует обратить внимание, что порядок множеств в данном случае важен, т.е. X-Y и Y-X - это разные множества.

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

Множества находят широкое применение. С помощью множеств удобно задавать набор опций, каждая из которых либо включена, либо выключена. К примеру, поместите на форму кнопку (TButton), перейдите в инспектор объектов, разверните свойство Font (шрифт) и найдите свойство Style. Вот это свойство как раз и реализовано множеством. Во множестве 4 элемента: fsBold, fsItalic, fsUnderline и fsStrikeOut, каждый из которых отвечает за стиль шрифта. Принадлежность элементов ко множеству задаётся указанием значения True или False для каждого из этих пунктов. В строке "Style" находится описание данного множества. Попробуйте изменять стиль и посмотреть, как меняется описание множества Style.

А теперь давайте сделаем простенький интерфейс для доступа к этому свойству. Пусть будет меняться стиль шрифта у этой кнопки (Button1). Поместим на форму 4 TCheckBox - для доступа ко всем значениям и дадим им соответствующие имена. Изменение стиля будем делать при нажатии на саму эту кнопку. Пример реализации:

procedure TForm1.Button1Click (Sender: TObject ) ; begin Button1.Font .Style := ; //Сделали множество пустым if CheckBox1.Checked then Button1.Font .Style :=Button1.Font .Style +[ fsBold] ; if CheckBox2.Checked then Button1.Font .Style :=Button1.Font .Style +[ fsItalic] ; if CheckBox3.Checked then Button1.Font .Style :=Button1.Font .Style +[ fsUnderline] ; if CheckBox4.Checked then Button1.Font .Style :=Button1.Font .Style +[ fsStrikeOut] ; end ;

Чтобы не повторять везде одно и то же "Button1.Font .", эту часть кода можно, что называется, вынести за скобку при помощи специального оператора with . Ранее речь о нём не шла, однако этот оператор очень удобен. Смысл его прост: то, что вынесено вперёд, автоматически применяется ко всему, что находится внутри данного блока. В нашем случае будет так:

procedure TForm1.Button1Click (Sender: TObject ) ; begin with Button1.Font do begin Style:= ; //Сделали множество пустым //Теперь смотрим состояния флажков и добавляем нужные стили if CheckBox1.Checked then Style:=Style+[ fsBold] ; if CheckBox2.Checked then Style:=Style+[ fsItalic] ; if CheckBox3.Checked then Style:=Style+[ fsUnderline] ; if CheckBox4.Checked then Style:=Style+[ fsStrikeOut] ; end end ;

Согласитесь, так гораздо удобнее. Используйте оператор with как можно чаще - с его помощью и код по объёму становится меньше и скорость работы увеличивается.

У большинства компонент среди свойств можно найти множества. Например, у диалога открытия файла TOpenDialog (вкладка Dialogs) множеством представлено свойство Options, которое содержит приличное число элементов:

Вы спросите - а что это за названия элементов у множеств? Ответ прост - это специально объявленный перечислимый тип данных, на основе которого и создано множество. Если немного покопать, то можно найти описание этого типа:

TOpenOption = (ofReadOnly, ofOverwritePrompt, ofHideReadOnly, ofNoChangeDir, ofShowHelp, ofNoValidate, ofAllowMultiSelect, ofExtensionDifferent, ofPathMustExist, ofFileMustExist, ofCreatePrompt, ofShareAware, ofNoReadOnlyReturn, ofNoTestFileCreate, ofNoNetworkButton, ofNoLongNames, ofOldStyleDialog, ofNoDereferenceLinks, ofEnableIncludeNotify, ofEnableSizing, ofDontAddToRecent, ofForceShowHidden) ; TOpenOptions = set of TOpenOption; Как видите, ничего сверхестественного здесь нет - вам всё уже знакомо.

Заключение

Сегодня мы познакомились с множествами - наборами элементов. С помощью множеств реализованы свойства многих компонент. Множества не дают возможности хранить какие-либо значения - они просто позволяют создавать наборы из значений перечислимых типов данных. Но во многих случаях использование множеств - лучший и самый быстрый способ хранения некоторого набора параметров.

Множества

Введение

От рассмотрения простых типов данных переходим к более сложным наборам данных. Следует вспомнить, что простые типы данных позволяют хранить одно-единственное значение в одной переменной. Структуры данных позволяют хранить сразу несколько значений, причём некоторые такие структуры теоретически вообще не имеют ограничения на количество значений - этот предел определяется лишь объёмом доступной памяти. Сегодня мы поговорим о множествах.

Математическое понятие множества.

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

Множества в Delphi.

Понятие множества в языке программирования несколько отличается от математического определения этого понятия, но смысл сохраняется. Основное отличие в том, что в программировании множество может содержать только конечное число элементов, т.е. не может состоять из бесконечного числа объектов. В математике же последнее допустимо. Например, мы можем определить множество натуральных чисел, которое бесконечно: N = {1, 2, 3, ...}

Следует понимать, что множество не предназначено для хранения каких-либо значений (чисел, символов и т.д.) - оно лишь может дать нам ответ на вопрос: присутствует конкретный элемент в множестве или его там нет.

Перейдём ближе к делу. Множество может быть построено на основе перечислимого типа данных (кто забыл - открываем предыдущий урок). Например, на основе символьного типа Char. По-английски множество называется set (набор) и именно этим словом описывается в Delphi:

приведёткошибке "Set base type out of range".

Задание множеств.

В математике множество обычно записывается в виде фигурных скобок, в которых через запятую перечисляются элементы, принадлежащие множеству. В Delphi вместо фигурных скобок используются квадратные.

Чтобы задать множество, мы можем воспользоваться операцией присваивания, где слева стоит переменная-множество, а справа - нужный нам набор. Например, в описанное выше множество A мы хотим поместить элементы-символы A, B, C, D. Тогда это запишется так:

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

A:=["A","B","K".."N","R","X".."Z"];

Помните, что множество - это виртуальный набор элементов: множество нельзя ввести с клавиатуры и точно так же нельзя вывести на экран. Поэтому добавление элементов во множество делается только программным путём. Безусловно, вы каким-либо образом можете связать элементы интерфейса программы и операцию добавления элементов во множество, но напрямую ввести множество нельзя. Аналогично, вы можете показать множество на экране с помощью каких-либо элементов (например, флажков TCheckBox), но само множество "в чистом виде" вывести нельзя.

Операции над множествами.

В программировании, как и в математике, над множествами допустимы некоторые операции. Рассмотрим их.

Находится ли элемент во множестве?

Самая простая операция, для понятия смысла которой даже не нужно задумываться. Чтобы проверить, входит ли элемент во множество, следует использовать специальную конструкцию с оператором in. Слева от него указывается элемент, справа - множество. Результатом, как несложно догадаться, является логичное значение - истина или ложь. True - элемент принадлежит множеству, False - не принадлежит:

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

Объединение множеств

Если есть два множества, определённые на одном и том же типе данных, то их можно объединить и получить таким образом новое множество.

Если изобразить множества в виде кругов, причём круги пересекаются в том случае, если у множеств есть одинаковые элементы, то объединение можно изобразить следующим образом:

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

Объединение записывается знаком плюс "+". Пример:

var A,B,C: set of Char; {...} A:=["A","B","C"]; B:=["X","Y","Z"]; C:=A+B; //C = ["A","B","C","X","Y","Z"]

Включение одного элемента во множество делается точно таким же образом, просто в этом случае включаемое множество содержит всего один элемент.

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

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

Пересечение обозначается звёздочкой "*". Пример:

Следует обратить внимание, что порядок множеств в данном случае важен, т.е. 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, которое содержит приличное число элементов:

Вы спросите - а что это за названия элементов у множеств? Ответ прост - это специально объявленный перечислимый тип данных, на основе которого и создано множество. Если немного покопать, то можно найти описание этого типа:

TOpenOption = (ofReadOnly, ofOverwritePrompt, ofHideReadOnly, ofNoChangeDir, ofShowHelp, ofNoValidate, ofAllowMultiSelect, ofExtensionDifferent, ofPathMustExist, ofFileMustExist, ofCreatePrompt, ofShareAware, ofNoReadOnlyReturn, ofNoTestFileCreate, ofNoNetworkButton, ofNoLongNames, ofOldStyleDialog, ofNoDereferenceLinks, ofEnableIncludeNotify, ofEnableSizing, ofDontAddToRecent, ofForceShowHidden); TOpenOptions = set of TOpenOption;

Как видите, ничего сверхестественного здесь нет - вам всё уже знакомо.

Заключение

Сегодня мы познакомились с множествами - наборами элементов. С помощью множеств реализованы свойства многих компонент. Множества не дают возможности хранить какие-либо значения - они просто позволяют создавать наборы из значений перечислимых типов данных. Но во многих случаях использование множеств - лучший и самый быстрый способ хранения некоторого набора параметров.