8.1 Определение записи

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

Описание записи обычно осуществляют с использованием оператора 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.

8.2 Оператор над записями

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

Структура оператора:

with <имя записи> do <оператор>;

обычно требуется begin…end;

В этом случае можно указывать только поле записи:

 with birthday do
  begin
    day:=10;
    month:=5;
    year:=1980;
  end;

8.3 Вложенные записи

Поля записи могут быть любого типа, в том числе поле записи может быть тоже записью. В этом случае образуются вложенные записи.

Пример:

 

8.4 Массив записей

На практике часто используются не отдельные записи, а массивы записей. Рассмотрим использование массива записей на примере.

 

Пример 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.

8.5 Записи с вариантами

Кроме фиксированного списка полей, запись может содержать вариантную часть, определяющую несколько вариантов структуры записи. Различие может касаться количества полей и их типов.

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

Например, в библиотечном каталоге хранятся не только книги, но и журналы. Кроме названия, для книг хранится автор, год издания и количество страниц, а для журналов – номер и год выпуска.

 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;