Aula 19: Definir novos tipos


Type

Às vezes é bom declarar um novo tipo de variável para usar mais tarde no programa. Para manter o código mais legível, ou para evitar escrever o mesmo código muitas vezes. Definir um novo tipo de variável é assim:
 
 Type typename = description

com typename o nome que queremos dar ao novo tipo e decription a descrição do novo tipo que pode incluir qualquer combinação (arrays e records) de tipos de variáveis ou tipos simples. Pode também ser um tipo apontador que nós vamos aprender na aula seguinta (aula 20).

Exemplos:

 Type float = real;
Isto é util para programadores que prefirem (ou costumam) programar na linguagem C. Depois este declaração, será possível a utilização das variáveis do tipo float, como em C.
Mais exemplos:

 Type realarray = array[1..10] of real;

 Type myrecord =
   record
     name: string;
     length: real;
     width: real;
     height: real;
   end;

Nota que definir um novo tipo não vai criar uma nova variável! Não vai reservar espaço na memória e não atribue um valor a uma variável. Só vai especificar ao compilador um novo tipo da variável que nós podemos usar mais tarde numa declaração de uma nova variável.
 

... definir novas caixas para as variáveis.

Usar o novo tipo

Após a especificação do novo tipo, podemos declarar uma nova variável deste tipo:
 
 Var varname: typename

com varname o nome da nova variável, e typename o tipo. Este declaração é exactamente igual à declaração das variáveis normais da aula 5. Só que agora podemos usar os nossos novos tipos.

Exemplos:

 Var f: float;
Isto (agora) é muito parecido com a linguagem C (em C seria "float f")

 Var ra: realarray;
vai declarar uma variável do tipo realarray. E no código podemos usar este novo array, por exemplo
 ra[1] := 2.68;
Isto é equivalente com
 Var ra: array[1..10] of real;
 ra[1] := 2.68;

O útlimo exemplo
 Type myrecord =
   record
     name: string;
     length: real;
     width: real;
     height: real;
   end;
 Var mydata: array[1..100] of myrecord;
 mydata[23].length := 3.1;


Mais exemplos

PROGRAM WithTypeDefinition;

Type ra = array[1..6] of integer;
Var x: ra;
    y: array[1..7] of integer;

FUNCTION AreEqual(r: ra): boolean;
(* Nota que o novo tipo pode também ser usado para os parametros *)
begin
  if r[1]=r[2] then
    AreEqual := TRUE;
  else
    AreEqual := FALSE;
end;

begin
  x[1] := 1;
  x[2] := 0;
  WriteLn(AreEqual(x));
  y[1] := 1;
  y[2] := 0;
   (* A seguinta linha de código não é permitido, porque o tipo de y e o tipo que a função 'AreEqual' está a esperar são diferente. Nota a diference no tamanho dos arrays. *)
  WriteLn(AreEqual(y));
end.



PROGRAM WithTypeDefinition;

Type time =
  record
    hour, minute, second: integer;
  end;

PROCEDURE ShowTime(t: time);
  (* Vai mostrar o tempo no formato h:m.s *)
begin
  WriteLn(t.hour, ':', t.minute, '.', t.second);
end;

Var atime: time;

begin
  atime.hour := 23;
  atime.minute := 16;
  atime.second := 9;
  ShowTime(atime);
end.



um record de records:

Type date =
  record
    day, month, year: integer;
  end;
Type time =
  record
    hour, minute, second: integer;
  end;
Type dateandtime =
  record
    dattime: time;
    datdate: date;
  end;
Var x: datendtime;

x.dattime.hour := 1;

x é um record que contem dois campos. Um campo chama-se dattime o que é um record de três campos. Um destes campos é hour.


Mini Teste

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

Peter Stallinga. Universidade do Algarve, 18 Abril 2002