- •2.1. Стандартные типы данных
- •2.2. Описание структур данных
- •2.3.1. Интервальные типы данных
- •2.4. Динамические структуры данных
- •2.5. Вариантные структуры данных
- •V: Variant; ; : rv.
- •I: Integer; ::::
- •V: Variant;
- •V: Variant;
- •V: Variant;
- •2.6. Выражения в Object Pascal
- •X, Rd: Double; I, Ri: Integer;
- •Var а, в, с: Boolean
- •X, y: Double;
2.3.1. Интервальные типы данных
Интервальные типы данных (типы-диапазоны) представляют собой подмножества возможных значений стандартных типов данных Integer и Char и применяются для более удобного представления информации в программе. Описание интервального типа данных выглядит следующим образом:
<Название переменной> = <начальное знач.>..<конечное знач.>
Использование интервального типа данных аналогично использованию любого другого типа данных. Рассмотрим пример, в котором описывается переменная интервального типа, значениями которой могут быть строчные латинские символы от 'с' до 'у' (см. листинг 2.2).
Листинг 2.2. Использование интервального типа
Program UsingSubranges; Type
TInterval = 'с'..'у';
{Описание интервального типа — подмножества типа Char; допустимые значения переменных данного типа находятся в диапазоне от символа 'с' до символа 'у' } Var
Interval: TInterval;
{Описание переменной интервального типа TInterval}
Begin
Interval := 'е';
{Присвоение переменной Interval значения хе'} End.
Если переменной интервального типа данных присваивается значение, не соответствующее диапазону данного типа, то программа прерывается и выдается ошибка времени выполнения программы (ошибка проверки диапазона возможных значений). Данное свойство интервального типа используется для ограничения возможных значений переменной, так как в некоторых случаях удобнее прекратить программу с ошибкой, чем продолжать ее выполнение с некорректным значением некоторой переменной.
2.3.2. Перечислимые типы данных
Перечислимый тип данных представляет собой некоторый набор констант. Сответственно переменная данного типа может принимать в качестве своего значения только одну из них. Константы задаются именами, их значения неизвестны и определяются компилятором во время построения программы. Описание перечислимых типов имеет следующий вид:
<Тип> = (<Имя константы
<Имя константы п>);
Перечислимые типы используются для описания множества значений какого-либо свойства, например, цвета некоторого объекта. Описание и использование такого свойства может выглядеть так, как показано в листинге 2.3.
Листинг 2.3. Использование перечислимого типа
Program UsingEnumerateds; Type
TColor = (Black, White, Red) ;
{Описание перечислимого типа TColors. Диапазоном значений переменных этого типа являются три константы — Black, White, Red; значения этих констант не известны, но их можно использовать по именам}
Var
Color: TColor;{Описание перечислимого типа данных} Begin
Color := White;{Присвоение переменной Color значение White}
End.
Перечислимые типы данных используются, в основном, для повышения читабельности программы и привлечения внимания к возможным значениям какого-либо параметра программы. Обратим внимание на то, что в стандартных компонентах и подпрограммах Delphi крайне широко используются перечислимые типы.
2.3.3. Множества
Типы данных «множества» аналогичны перечислимым и интервальным типам данных, однако переменные множественных типов могут иметь несколько значений из описанного перечисления в каждый момент времени работы программы, причем каждое значение не может присутствовать в множестве дважды в одно и то же время. Описание переменной множественного типа выглядит следующим образом:
<Переменная>: Set Of <Перечислимый тип>;
Аналогично можно описать множество на основе интервального типа: <Переменная>: Set Of <Интервальный тип>;
Для присвоения значения переменной множественного типа используется специальный оператор — конструктор множества [ ]:
<Переменная> := [Оначение 1>, . . . , Оначение п>] ;
В качестве Значений может быть использовано любое значение из множества, на основе которого создан данный тип.
Рассмотрим пример описания и использования переменной-множества, основанной на перечислимом типе данных (см. листинг 2.4).
Листинг 2.4. Пример описания и использования переменной-множества
Program UsingSets; Type
TColors = Set Of (Black, White, Red) ;
{описание множественного типа данных TCoiors. В качестве значений переменных данного типа в любой момент времени выполнения программы может быть любое сочетание констант Black, White и Red}
Var
Colors: TColors;
{описание переменной множественного гиг.а данных TColors}
Begin
Colors:= [Black, Red]; {присвоение переменной Colors
множества, состоящего из двух
элементов — Black и Red}
Colors := []; {присвоение переменной Colors пустого
множества}
Colors:= [White]; {присвоение переменной Colors
множества, состоящего из одного
элемент.а — White}
End.
При работе с множествами используются следующие понятия:
♦ Объединением двух множеств называется множество, содержащее элементы, как первого, так и второго множеств. Для объединения множеств используется оператор «+». Например, после выполнения команды Colors := [Black] + [Red], В переменной Colors будет содержаться множество [Black, Red].
♦ Пересечением двух множеств называется множество, содержащее элементы, включенные в оба множества. Для пересечения множеств используется оператор «*». Например, после выполнения команды Colors := [Black, Red] * [Black, White], В переменной Colors будет содержаться множество из одного элемента Black.
♦ Разностью двух множеств называется множество, содержащее элементы первого множества (уменьшаемого), не содержащиеся во втором множестве. Для определения разности множеств используется оператор «-». Например, после выполнения команды Colors : = [Black, Red] - [Black, White], в переменной Colors будет содержаться множество из одного элемента Red.
♦ Пустым множеством называется множество, не содержащее элементов. Для присвоения переменной множественного типа пустого множества может использоваться обычный конструктор множества. Например, после выполнения команды Colors := [] в переменной Colors не будет содержаться ни одного элемента. Множество станет пустым, если вычесть из него множество, содержащее все возможные элементы. Например, после выполнения команды Colors := Colors - [Black, White, Red] множество Colors будет пустым вне зависимости от своего начального состояния. 2.3.4. Записи
Запись является типом данных5 и описывается в разделе описания типов данных Туре. После описания типа данных его можно использовать для создания переменных этого типа в обычном порядке. Описание записей как типов данных имеет следующий вид:
Туре {начало раздела описания типов данных} <Имя типа>=Record {заголовок описания записи} <Имя переменной 1>: <Тип>;
{описание "поля» записи}
<Имя переменной п>: <Тип>;
{описание "поля» записи} end; {окончание описания типа}
Таким образом, запись, как переменная, состоит из набора разнородных переменных, называемых полями записи, каждая из которых имеет свое уникальное имя в пределах записи. В качестве Типов переменных, описываемых внутри записи, могут использоваться любые типы данных, встроенные в Delphi или описанные в программе до описания данной записи, в том числе массивы и другие записи.
Описание переменных-записей, или, как их принято называть, экземпляров записей, осуществляется по обычным правилам в разделе описания переменных Var.
Обращаться к экземплярам записей в программе можно двумя способами — как к совокупностям полей, то есть к записям в целом, так и к отдельным полям конкретной записи. Для работы с записями в целом определена всего одна операция — присвоение. При этом поля одной записи присваиваются полям другой записи, то есть копируются в них.
Для обращения к какому-либо конкретному полю записи используется имя этой записи и имя поля в его составе, разделенные точкой:
<Имя переменной-экземпляра записи>.<Имя поля>
С полями экземпляров записей можно производить любые операции, допустимые для типа данных этого поля, то есть указывать в качестве параметров процедур и функций, использовать как операнды для арифметических и логических операторов, и так далее. Приведем небольшой пример (листинг 2.5).
Листинг 2.5. Работа с записями
Program UsingRecords;
Type {начало раздела описания типов данных}
Thuman = Record {заголовок описания записи)
FirstName: String; {описание поля записи
с именем FirstName} {описание поля записи с именем LastName} {описание поля записи с именем Age} {окончание описания типа}
Lastame: String; Age: Integer; end;
Var Human1:Thuman; Human2: Thuman;
{Описание переменной — записи типа THuman с именем Human1} {Описание переменной — записи типа THuman с именем Human2}
Begin
Humanl.FirstName
= 'Michael'; {Изменение поля FirstName
переменной Humanl}
Human2 := Humanl; {Копирование значений всех полей записи Humanl в поля записи Human2. Таким образом поле FirstName записи Human2 станет иметь значение 'Michael'}
End.
2.3.5. Массивы
Массив — это поименованная область памяти, доступ к отдельным частям которой осуществляется по общему имени и индексу соответствующей части. Все части (элементы) массива имеют один и тот же тип, в качестве которого может выступать любой из стандартных или нестандартных типов, описанных к моменту объявления массива. В частности, элементы массива также могут являться массивами. Такие структуры называются многомерными.
Описание массива производится в разделе описания типов данных (после ключевого слова Туре) и выглядит следующим образом:
<Наззание массива> = Array [<Нижний индекс>..<Верхний индекс>]
Of <Тип элементов>;
Program DeclareArrayTypesl;
Type
MyArray
Begin End.
{Начало раздела описания типов данных) Array [5..150] Of Integer;
{Описание типа данных — массива с именем MуАrrау, состоящего из 14 6-ти элементов, пронумерованных от 5-ти до 150-ти, каждый из которых имеет тип Integer}
С момента такого описания тип MyArray может использоваться наравне с остальными типами данных, известными компилятору, например, для описания двухмерного массива:
Program DeclareArrayTypes2;
Туре {Начало раздела описания типов данных) MyArray = Array [5..150] Of Integer;
{Описание типа данных — массива с именем MyArray, состоящего из 146-ти элементов, пронумерованных от 5-ти до 150-ти, каждый из которых имеет тип Integer) MyArray2D = Array [1..10] Of MyArray;
{Описание типа данных — массива с именем MyArray2D, состоящего из 10-ти элементов, пронумерованных от 1 до 10-ти, каждый из которых представляет собой массив типа MyArray}
Begin
End.
Многомерный массив можно также описать без использования вспомогательных типов, просто указав в квадратных скобках через запятую пределы изменения индексов для каждого измерения массива:
Туре
MyArray2D = Array [1..10, 5..150] Of Integer;
{Описание двухмерного массива)
Описание переменной, представляющей собой массив, происходит по обычным правилам описания переменных:
Туре
MyArray2D = Array [1..10, 5..150] Of Integer;
{Описание двухмерного массива) Var
Array2D: MyArray2D; {Описание переменной-массива}
Для обращения к элементу массива-переменной, ее индекс (индексы в случае многомерных массивов) указываются в квадратных скобках после имени переменной:
Program UsingArrays; Type
MyArray2D = Array [1..10, 5..150] Of Integer;
{Описание двухмерного массива) Var
Array2D: MyArray2D; {Описание переменной-массива} Begin
Array2D [1, 6] := 18; {Присвоение значение элементу
массива с индексами 1, 6} End.
Обратите внимание, что максимально возможный размер массивов в Delphi увеличен по сравнению с Pascal, и может достигать 2 гигабайт вместо 64 килобайт.
Заметим, что для массивов одного и того же типа, как и для записей, определена операция присвоения, выполняемая копированием значений элементов одного массива в другой. Также доступна операция присвоения для отдельных элементов массивов. Сравнение массивов в целом невозможно и вызывает ошибку компиляции. Однако это доступно динамическим массивам, описанным ниже.
Переменную-массив можно описать и без предварительного создания соответствующего типа данных, прямо в разделе описания переменных:
Var
MyArray2D: Array [1..10, 5..150] Of Integer;
{Описание переменной — двухмерного массива целочисленных элементов;
Необходимо отметить, что при внешне эквивалентном описании два массива не будут считаться принадлежащими к одному типу данных, если это не указано явно:
?•::ходит по
Туре
ArrType = Array [1..10] Of Integer;
{Описание типа данных — массива целочисленных элементов}
Var А1
= Array [1..10] Of Integer;
{Описание переменной-массива целочисленных элементов}
А2 = Array [1..10] Of Integer;
A3: ArrType;
A4: ArrType; Begin
A3 := A4;
Al := A2;
{Описание переменной-массива целочисленных элементов, полностью идентичной А1}
{Описание переменной-массива целочисленных элементов}
{Операция допустима, так как обе переменные имеют один и тот же тип — ArrType}
{Операция не допустима, так как обе переменные имеют не один и тот же тип данных, а лишь похожие по структуре типы}
В рассмотренном примере все четыре используемые переменные являются одномерными массивами целочисленных элементов, проиндексированных от 1 до Ю, однако переменные A3 и А4 совместимы между собой, так как при их описании явно указан один и тот же тип, а переменные А1 и А2 не совместимы ни между собой, ни с переменными A3 и А4. Соответственно при попытке компиляции такого фрагмента программы будет выдана ошибка "Incompatible types» - "Несовместимость типов».
Однако если бы переменные А1 и А2 были описаны в одной строке, то их типы считались бы идентичными:
var
Al, A2
Array [1..10] Of Integer;
{Описание двух переменных-массивов целочисленных элементов}
Begin
Al := А2;
(Операция допустима)