Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Чернов Шафеева.doc
Скачиваний:
47
Добавлен:
21.05.2015
Размер:
1.39 Mб
Скачать

2.8.10. Записи

Запись  описание комбинированного типа, состоящее из нескольких полей, каждое из которых имеет свой тип.

Структура записи аналогична таблице.

Записи состоят из фиксированного числа компонентов, называемых полями записи. В отличие от массива компоненты (поля) записи могут быть различного типа. Структура объявления типа "запись" имеет вид

TYPE

<ИмяТипа>=RECORD

<поле1>:<тип поля1>;

<поле2>:<тип поля2>;

...

<полеN>:<тип поляN>

end;

Если тип нескольких полей совпадает, то имена полей можно перечислить через запятую. <ИмяТипа> и поля являются правильными идентификаторами.

Например:

TYPE

DENROGD=RECORD

name:string; {фамилия или имя }

den,mes:byte; {день, месяц}

god:word {год}

end;

Объявление переменных производится, как и для других типов, в разделе VAR:

VAR a,b:DENROGD;

Доступ к каждой компоненте записи производится указанием состав­ного имени: имени переменной и затем через точку имени поля, например:

a.name := 'MARINA';

a.god := 1981;

a.den: = 23;

a.mes := 3;

Таким образом, в типе "запись" определена операция присваивания. Кроме того, как и в массиве, все значения переменных типа "запись" можно присваивать другим переменным того же типа: B := A; .

Над полями можно выполнять действия, разрешенные для базового типа:

b.god:=а.god+1; {на год старше}.

В качестве переменной может быть объявлен массив записей:

VAR s: array[1..20] of STUDENT;

Пример. Разработать программу формирования списка студентов с указанием дат рождения. Распечатать список в алфавитном порядке.

Program zapis;

Type {определение нового типа}

student = record {запись}

name:string[15];

den, mes:byte;

god:word

end;

Var

Z: ARRAY [1..20] OF student;

k,m,i,n: byte;

r:string[15]; {вспомогательная строка для перестановки}

BEGIN

writeln('ВВЕДИТЕ КОЛИЧЕСТВО СТУДЕНТОВ');

READln(n);

for i:=1 to n do

begin

writeLN('ВВЕДИТЕ имя ',i,' студента с прописной буквы');

readLN (z[i].name);

WRITELN('ВВЕДИТЕ день рождения');

readLN(z[i].den);

WRITELN('ВВЕДИТЕ месяц рождения');

readLN(z[i].mes);

WRITELN('ВВЕДИТЕ год рождения');

readLN(z[i].god);

end;

for i:=n downto 2 do {********* Упорядочение списка *********]

begin {поиск "наибольшего" значения поля NAME}

m:=1;

for k:=2 to i do if z[k].name>z[m].name then m:=k;

r:=z[i].name; {перестановка записей}

z[i].name:=z[m].name;

z[m].name:=r

end; {**************************************}

writeln(' Упорядоченный список ');

for i:=1 to n do

begin

WRITE(z[i].name);

WRITELN(' Дата рождения:',z[i].den,'.',z[i].mes,'.',z[i].god);

end

END.

Для упрощения доступа к полям записи может использоваться оператор присоединения. Структура оператора имеет вид

WITH <переменнаяТипаЗапись> DO <оператор>;

где WITH, DO  ключевые слова (с, делать).

Пример: WITH a DO

begin

name:='MARINA';

god:=1981;

date:=23;

mes:=3

end;

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

Пример. Определим вложенную запись (запись в записи)

TYPE

STUDENT=RECORD

name:string;

DenRogden: RECORD

den,mes:byte;

god:word

end;

end;

VAR z: STUDENT;

Имя DenRogden в свою очередь тоже является записью, тогда обращение к вложенным полям выполняется в виде

z.name := 'LIZA';

z.DenRogden.god := 1984;

Используя оператор присоединения, к этим же полям можно получить доступ

другими способами:

WITH z DO

begin

name:='LIZA';

with DenRogden DO

god:=1984;

end;

или

WITH z DO name:='LIZA';

WITH Z DO with DenRogden DO god:=1984;

К полю GOD можно обратиться и следующим оператором

WITH z.DenRogden DO god:=1984;

Запись может иметь вариантную часть. Это означает, что можно за­дать в пределах одного типа несколько различных структур. Вариантная часть задается после перечисления фиксированных полей предложением CA­SE .. OF (не оператор CASE). Вариантная часть состоит из нескольких вариантов, каждый из которых определяется константой выбора, за кото­рой следует двоеточие и список полей с указанием типа:

TYPE

<имя типа> = RECORD

<поле1>:тип_поля1;

<поле2>:тип_поля2;

CASE <переменная_переключатель> OF

<константа_выбора1>: (<поле_c11>:<тип_поля_с11>;

<поле_с12>:<тип_поля_с12>;...)

<константа_выбора2>: (<поле с21>:<тип поля с21>;

<поле_с22>:<тип_поля_с22>;...)

. . .

<константа_выбораk>: (<поле_сk1>:<тип_поля ck1>;

<поле_ck2>:<тип поля_ck2>;...)

END;

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

В любой записи может быть только одна вариантная часть.

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

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

TYPE MESTO=(ob,dom);

VAR N: mesto;

TYPE

STUD=RECORD name := string;

DENROGD: RECORD

data: read;

god: word

END;

CASE N OF

dom: (indeks:word;adres:string)

ob: (komn:word)

END;

Var W: STUD;

В основном блоке программы при обращении к компонентам части CASE необходимо предусмотреть разветвление (операторами IF либо CASE). Пе­реключателю N присваивается соответствующее значение. В зависимости от значения переключателя переменная W, помимо полей name и dateRogd со­держит поля, которые соответствуют той константе выбора, с которой совпадает значение N. Далее выполняется операция с компонентой W.dom и W.ob.

Используя тип "запись", можно составить базы данных для разных назначений, а затем обрабатывать их с помощью программы [1-3].

Особенности комбинированного типа:

1. Любая запись может иметь только одну вариантную часть, она распола- гается последней в записи.

2. Среди идентификаторов полей не должно быть одинаковых.

3. Переменная-переключатель должна определяться некоторым стан­дартным или предварительно объявленным типом.

4. Перед засылкой информации в запись программист должен присво­ить переключателю определенное значение.

5. Турбо Паскаль допускает использование вложенных вариантных частей.