Universidad de Costa Rica
|
|
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!
Adolfo Di Mare <adolfo@di-mare.com>.
|