Фиксированные записи

Записи

В задачах экономики и управления часто используются данные в виде таблиц, каждая строка которых может содержать разнотипные элементы. Такие данные представляются в виде совокупностей (структур) данных. На языке Паскаль их называют записями. В составе записи (например, с данными одной строки таблицы) могут быть скалярные типы, массивы, записи того же или другого типа. Кроме того, на языке Паскаль можно использовать массивы записей.

Запись (record)это структура данных, состоящая из фиксированного количества компонентов разного типа, называемых полями. Поля могут быть различных типов. С полями можно обращаться как с переменными соответствующего типа.

Другими словами, запись – это структурированная конструкция, состоящая из поименованных полей. Записи наиболее общий и гибкий тип данных Паскаля. Они могут быть постоянной (фиксированной) или переменной (вариантной) структуры.

Ввод-вывод и обработка записей в Паскале может производиться только поэлементно. Допускается копирование записей одного типа из одной переменной в другую с помощью оператора присваивания. Переменные типа «запись» могут участвовать в операторах присваивания, но никакие операции над ними выполняться не могут. Арифметические или какие-либо другие операции могут выполняться только над отдельными полями записи.

Фиксированная записьэто структура постоянного строения, состоящая из фиксированного количества элементов (компонентов, полей). Элементы записи в ней могут быть любых типов, в том числе скаляры, множества, файлы, другие записи. Описатель типа записи RECORD. Объявление записи завершается словом END и может быть в подразделах TYPE и VAR. Форма объявления записи:

TYPE T = RECORD {Т – идентификатор типа записи}

Идентификатор поля 1 : Тип 1;

Идентификатор поля 2 : Тип 2;

………….. список полей

Идентификатор поля К : Тип К;

END ;

где список полей – это последовательность определений элементов записи; определение полей может быть в виде идентификатора или списка идентификаторов полей, разделенных запятыми; за идентификаторами ставится двоеточие и имя или определение типа.

После объявления типа можно объявить переменную-запись.

Например:

TYPE TAB = RECORD { объявление записи в подразделе тип }

A, B : REAL { А и В – поля одинакового типа }

END ;

VAR C := TAB;

D : RECORD { объявление записи в подразделе переменная }

E, F : INTEGER:

END ;

 

Пример таблицы с данными различного типа:

 

Номер зачетки Фамилия и инициалы Размер стипендии
Иванов И.И.
Петров П.П.
…… …….. ……
Казначеев А.А.

 

Данные этой таблицы могут быть объявлены в виде:

TYPE STR = RECORD { STR - ИМЯ ТИПА ЗАПИСИ }

NZ : 93100 .. 93500;

FI0 : STRING [ 20 ] ;

RS : REAL

END ;

VAR STUD : STR; { STUD – переменная типа STR }

MST : ARRAY [ 1..20 ] OF STR; { MST – массив данных типа STR }

Чтобы использовать в операторе программы элемент (поле) переменной записи, необходимо указать имя переменной и, после точки, имя поля. Например, процедура WRITE (STUD . NZ, ‘ ‘, STUD . FI0, ‘ ‘, STUD . RS); выводит на экран содержимое полей NZ, FI0, RS переменной-записи STR.

В случае, когда необходимо обратиться к полю записи, являющейся подструктурой другого поля записи (вложенность полей) уточнение имени поля обращения осуществляется через еще одну точку. Например, A.B.C.

Пример: сведения о результатах экзаменов

Ф. И. О. Номер зачетки Оценка экзамена по дисциплине
Математ. Физика Программиров. История
Иванов И.И.
Петров П.П.

 

 
 


Запись

 
 

 


Массив

записей

Данные таблицы могут быть объявлены в виде:

TYPE ST = RECORD {ОПРЕДЕЛЕНИЕ ТИПА ЗАПИСИ}

FI0 : STRING [20]; { Ф.И.О. }

NZ : 93100..93500; { номер зачетки }

OZ : ARRAY [1..4 ] OF BYTE; { поле – массив из четырех оценок}

END;

VAR EKZ : ARRAY [ 1 .. 25 ] OF ST; { массив записей типа ST }

Примеры обращения к элементам массива записей EKZ:

EKZ [ I ] . F10 – к фамилии I – ой строки таблицы;

EKZ [ I ] . OZ [J ] – к J – ой оценке I – ой строки таблицы.

Обращение к полям записи: X . DEN := 25 ; X . MES := APR ; X . GOD := 1991; Y [ I ] . GOD := 1993 ;

Пример копирования записи: X := Y [ I ] ;

Для упрощения обращения к элементам записи, а именно для обеспечения возможности обращения к элементам без составных имен, с помощью простых имен элементов записи существует оператор WITH(присоединить).

Форма оператора WITH:

WITHсписок имен – записей DO S ;

где S – один оператор, простой или составной (блок). Слово WITH означает, что после него до точки с запятой простого оператора или слова END составного оператора при обращении к полям переменных – записей из списка можно не указывать имя записи, а только имя поля.

Пример.

Type Date = Record

DEN : 1 .. 31 ; { поле интервального типа }

