Aula 18: Records


Record

Na aula anterior aprendemos como armazenar variáveis do mesmo tipo num array. Bem organizado com um índice, tal como num armário de gavetas com na cada gaveta o mesmo tipo da informação. Se nós queremos juntar variáveis que não são do mesmo tipo, podemos fazer isto com um record.
 

Os três armários armazem coisas do mesmo
tipo, tal como os arrays. Por exemplo, o armário
esquerdo armazene "bytes", no meio é para
"integers" e o armário direito é para "reals".

 

O armário no centro está usado
para armazenar coisas do tipo misto.
Da mesma forma, um record é usado para
armazenar variáveis dos tipos diferentes,
integers, reals, or qualquer outro tipo,
na mesma caixa.


 
 Um record é uma colecção de variáveis do tipo misto


Declaração de um record


Uma visualização de um record, nonemademente uma colecção das variáveis. Cada variável dentro de um record chama-se um campo. Aqui temos 5 campos: um byte (b), um real (f), um boolean (c), um array simples de reals (r) e um array dobra de reals (m).

Para declarar um record usamos a seguinta
 

 Var name:
   record
       item1: type1; 
       item2: type2;
          |
       itemN: typeN;
   end;
com
name: o nome para o record inteiro.
item1..itemN: os nomes dos campos no record. Estes nomes seguem as mesmas regras para identificadores como as variáveis, constantes, procedures, etc. Nota que podemos pôr tanto campos como nos queremos, com qualquer combinação dos tipos.
type1..typeN: os tipos dos campos do record.

Como exemplo, a declaração de um record para armazenar informação de um aluno pode conter os campos name, year, e propinas:
 Var student:
   record
     name: string;
     year: integer;
     propinas: boolean; 
   end;
Este record só consegue armazenar a informação de um aluno. No entanto, com o saber da aula anterior (aula 17), é possível construir um array capaz de armazenar records de muitos alunos. vamos construir um array de 1000 alunos:
 
 Var students: array[1..1000] of 
   record
     name: string;
     year: integer;
     propinas: boolean;
   end;

Mais tarde vamos ver que é muito mais fácil fazer isto através a definição de um novo tipo da variável (see aula 19).


Usar um record

Para ter acesso a um record usamos o formato
 
 name.field 

Por exemplo, para atribuir valores ao record student podemos fazer o seguinte

  student.name := 'Peter Stallinga';
  student.year := 2002;
  student.propinas := TRUE;

ou no exemplo de um array de records students:

  i := 1055;
  students[i].name := 'Peter Stallinga';
  students[i].year := 2002;
  students[i].propinas := TRUE;

Nota a estrutura dos arrays de records. students é um array de records, portanto, students[i] é um dos elementos do array e, por isso, é um record. Se queremos atribuir um valor a um campo deste record usamos o ponto final e o nome do campo, então students[i].name é um string que conte o nome do aluno com número i.
Sintaxe errada seria students.name[i] (isto podemos usar se students for um único record que conte um campo name do tipo array)
Também errado: students.[i]name. Esta estrutura não faz sentido nenhum.

Outro exemplo:

  Var coordinate:
    record
      x: real;
      y: real;
    end;

  coordinate.x := 1.0;
  coordinate.y := 0.0;

Os campos do record coordinate não são dos tipos mistos, então in princípio é possível fazer isto com um array:

  Var coordinate: array[1..2] of real;

  coordinate[1] := 1.0;
  coordinate[2] := 0.0;

mas, a primeira versão tem preferência; com um record é mais legível.
Outro exemplo:

  Var address:
    record
      street: string;
      housenumber: integer;
      andar: integer;
      porta: char;
    end;

  address.street := 'Rua Santo Antonio';
  address.housenumber := 34;
  address.andar := 3;
  address.porta := 'E';

  writeln(address.street, '  ', address.housenumber);
  writeln(address.andar, address.porta);

No exemplo acima precisava de escrever muitas vezes a palavra "address". Para poupar tempo, em PASCAL existe a combinação "with recordname do", o que significa que na instrução a seguir (ou tudo entre "begin" e "end") as variáveis levam o recordname em frente. Por isso, o código acima pode  ser reescrivado na forma seguinta mais legível

  with address do
     begin
       writeln(street, '  ', housenumber);
       writeln(andar, porta);
     end;


Quick Test

Para testar o seu conhecimento, sobre o que aprendeu nesta aula, clique aqui para um teste on-line.

Peter Stallinga. Universidade do Algarve, 16 Abril 2002