UNIVERSIDAD TECNICA FEDERICO SANTA MARIA DEPARTAMENTO DE ELECTRONICA Programación en Pascal Capítulo 20. Conjuntos. Set. 20. CONJUNTOS. SET. 20.1. Valores. Un tipo de datos especifica el conjunto de valores que una variable de ese tipo puede adoptar. El tipo conjunto es estructurado a partir de un tipo base; el tipo base debe ser de enumeración o subrango. El tipo conjunto define el conjunto de valores que es el conjunto potencia de su base. Es decir, el conjunto de todos los posibles conjuntos que consisten de elementos tomados del tipo base. Ejemplo: type base = 0..1; conjunto = set of base; Entonces los valores de conjunto son los conjuntos: []; [0]; [1]; [0,1]; Donde [] es el conjunto vacío. 20.2. Sintaxis. <definición de tipo conjunto> ::= 'type' <nombre conjunto> '=' 'SET OF' <tipo base> <valores de tipo conjunto> ::= '[' {(<vacío> |<expresión> ['..' <expresión>])* ','} ']' Las expresiones deben ser del tipo base. Prof. Leopoldo Silva Bijit. 07-07-2003 255 UNIVERSIDAD TECNICA FEDERICO SANTA MARIA DEPARTAMENTO DE ELECTRONICA Programación en Pascal Capítulo 20. Conjuntos. Set. Un valor de tipo conjunto es una variedad de factor en la sintaxis general de expresión. La construcción de un conjunto se efectúa por la enumeración de sus elementos, separados por comas y encerrados entre paréntesis cuadrados. Los conjuntos deben contener constantes, del tipo base, solamente. Normalmente está limitada la cardinalidad de los conjuntos, a un número pequeño; generalmente el número de bits en una palabra del computador. Suele ser 16 ó 32. Si bien estas reglas reducen la generalidad del concepto, la definición de este tipo favorece la abstracción de situaciones típicas basadas en el concepto matemático de conjunto. Normalmente simplifican el planteo de condiciones complicadas (en caso que no se usen conjuntos). Usualmente los conjuntos se representan en forma interna por conjuntos de bits; por esta razón los operadores que manipulan conjuntos suelen implementarse con las instrucciones lógicas de la máquina. Debido a esto suelen ser muy rápidas, incluso más que la suma de enteros. 20.3. Manipulación. No pueden leerse ni escribirse variables de este tipo; de ser necesario es preciso elaborar procedimientos especiales. Sólo puede asignarse a una variable de tipo conjunto una expresión de igual tipo. Los operadores definidos son: + unión * intersección - diferencia de conjuntos Si X e Y son variables de tipo conjunto: X+Y contiene todos los elementos que pertenecen a X ó a Y ó a ambos. X*Y contiene todos los elementos que pertenecen a X y a Y. Prof. Leopoldo Silva Bijit. 07-07-2003 256 UNIVERSIDAD TECNICA FEDERICO SANTA MARIA DEPARTAMENTO DE ELECTRONICA Programación en Pascal Capítulo 20. Conjuntos. Set. X-Y contiene sólo los elementos de X que no pertenecen a Y Los siguientes operadores relacionales pueden aplicarse a expresiones simples de tipo conjunto: = test de igualdad <> test de desigualdad >= test de inclusión <= test de inclusión Ejemplos: X <= Y se lee: X es subconjunto de Y. X >= Y se lee: X contiene a Y. Existe un operador relacional especializado para probar si un elemento es miembro o no de un conjunto: x in X Donde: x debe ser del tipo base X es un conjunto del tipo base La expresión es verdadera si x pertenece a X. 20.4. Ejemplos de Conjuntos. a) [2, 3, 4, 5] es igual a [3, 5, 2, 4] ya que no está definida una relación de orden. b) [5..3] es el conjunto vacío []. c) [] no es igual a [0]; este último es un conjunto cuyo único elemento es un cero. d) Si i es de tipo base y u y v son conjuntos: d1) (i in u) <> (i in v) Es la diferencia simétrica, es decir, i está en u o en v, pero no en ambos. d2) (i in u) and (i in v) Prof. Leopoldo Silva Bijit. 07-07-2003 257 UNIVERSIDAD TECNICA FEDERICO SANTA MARIA DEPARTAMENTO DE ELECTRONICA Programación en Pascal Capítulo 20. Conjuntos. Set. Puede escribirse: i in (u*v) Es decir i está en ambos (u y v). d3) (i in u) and not (i in v) Puede escribirse: i in (u-v) Es decir, i está en u pero no en v. d4) (i in u) or (i in v) Puede escribirse: i in (u+v) Es decir i está en u o en v o en ambos. e) ['A'..'Z','0'..'9'] define un conjunto formado por letras mayúsculas y dígitos (literales de los dígitos decimales). f) Si se desea probar si una variable de tipo char es una letra minúscula, puede escribirse: ch in ['a'..'z'] g) La siguiente instrucción: if (ch='x') or (ch='y') or (ch='z') then A; Puede escribirse: if ch in ['x','y','z'] then A; y también: if ch in ['x'..'z'] then A; h) Definición de intervalos. Prof. Leopoldo Silva Bijit. 07-07-2003 258 UNIVERSIDAD TECNICA FEDERICO SANTA MARIA DEPARTAMENTO DE ELECTRONICA Programación en Pascal Capítulo 20. Conjuntos. Set. La condición: (x>=a) and (x<=b); {con a<b} Puede escribirse: x in [a..b] i) Las prioridades de los operadores son: La de mayor prioridad es la intersección; luego, en un mismo nivel, la unión y diferencia; finalmente, el test de inclusión o pertenencia. Entonces: i1) x in u+v Debe entenderse: x in (u+v) i2) u-v*w Es equivalente a: u-(v*w) i3) u-v+w Puede interpretarse: (u-v)+w Pero es preferible emplear la expresión con paréntesis. j) Jerigonza. Entre los niños suele emplearse un lenguaje secreto, consistente en agregar después de cada vocal la sílaba formada por la consonante P y la vocal correspondiente. Por ejemplo: Prof. Leopoldo Silva Bijit. 07-07-2003 259 UNIVERSIDAD TECNICA FEDERICO SANTA MARIA DEPARTAMENTO DE ELECTRONICA Programación en Pascal Capítulo 20. Conjuntos. Set. mi mamá me mima Quedaría traducido en: mipi mapamapa mepe mipimapa El programa siguiente hace la traducción: program jerigonza(x,output); var x : text; ch : char; vocales : set of char; begin assign(x,'ejem.pas'); {Turbo Pascal} reset(x); vocales := ['A','E','I','O','U','a','e','i','o','u']; while not eof(x) do begin while not eoln(x) do begin read(x,ch);write(ch); if ch in vocales then write('p',ch); end; readln(x);writeln {mantiene estructura de líneas} end end. Prof. Leopoldo Silva Bijit. 07-07-2003 260