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

Examen #2 [solución]
Versión #1

     Duración: dos horas.  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.  Cuentan las convenciones.  Puede hacer el examen con lápiz.  ¡No 
haga más de lo que se le pide!

1) [25 pts] Considere el  procedimiento  BajeSuba(n,m)  tomado  del  artículo 
"Tres formas diferentes de explicar la Recursividad" escrito por su profesor: 

    PROCEDURE BajeSuba( n : INTEGER; m : INTEGER );
    { Como ejercicio, determine qué despliega
      este programa, y porqué lo hace.        }
    BEGIN
      IF m > 0 THEN BEGIN
        INC(n); DEC(m);
        WriteLn( '':10-2*m, 'Pre[', n:1,',', m:1,']' );
        BajeSuba( n, m );
        WriteLn( '':10-2*m, 'Pos[', n:1,',', m:1,']' );
      END;
    END;          { OJO: ¡indenta (10-2*m) espacios! }

1.a) [10 pts] Si n=1 y m=3, diga qué imprime BajeSuba(n,m).

1.b) [10 pts] Suponga ahora que el encabezado de BajeSuba() es este:
    PROCEDURE BajeSuba( n : INTEGER; VAR m : INTEGER );
De nuevo, diga qué imprime BajeSuba(n,m) si n=1 y m=3.

1.c) [5 pts] Explique  porqué  al correr  la versión  a) de  BajeSuba(n,m) se 
obtiene un resultado diferente que si se corre la versión b).


2) [25 pts] Un número romano está formado por una  secuencia formada  con las 
letras M-D-C-L-X-V-I.  Cada letra tiene un valor diferente, desde 1.000 hasta 
1.  La regla para traducir un número romano a un número entero es muy simple: 
se  suma  el valor  de cada  caracter romano,  excepto cuando  ocurre que  el 
siguiente  caracter  romano  es  mayor, en  cuyo caso  lo que  se suma  es la 
diferencia entre los dos:

     M = 1.000     VI       ==> 6        (5+1)
     D =   500     IX       ==> 9        (10-1)
     C =   100     LXXXVII  ==> 87       (50+10+10+10+5+1+1)
     L =    50     CCXIX    ==> 219      (100+100+10+(10-1))
     X =    10     MCCCLIV  ==> 1354     (1000+100+100+100+50+(5-1))
     V =     5     MCMLVI   ==> 1956     (1000+(1000-100)+50+5+1)
     I =     1                              M      CM      L V I   

2.a) [10 pts] Especifique la función Romano_INT() que sirve  para obtener  el 
     valor de un número romano. Su especificación debe quedar bien completa.

2.b) [15 pts] Implemente Romano_INT().

3) [25 pts] El tipo  TRebote ha  sido creado  para que  dentro de  una matriz 
rectangular  [n*m]  uno de  sus elementos  recorra en  forma transversal  las 
entradas, pero  rebotando cuando  se alcanza  alguna de  las paredes  como se 
muestra a continuación:

     +-------------+     TYPE
     |\   |\       |       TMatriz = OBJECT
     |2\  | \      |         _val  : ARRAY[1..DIM, 1..DIM] OF CHAR;
     | 3\ |6 \ |n  |         _n,_m : [1..DIM]; { dimensiones actuales }
     |  4\|5  \|   |       END;
     +-------------+

     TYPE
       TRebote = OBJECT
         _x, _y : WORD;
         _dir   : (Up {|'}, Side {\.});
         ...
         PROCEDURE Step( VAR M: TMatriz; VAR x,y: WORD; VAR ch: CHAR);
       END; { TRebote }

3.a) [5 pts] Explique para qué sirve cada uno de los campos de TRebote.

3.b) [5 pts] Haga la  especificación de  TRebote.Step(). Tome  en cuenta  que 
     antes de terminar TRebote.Step() siempre ejecuta la instrucción:
         M._val[x,y] := ch;

3.c) [15 pts] Implemente TRebote.Step(). [Step(Inglés)=Paso(Español)].


4) [25 pts] Palabras( s : STRING ) : WORD;  es  una  función  que retorna  el 
número de palabras que contiene la hilera "s".  Una palabra es una  secuencia 
de uno o más caracteres consecutivos pero todos  diferentes de  blanco.  Cada 
uno de los símbolos de puntuación  [ . , ; : ¿ ? ¡ ! ] cuentan  por sí  solos 
como una palabra. Programe la función Palabras().

     Palabras(' el bananazo es ;muy; largo   ')   ==>  7
     Palabras(' ; ; ;;; ; siete; nueve; 11   ')   ==> 11
     Palabras('')                                 ==>  0
     Palabras('                              ')   ==>  0

 