MES : (YAN, FEB, MAR, APR, MAY, IUN, { поле перечисляемого }

IUL, AUG, SEN, OKT, NOV, DEC ); { типа }

GOD : 1900 .. 2000;

END ;

VAR X : DATE ; { переменная типа DATE }

Y : ARRAY [ 1 .. 12 ] OF DATE ; { массив типа DATE }

Begin

..........................................................................

With Y[I] Do If Den > 15 Then Write (‘ Вторая половина месяца’) ;

Данная строка в программе означает, что из I – ой строки массива записей типа Date выбирается содержимое поля Den и сравнивается с числом 15. Если оно больше 15, то будет напечатано – «Вторая половина месяца».

Вариантные записи

В списке полей записи могут быть фиксированные поля и одно переменное (вариантное) поле. Вариантная часть записи должна быть в конце описания, т.е. в качестве последнего ее элемента. В описании записи перечисляются все возможные варианты переменного поля записи. При работе с записью в зависимости от значения селектора записи (ключа) выбирается один из вариантов переменного поля записи.

Переменная часть записи может быть представлена в одной из двух форм:

Форма 1: TYPE SEL = тип ; { описание типа переменной селектора (ключа)}

RECORD { описание фиксированной части записи}

CASE SEL OF

Метка 1 : (список полей);

Метка 2 : (список полей);

……………………

END ;

Форма 2: TYPE SEL = тип ; { описание типа переменной селектора (ключа)}

RECORD { описание фиксированной части записи}

CASE PR : WORD OF

Метка 1 : (список полей);

Метка 2 : (список полей);

……………………

END ;

SEL – имя типа ключа PR и меток для выбора варианта. PR – имя переменной – селектора (ключа) выбора варианта, оно должно получить значение до использования вариантной части записи. Элемент списка полей – это список идентификаторов полей: тип; элементы списка полей, разделенных точкой с запятой.

Ограничения:

1) в описании записи может быть только одна вариантная часть;

2) все идентификаторы в списках полей одной записи должны быть различны, но на разных уровнях вложенности полей одной записи и в разных записях имена могут повторяться;

3) вариантная часть записи должна быть последним ее элементом.

Тип SEL должен определять перечисляемый тип переменной. Для выбора одного из вариантных полей значениями этого типа должны быть метки, стоящие перед списками вариантных полей. Переменной (PR) этого типа в программе можно присваивать значения ее типа (SEL) и таким образом выбирать один из вариантов полей вариантной записи.

Ключ выбора в предложении CASE..OF фактически игнорируется компилятором: единственное требование, предъявляемое к нему Турбо Паскалем, состоит в том, чтобы ключ определял некоторый стандартный или порядковый тип. Причем сам этот тип никак не влияет ни на количество следующих далее вариантных полей, ни даже на характер констант выбора.

Пример 1.

TYPE VID = ( KNIG, GAZ, GUR ) ; { VID – перечисляемый тип, являющийся именем и типом селектора }

IZDANIE = RECORD { тип вариантной записи }

AVTOR, NAIM, : STRING ;

CASE VID OF

KNIG : (GODIZD : 1900 .. 2004; IZDAT : STRING) ;

GAZ : ( NM : 1 .. 365 ; REDAKTOR : STRING ) ;

GUR : ( NOM : 1 .. 12 ; GOD : 1900 .. 2004 ) ;

END ;

VAR V : VID ; {переменная типа VID }

K : ARRAY ( 1 .. 50 ) OF IZDANIE ; { массив записей }

BEGIN

WITH K [ 5 ] DO { присоединение к пятой записи массива К }

BEGIN { заполнение пятой записи }

AVTOR := ‘ А. Гусева’ ;

NAIM := ‘Учимся информатике ‘ ;

V := KNIG ; { установлено значение варианта }

GODIZD := 2001 ;

IZDAT := ЗАО «ДИАЛОГ – МИФИ» ;

END ;

END .

 

Пример 2.

TYPE VID = ( KNIG, GAZ, GUR ) ; { VID – имя и тип селектора }

IZDANIE = RECORD { тип вариантной записи }

AVTOR, NAIM, : STRING ;

CASE V : VID OF { V – в составе записи IZDANIE }

KNIG : (GODIZD : 1900 .. 2004; IZDAT : STRING) ;

GAZ : ( NM : 1 .. 365 ; REDAKTOR : STRING ) ;

GUR : ( NOM : 1 .. 12 ; GOD : 1900 .. 2004 ) ;

END ;

VAR E : IZDANIE ; {переменная типа IZDANIE }

BEGIN { заполнение переменной Е }

E . AVTOR := ‘ А. Гусева’ ;

E . NAIM := ‘Учимся информатике ‘ ;

E . V := GUR ; { установлено значение варианта }

E . NOM := 10 ; { установлено значение номера }

E . GOD := 1988 ; { установлено значение года выпуска }

END .

Вывод. Громоздкость обозначений записей в программе с лихвой компенсируется большей наглядностью алгоритма за счет структуризации данных, гибкостью и удобством при описании различных свойств сложного объекта.