Universidad de Costa Rica
|
|
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
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)].
Adolfo Di Mare <adolfo@di-mare.com>.
|