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

      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:

+---+---+---+
| 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
+---+---+---+
En este problema use la siguiente definición del objeto TMagico:
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:

(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 }

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.

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