16 septiembre 2014

Pascal - 4d2: Datos enumerados

4.4.2. Datos enumerados

Podemos crear nuestros propios tipos de datos enumerados, detallando todos los valores que puede tomar una variable, así:
 
var dia: (Lunes, Martes, Miercoles, Jueves, Viernes,
  Sabado, Domingo);
 
Podemos asignar uno de esos valores a la variable (sin comillas, porque no son cadenas de texto), comprobar un valor, o incluso avanzar de un valor al siguiente con "succ" (sucesor) y retroceder al que le precede con "prec" (precedente):
(* ENUMERADO1.PAS, Variables enumeradas  *)
(* Parte de CUPAS5, por Nacho Cabanes    *)
 
program Enumerado1;
 
var
  dia: (Lunes, Martes, Miercoles, Jueves, Viernes,
  Sabado, Domingo);
 
begin
    dia := Lunes;
 
    if (dia = Martes) then
        writeLn('El dia es Martes')
    else
        writeLn('No es Martes');
 
    dia := succ( dia );
 
    if (dia = Martes) then
        writeLn('Ahora el dia es Martes')
    else
        writeLn('Aun no es Martes')
end. 
 
(* Resultado:
No es Martes
Ahora el dia es Martes
*)
 
También se puede saber el "número de orden", con la función "ord". Por ejemplo, "ord(Lunes)" valdría 1, porque es el primer dato de la lista. De igual modo, podríamos recorrer todos los valores posibles usando "for": "for dia := Lunes to Viernes do ..."
En algunos compiladores, como Free Pascal (pero no Turbo Pascal, ni siquiera en su versión 7), se nos permite mostrar en pantalla el valor de un dato enumerado, y habitualmente lo que ocurrirá es que se mostrará la cadena de texto equivalente, como en este ejemplo:
(* ENUMERADO2.PAS, Variables enumeradas  *)
(* Visualizacion (solo Free Pascal)      *)
(* Parte de CUPAS5, por Nacho Cabanes    *)
 
program Enumerado2;
 
var
  dia: (Lunes, Martes, Miercoles, Jueves, Viernes,
  Sabado, Domingo);
 
begin
    dia := Lunes;
 
    if (dia = Lunes) then
        writeLn('El dia es ', dia);
 
    dia := succ( dia ); { Avanzamos un dia }
    writeLn('Ahora el dia es ', dia);
end. 
 
(* Resultado:
El dia es Lunes
Ahora el dia es Martes
*)
 
Pero Free Pascal llega más allá, nos permite incluso introducir valores mediante teclado para una variable enumerada (nuevamente, esta posibilidad no existe en Turbo Pascal):
(* ENUMERADO3.PAS, Variables enumeradas  *)
(* Lectura desde teclado (Free Pascal)   *)
(* Parte de CUPAS5, por Nacho Cabanes    *)
 
program Enumerado3;
 
var
  dia1, dia2: (Lunes, Martes, Miercoles, Jueves, Viernes,
  Sabado, Domingo);
 
begin
    dia1 := Lunes;
    writeLn('Introduce un dia: ');
    readLn(dia2);
 
    if (dia1 = dia2) then
        writeLn('El dia es ', dia1)
    else
    begin
        writeLn('Mi dia es ', dia1);
        writeLn('Y el tuyo es ', dia2);
    end;
end. 
 
(* 
Ejemplo de ejecucion 1:
Introduce un dia: 
lunes
El dia es Lunes
 
Ejemplo de ejecucion 2:
Introduce un dia: 
martes
Mi dia es Lunes
Y el tuyo es Martes
*)
 
En compiladores más antiguos, deberemos usar otros tipos de datos (números, caracteres o cadenas de texto) para interactuar con el usuario, y convertirlos posteriormente al tipo enumerado dentro de nuestro programa, empleando "if" o "case".