Программа на DelphiРефераты >> Программирование и компьютеры >> Программа на Delphi
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 Real; Var Y, Z: tA1; |
Var y, Z: array [1 10] of Real; |
Многомерные массивы содержат два и более индексов, например:
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, который имеет диапазон значений 0 255, т. к. значением этого поля может быть одно из значений 1 6, которые полностью охватываются диапазоном типа Byte. Этому полю можно было бы назначить любой другой целый тип, например Word. Однако, в целях экономии памяти, повышения скорости чтения и записи данных, следует назначить именно тип Byte, который занимает всего 1 байт памяти, а не тип Word, который требует 2 байта памяти. В то же время, например, для поля ElectYear (год поступления) тип Byte непригоден, т. к. имеет недостаточный диапазон значений.
Записи с вариантами. Синтаксис записи допускает вариантность описания полей. Вариантная часть содержит несколько альтернатив, в каждой из которых в круглых скобках задается список полей, присущих своему варианту. Примером могут служить записи о пенсионерах:
Type tPensioner = Record { пенсионер } FioIO : String[100]; { Фамилия, имя, отчество одной строкой } Age : Byte; { Возраст } Case Citizen: boolean of {Горожанин ли ?} TRUE : (Town : String[30];) {Город, в котором проживает} FALSE: (Address : String[100]; {Полный адрес одной строкой} Transport : String[200];) {Транспорт, которым можно добраться до города} End;
В этом примере запись tPensioner содержит понятные поля FioIO и Age, а также поле нового вида – логическое поле Citizen вариантного типа. От значения этого поля зависит появление и непоявление некоторых потенциальных полей записи. Так если значение этого поля TRUE (истина), то в записи появляется (становится доступным) поле Town (город), при значении FALSE (ложь) – поля Address и Transport.
При использовании вариантных полей в записях следует подчиняться следующим правилам синтаксиса:
- Вариантная часть должна начинаться со строки, в начале которой располагается слово Case, а в ее конце – слово Of. Между ними располагается поле-признак.
- Запись должна содержать только один вариант, который должен располагаться в конце всех описанных полей непосредствено перед словом End.
- Имена полей во всех вариантах должны быть разными. Они должны также отличаться от имен полей фиксированной части.
- Для некоторых возможных значений поля-признака вариант может отсутствовать. В этом случае после двоеточия, соответствующего значению варианта, следует поставить пустой список ( ) либо не указывать этот вариант вообще (включая значение, двоеточие и пустое поле).