DMarlon Studio

Lección 17 · 17 de 20

Enumerados y conjuntos · Pascal

Defina tipos enumerados y conjuntos en Pascal: los días de apertura de una tienda con in, Include, Exclude, Ord, Succ y la intersección.

Pascal · Enumerados y conjuntos en DMarlon Studio: el código del ejemplo y su salida en la terminal

Un tipo enumerado es una lista ordenada de nombres: TDay = (Mon, Tue, ...). Es más claro que usar números para los días, y el compilador no deja mezclarlo con otros tipos. Free Pascal escribe su nombre con WriteLn: Wed.

Cada valor tiene una posición, que empieza en 0: `Ord(Wed)` es 2. `Succ` da el siguiente y `Pred`, el anterior. Como son ordinales, sirven de contador en un for y de opción en un case.

Un conjunto (set of TDay) guarda algunos de esos valores, sin orden y sin repetirlos. [Mon..Fri] son los días laborables; `Include` añade el sábado y `Exclude` quita el miércoles. `in` pregunta si un valor está dentro: Sun in open es FALSE.

Con los conjuntos se opera: + es la unión, - la diferencia y * la intersección. open * [Sat, Sun] da los días del fin de semana en que abre la tienda, y `for ... in` los recorre uno a uno.

Los conjuntos de Char son muy prácticos para clasificar caracteres: c in ['a', 'e', 'i', 'o', 'u'] dice si c es una vocal. for c in también recorre una cadena letra a letra.

Código · main.pas

program main;type  TDay = (Mon, Tue, Wed, Thu, Fri, Sat, Sun);  // an enumerated type  TDays = set of TDay;var  day: TDay;  open: TDays;  c: Char;  vowels: Integer;begin  day := Wed;  WriteLn(day, ' is at position ', Ord(day), '; the next day is ', Succ(day));  // A set holds some of those values, without order or repeats.  open := [Mon..Fri];  Include(open, Sat);  Exclude(open, Wed);  for day := Mon to Sun do    if day in open then      Write(day, ' ');  WriteLn;  WriteLn('Open on Sunday? ', Sun in open);  for day in open * [Sat, Sun] do  // * is the intersection    WriteLn('Open at the weekend: ', day);  // Sets of Char make quick character tests.  vowels := 0;  for c in 'free pascal compiler' do    if c in ['a', 'e', 'i', 'o', 'u'] then      Inc(vowels);  WriteLn('Vowels: ', vowels);end.

Salida · fpc main.pas && ./main

Wed is at position 2; the next day is Thu
Mon Tue Thu Fri Sat 
Open on Sunday? FALSE
Open at the weekend: Sat
Vowels: 7

Para recordar

  • (A, B, C) define un tipo enumerado.
  • Ord, Succ y Pred dan la posición, el siguiente y el anterior.
  • set of T guarda valores sin orden ni repeticiones.
  • in, Include, Exclude, +, - y * trabajan con conjuntos.

Ejercicio

Cree un tipo TTopping = (Cheese, Ham, Mushrooms, Olives, Pepper) y un conjunto con los ingredientes de una pizza; escriba los que lleva y, con -, los que le faltan para llevarlos todos.