Universidad de Costa Rica
|
|
Duración: Ciento veinte 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!
1) [33 pts] Una forma de grabar el valor de uno de los polinomios de la segunda tarea programada es utilizar el siguiente algoritmo:
void graba( const poly& P ) { iterPoly it( P ); // iterador sobre los coeficientes del polinomio int i=0; while ( it.hasNext() ) { float coef = it.next(); if ( coef != 0.0 ) { cout << coef; if ( i > 0 ) { cout << " X"; } if ( i > 1 ) { cout << "^" << i; } if ( it.hasNext() ) { cout << " + " } } ++i; } }
1.a) [0 pts]
Suponga que el
Rep de la clase
iterPoly
contiene 2 campos: un número entero que
indica el grado del siguiente coeficiente que será retornado por
next()
[iterPoly::grado()
] y un
puntero al polinomio
sobre el que next()
y hasNext()
trabajan. Explique si el constructor de la clase está bien
implementado:
iterPoly( const poly& P ) : m_grd(0), m_P(& P) { }
1.b) [7 pts]
Explique si es necesario o no que hasNext()
puede ser
invocado una cantidad infinita de veces (pues es un método
const
).
Explique lo mismo para next()
, que es el
método que se encarga de retornar los coeficientes del
polinomio [iterPoly::coef()
].
1.c) [12 pts]
Especifique los
métodos next()
y hasNext()
.
1.d) [14 pts]
Implemente next()
y hasNext()
:
¡No se le meta al
Rep de la clase polinomio!
2) [33 pts] La función "
rotalina(V,i,n)
" sirve para rotar
circularmente una parte de un vector.
(a b [c d e] f) ==> (a b [e c d] f) i---> i---> n=3 n=3
2.a) [11 pts]
Especifique "rotalina(V,i,n)
". Incluya los datos
de prueba
BUnit y use el formato
Doxygen.
2.b) [11 pts]
Implemente "OrdeneVector(V,m)
" ("m
"
es la cantidad de elementos del vector). Use únicamente la
función "rotalina(V,i,n)
" para copiar o
trasladar valores del vector.
2.c) [11 pts]
Implemente "rotalina(V,i,n)
".
3) [33 pts] La clase
Rebotador
ha sido creado para que, dentro de
una matriz rectangular [N*M]
, uno de sus elementos
recorra en diagonal las entradas, pero rebotando cuando se alcanza
alguna de las paredes, como se muestra a continuación:
+-------------+ class Matriz { | /\ /\| enum { DIM = 25 }; | /3 \ / /| char m_MAT[DIM][DIM]; | /2 \ / / | int m_N,m_M; // dimensiones actuales |/1 \/ /n | friend class Rebotador; +-------------+ }; // Matriz class Rebotador { int m_dir; // '\ /' ./ \. enum { NO= -1, NE= +1, SO= +2, SE= -2 }; int m_x, m_y; public: void Paso(Matriz& M, int& x, int& y, char& ch); }; // Rebotador |
3.a) [7 pts] Explique para qué sirve cada uno de
los campos del
Rep de
Rebotador
(en el ejemplo se ha comenzado desde la
esquina inferior izquierda).
3.b) [7 pts] Haga la
especificación de Rebotador::Paso()
. Tome
en cuenta que, antes de terminar, Rebotador::Paso()
siempre ejecuta esta instrucción:
M.m_MAT[x][y] = ch;
Suponga que, en cada invocación,
Rebotador::Paso()
avanza un paso nada más.
3.c) [19 pts]
Implemente Rebotador::Paso()
.
Adolfo Di Mare <adolfo@di-mare.com>.
|