Universidad de Costa Rica Escuela de Computación |
Examen 02 |
CI-1201 Programación II - 2013a Profesor Jeisson Hidalgo-Céspedes |
En cada ejercicio se evaluará la eficiencia del código y las buenas prácticas de programación como: el uso de identificadores significativos, la indentación, escritura correcta de llaves {} y el uso adecuado de la palabra reservada const. Se dispone de tres horas para entregar la prueba y debe realizarse en forma estrictamente individual.
Escriba en C++ una plantilla para generar clases Conjunto
(en inglés Set
), las cuales representan conjuntos finitos de valores de algún tipo de datos. Note que por definición un conjunto matemático no permite valores repetidos. Dadas las limitaciones de los compiladores sobre las plantillas, puede escribir su clase completa en el archivo de encabezado (.h
). Debe implementar al menos los siguientes miembros.
Set(n)
: Crea un conjunto con capacidad para n
valores. Note que n
es una indicación de capacidad y no se trata de convertir n
en un conjunto.Set
utiliza memoria dinámica, debe evitar fugas de memoria o accesos inválidos a toda costa. Es importante que estos métodos sean públicos e implementados, no se deben declarar como privados.count()
retorna la cantidad de valores contenidos en el conjunto. Método empty() retorna true
si el conjunto está vacío.has(v)
: Retorna true
si el valor v
se encuentra en el conjunto, false
en caso contrario. ¿Es su implementación eficiente? Justifique. Si la respuesta es negativa, indique cómo hacerlo eficiente y la consecuencia en los otros métodos de la clase.add(v)
: Agrega una copia del valor v
en el conjunto. Retorna verdadero si el valor pudo ser agregado, falso si no hay memoria suficiente.+=
.*=
.true
si el conjunto que está al lado izquierdo del operador tiene exactamente los mismos elementos que el conjunto que está al lado derecho del operador.ConstIterator
: Implemente una clase ConstIterator
que permita tener acceso a los elementos del conjunto. Su iterador debe ser capaz de ejecutar el código que se encuentra en el main()
de abajo. Implemente métodos en la clase Set
para obtener un iterador que inicie el recorrido por el contenedor, y otro que indique una posición no válida o de finalización del contenedor.Recuerde implementar en línea los métodos que son candidatos a ello. Su clase Set
debe hacer funcionar el siguiente main():
set1; cout << "Input first set (EOF to finish):\n"; cin >> set1; Setset2; cout << "Input second set (EOF to finish):\n"; cin.clear(); cin >> set2; Set set3 = set1 + set2; cout << set1 << " + " << set2 << " = " << set3 << endl; cout << set1 << " * " << set2 << " = " << set1 * set2 << endl; Set set4; for ( Set ::ConstIterator itr = set3.begin(); itr != set3.end(); itr++ ) set4.add( *itr ); cout << set3 << " == " << set4 << ": " << set3 == set4 << endl; return 0; } ]]>