Estos son tipos definidos por el usuario, por lo que se debe crear primero el tipo, utilizando la palabra reservada type.
Tanto el subintervalo como el enumerado son tipos de datos ordinales. Es decir, los valores que adopten las variables de alguno de estos tipos tendrán un predecesor y un sucesor, que pueden obtenerse con las funciones pred(valor) y succ(valor).
Subintervalo
Este tipo de dato es simple (ya que cada variable sólo contendrá un valor) pero definido por el usuario. Lo que el usuario define, en este caso, es el rango de valores que una variable puede adoptar.
Sólo puede establecerse un subrango de datos ordinales, donde se determina el menor valor del rango y el mayor. Siempre se debe recordar que al primer valor del rango no puede aplicársele la función pred(valor), ya que esto daría un error. Lo mismo sucede con el último valor del rango y la función succ(valor).
Por ejemplo, si se necesitara una variable que almacene dígitos entre el 0 y el 9, se podría definir un tipo subrango, al que hemos llamado digito, de la siguiente forma:
type digito = 0 .. 9;
Los subrangos brindan su utilidad en la creación de datos de tipo array, para la manipulación de índices.
Enumerado
En este caso el programador especifica, uno a uno, los valores que puede adoptar el dato. Este tipo se convertirá en un tipo de dato ordinal, siendo el orden en que sean definidos los valores lo que determinará su posición. El primer valor asignado recibirá el número de orden 0, el siguiente el 1, luego el 2, etc. La sintaxis requiere que los valores sean encerrados entre paréntesis y separados por coma. Por ejemplo, para crear un tipo de dato llamado presidente que permita almacenar como valores los nombres de los primeros cinco presidentes de Argentina, se utiliza la siguiente sintaxis:
type presidente = (Rivadavia, Urquiza, Derqui, Mitre, Sarmiento);
Así, una variable de tipo presidente puede adoptar uno de los cinco valores definidos. En el ejemplo, Rivadavia adopta la posición 0, Urquiza la posición 1, Derqui la 2, Mitre la 3 y Sarmiento la 4.
Para asignar un valor a una variable de este tipo, puede utilizarse la asignación directa o la asignación mediante el número de orden. Un ejemplo de lo primero (utilizando una variable llamada procer, de tipo presidente) sería el siguiente:
procer:=Derqui;
Sabiendo que cada valor posible de un dato de un tipo enumerado tiene una correspondencia numérica con su posición, otra opción es asignar a la variable el valor correspondiente a su número de orden. Esto es:
procer:=presidente(2);
Esto asigna el valor ‘Derqui’ a la variable procer (ya que ese es el valor correspondiente a la posición 2). Debe tenerse en cuenta que los datos contenidos en una variable de tipo enumerado no pueden leerse ni escribirse directamente. Es decir, dada la variable llamada procer de tipo presidente, la siguiente sintaxis es inválida:
writeln(procer)
Para poder leer el contenido de una variable de tipo enumerado se deberá utilizar otra forma. Por ejemplo, se puede utilizar una estructura de selección case:
case procer of
Rivadavia: writeln('Rivadavia');
Urquiza: writeln('Urquiza');
Derqui: writeln('Derqui');
Mitre: writeln('Mitre');
Sarmiento: writeln('Sarmiento');
end;
Para conocer el número de orden que corresponde a un determinado valor es posible utilizar la función ord, que devuelve un número entero, de la siguiente forma:
posicion:=ord(Mitre);
Suponiendo que la variable posicion es de tipo integer, se asigna a la misma el número 3, correspondiente al valor “Mitre” del tipo enumerado definido anteriormente.
También pueden obtenerse los valores anterior y siguiente a un valor enumerado determinado. Esto se logra con las funciones pred y succ:
anterior:=pred(procer);
siguiente:=succ(procer);
En este caso, las variables anterior y siguiente son del tipo presidente definido con anterioridad y, suponiendo que procer contiene el valor “Urquiza”, correspondiente a la posición 1, los valores que se almacenarán en ellas serán: Rivadavia (posición 0) en anterior y Derqui (posición 2) en siguiente. Algo importante a considerar es que el valor en la posición 0 no tiene antecesor y el valor en la última posición no tiene sucesor.
Incluso, podría crearse un subrango de un tipo enumerado. Por ejemplo:
type
dias = (lunes,martes,miercoles,jueves,viernes,sabado,domingo);
laborables = lunes .. viernes;
finDeSemana = sabado .. domingo;