Queremos escribir un programa que procesa instrucciones de unión y de
intersección de conjuntos. Con cada instrucción se reciben dos
subconjuntos finitos de enteros y se habrá de escribir el subconjunto
resultante de hacer la unión o la intersección de los dos subconjuntos
dados.
En vuestro programa usaréis las siguientes definiciones:
// un subconjunto finito de enteros se representa mediante una // set de int en orden estrictamente creciente typedef set<int> subcjt; // Pre: a y b son sets representando dos conjuntos de enteros // a = {a0, a1, ... }, b = {b0, ... } // Post: c = set que representa a A U B, esto es, la unión de los // conjuntos representados por a y b void unir(const subcjt& a, const subcjt& b, subcjt& c); // Pre: a y b son sets representando dos conjuntos de enteros // a = {a0, a1, ... }, b = {b0, ... } // Post: c = set que representa a A ^ B, esto es, la intersección // de los conjuntos representados por a y b void intersectar(const subcjt& a, const subcjt& b, subcjt& c);
Se os suministra un módulo (ficheros subset-IO.o y subset-IO.hh) con, entre otras cosas, operaciones de entrada/salida para subconjuntos de enteros. En particular, proporciona un operador >> para leer un conjunto de números (que está escrito siguiendo el formato del apartado de Entrada y pondrá los elementos en orden si es necesario), y un operador << para imprimir un conjunto de números (según el formato de Salida).
Con todo ello completaréis un pequeño programa que lee una tras otra diferentes instrucciones y los conjuntos a operar, ejecuta cada instrucción e imprime los conjuntos resultantes. Utilizad el fichero plantilla_solucion.cc.txt para escribir vuestra solución. Vuestra solución debe hallarse en el fichero solution.cc, que es el único fichero a enviar (una buena idea es renombrar el fichero plantilla_solucion.cc.txt como solution.cc).
Entrada La entrada consiste en una secuencia de instrucciones. Cada instrucción comienza con una letra (U, I, o Q), y si la letra es U o I a continuación se dan dos subconjuntos de enteros. Los conjuntos (operandos) se introducen delimitando sus contenidos mediante llaves de apertura y cierre ’{’ ’}’. Debe haber al menos un blanco entre la llave de apertura y el primer elemento, y de igual modo debe existir al menos un blanco entre el último elemento y la llave de cierre. Las letras U e I denotan uniones e intersecciones, respectivamente. Si la instrucción comienza con la letra Q se indica el final de la entrada (Quit).
Salida Para cada instrucción (excepto Q) se escribe el conjunto de números resultante de hacer la unión (U) o la intersección (I) de los dos conjuntos dados en la instrucción. Los conjuntos se imprimen utilizando ’{’ y ’}’ para delimitar su comienzo y su final, y se usan blancos para separar los elementos del conjunto, que han de escribirse en orden estrictamente creciente. Después de imprimir la salida de cada instrucción se imprime un salto de línea.
Input
U { 1 8 } { 9 2 -3 } I { 1 8 -3 12 } { 9 1 -3 } U { } { 2 3 } I { 1 5 7 9 } { 4 -2 8 6 } Q
Output
{ -3 1 2 8 9 } { -3 1 } { 2 3 } { }