Universidad de Costa Rica
Escuela de Ciencias de la
Computación e Informática
|
|
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
Adolfo Di Mare <adolfo@di-mare.com>.
Copyright © 1996
Derechos de autor reservados © 1996