Primer examen intermedio de la asignatura Programación Orientada a Objetos

5/11/97:

    A) Teoría

  1. Señalar el tipo de relación que existe entre las siguientes clases de objetos (1 punto):
                            Herencia  Agregación  Asociación
    USUARIO->TELEFONO
    ORDENADOR->DISQUETERA
    DISPOSITIVO->DISQUETERA
    TABLA->"TUPLA"
    TABLA->"JOIN"
    PROGRAMA->VARIABLE
    PAGINA "WEB"->MODEM
    OBJETO->ATRIBUTO
    TEMPLATE->CLASE
    PRISMA->POLIGONO
    
  2. Enumerar los elementos fundamentales de la programación orientada a objetos, sin los cuales no se puede hablar de orientación a objetos (1 punto).

    B) Problemas de C++

  3. Señalar los errores que contiene el programa siguiente, especificando quién los detecta (compilador, enlazador) (3 puntos):
    #include
    class Complex {
        double real, imag;
        public:
          Complex (double r=0., double i=0.) {
            real = r;
            imag = i;
            }
          void print () { printf ("(%g,%g)", real, imag);}
          };
    Complex operator + (Complex c1, Complex c2) {
      Complex temp (c1.real + c2.real, c1.imag + c2.imag);
      return temp;
      }
    Complex operator - (Complex c1, Complex c2) {
      Complex temp (c1.real - c2.real, c1.imag - c2.imag);
      return temp;
      }
    Complex operator * (Complex c1, Complex c2) {
      Complex temp;
      temp.real = c1.real*c2.real+c1.imag*c2.imag;
      temp.imag = c1.real*c2.imag+c2.real*c1.imag;
      return temp;
      }
    // programa principal
    int main(void) {
      Complex a (3.), b (2., 2.);
      Complex c=a+b, d=b+3, e=3-b, f=c*b+e;
      Complex *ac = Complex[5] new;
      ac[0]=a+1;
      for (int i=1; i<5; i++) ac[i]=ac[i-1]+b;
      printf ("a = "); a.print (); printf ("\n");
      printf ("b = "); b.print (); printf ("\n");
      printf ("c = "); c.print (); printf ("\n");
      printf ("d = "); d.print (); printf ("\n");
      printf ("e = "); e.print (); printf ("\n");
      printf ("f = "); f.print (); printf ("\n");
      for (int i=0; i<5; i++)
        printf ("ac[%d] = ",i); ac[i].print (); printf ("\n");
      return 0;
      }
    
  4. Suponiendo corregidos los errores anteriores, ¿qué resultado se obtendrá al ejecutar el programa? (1 punto).
  5. Construir un "template" de vectores que contenga información sobre el número de elementos del vector, y redefinir el operador de indexación para devolver el elemento indicado por su argumento, comprobando la validez del índice y provocando una excepción atrapable en caso contrario. Escribir un programa principal que cree un vector de enteros, un puntero a vector de reales en doble precisión, y un vector de números complejos como los del ejercicio anterior (4 puntos).

Soluciones:

  1.                         Herencia  Agregación  Asociación
    USUARIO->TELEFONO                                 X
    ORDENADOR->DISQUETERA                 X
    DISPOSITIVO->DISQUETERA    X
    TABLA->"TUPLA"                        X
    TABLA->"JOIN"              X
    PROGRAMA->VARIABLE                    X
    PAGINA "WEB"->MODEM                               X
    OBJETO->ATRIBUTO                      X
    TEMPLATE->CLASE                                   X
    PRISMA->POLIGONO                      X
    
  2. Ver la teoría.
  3. Errores que contiene el programa C++:
  4. El resultado del programa es:
    a = (3,0)
    b = (2,2)
    c = (5,2)
    d = (5,2)
    e = (1,-2)
    f = (7,12)
    ac[0] = (4,0)
    ac[1] = (6,2)
    ac[2] = (8,4)
    ac[3] = (10,6)
    ac[4] = (12,8)
    
  5. Template C++ (una solución válida):
    #include "Complex.h"
        template <class T> class Vector {
            T *elements;
            unsigned int size;
          public:
            Vector (unsigned int size) {
              this->size = size;
              elements = new T[size];
              }
            ~Vector () {
              delete [] elements;
              }
            class IndexError {
                unsigned int index, size;
              public:
                IndexError (unsigned int i, unsigned int s) {
                  index = i; size = s;
                  }
              };
            T operator [](unsigned int index) throw (IndexError) {
              if (index<size) return elements[index];
              IndexError ie (index, size);
              throw (ie);
              }
            };
    void main() {
      Vector<int> vi(10);
      Vector<double> *pvd = new Vector<double>(10);
      Vector<Complex> vc(10);
      . . .
    }