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

Examen #2 [solución]

      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   
Figura 1

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.

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
Figura 1

4.a) [8 pts] Especifique el método vector::Eliminar_Final(size_t).

4.b) [25 pts] Implemente vector::Eliminar_Final(size_t).

Soluciones

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