Программа на Delphi
нием их типа|
|Var |Type |
|t,u,n:(Mon, Tue,Wed, |DaysOfWeek = (Mon, Tue,Wed, |
|Thu,Fri,Sat,Sun); |Thu,Fri,Sat,Sun); |
| |Var t,u,n: DaysOfWeek; |
В тех случаях, когда явный и типизованный способы описания переменных
конкурируют, следует всегда отдавать предпочтение способу описания
переменных с предварительным объявлением их типа в секции Type. Такой
способ позволяет:
а) конкретизировать тип;
б) четко выделить множество переменных этого типа;
в) повысить уровень структурированности программы;
г) снизить вероятность путаницы в типах, когда переменные фактически
того же типа объявлены разными способами;
д) уменьшить объем текста за счет возможности быстрой ссылки на ранее
определенный тип, особенно в тех ситуациях, когда этот тип
используется для порождения новых типов, переменных, функций и пр. в
других секциях или модулях.
В этой связи важно подчеркнуть, что даже при совпадении базовых типов
различие в пользовательских типах может привести к непредсказуемому
поведению программы. Например, в нижеследующей секции Type два
производных типа t1 и t2 имеют одинаковый базовый тип byte. Однако
объявленные ниже в Var-секции переменные p1 и p2 будут расценены
системой как переменные разных типов. Это обстоятельство может
послужить причиной недоразумений в ходе составления и/или выполнения
программы.
Type
t1 = byte;
t2 = byte;
Var
p1: t1;
p2: t2;
Корректным можно считать следующий аналог:
Type
t1 = byte;
Var
p1,p2: t1;
7. Структурные типы
Структурные типы представляют собой совокупность значений одного или
нескольких различных типов. Их наличие позволяет программисту
конструировать производные типы практически любой сложности, что резко
расширяет возможности языка.
К числу структурных относятся следующие типы:
. множественные типы [Set],
. регулярные типы (массивы) [Array],
. комбинированные типы (записи) [Record],
. файловые типы [File],
. классы [Class],
. классовые ссылки [Class reference],
. интерфейсы [Interface].
Ниже будут подробно описаны первых четыре структурных типа – регулярный,
комбинированный, множественный и файловый.
Три последних типа будут описаны отдельно в разделах, посвященных объектно-
ориентированному программированию.
7.1. Регулярные типы (массивы)
Массив – это структура языка Object Pascal, представляющая собой
упорядоченную совокупность элементов одного типа.
Следует различать два вида массивов: массив-тип и массив-переменную.
Массив-тип. Синтаксис маcсива-типа:
<имя массива> = Array [<тип индекса>, <тип индекса>, …, <тип индекса>]
Of <тип элемента>;
Всякий массив имеет размерность. Размерность определяется количеством типов
индексов, которые заключены в квадратные скобки [ .. ].
Массив-тип предназначен для описания:
. структуры массива как типа;
. размерности массива;
. типов индексов массива;
. типа каждого элемента массива.
Так, в следующем примере
Type
tA1: array [1 .. 10] of Real;
описана структура одномерного массива вещественных элементов (Real), в
котором индекс может изменяться в диапазоне целых значений от 1 до 10. Его
элементами являются вещественные типы tA1[1], tA1[2], tA1[3], …, tA1[9],
tA1[10].
Другой пример:
Type
Color: (Red, Green); { перечислимый тип }
Z: array [1 .. 3, Color ] of Boolean; { массив }
В нем сначала описан простой перечислимый тип Color. Ниже на его основе
описан двумерный массив Z логических (Boolean) элементов. Первый индекс
массива имеет целый тип, а второй – тип Color. Таким образом, массив
состоит из шести элементов – логических типов:
Z [1, Red], Z [1, Green], Z[2, Red], Z[2, Green], Z[3, Red], Z[3, Green].
Массив-переменная. Синтаксис маcсива-переменной:
<имя массива > : Array [<тип индекса>,<тип индекса>, …, <тип индекса>]
Of <тип элемента>;
Массив-переменная отличается от массива-типа тем, что все его элементы –
это отдельные независимые переменные, которые могут содержать различные
значения одного типа.
Массив-переменная может быть описан явно или с помощью ранее определенного
в секции Type типа.
В следующем примере массивы y, Z описаны идентично, причем y – явно, Z – на
основе ранее определенного типа в секции Type, т. е. неявно.
Type
tA1: array [1 .. 10] of Real;
Var
y : array [1 .. 10] of Real; {массив}
Z : tA1; {массив}
Этот пример демонстрирует разные способы описания одинаковых по структуре,
но разных по типу массивов. С точки зрения корректного программирования он
одновременно является примером того, как не следует описывать идентичные
переменные. Причина этого заключается в том, что идентичные структуры во
избежание непредсказуемого поведения программы следует описывать одним
типом.
В этой связи корректным будет любой из вариантов, приведенных в табл. 5.
Таблица 5
|Корректный неявный способ |Корректный явный способ |
|Type tA1: array [1 .. 10] of |Var y, Z: array [1 .. 10] of |
|Real; |Real; |
|Var Y, Z: tA1; | |
Многомерные массивы содержат два и более индексов, например:
Var h: array[1 ..3, boolean, -7 .. 7] of Word;
что эквивалентно
Var h: array[1 ..3] of array[boolean] of array[-7 .. 7] of Word;
Для упакованных массивов
Var packed array[Boolean,1..10,TShoeSize] of Char;
что эквивалентно
Var
packed array[Boolean] of packed array[1..10]
of packed array[TShoeSize] of Char;
Манипуляции с отдельными элементами массивов. Обращение к отдельному
элементу массива возможно через его индексы. В следующем примере в секции
Var описаны простая переменная i и два одномерных массива A и V как целые
переменные типа Integer. Затем в блоке begin … end расположены три
вычислительных оператора.
Var
i: Integer;
A, V: array[1..100] of Integer;
…
begin
i:= 5;
V[8]:= i+9;
A[45]:= V[i+3]*2;
end;
При выполнении первого из них переменная i примет значение 5. При
выполнении второго – восьмой элемент массива V примет значение 14. В
третьем операторе сначала будет вычислен индекс i + 3 = 8, затем значение
восьмого элемента массива V (значение 14) будет умножено на 2 и полученный
результат – значение 28 – будет присвоено 45-му элементу массива A.
Манипуляции с массивами. Язык допускает с помощью одного оператора
присваивания выполнить операцию над массивом в целом. Пусть, например,
массивы A, V объявлены как квадратные матрицы. Тогда оператор
V:= A;
выполнит копирование значений всех элементов массива A в массив V, а после
выполнения оператора
V:= A * V;
будет выполнено умножение матрицы А на матрицу V и результат будет помещен
в матрицу V с предварительным затиранием старых значений.
Упакованные массивы. Элементы упакованного массива хранятся в памяти
максимально плотно. При записи он предварительно упаковывается с целью
экономии памяти. При чтении, наоборот, распаковывается. Операции упаковки и
распаковки требуют дополнительного времени. Поэтому использование
упакованных массивов несколько замедляет работу программы. От обычного
массива Array описание упакованного массива отличается тем, что перед этим
словом добавляется слово Pаcked, например:
Var W: packed array [1..100] of Integer;
7.2. Комбинированные типы (записи)
Запись – это объединение элементов разных типов. Как и в массивах, следует
различать запись-тип и запись-переменную. Один элемент записи называется
полем.
Запись-тип. Синтаксис записи-типа:
<имя записи> = Record
<имя поля 1> : <тип>;
<имя поля 2> : <тип>;
...
<имя поля N> : <тип>;
<вариантная часть >
End;
Записи очень удобны для описания и хранения разнотипных данных о каких-либо
однотипных структурах.
Примером могут служить сведения о студентах. Сведения о любом из них могут
включать поля: Фамилия, Имя, Отчество, Год рождения, Группа, Год
поступления в вуз, Курс. Такие структуры являются однотипными и могут быть
описаны следующим типом:
Type
TStud = Record { Сведения о студенте как запись }
Fio : String[40]; { ФИО как строка из 40 символов }
Name : String[20]; { Имя как строка из 20 символов }
Otch : String[30]; { Отчество как строка из 30 символов }
BirthYear : Word; { Год рождения как целое типа Word }
Group : String[8]; { Группа как строка из 8 символов }
ElectYear : Word; { Год поступления как целое типа Word }
Curs : Byte; { Курс как целое типа Byte }
End;
В этом примере типы полей записи типа tStud назначены с учетом максимально
возможных значений этих полей. Так, структура может хранить фамилию из не
более чем 40 символов. Полю Curs назначен тип Byte, который и
| | скачать работу |
Программа на Delphi |