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. Puede hacer el examen con lápiz. Resuelva tres de las cuatro preguntas. ¡No haga más de lo que se le pide!
1) [33 pts] Con el fin de trasmitir datos por una línea telefónica vigilada por la policía, en la Compañía Rateros INC han decidido encriptar los datos de manera que cualquiera que escuche la transmisión no puede descifrar el mensaje. Los mensajes son números enteros de cuatro dígitos, y usted tiene que escribir la función que codifica mensajes como sigue: primero remplace cada dígito por (la suma del dígito más siete) módulo 10. Luego, intercambie el primer y tercer dígito, y el cuarto con el segundo.
{ 1234, 4321, ... } ==> { 8901, 1098, ... } ==> { 0189, 9810, ... }
1.a) [13 pts] Especifique la función
Encripta()
, de dos parámetros, que codifica
los primeros números enteros del vector de enteros que
contiene el mensaje a cifrar.
1.b) [20 pts] Implemente Encripta()
.
1.c) [0 pts] Especifique e implemente
DesEncripta()
.
2) [33 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
carácter romano, excepto cuando ocurre que el siguiente
carácter 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) [13 pts] Especifique la función
Romano_INT()
que recibe como parámetro una
hilera que contiene un un número romano y lo convierte a su
valor entero. Su especificación debe ser completa.
2.b) [20 pts] Implemente Romano_INT()
(SUGERENCIA: use dos variables, para saber cuál es el
carácter anterior y cuál es el actual;
también puede usar una función que retorne el valor
de cada letra, de acuerdo a la Figura 1).
3) [33 pts] La función
strstr()
de la biblioteca
estándar C++ sirve para encontrar una subhilera dentro de
otra hilera.
3.a) [10 pts] Explique cuál es la diferencia
entre la hilera vacía ""
y el
puntero nulo NULL
(cero). Use ejemplos en su
respuesta.
3.b) [5 pts] Especifique la función
strstr()
.
3.c) [18 pts] Implemente strstr()
.
4) [33 pts] En la Tarea #10 usted implementó la clase
vector
, cuya declaración parcial
aparece en la
Figura 1.
4.a) [8 pts] Especifique el método
4.b) [25 pts] Implemente
Figura 1
typedef long T; // tipo de valor almacenado en la vector
class vector {
enum { Vdim = 40, VPdim = 30 };
class Pata {
friend class vector;
public:
T _v[VPdim]; // pedazo del vector, de longitud fija VPdim
}; // Pata
public:
void Agregar_Final (size_t); // Agregar elementos al Final
void Agregar_Principio(size_t); // Agregar elementos al principio
private:
size_t _izq_primero; // tamaño del bloque libre a la izquierda
size_t _der_ultimo; // tamaño del bloque libre a la derecha
size_t _der;
Pata * _vp[Vdim]; // vector de punteros hacia las partes ("patas")
}; // vector
vector::Eliminar_Final(size_t)
.vector::Eliminar_Final(size_t)
.
Adolfo Di Mare <adolfo@di-mare.com>.
|