MC102 |
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).