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] Un cuadrado mágico es una matriz en que la suma los números de las filas y las columnas, o de la diagonal, siempre es la misma. Por ejemplo, los siguientes son cuadrados mágicos:
En este problema use la siguiente definición del objeto TMagico:+---+---+---+ | 8 | 1 | 6 | 1 1 1 1 1 +---+---+---+ 1 1 1 1 1 | 3 | 5 | 7 | 1 1 1 1 1 +---+---+---+ 1 1 1 1 1 | 4 | 9 | 2 | 1 1 1 1 1 +---+---+---+
CONST MxSize = 200; TYPE TMagico = OBJECT PRIVATE _m : ARRAY[1..MxSize,1..MxSize] OF INTEGER; { matriz } _n : WORD; { tamaño de _m[] } PUBLIC PROCEDURE Init; { Constructor } ... etc ... FUNCTION Ok : BOOLEAN; END; { TMagico }
Implemente el método TMagico.Ok(), que retorna TRUE cuando los valores almacenados en el objeto TMagico forman un cuadrado mágico, y FALSE en caso contrario.
1.a) [11 pts] Especifique el método TMagico.Ok().
1.b) [22 pts] Implemente el método TMagico.Ok().
2) [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á ¢nbsp;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 }
2.a) [11 pts] Especifique el método TTarifa.Calcule().
2.b) [22 pts] Implemente el método TTarifa.Calcule()
3) [33 pts] Implemente la función BinDec(). [Sugerencia: use un ciclo FOR y procese la hilera de atrás hacia adelante].
FUNCTION BinDec( {+} b: STRING { número en formato binario } ) {>>>>}: LONGINT; { número en decimal } { RESULTADO Toma la hilera "b" y la transforma al valor decimal equivalente. - "b" es un número binario compuesto de unos y ceros. - "b" sólo puede contener los caracteres "0" y "1". - "b" pude tener una longitud máxima de 255 caracteres. } { EJEMPLO 6..3..0 6..3..0 b = '0100101' b = '1000110' -------------- -------------- 0 * 2^6 = 0 1 * 2^6 = 64 1 * 2^5 = 32 0 * 2^5 = 0 0 * 2^4 = 0 0 * 2^4 = 0 0 * 2^3 = 0 0 * 2^3 = 0 1 * 2^2 = 4 1 * 2^2 = 4 0 * 2^1 = 0 1 * 2^1 = 2 1 * 2^0 = 1 0 * 2^0 = 0 ---- ---- BinDec(b) ==> 37 70 37 = 0*2^6 + 1*2^5 + 0*2^4 + 0*2^3 + 1*2^2 + 0*2^1 + 1*2^0 70 = 1*2^6 + 0*2^5 + 0*2^4 + 0*2^3 + 1*2^2 + 1*2^1 + 0*2^0 }
4) [33 pts] Considere la siguiente función, que ha sido pasada por el Destructor Interplanetario de Programas Pascal:
FUNCTION palmena(glutabana: LONGINT ) : BOOLEAN; CONST plegelena = 10; VAR gluta : LONGINT; VAR muca : LONGINT; VAR plangalana : LONGINT; BEGIN gluta := 0; plangalana := glutabana; WHILE plangalana <> 0 DO BEGIN muca := plangalana MOD plegelena; gluta := gluta + (muca * muca * muca); plangalana := plangalana DIV plegelena; END; palmena := (gluta = glutabana);END;
4.a) [11 pts] Reescriba esta función de acuerdo a las Convenciones de Programación de Adolfo Di Mare.
4.b) [11 pts] Haga un ejemplo del resultado de ejecutar esta función con el valor 408.
4.c) [11 pts] Diga qué hace la función. Sugiera nombres mejores para cada una de los identificadores de la función.
Adolfo Di Mare <adolfo@di-mare.com>.
|