Universidad de Costa Rica
Escuela de Ciencias de la
Computación e Informática
Profesor Adolfo Di Mare
CI-1201
I Semestre 2008
[<=] [home] [<>] [\/] [=>]
CI-1201 Programación II

Examen #2 [solución]

      Duración: Ochenta minutos. Lea bien el examen antes de hacerlo. El examen es a libro abierto. Cuenta la documentación. Cuenta la redacción y la ortografía. Puede hacer el examen con lápiz. Resuelva todas las preguntas. ¡No haga más de lo que se le pide!

 

3) [50 pts] En algunas aplicaciones conviene contar con la clase Acumulador que sirve para sumar un montón de valores numéricos, pero eliminando del total tanto al más grande como al más pequeño de todos los valores. Por ejemplo, el acumulador aplicado a los valores (1,5,2,2,3,3,4,5) sólo sumaría 5+2+2+3+3+4 y eliminaría el 1 y alguno de los 5's, que son los valores menor y mayor de toda la secuencia.

3.a) [0 pts] Las operaciones más importantes de esta clase son acumule(), total() y cantidad(). Especifique en formato "Doxygen" cada una de estas operaciones.

3.b) [20 pts] Especifique en formato "Doxygen" la operación elimine() que permite borrar uno de los valores acumulados, sea éste el más grande, el más pequeño, o cualquiera de los valores intermedios. De esta manera usted estará modificando la clase Acumulador de la tarea programada, que es una clase que no permite eliminar alguno de los valores que tiene acumulados. Incluya ejemplos de prueba BUnit en su especificación.

3.c) [10 pts] Defina el Rep para su clase Acumulador. Debe usar un vector de valores para mantener memoria de todos los números que han sido acumulados.

3.d) [0 pts] Implemente las operaciones cantidad() y total() y para la clase acumulador. Recuerde manejar correctamente los casos límite.

3.e) [10 pts] Implemente Acumulador::acumule().

3.f) [10 pts] Implemente Acumulador::elimine().

 

3) [50 pts] En algunas aplicaciones conviene contar con la clase Acumulador que sirve para sumar un montón de valores numéricos, pero eliminando del total tanto al más grande como al más pequeño de todos los valores. Por ejemplo, el acumulador aplicado a los valores (1,5,2,2,3,3,4,5) sólo sumaría 5+2+2+3+3+4 y eliminaría el 1 y alguno de los 5's, que son los valores menor y mayor de toda la secuencia.

3.a) [0 pts] Las operaciones más importantes de esta clase son Acumule(), Total() y Cantidad(). Especifique en formato "Doxygen" cada una de estas operaciones.

3.b) [20 pts] Especifique en formato "Doxygen" la operación Elimine() que permite borrar uno de los valores acumulados, sea éste el más grande, el más pequeño, o cualquiera de los valores intermedios. De esta manera usted estará modificando la clase Acumulador de la primera tarea programada, que es una clase que no permite eliminar alguno de los valores que tiene acumulados. Incluya ejemplos de prueba BUnit en su especificación.

3.c) [10 pts] Defina el Rep para su clase Acumulador. Debe usar un vector o una lista de valores para mantener memoria de todos los números que han sido acumulados.

3.d) [0 pts] Implemente las operaciones Cantidad() y Total() y para la clase Acumulador. Recuerde manejar correctamente los casos límite.

3.e) [10 pts] Implemente Acumulador::Acumule().

3.f) [10 pts] Implemente Acumulador::Elimine().

 

4) [50 pts] La operación COPY() hace una copia sin alterar el valor copiado. En contraste, MOVE() traslada el valor de un objeto a otro. Por ejemplo MOVE(a,b) deja "en blanco" a su segundo argumento "b" , con el valor original que tendría después de serle aplicado el constructor por defecto, mientras que COPY(a,b) no le cambia el valor a "b".

 std::list<int> La, Lb, Lc;
 std::list<int>::const_iterator p,q;
 La = makeList( "( 1 2 3 4 )" );
 Lb = makeList( "( 5 6 7 )" );
 p = Lb.begin(); // & 5
 assertTrue( La != Lb && Lb != Lc );
 assertTrue( *p == 5 );

 COPY( La , Lb );
 assertTrue( La == makeList( "( 5 6 7 )" ) );

 assertTrue( La == Lb && Lb != Lc );
 q = La.begin();
 assertTrue( *q == 5 );
 assertTrue(  p != q ); // copió a [5]
 std::list<int> La, Lb, Lc;
 std::list<int>::const_iterator p,q;
 La = makeList( "( 1 2 3 4 )" );
 Lb = makeList( "( 5 6 7 )" );
 p = Lb.begin(); // & 5
 assertTrue( La != Lb && Lb != Lc );
 assertTrue( *p == 5 );

 MOVE( La , Lb ); // ==> Lb.empty()
 assertTrue( La == makeList( "( 5 6 7 )" ) );

 assertTrue( La != Lb && Lb == Lc );
 q = La.begin();
 assertTrue( *q == 5 );
 assertTrue(  p == q ); // si trasladó a [5]

4.a) [0 pts] Especifique en formato "Doxygen" la operación std::list<>splice(). Incluya ejemplos de prueba BUnit en su especificación.

4.b) [15 pts] Especifique en formato "Doxygen" el método MOVE() para la lista estándar. Incluya ejemplos de prueba BUnit en su especificación.

4.c) [15 pts] Use el método std::list<>splice() para implementar std::list<>MOVE(). Debido a que splice() traslada los valores de la lista sin copiarlos, también ocurre que MOVE() traslada el valor completo de una lista a otra sin hacer copias. ¡No se le meta al Rep!

4.d) [10 pts] Especifique en formato "Doxygen" el método SWAP() para la lista estándar. Incluya ejemplos de prueba BUnit en su especificación.

4.e) [10 pts] Implemente SWAP(). Haga su implementación en términos de MOVE(). ¡No se le meta al Rep!

 

Soluciones

[mailto:] Adolfo Di Mare <adolfo@di-mare.com>.
Copyright © 2008
Derechos de autor reservados © 2008
[home] <> [/\]