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>.
|
|
|