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! ¡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?
Adolfo Di Mare <adolfo@di-mare.com>.
|