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

Examen Parcial #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. Cuentan las convenciones. Puede hacer el examen con lápiz. ¡No haga más de lo que se le pide! ¡ESCOGA 3 DE LAS 4 PREGUNTAS!

1) [33 pts] El ICE acaba de contratarlo para automatizar el cobro de las tarifas de llamadas por teléfono celular, para lo que usted debe aplicar la siguente tabla:

       Desde     Hasta      Tarifa
       ---------------      ------
[1]    00:00 --> 07:59       0.25
[2]    08:00 --> 11:59       0.75
[3]    12:00 --> 16:59       1.00
[4]    17:00 --> 23:59       0.35

      Las tarifas son en colones por minuto. Si una llamada comienza a las 07:45 y termina a las 08:15, entonces para calcular el costo usted tiene que contar cuántos minutos en cada rango usó el cliente, y retornar el acumulado. En este caso se han usado [07:45-->07:59] = 15 minutos en el rango [1], y [08:00-->08:15] = 16 minutos en el rango [2], por lo que el costo total de la llamada será 15.75: (15 * 0.25) + (16 * 0.75) = 3.75 + 12.00 = 15.75

      Implemente el método TTarifa.Calcule(desde, hasta), que retorna el valor de la costo de una llamada que comienza en la hora "desde" y termina en la hora "hasta". Ninguna llamada cruza la media noche. Use las horas en el formato militar: 800 es las 8:00 am, y 1315 es 13:15 o sea 1:15 pm. Use la siguiente definición para el objeto TTarifa:

CONST
  MxSize = 200;

TYPE
  TTarifa = OBJECT
    PRIVATE
      _de : ARRAY[1..MxSize] OF WORD;   { rango "desde" }
      _a  : ARRAY[1..MxSize] OF WORD;   { rango "hasta" }
      _tf : ARRAY[1..MxSize] OF REAL;   { tarifa        }
      _n  : WORD;     { cantidad de valores en la tabla }
    PUBLIC
      PROCEDURE Init; { Constructor }
      ... etc ...
      FUNCTION  Calcule(desde, hasta: WORD) : REAL;
  END; { TTarifa }

1.a) [11 pts] Especifique el método TTarifa.Calcule().

1.b) [22 pts] Implemente el método TTarifa.Calcule()

2) [33 pts] El tipo TVectorSube sirve para manipular vectores de números reales de longitud variable. Por ejemplo, si el vector ya tiene 10 elementos, y se agrega al vector mediante TVectorSube.Put(15,v) al valor "v" en la posición número 15, entonces automáticamente el vector cambia de tamaño para acomodar cinco valores más (con índices 11,12,13,14 y 15). En este caso, el valor del campo "_n" pasa de 10 a 15, pues "_n" indica cuántos valores tiene el vector en cada momento. Los valores intermedios [11..14] quedan en cero.

  CONST
  MxVec = 500;   { Capacidad máxima de un TVectorSube }

TYPE
  TVectorSube = OBJECT
    PRIVATE
      _v : ARRAY [0..MxVec-1] OF REAL;
      _n : WORD; { dimensión (o tamaño) actual del vector [0..MxVec] }

    PUBLIC
      PROCEDURE Init;                    { constructor }
      PROCEDURE Done;                    { destructor  }

      PROCEDURE SetDim(n: WORD);         { le cambia el tamaño al vector }
      PROCEDURE Ordena;                  { ordena al vector }
      FUNCTION  Val(i: WORD)  : REAL;    { retorna vec[i] }
      PROCEDURE Put(i: WORD; v: REAL);   { cambia  vec[i] := v }

      PROCEDURE Intercale(VAR V: TVectorSube); { intercala los valores de V }
  END; { TVectorSube }

2.a) [11 pts] Especifique TVectorSube.Intercale(V) que toma los valores que están en orden ASCENDENTE en el vector "V" y los agrega a SELF, cuyos valores también están ordenados ASCENDENTEMENTE [el vector queda ordenado después de invocar al método TVectorSube.Ordena()]. Note que si no hay campo para meter a todos los valores, en SELF quedarán sólo los más pequeños, que aparecen de primeros en SELF y V. Incluya en su especificación un ejemplo.

2.b) [22 pts] Implemente TVectorSube.Intercale(). En su implementación debe efectuar la intercalación sin invocar al método TVectorSube.Ordena() y además SI puede usar un vector adicional para almacenar valores intermedios.

3) [33 pts] Considere la especificación de la función LONGINT_Dot():

FUNCTION LONGINT_Dot(
  {+} l : LONGINT     { qué transformar }
) {>>>} : STRING;
{ RESULTADO
  Retorna una hilera que contiene el valor de "l" pero expresado
  como cuatro números que están cada uno en el rango [0..255].
  - Este el el formato que se usa para expresar los números IP
    de Internet, que siempre son números de 32  bits que se
    representan como 4 números decimales en el rango de 8 bits.

  - (4*8=32)    255  = FF  = 11111111
                   10    16          2

  - LONGINT_Dot(32)        ==> '0.0.0.32'
  - LONGINT_Dot(256)       ==> '0.0.1.0'
  - LONGINT_Dot($0a0b0c0d) ==> '10.11.12.13'
  - LONGINT_Dot($bbaaddcc) ==> '187.170.221.204'
  - LONGINT_Dot($00ff0a0b) ==> '0.255.10.11'
  - LONGINT_Dot($FFFFFFFF) ==> '255.255.255.255'  }

3.a) [11 pts] Especifique la función Dot_LONGINT( {+} s : STRING) : LONGINT; que tiene el efecto exactamente inverso a LONGINT Dot(). No olvide incluir en su especificación las precondiciones de la función (cláusula REQUIERE).

3.b) [22 pts] Implemente Dot_LONGINT().

4) [33 pts] Explique las siguientes particularidades del lenguaje Turbo Pascal.

4.a) [7 pts] ¿Cuál es la diferencia entre una UNIT Turbo Pascal y el programa principal?

4.b) [7 pts] ¿Para qué se necesita la sección INTERFACE en Turbo Pascal?

4.c) [7 pts] ¿Porqué algunos procedimientos no se declaran en la sección de INTERFACE, pero sí en la de IMPLEMENTATION?

4.d) [7 pts] ¿Cómo logra Turbo Pascal NO recompilar todas las UNIT que forman un programa cuando uno cambia una sóla de ellas?

4.e) [7 pts] ¿Cuál es la diferencia entre la tecla F7 y F8, en el ambiente integrado de Turbo Pascal?

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