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

Examen #1 [solución]

      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 (no se complique: exprese sus datos de prueba usando una rutina similar a "intlist()" o "intMatrix()").

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

 

Soluciones

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