Программа на Delphi
меет диапазон
значений 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. Для некоторых возможных значений поля-признака вариант может
отсутствовать. В этом случае после двоеточия, соответствующего
значению варианта, следует поставить пустой список ( ) либо не
указывать этот вариант вообще (включая значение, двоеточие и пустое
поле).
Запись-переменная. Синтаксис записи-переменной:
<имя записи> : 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
|Опера-|Наименование |Тип операндов|Тип |Пример |
|ция |операции | |результата | |
|+ |Объединение |set |set |Set1 + Set2 |
|– |Вычитание |set |set |S - T |
|* |Пересечение |set |set |S * T |
|<= |Не меньше |set |boolean |Q <= MySet |
|>= |Не больше |set |boolean |S1 >= S2 |
|= |Равенство |set |boolean |S2 = MySet |
|<> |Неравенство |set |boolean |MySet <> S1 |
|in |Принадлежание |элемент set |boolean |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 (ложь).
Пример:
Var
S1, S2, S3 : set of Byte;
B: boolean;
...
S1:= [3, 4]; {оператор определения множества}
S2:= [1, 3, 4]; {оператор определения множества}
S3:= [3, 4, 5, 6, 78]; {оператор определения множества}
B:= S1 <= S3; {True, т. к. S1 является подмножеством S3}
B:= S3 >= S2; {False, т. к. S2 не является подмножеством S2}
B:= S3 = S2; {False, т. к. мн-ва S2 и S3 не равны друг другу }
B:= S3 <> S2; {True, т. к. мн-ва S2 и S3 не равны друг другу }
Проверка вхождения элемента во множество. Результатом операции in будет
логическая константа True (истина) или False (ложь). Пример:
Var
S1 : set of Integer;
B: boolean;
...
S1:= [3, 4, 18 .. 178, 3101, 4427]; {оператор определения множества}
B:= ( 4 in S1); {True, т. к. 4 является элементом множества S1}
B:= (200 in S1); {False, т. к. 200 не является элементом S1}
7.4. Файловые типы
В языке Object Pascal есть три типа файлов:
. текстовые файлы,
. файлы с типом,
. файлы без типа.
Связь с файлом может быть установлена через файловую переменную, которая
после описания, но до использования в программе должна быть связана с
внешним файлом с помощью процедуры AssignFile.
Текстовой файл – это последовательность символьных строк перемен-ной длины.
Всякая такая строка завершается маркером конца строки CR/LF. Текстовые
файлы можно обрабатывать только последовательно. Ввод и вывод нельзя
производить для открытого файла, используя одну файловую переменную.
Текстовой файл имеет тип TextFile, или просто Text. Пример описания
файловой переменной текстового типа:
Var Fi: TextFile;
Файлы без типа состоят из компонент одинакового размера, структура которых
не известна или не имеет значения. Допустим прямой доступ к любой
компоненте файла. Пример объявления файловой переменной файла без типа:
| | скачать работу |
Программа на Delphi |