Pascal - Records

Las matrices de Pascal le permiten definir el tipo de variables que pueden contener varios elementos de datos del mismo tipo, pero un registro es otro tipo de datos definido por el usuario disponible en Pascal que le permite combinar elementos de datos de diferentes tipos.

Los registros constan de diferentes campos. Suponga que desea realizar un seguimiento de sus libros en una biblioteca, es posible que desee realizar un seguimiento de los siguientes atributos sobre cada libro:

  • Title
  • Author
  • Subject
  • ID del libro

Definición de un registro

Para definir un tipo de registro, puede utilizar la declaración de declaración de tipo. El tipo de registro se define como:

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

Esta es la forma en que declararía el registro del Libro:

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;

Las variables de registro se definen de la forma habitual como

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

Alternativamente, puede definir directamente una variable de tipo de registro como:

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;

Acceso a los campos de un registro

Para acceder a cualquier campo de un registro, utilizamos el operador de acceso de miembros (.). El operador de acceso a miembros se codifica como un período entre el nombre de la variable de registro y el campo al que deseamos acceder. A continuación se muestra el ejemplo para explicar el uso de la estructura:

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.

Cuando se compila y ejecuta el código anterior, produce el siguiente resultado:

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

Registros como argumentos de subprograma

Puede pasar un registro como un argumento de subprograma de una manera muy similar a como pasa cualquier otra variable o puntero. Accederá a los campos de registro de manera similar a como lo hizo en el ejemplo anterior:

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.

Cuando se compila y ejecuta el código anterior, produce el siguiente resultado:

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

Punteros a récords

Puede definir punteros a registros de manera muy similar a como define puntero a cualquier otra variable de la siguiente manera:

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

Ahora, puede almacenar la dirección de una variable de tipo de registro en la variable de puntero definida anteriormente. Para declarar una variable del tipo de puntero creado, usa la palabra clave var -

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

Antes de usar estos punteros, debe crear almacenamiento para una variable de tipo de nombre de registro, que será manipulada por estos punteros.

new(r1);
new(r2);

Para acceder a los miembros de un registro usando un puntero a ese registro, debe usar ^. operador de la siguiente manera:

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

Por último, no olvide desechar el almacenamiento usado, cuando ya no esté en uso.

dispose(r1);
dispose(r2);

Reescribamos el primer ejemplo usando un puntero al registro de Libros. Espero que esto le resulte fácil de entender el concepto:

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.

Cuando se compila y ejecuta el código anterior, produce el siguiente resultado:

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

La declaración con

Hemos comentado que se puede acceder a los miembros de un registro mediante el operador de acceso de miembros (.). De esta forma, el nombre de la variable de registro debe escribirse cada vez. losWith La declaración proporciona una forma alternativa de hacerlo.

Mire el siguiente fragmento de código tomado de nuestro primer ejemplo:

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

La misma tarea se puede escribir utilizando el With declaración como -

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