Билет 24. Вопрос 1. Запись как структурированный тип данных в языке Pascal. Способы описания записей.
Тип-запись включает ряд компонент, называемых полями, которые могут быть разных типов. При задании типа-записи после зарезервированного слова record следует перечислить все поля типа-записи с указанием через двоеточие их типов и завершить задание типа словом end . Поля отделяются друг от друга точкой с запятой. Количество полей записи может быть любым.
Пример .
Type Complex = record Re : real; Im : real end; Data = record Year : integer; Month : 1 . . 12; Day : 1 . . 31 end; Person = record Name : string [20]; Sex : (Male, Female); Age : Integer; Married : boolean end ;
Примечание. Если несколько полей типа-записи имеют один и тот же тип, то их имена можно перечислить через запятую и затем указать этот общий тип. Так, рассмотренный в примере тип комплексных чисел можно ввести и другим образом:
Type Complex = record Re, Im : Real end ;
После введения типа-записи можно затем задать переменные или типизированные константы этого типа-записи. При задании значений константе ее поля записываются в круглых скобках через точку с запятой. Для задания значения каждого поля сначала указывается имя поля, а затем через двоеточие – его значение. Так для введённых выше типов можно задать, например, следующие переменные и константы:
var X, Y, Z: Complex; Dat : Data; const Birthday : Data = (Year : 1971; Month : 12; Day : 19); Ivanov: Person = (Name : ‘ Иванов '; Sex : Male; Age : 40; Married : True);
Примечание. Тип-запись можно вводить и непосредственно при определении переменных или типизированных констант. Например, фрагмент
var X , Y , Z : record Re , Im : real end ;
определяет те же комплексные переменные, что и предыдущем примере. Доступ к полям записи осуществляется указанием имени переменной (константы) и имени поля, записываемого через точку, например:
Ivanov . Age, X . Im, Dat . Day и т. д.
Пример. Использование полей записей.
X . Re := 1.5; X . Im := 1.7; Y . Re := - X . Re; Ivanov . Married := False ;
Для того, чтобы не выписывать каждый раз имя записи при обращении к ее полям, можно использовать оператор над записями WITH . Его структура выглядит следующим образом: with <имя записи> do <опратор>;
В этом случае внутри оператора можно указывать только поле записи. Например , фрагмент :
with X do begin Re := 1.5; Im := 1.7; Y . Re := -Re; end; with Ivanov do Married := False;
эквивалентен фрагменту из предыдущего примера. Тип-запись может иметь вариантную часть , изменяющуюся при разных реализациях, например, в типе-записи параметров геометрических фигур для квадрата задается сторона, для треугольника – две стороны и угол между ними, для окружности – радиус и т. д. Вариантная часть может быть только одна и должна располагаться в конце записи.
Например :
type Figure = (Square, Triangle, Circle); Param = record X, Y : real; case Fig : Figure of Square : (Side : real); Triangle : (Side1, Side2, Angle : real); Circle : (Radius : Real) end; var MySquare, MyCircle : Param;
Вариантная часть начинается словом case , за которой следует переменная выбора варианта (в примере Fig ) с указанием типа. Далее указываются константы, значения которых может принимать переменная выбора варианта (в примере – Square , Triangle , Circle ). За каждой константой через двоеточие в круглых скобках записываются поля данного варианта записи с указанием их типов. Круглые скобки необходимы, даже если для данного варианта вариантная часть отсутствует. Следует отметить, что вариантная часть не завершается своей операторной скобкой end , как у обычной конструкции case , т. к. Далее идет завершающая операторная скобка всего типа. В стандарте языка Pascal перед тем, как использовать один из вариантов записи, переменной выбора варианта необходимо присвоить соответствующее значение:
Fig := Square; MySquare.Side := 5.2; Fig := Circle; MyCircle . Radius := 7.5;
В Turbo Pascal эту операцию делать необязательно, хотя, если переменная выбора задана, ее затем можно в програме посмотреть, чтобы определить, какой задан вариант. Более того, значения переменной выбора ни на что не оказывают влияния =, и следующий фрагмент эквивалентен рассмотренному выше:
Fig := Square; MyCircle.Radius := 7.5; Fig := Circle; MySquare . Side := 5.2;
В тип-запись допустимо не вводить переменную выбора вариантов, а перечислить лишь разные варианты, например:
Transf = record case Integer of 1 : (W : Word); 2 : (TS : array [1. . 2]of char) end; |