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

Examen #2

      Duración: dos horas. Lea bien el examen antes de hacerlo. El examen es a libro abierto. Cuenta el buen estilo, la redacción y la ortografía. Puede hacer el examen con lápiz. ¡No haga más de lo que se le pide! ¡Conteste, en cualquier orden, exactamente cuatro [4] preguntas! Use su lenguaje predilecto en cada pregunta.

1) [25 pts] OOP = Herencia + polimorfismo

      Escriba un programa que use herencia y polimorfismo. Luego reprográmelo pero sin usar herencia. Trabaje de manera que su respuesta muestre por qué la programación orientada a los objetos debe incluir ambas facilidades de sintácticas. Use su lenguaje predilecto.

2) [25 pts] Excepciones

    +---+-------+
 +->| n |  sp   |--+ 
 |  +---+-------+  |
 |                 |
 |                 |
 |    +-------+    |
 +----|  @sp  |<---+
      +-------+
 TYPE
   TSelfPoint = OBJECT
      n      :   INTEGER;      { Rep }
      pBlock : ^^TSelfPoint;   { Rep }
       ...
      CONSTRUCTOR Init;
      DESTRUCTOR  Done;
       ...
   END; { TSelfPoint }

 PROCEDURE Recursivo( n: INTEGER );

2.a) [0 pts] Defina el tipo TSelfPoint, que tiene la particularidad de que cada instancia incluye en su Rep un puntero (pBlock) a un bloque de memoria en el que está almacenado un puntero que apunta de vuelta a la instancia, como se muestra en el diagrama. Use su lenguaje predilecto.

2.b) [10 pts] Implemente el procedimiento Recursivo(n). Inclúyale un manejador de excepciones. Puede usar la biblioteca de exepciones descrita en:
[DiM­94] Di Mare, Adolfo: Manejo de excepciones en Turbo Pascal, Reporte Técnico ECCI­94­10 (Revisión 4), Proyecto 326­89­019,, Escuela de Ciencias de la Computación e Informática (ECCI), Universidad de Costa Rica (UCR), 1994.
      http://www.di-mare.com/adolfo/adt/except.htm

2.c) [15 pts] Use el procedimiento Recursivo(n) para mostrar por qué, cuando ocurre una excepción, es necesario invocar los destructores de los objetos. No está de más que en su respuesta incluya un diagrama simple de la pila de ejecución del programa.

3) [25 pts] Perl vs Parametrización + polimorfismo

      Considere el lenguaje Perl cuya fortaleza principal es la manipulación de archivos e hileras. Para efectos de esta pregunta, concéntrese en la versión del lenguaje discutida en el libro que se ha usado en el curso:
[Sch­93] Schwartz, Randall L.: Learning Perl, O'Reilly & Associates, Inc. ISBN 1-56952-042-2, http://www.perl.com, 1994.

3.a) [8 pts] Explique el grado de parametrización de Perl. Luego argumente si Perl soporta polimorfismo.

3.b) [8 pts] Mencione las restricciones, o deficiencias, de Perl, que le impiden ser un lenguaje que soporta por completo polimorfismo uniforme.

3.c) [9 pts] Sustenten sus respuestas anteriores con unos programas ejemplo pequeños.

4) [25 pts] Comparación de lenguajes

4.a) [18 pts] Haga una tabla en que incluya, en la columna izquierda, tres situaciones en que conviene más usar Perl en lugar de Pascal o C++. En la columna derecha, menciones tres situaciones en que ocurre precismamente lo contrario, pues conviene más usar Pascal o C++ en lugar de Perl.

4.b) [7 pts] En pocas palabras, explique cuál lenguaje es mejor: Perl, o uno de Pascal y C++.

5) [25 pts] Programación

      Haga un programa que lea un grupo de archivos ASCII, y traduzca a enfatizado las palabras reservadas Pascal que contengan. Suponga que las palabras reservadas siempre se escriben con letras mayúsculas, y que se encuentran en un archivo llamado:
      /bin/perl/turbo/strong

      Para que la palabra quede en formato enfatizado debe quedar rodeada por las hileras <STRONG> y </STRONG>. Cuide, sin embargo, de no traducir aquellas palabras reservadas que están dentro de alguna otra palabra. Además, traduzca únicamente la palabras que están escritas en mayúsculas. Al final, asegúrese de que no queden marcadores <STRONG><STRONG> o </STRONG></STRONG> contiguos.

6) [25 pts] Constructores y destructores

      El lenguaje C++ estándar no permite que el programador invoque un constructor sin al mismo tiempo crear una nueva instancia de una variable. Para Pascal tampoco hay una forma portable de hacerlo.

6.a) [10 pts] Defina el tipo TClonabe, en su lenguaje preferido, que incluye un método polimórfico Invoca_Constructor(), que se encarga de invocar al constructor de un objeto sin requerir la creación de una nueva instancia. Luego implemente el método Invoca_Constructor() usando el siguiente algoritmo (que fue mencionado en clase):

  1. Primero hay que contar con una variable "desde" del tipo a construir.
  2. Hay que contar con "pClonable", la dirección de memoria sobre la que se invocará al constructor.
  3. Luego hay que hacer una copia bit por bit desde la variable "desde" ya construida.
  4. Por último, hay que inicializar los campos de la variable a construir "*pClonable".

      Recuerde que para lograr su objetivo debe implementar el constructor de TClonable usando una pareja de métodos diferentes [TClonable.Init() y TClonable.Real_Init()], de manera que pueda invocarlos por separado.

6.b) [5 pts] Diga qué debe hacer el programador cliente del tipo TClonabe para invocar el constructor de un objeto usando la maquinaria de Invoca_Constructor().

6.c) [5 pts] Explique por qué Invoca_Constructor() funciona.

6.d) [5 pts] De un ejemplo de una aplicación en la que conviene que el programador pueda invocar al constructor de la forma en que lo ha hecho al contestar esta pregunta.

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