MC102
Algoritmos e Programação de Computadores
Parte XVIII



Norton Trevisan Roman




TIPO SUBRANGE (INTERVALO)

Suponha que queremos um programa em que uma variável, v, só pode ter valores inteiros de 0 a 100. Poderíamos declarar:

  VAR v : integer;
	

mas isso permitiria que fizéssemos

  v := 1000;
	

o que não deveria ser permitido! Como fazemos para, então, limitar os valores que podemos atribuir à nossa variável?

  VAR v : 0..100;
	

O que fizemos aqui? Declaramos uma variável de um tipo especial, um intervalo, que vai de 1 a 100.

O tipo intervalo (subrange) é, na verdade, um subintervalo de algum tipo do Pascal. No exemplo acima, como 0 e 100 são inteiros, é um intervalo de 0 a 100 de inteiros. De fato, podemos ter intervalos de qualquer tipo padrão do Pascal, exceto real, desde que o tipo permita valores seqüenciais ('a', 'b' etc, 0, 1 etc). Então, podemos ter intervalos do tipo:

  VAR v : 0..100;
      x : 'a'..'d';
      y : '5'..'9'; {note que são caracteres, não números}
	

Assim, de uma forma geral, um intervalo é representado da seguinte maneira:

  limite_inferior..limite_superior
	

note que não há espaços entre os limites e os "..".

Qual a vantagem do uso de intervalo? Não cometemos erros de programação, como os abaixo:

  PROGRAM P;
  VAR x : 1..100;

  BEGIN
    x := 5;   {aceito}
    x := 0;   {erro de compilação}
    x := 200; {erro de compilação}
    x := 'a'; {erro de compilação}
    x := 3.24 {erro de compilação}
  END.
	

Assim, o uso de intervalos é mais uma técnica de auto-contenção usada pelo programador do que uma estrutura de dados mais elaborada.



TYPE

Suponha agora que, em vez de sempre digitarmos 1..100 queremos dar um jeito de criar um tipo que represente esse intervalo. Como faremos?

  PROGRAM P;
  TYPE intervalo = 1..100;
  VAR x : intervalo;

  BEGIN
    x := 10;
    x := x + 5*x
  END.
	

Pronto! Repare na sintaxe:

  TYPE nome_do_tipo_criado = o tipo;
	

Assim, o que fizemos foi criar um tipo novo, chamado intervalo, que é um intervalo de 1 a 100 de inteiros. Esse tipo pode ser usado normalmente como qualquer outro tipo do Pascal. Assim conseguimos criar tipos diferentes de real, boolean, integer e char. Por exemplo:

  PROGRAM Exemplo;
  TYPE LetraMai = 'A'..'Z';
       Digito   = '0'..'9'; {note que é caracter}
       hora     = 1..24;

  VAR inicial : LetraMai;
      tempo   : Hora;
      num     : Digito
	

Agora a pergunta é: precisamos mesmo usar TYPE? Não! Como vimos acima, podemos definir direto na declaração da variável, sem precisar de TYPE. Então, qual a vantagem de declararmos um tipo novo com TYPE?

Bem, antes de mais nada, o fato de eu poder dar nome aos meus tipos deixa o programa mais legível, de mais fácil compreensão e, dependendo da estrutura de dados que o tipo criado representa, o uso de TYPE pode poupar tempo de programação.

Mas essa não é a principal vantagem de TYPE. A grande vantagem deste está no retorno de funções e na passagem de parâmetros para funções e procedimentos. Uma característica da linguagem Pascal é que NÃO posso definir procedimentos e funções como os abaixo:

  PROGRAM Exemplo;

  PROCEDURE P(x : 1..20);
  BEGIN
    ...
  END;

  FUNCTION F1(x : 1..20);
  BEGIN
    ...
  END;

  FUNCTION F2(y : integer) : 1..20;
  BEGIN
    ...
  END;

  BEGIN
    ...
  END.
	

Já se eu der nome ao meu intervalo, com TYPE, o compilador ACEITA:

  PROGRAM Exemplo;
  TYPE intervalo = 1..20;

  PROCEDURE P(x : intervalo);
  BEGIN
    ...
  END;

  FUNCTION F1(x : intervalo) : integer;
  BEGIN
    ...
  END;

  FUNCTION F2(y : integer) : intervalo;
  BEGIN
    ...
    F2 := 15 {se não estiver no intervalo 1..20, o compilador reclama}
  END;

  BEGIN
    ...
  END.
	

Mas por que ele não aceita da primeira forma e aceita da segunda se as duas são equivalentes? Porque em Pascal somente nomes de tipos podem aparecer nos parâmetros de procedimentos e funções. Assim, para fazer nosso programa rodar, temos que dar nome aos tipos diferentes de Integer, Real, Char e Boolean (há outros, variações destes 4 básicos).





‹— Parte XVIIPágina da disciplinaParte XIX —›