Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Теория 9.doc
Скачиваний:
5
Добавлен:
05.05.2019
Размер:
349.7 Кб
Скачать

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;

(Операция допустима)