
для экзамена по инф Брэ / лекции паскаль / Lekcija6
.docТема 6. Записи. Структура объявления типа записи. Оператор присоединения WITH. Использование записи с вариантными полями. Примеры
Запись – это структура данных, состоящая из фиксированного числа компонентов, называемых полями записи. В отличие от массива компоненты (поля) записи могут быть различного типа.
При определении типа RECORD для каждого поля указывается идентификатор и тип поля.
Общий вид описания типа RECORD:
TYPE <имя типа>= RECORD
< список полей >
END.
Здесь < имя типа > - правильный идентификатор, < список полей> -список полей; представляет собой последовательность разделов записи, между которыми ставится точка с запятой.
TYPE NTYPE =RECORD
ID 11, ID 12, …, ID 1N: TYPE1;
ID K1, ID K2, …, ID KN: TYPEK;
END;
Каждый раздел записи состоит из одного или нескольких идентификаторов полей, отделяемых друг от друга запятыми. За идентификаторами полей через двоеточие указывается тип полей, например:
Type DAT=RECORD
DEN: 1.. 31;
MEC: 1.. 12;
GOD: INTEGER;
END;
VAR DR, DPL: DAT;
Как и в массиве, значения переменных типа записи можно присваивать другим переменным того же типа, например:
DP:=DR;
Для обращения к полям записи, используется составное имя, т. е. указывается имя переменной типа RECORD, затем через точку указывается имя поля:
DR.DEN: = 3;
DR.MEC: =11;
DR.GOD:=2000;
Для вложенных полей приходится продолжать уточнения:
TYPE DAT=RECORD
DEN, MEC: BYTE;
GOD: WORD;
END;
VAR SV: RECORD
NAME: STRING;
DATR: DAT;
END;
BEGIN
IF SV.DATR.GOD>1980 THEN…
END.
В языке Паскаль можно использовать тип RECORD при описании других структурированных типов. Например, описание массива записей имеет вид:
TYPE GRUP=(ST1, ST2, ST3, ST4);
VAR MASDAT: ARRAY [GRUP] OF DAT;
где DAT-описанная выше запись;
MASDAT – массив, состоящий из записей дат рождения студентов.
Для занесения даты рождения например 1-го студента используются следующие операторы:
MASDAT. [ST1]. DEN: =7;
MASDAT [ST1]. MEC: =11;
MASDAT [ST1]. GOD: =1983;
Оператор WITH.
Для обращения к полям записей используются составные имена, перечисляются имена полей более старших структур.
Для сокращения записи составных имен (для облегчения доступа к полям записи) используется оператор присоединения WITH. Его общий вид:
WITH <переменная> DO
<оператор>;
<переменная>- имя переменной типа RECORD, за которым, возможно, следует список вложенных полей;
<оператор> - любой оператор Паскаля.
Пример: для занесения даты рождения в приведенном выше примере достаточно выполнить операторы:
WITH MASDAT [ST1] DO
BEGIN
DEN: =7;
MEC: =11;
GOD: =1983;
END;
WITH SV. DATR DO MEC: =11; эквивалентно WITH SV DO WITH DATR DO MEC: =11;
В операторе WITH можно использовать запятую, если необходимо указать более одного типа записи. Запятая служит сокращением для вложенных операторов WITH. Оператор WITH а, b DO... эквивалентен WITH а DO WITH b DO…
Таким образом, во внутреннем операторе можно использовать компоненты обеих записей. Например:
TYPE KRUG: =RECORD
RADIUS: REAL;
CENTER: RECORD
X, Y: REAL
END;
END;
VAR K: KRUG;
Переменной K присвоить значение, соответствующее кругу радиуса 2.5 с центром в т. (0, 1.8)
-
WITH K DO BEGIN RADIUS: 2.5; CENTER.X: = 0; CENTER.Y: =1.8;END;
-
WITH K DO BEGIN RADIUS: 2.5; WITH CENTER DO BEGIN X: =0; Y: =1.8; END;
-
WITH K, CENTER DO BEGIN RADIUS: -2.5; X: =0;Y: =1.8;END;
Записи, рассмотренные выше, - это записи с фиксированными частями. В языке Паскаль имеется средство, позволяющее описывать записи переменной структуры. В этом случае список может содержать вариантную часть.
Тогда в описании типа записи после фиксированной части перечисляются все возможные варианты в этой структуре, а при работе осуществляется выбор одного из вариантов с помощью оператора CASE.
Общий вид описания записи с вариантами
Type NTYPE =RECORD
ID11, ID12, …, ID1N: TYPE 1;
IDK1, IDK2, …, IDKN: TYPEK;
CASE L: TYPE L OF
C1: (T11: TYPE 11;T12: TYPE12, …);
C2:(T21: TYPE 21; T22: TYPE 22, …);
CK: (TK1: TYPE K1; TK2; TYPE K2;…)
END;
VAR Z: NTYPE;
где NTYPE – имя типа; L –переменная называемая полем признака, TYPEL – тип признака; С1, С2, ..., Ск – константы выбора, должны принадлежать типу переменной L: T1, Т2, ... – список полей, соответствующих каждой константы выбора (поля является компонентами варианта)
Замечания
-
Любая запись может иметь только одну вариантную часть.
-
Вариантная часть должна расположатся после фиксированной части.
Замечательной особенностью вариантной части является то обстоятельство, что все заданные в ней варианты «накладываются» друг на друга, т.е. каждому из них выделяется одна и та же область памяти. Это открывает дополнительные возможности преобразования типов, например:
VAR
Mem4: record
Case byte of
0:(by: array [0.. 3] of byte);
1:(wo: array [0..1] of word);
2:(lo: longint);
end;
Запись mem4 имеет три варианта, каждый из которых занимает в памяти один и тот же участок из 4 байт. Например, этой записи можно сначала присвоить значение как длинному целому, а затем проанализировать результат по байтам или словам:
VAR
begin
with m do
begin
lo: =trunc(2*pi*x);
if wo [l]=0 then
if by [1]=0 then
xb: =x [0]
else
x: =wo [0]
xl: =lo;
end;
...
end.
Пример записи с вариантными полями:
TYPE Видлист = (книга, журнал)
литист = record
АВТОР:STRING [20];
НАЗВ:STRING [30];
CASE ИСТ: видлист OF
Книга: (город: STRING [12]; Издат: STRING [20]; год-изд:INTEGER);
Журнал: (Назвжур: STRING [15]; Номер: BYTE;) год:INTEGER;
END;
VAR сплит: ARRAY [1..20] of литлист.
Для записи новых данных о книге, расположенной на пятом листе списке, необходимо выполнить следующие операторы:
var Сплит [5] DO
begin
АВТОР:=’Фаронов В.В.’;
НАЗВ:=’TURBOPASCAL 7.0’;
ист:=’книга’;
город:= ’Москва’;
издат:= ’Нолидж’;
год изд.: = ‘1999’;
end;
В Турбо Паскале также можно в поле ключа выбора указывать переменную порядкового типа и даже присваивать ей в программе значение, что однако не влияет на выбор поля: значения констант Турбо Паскале могут быть произвольными, в том числе повторяющимися, например:
Type
Rec1= record
a: byte;
b: word;
end;
rec 2=record
c: longint;
case x: byte of
1: (d: word);
2: (e: record
case of boolean of
3: (f: rec1);
3’: (g: single);
3’’: (c: word);
end)
end;
var r: rec2;
begin
r.x=255;
if r. E. G=0 then writeln (‘O. K.’)
else writeln (r..g); end.
1осн. [104-108]
5доп [19-22], 10доп.[95-99], 11доп.[321-338]
Контрольные вопросы
-
Для чего предназначен и как выполняется оператор присоединения?
-
Что такое запись?
-
В каких случаях целесообразно использовать вариантные записи?
-
Какие преимущества дает использование оператора присоединения?
-
Какова структура объявления типа запись?
-
Каким образом осуществляется доступ компонентам записи?