Программа на 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.

При использовании вариантных полей в записях следует подчиняться следующим правилам синтаксиса:

  1. Вариантная часть должна начинаться со строки, в начале которой располагается слово Case, а в ее конце – слово Of. Между ними располагается поле-признак.
  2. Запись должна содержать только один вариант, который должен располагаться в конце всех описанных полей непосредствено перед словом End.
  3. Имена полей во всех вариантах должны быть разными. Они должны также отличаться от имен полей фиксированной части.
  4. Для некоторых возможных значений поля-признака вариант может отсутствовать. В этом случае после двоеточия, соответствующего значению варианта, следует поставить пустой список ( ) либо не указывать этот вариант вообще (включая значение, двоеточие и пустое поле).


Страница: