Реферат: Object Pascal
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.
Имена полей во всех вариантах должны быть разными. Они должны также отличаться от имен полей фиксированной части.
Для некоторых возможных значений поля-признака вариант может отсутствовать. В этом случае после двоеточия, соответствующего значению варианта, следует поставить пустой список ( ) либо не указывать этот вариант вообще (включая значение, двоеточие и пустое поле).
Запись-переменная. Синтаксис записи-переменной:
<имя записи> : Record
<имя поля 1> : <тип>;
<имя поля 2> : <тип>;
...
<имя поля N> : <тип>;
<вариантная часть >
End;
т.е. синтаксисы переменной и типа отличаются одним символом (":" и "=").
Пример:
Type
tMass : Array [1 .. 2, 1 .. 50] of Real;
tRec: Record
Name : String [10];
Mass2: tMass;
End;
Var
J: Integer;
S: String[70];
F,Gri : Record
a,b,c: Integer;
k: Array [1..10] of String [60];
z: tMass;
r: tRec;
End;
В секции Var описаны две простые переменные J и S и две записи F и Gri, имеющих одинаковую, но достаточно сложную структуру:
первых три поля записей F и Gri имеют имена a,b,c и тип Integer;
поле k представляет собой одномерный строковый массив из 10 элементов;
поле z имеет тип, описанный в секции Type как двумерный вещественный массив, в котором первый индекс может изменяться в диапазоне 1 .. 2, а второй индекс – в диапазоне 1 .. 50;
поле r в свою очередь само является записью, поля которой описаны типом tRec в секции Type.
Доступ к полям записей. Переменная, представляющая поле, конструируется из имени записи и поля, отделенного друг от друга десятичной точкой. Такая составная переменная называется квалификационной.
Примеры квалификационных полей вышеприведенных записей:
F.a Gri.a F.k[6] Gri.z [2, 34] F.r.Name F.r.Mass2[1, 50]
Примеры операторов присваивания с участием полей записей:
S := 'Иванов Иван Петрович';
J := 123;
F.a := J + 9;
Gri.a := ( F.a + J ) * ( F.c + F.b - Gri.c);
Gri.a := ( F.a + J ) * ( F.c + F.b - Gri.c);
F.k [1] := F.z [2,30];
Gri.r.Name := 'Студент ' + F.k [8];
Gri.a := 12 * (Gri.a + Gri.b + Gri.c);
Доступ к полям записей с помощью оператора With. Для упрощения обращения к полям одной и той же записи можно использовать оператор With.
Пример:
With Gri do
Begin
a:= 12 * (a + b + c + F.a);
b:= 64 * ( b - c);
End;
Эти операторы выполняют те же операции, что и операторы
Gri.a:= 12 * (Gri.a + Gri.b + Gri.c + F.a);
Gri.b:= 64 * (Gri.b - Gri.c);
7.3. Множественные типы
Множество – это совокупность однотипных элементов. Во многом оно похоже на типизованную константу, однако имеет от него принципиальное отличие. Это отличие состоит в том, что значениями множества являются все его допустимые подмножества.
Как и в массивах, следует различать множество-тип и множество-переменную.
Множество-тип. Синтаксис множества-типа:
<имя множества> = Set of <базовый тип >;
Пример:
Type
TSomeInts = 1..250;
TIntSet = set of TSomeInts;
создает тип множества с именем TIintSet, которое содержит множество целых чисел в диапазоне от 1 до 250. Это же множество могло быть описано явно:
type TIntSet = set of 1..250;
Множество-переменная. Синтаксис множества-переменной:
<имя множества> : Set of <базовый тип >;
В соответствии с вышеописанными типами можно объявить множества:
Var Set1, Set2: TIntSet;
а затем в операторной части задать эти множества:
...
Set1 := [1, 3, 5, 7, 9];
Set2 := [2, 4, 6, 8, 10];
Можно объявить множество явно, перечислив его элементы:
Var
MySet1 : set of 'a' .. 'z';
MySet2 : set of Byte
MySet3 : set of (Club, Diamond, Heart, Spade)
MySet4 : set of Char;
...
MySet 1:= ['a','b','c']; {оператор определения множества}
Операции над множествами. Допустимые операции над множествами приведены в следующей табл. 6:
Таблица 6
Опера-ция | Наименование операции | Тип операндов | Тип результата | Пример |
+ – * <= >= = <> in |
Объединение Вычитание Пересечение Не меньше Не больше Равенство Неравенство Принадлежание |
set set set set set set set элемент set |
set set set boolean boolean boolean boolean boolean |
Set1 + Set2 S - T S * T Q <= MySet S1 >= S2 S2 = MySet MySet <> S1 A in Set1 |
Объединение, вычитание и пересечение множеств.
Результатом любой из операций будет также множество.
Пример:
Var
S1, S2,S3 : set of Byte;
...
S1:= [1, 2 , 3, 4]; {оператор определения множества}
S2:= [3, 4, 5, 6, 78]; {оператор определения множества}
S3:= S1 + S2; {объединение множеств}
{результат S3 = [1, 2, 3, 4, 5, 6, 78] }
S3:= S2 - S1; {вычитание множеств}
{результат S3 = [1, 2, 5, 6, 78] }
S3:= S2 * S1; {пересечение множеств}
{результат S3 = [3, 4] }
Операции сравнения множеств.
Результатом любой из операций будет логическая константа True (истина) или False (ложь).
Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19