Pascal - Records
Arrays Pascal permitem definir o tipo de variáveis que podem conter vários itens de dados do mesmo tipo, mas um registro é outro tipo de dados definido pelo usuário disponível em Pascal que permite combinar itens de dados de diferentes tipos.
Os registros consistem em campos diferentes. Suponha que você queira acompanhar seus livros em uma biblioteca, você pode querer acompanhar os seguintes atributos sobre cada livro -
- Title
- Author
- Subject
- ID do livro
Definindo um Registro
Para definir um tipo de registro, você pode usar a instrução de declaração de tipo. O tipo de registro é definido como -
type
record-name = record
field-1: field-type1;
field-2: field-type2;
...
field-n: field-typen;
end;
Esta é a maneira como você declararia o registro do livro -
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;
As variáveis de registro são definidas da maneira usual como
var
r1, r2, ... : record-name;
Alternativamente, você pode definir diretamente uma variável 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;
Acessando Campos de um Registro
Para acessar qualquer campo de um registro, usamos o operador de acesso de membro (.). O operador de acesso de membro é codificado como um período entre o nome da variável de registro e o campo que desejamos acessar. A seguir está o exemplo para explicar o uso da estrutura -
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.
Quando o código acima é compilado e executado, ele produz o seguinte 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
Você pode passar um registro como um argumento de subprograma de maneira muito semelhante à que passa qualquer outra variável ou ponteiro. Você acessaria os campos de registro da mesma forma que acessou no exemplo acima -
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.
Quando o código acima é compilado e executado, ele produz o seguinte 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
Indicadores para registros
Você pode definir ponteiros para registros de maneira muito semelhante à de definir ponteiros para qualquer outra variável da seguinte maneira -
type
record-ptr = ^ record-name;
record-name = record
field-1: field-type1;
field-2: field-type2;
...
field-n: field-typen;
end;
Agora, você pode armazenar o endereço de uma variável de tipo de registro na variável de ponteiro definida acima. Para declarar uma variável do tipo de ponteiro criado, você usa a palavra-chave var -
var
r1, r2, ... : record-ptr;
Antes de usar esses ponteiros, você deve criar armazenamento para uma variável do tipo nome de registro, que será manipulada por esses ponteiros.
new(r1);
new(r2);
Para acessar os membros de um registro usando um ponteiro para esse registro, você deve usar o ^. operador da seguinte forma -
r1^.feild1 := value1;
r1^.feild2 := value2;
...
r1^fieldn := valuen;
Finalmente, não se esqueça de descartar o armazenamento usado, quando não estiver mais em uso -
dispose(r1);
dispose(r2);
Vamos reescrever o primeiro exemplo usando um ponteiro para o registro Books. Espero que seja fácil para você entender o conceito -
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.
Quando o código acima é compilado e executado, ele produz o seguinte 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
A declaração com
Discutimos que os membros de um registro podem ser acessados usando o operador de acesso de membro (.). Desta forma, o nome da variável de registro deve ser escrito todas as vezes. oWith declaração fornece uma maneira alternativa de fazer isso.
Observe o seguinte snippet de código retirado do nosso primeiro exemplo -
(* book 1 specification *)
Book1.title := 'C Programming';
Book1.author := 'Nuha Ali ';
Book1.subject := 'C Programming Tutorial';
Book1.book_id := 6495407;
A mesma tarefa pode ser escrita usando o With declaração como -
(* book 1 specification *)
With Book1 do
begin
title := 'C Programming';
author := 'Nuha Ali ';
subject := 'C Programming Tutorial';
book_id := 6495407;
end;