Aula 18: Records |
Os três armários armazem coisas do mesmo
|
O armário no centro está usado
|
Um record é uma colecção de variáveis do tipo misto. |
|
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; |
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; |
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).
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;