Учебники

Паскаль — Отчеты

Массивы Pascal позволяют вам определять тип переменных, которые могут содержать несколько элементов данных одного типа, но запись — это другой определенный пользователем тип данных, доступный в Pascal, который позволяет комбинировать элементы данных разных типов.

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

  • заглавие
  • автор
  • Предмет
  • ID книги

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

Чтобы определить тип записи, вы можете использовать оператор объявления типа. Тип записи определяется как —

type
record-name = record
   field-1: field-type1;
   field-2: field-type2;
   ...
   field-n: field-typen;
end;

Вот как бы вы объявили Книжную запись —

type 
Books = record
   title: packed array [1..50] of char;
   author: packed array [1..50] of char;
   subject: packed array [1..100] of char;
   book_id: integer;
end;

Переменные записи определяются обычным образом как

var
   r1, r2, ... : record-name;

Кроме того, вы можете напрямую определить переменную типа записи как —

var
Books : record
   title: packed array [1..50] of char;
   author: packed array [1..50] of char;
   subject: packed array [1..100] of char;
   book_id: integer;
end;

Доступ к полям записи

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

Live Demo

program exRecords;
type
Books = record
   title: packed array [1..50] of char;
   author: packed array [1..50] of char;
   subject: packed array [1..100] of char;
   book_id: longint;
end;

var
   Book1, Book2: Books; (* Declare Book1 and Book2 of type Books *)

begin
   (* book 1 specification *)
   Book1.title  := 'C Programming';
   Book1.author := 'Nuha Ali '; 
   Book1.subject := 'C Programming Tutorial';
   Book1.book_id := 6495407;

   (* book 2 specification *)
   Book2.title := 'Telecom Billing';
   Book2.author := 'Zara Ali';
   Book2.subject := 'Telecom Billing Tutorial';
   Book2.book_id := 6495700;
 
   (* print Book1 info *)
   writeln ('Book 1 title : ', Book1.title);
   writeln('Book 1 author : ', Book1.author);
   writeln( 'Book 1 subject : ', Book1.subject);
   writeln( 'Book 1 book_id : ', Book1.book_id);
   writeln; 

   (* print Book2 info *)
   writeln ('Book 2 title : ', Book2.title);
   writeln('Book 2 author : ', Book2.author);
   writeln( 'Book 2 subject : ', Book2.subject);
   writeln( 'Book 2 book_id : ', Book2.book_id);
end.

Когда приведенный выше код компилируется и выполняется, он дает следующий результат —

Book 1 title : C Programming
Book 1 author : Nuha Ali
Book 1 subject : C Programming Tutorial
Book 1 book_id : 6495407

Book 2 title : Telecom Billing
Book 2 author : Zara Ali
Book 2 subject : Telecom Billing Tutorial
Book 2 book_id : 6495700

Записи как аргументы подпрограммы

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

Live Demo

program exRecords;
type
Books = record
   title: packed array [1..50] of char;
   author: packed array [1..50] of char;
   subject: packed array [1..100] of char;
   book_id: longint;
end;

var
   Book1, Book2: Books; (* Declare Book1 and Book2 of type Books *)

(* procedure declaration *)
procedure printBook( var book: Books );

begin
   (* print Book info *)
   writeln ('Book  title : ', book.title);
   writeln('Book  author : ', book.author);
   writeln( 'Book  subject : ', book.subject);
   writeln( 'Book book_id : ', book.book_id);
end;

begin
   (* book 1 specification *)
   Book1.title  := 'C Programming';
   Book1.author := 'Nuha Ali '; 
   Book1.subject := 'C Programming Tutorial';
   Book1.book_id := 6495407;
   
   (* book 2 specification *)
   Book2.title := 'Telecom Billing';
   Book2.author := 'Zara Ali';
   Book2.subject := 'Telecom Billing Tutorial';
   Book2.book_id := 6495700;
   
   (* print Book1 info *)
   printbook(Book1);
   writeln; 

   (* print Book2 info *)
   printbook(Book2);
end.

Когда приведенный выше код компилируется и выполняется, он дает следующий результат —

Book 1 title : C Programming
Book 1 author : Nuha Ali
Book 1 subject : C Programming Tutorial
Book 1 book_id : 6495407

Book 2 title : Telecom Billing
Book 2 author : Zara Ali
Book 2 subject : Telecom Billing Tutorial
Book 2 book_id : 6495700

Указатели на записи

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

type
record-ptr = ^ record-name;
record-name = record
   field-1: field-type1;
   field-2: field-type2;
   ...
   field-n: field-typen;
end;

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

var
   r1, r2, ... : record-ptr;

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

new(r1);
new(r2);

Чтобы получить доступ к членам записи, используя указатель на эту запись, вы должны использовать ^. оператор следующим образом —

r1^.feild1 := value1;
r1^.feild2 := value2;
...
r1^fieldn := valuen;

Наконец, не забудьте утилизировать использованное хранилище, когда оно больше не используется —

dispose(r1);
dispose(r2);

Давайте перепишем первый пример, используя указатель на запись Книги. Надеюсь, вам будет легко понять концепцию —

Live Demo

program exRecords;
type
BooksPtr = ^ Books;
Books = record
   title: packed array [1..50] of char;
   author: packed array [1..50] of char;
   subject: packed array [1..100] of char;
   book_id: longint;
end;

var
  (* Declare Book1 and Book2 of pointer type that refers to Book type *)
   Book1, Book2: BooksPtr; 

begin
   new(Book1);
   new(book2);
   
   (* book 1 specification *)
   Book1^.title  := 'C Programming';
   Book1^.author := 'Nuha Ali '; 
   Book1^.subject := 'C Programming Tutorial';
   Book1^.book_id := 6495407;
   
   (* book 2 specification *)
   Book2^.title := 'Telecom Billing';
   Book2^.author := 'Zara Ali';
   Book2^.subject := 'Telecom Billing Tutorial';
   Book2^.book_id := 6495700;
   
   (* print Book1 info *)
   writeln ('Book 1 title : ', Book1^.title);
   writeln('Book 1 author : ', Book1^.author);
   writeln( 'Book 1 subject : ', Book1^.subject);
   writeln( 'Book 1 book_id : ', Book1^.book_id);
   
   (* print Book2 info *)
   writeln ('Book 2 title : ', Book2^.title);
   writeln('Book 2 author : ', Book2^.author);
   writeln( 'Book 2 subject : ', Book2^.subject);
   writeln( 'Book 2 book_id : ', Book2^.book_id);
   
   dispose(Book1); 
   dispose(Book2);
end.

Когда приведенный выше код компилируется и выполняется, он дает следующий результат —

Book 1 title : C Programming
Book 1 author : Nuha Ali
Book 1 subject : C Programming Tutorial
Book 1 book_id : 6495407

Book 2 title : Telecom Billing
Book 2 author : Zara Ali
Book 2 subject : Telecom Billing Tutorial
Book 2 book_id : 6495700

С заявлением

Мы обсудили, что к членам записи можно получить доступ с помощью оператора доступа к члену (.). Таким образом, имя переменной записи должно быть записано каждый раз. Оператор With предоставляет альтернативный способ сделать это.

Посмотрите на следующий фрагмент кода, взятый из нашего первого примера —

   (* book 1 specification *)
   Book1.title  := 'C Programming';
   Book1.author := 'Nuha Ali '; 
   Book1.subject := 'C Programming Tutorial';
   Book1.book_id := 6495407;

Такое же назначение может быть записано с использованием оператора With, как —