Examen #2 [solución]
Versión #2

     Duración: dos horas.  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.  Cuentan las convenciones.  Puede hacer el examen con lápiz.  ¡No 
haga más de lo que se le pide!

1) [25 pts] Un número romano está formado por una secuencia  formada con  las 
letras M-D-C-L-X-V-I.  Cada letra tiene un valor diferente, desde 1.000 hasta 
1.  La regla para traducir un número romano a un número entero es muy simple: 
se  suma  el valor  de cada  caracter romano,  excepto cuando  ocurre que  el 
siguiente  caracter  romano  es  mayor, en  cuyo caso  lo que  se suma  es la 
diferencia entre los dos:

     M = 1.000     VI       ==> 6        (5+1)
     D =   500     IX       ==> 9        (10-1)
     C =   100     LXXXVII  ==> 87       (50+10+10+10+5+1+1)
     L =    50     CCXIX    ==> 219      (100+100+10+(10-1))
     X =    10     MCCCLIV  ==> 1354     (1000+100+100+100+50+(5-1))
     V =     5     MCMLVI   ==> 1956     (1000+(1000-100)+50+5+1)
     I =     1                              M      CM      L V I   

1.a) [10 pts] Especifique la función Romano_INT() que sirve  para obtener  el 
     valor de un número romano. Su especificación debe quedar bien completa.

1.b) [15 pts] Implemente Romano_INT().


2) [25 pts] Considere el  procedimiento  BajeSuba(n,m)  tomado  del  artículo 
"Tres formas diferentes de explicar la Recursividad" escrito por su profesor:

    PROCEDURE BajeSuba( n : INTEGER; m : INTEGER );
    { Como ejercicio, determine qué despliega
      este programa, y porqué lo hace.        }
    BEGIN
      IF n < m THEN BEGIN
        INC(n); DEC(m);
        WriteLn( '':10-2*m, 'Pre[', n:1,',', m:1,']' );
        BajeSuba( n, m );
        WriteLn( '':10-2*m, 'Pos[', n:1,',', m:1,']' );
      END;
    END;          { OJO: ¡indenta (10-2*m) espacios! }

2.a) [10 pts] Si n=0 y m=5, diga qué imprime BajeSuba(n,m).

2.b) [10 pts] Suponga ahora que el encabezado de BajeSuba() es este:
    PROCEDURE BajeSuba( n : INTEGER; VAR m : INTEGER );
De nuevo, diga qué imprime BajeSuba(n,m) si n=0 y m=5.

2.c) [5 pts] Explique  porqué  al correr  la versión  a) de  BajeSuba(n,m) se 
obtiene un resultado diferente que si se corre la versión b).

3) [25 pts] Palabras( s : STRING ) : WORD;  es  una  función  que retorna  el 
número de palabras que contiene la hilera "s".  Una palabra es una  secuencia 
de uno o más caracteres consecutivos pero todos  diferentes de  blanco.  Cada 
uno de los símbolos de puntuación  [ . , ; : ¿ ? ¡ ! ] cuentan  por sí  solos 
como una palabra. Programe la función Palabras().

     Palabras(' el bananazo es ;muy; largo   ')   ==>  7
     Palabras(' ; ; ;;; ; siete; nueve; 11   ')   ==> 11
     Palabras('')                                 ==>  0
     Palabras('                              ')   ==>  0


4) [25 pts] El tipo  TRebote ha  sido creado  para que  dentro de  una matriz 
rectangular  [n*m]  uno de  sus elementos  recorra en  forma transversal  las 
entradas, pero  rebotando cuando  se alcanza  alguna de  las paredes  como se 
muestra a continuación:

     +-------------+     TYPE
     |/|5  /|      |       TMatriz = OBJECT
     | |6 / |n   3/|         _val  : ARRAY[1..DIM, 1..DIM] OF CHAR;
     | | /      2/ |         _n,_m : [1..DIM]; { dimensiones actuales }
     | |/      1/  |       END;
     +-------------+

     TYPE
       TRebote = OBJECT
         _x, _y : WORD;
         _dir   : (Side {/'}, Down {|.});
         ...
         PROCEDURE Step( VAR M: TMatriz; VAR x,y: WORD; VAR ch: CHAR);
       END; { TRebote }

4.a) [5 pts] Explique para qué sirve cada uno de los campos de TRebote.

4.b) [5 pts] Haga la  especificación de  TRebote.Step(). Tome  en cuenta  que 
     antes de terminar TRebote.Step() siempre ejecuta la instrucción:
         M._val[x,y] := ch;

4.c) [15 pts] Implemente TRebote.Step(). [Step(Inglés)=Paso(Español)].

Soluciones

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