Относится к структурированным типам данных (как и массив, файл, множество). Запись состоит из фиксированного числа компонентов, называемых полями записи. В отличие от массива, поля записи могут быть различных типов.
Описание записи обычно осуществляют с использованием оператора TYPE, т.е. сначала определяют тип-запись, а затем в разделе var описывают конкретную запись. Тип-запись описывается следующим образом:
type <имя типа> = record <поле1>: тип; <поле2>: тип; … <полеN>: тип; end;
Пример1:
type date = record day: 1..31; month: 1..12; year: integer; end; type person = record name: string[20]; age: integer; adres: string[50]; end; varbirthday: date;
day | month | year |
10 | 5 | 1980 |
student: person;
name | age | adres |
{Доступ к полям записи осуществляется указанием имени записи и имени поля через точку:} birthday.day:=10; birthday.month:=5; birthday.year:=1980;
Пример 2:
type detal = record name: string[20]; kod: integer; weight: real; end; var d: detal; Begin … d.name:='гайка'; d.kod:=155; d.weight:=0.057; … write('Деталь: ',d.name,' Код: ', d.kod,' Вес: ',d.weight); End.
Для того, чтобы не писать каждый раз имя записи при обращении к ее полям можно использовать оператор над записями WITH.
Структура оператора:
with <имя записи> do <оператор>;
обычно требуется begin…end;
В этом случае можно указывать только поле записи:
with birthday do begin day:=10; month:=5; year:=1980; end;
Поля записи могут быть любого типа, в том числе поле записи может быть тоже записью. В этом случае образуются вложенные записи.
Пример:
На практике часто используются не отдельные записи, а массивы записей. Рассмотрим использование массива записей на примере.
Пример 1: Программа, заполняющая экран точками различного цвета и стирающая их.
uses crt, graph; type point = record x,y: integer; color: byte; end; var gd,gm,i: integer; p: array [1..5000] of point; begin gd:=detect; initgraph (gd, gm, 'c:\tp6\bgi'); if graphresult <> 0 then begin write ('ошибка графики:', grapherrormsg (graphresult)); halt; end; randomize; for i:=1 to 5000 do with p[i] do begin x:=random(640); y:= random(350); color:= random(15)+1; putpixel (x,y,color); delay(50); end; for i:=1 to 5000 do begin putpixel(p[i].x, p[i].y,0); delay(50); end; end.
Пример 2: Программа создания библиотечного каталога и вывод на экран списка всех книг, изданных в указанном году.
usescrt;
uses crt; type book = record name: string; autor: string; year: string; str: string; end; var i, n, god: integer; ch: char; b: array [1..1000] of book; begin i:=0; repeat inc(i); with b[i] do begin write('название:'); readln(name); write('автор:'); readln(autor); write('год:'); readln(year); write('количество страниц:'); readln(str); end; write('Еще вводить? Y/N'); readln(ch); writeln; n:=i; until (upcase(ch)='N'); repeat{поиск в каталоге} write('Введите год'); readln(god); for i:=1 to n do if b[i].year=god then writeln(b[i].name, b[i].autor, b[i].year, b[i].str); writeln('Продолжить поиск? Y/N'); readln(ch); until (upcase(ch)='N'); end.
Кроме фиксированного списка полей, запись может содержать вариантную часть, определяющую несколько вариантов структуры записи. Различие может касаться количества полей и их типов.
Вариантная часть содержит несколько альтернатив, для каждой из которых в скобках указывается список полей, присущих данному варианту.
Например, в библиотечном каталоге хранятся не только книги, но и журналы. Кроме названия, для книг хранится автор, год издания и количество страниц, а для журналов – номер и год выпуска.
b.name:='Введение в Паскаль'; b.autor:='Абрамов В.И.'; b.year:=1980; b.str:=253;
или
b.name:='Мир ПК'; b.nomer:=2; b.god:=1998;
Вариантная часть может быть только одна и должна располагаться в конце записи. Она начинается со слова CASE, за которым следует переменная выбора варианта с указанием типа. Затем перечисляются варианты записи с указанием их полей.
В стандарте Паскаля перед тем, как использовать один из вариантов записи, переменной выбора варианта необходимо присвоить соответствующее значение. В Турбо-Паскале это делать необязательно (!).
case <переменная выбора>: тип of
вариант1:(поле1: тип;
поле2: тип;
…
полеN: тип);
вариант2:(поле1: тип;
поле2: тип;
…
полеK: тип);
Пример:
type izdanie = (book, magazine); zap = record name: string; case tip: izdanie of book:(autor: string; year: integer; str: integer); magazine: (nomer: byte; god: integer); end; var b: zap; begin if tip = book then writeln (b.name, b.autor, b.year, b.str) else writeln (b.name, b.nomer, b.god); end.
В запись с вариантами можно не вводить переменную выбора, перечислить только разные варианты.
type dostup = record case integer of 1: (one_word: word); 2: (byte1: byte; byte2: byte); end;