Bienvenido a mis Tutorías © en la UNED
Exámenes
Programación I
2ª Semana, Febrero 2002:
  1. La expresión A+B sólo devuelve..
    a) INTEGER o REAL o CARDINAL
       *** b) INTEGER o REAL o CARDINAL o Conjunto
    c) INTEGER o REAL
    d) INTEGER
  2. Un programa A tiene definidos dos procedimientos B y C en este orden. El procedimiento C contiene una fución D. En la sección de declaración del programa, de los procedimientos y de la función, se declaran las siguientes variables: en A:k,l,m; en B:l,p,q; en C:k,M; en D:l.

    Supóngase que ninguno de los procedimientos ni la función poseen parámetros formales asociados. Señale la afirmación correcta:
       *** a) La sentencia p:=m*k es válida en el procedimiento B.

    b) La variable k definida en A es accesible en D.
    c) Las variables k y m definidas en C sólo son accesibles en este procedimiento.
    d) Desde el programa A se puede llamar a los procedimientos B, C y D.
  3. Si p, q y r son variables booleanas que toman los valores p=TRUE, q=TRUE, r=FALSE, ¿cuál de las siguientes expresiones devuelve un valor FALSE?
    a) p AND r<q OR NOT r
    b) p OR q AND r=p AND q OR r
       *** c) NOT p OR NOT r <> NOT(q AND r)
    d) (p<r) OR NOT q<p AND q
  4. En Modula-2, la palabra CASE:
    a) Sólo se utiliza en la parte declarativa.
    b) Sólo se utiliza en la parte ejecutiva.
    c) Se utiliza en cualquier punto del módulo de implementación.
       *** d) Se utiliza en cualquier punto de un bloque.
  5. Dado el siguiente fragmento de código
          dato^.siguiente:=dato
    
    a) dato y siguiente son registros.
    b) dato es un registro y siguiente es un campo.
    c) dato es el cursor de un registro.
       *** d) dato y siguiente son punteros.
  6. Se define el TipoConjunto de la siguiente forma:
        TYPE TipoConjunto = SET OF [0..6];
    
    Si
       a:=TipoConjunto{0,1,2}; b:=TipoConjunto{2,4,6};
       c:=TipoConjunto{1,3,5}; d:=TipoConjunto{0,1,2,3,4,5};
    
    Y se ejecutan las sentencias:
       EXCL(a,1); INCL(c,2);
    
    Se verifica:
    a) (2 IN a*(c*b)) AND (a*d<=b)
       *** b) (2 IN a*(c*b)) OR (a*d<=b)
    c) (a-b<=c) AND (0 IN c-a)
    d) (c<=d) AND (b*c=TipoConjunto{})
  7. ¿Cuál de las siguientes afirmaciones es CORRECTA?
    a) Un compilador simula una máquina base.
    b) Un intérprete traduce desde un lenguaje a una máquina base.
       *** c) Un intérprete simula una máquina virtual.
    d) Un compilador traduce desde un lenguaje a una máquina virtual.
  8. Una estructura de datos secuencia:
    a) Se ordena utilizando un FOR
    b) Siempre se realiza mediante punteros
    c) Es una estructura acotada
       *** d) Se recorre mediante un WHILE
  9. Dado un tipo Enumerado. La función predefinida que permite conocer la posición de un valor en la lista de valores es:
    a) VAL
    b) ODD
    c) HIGH
       *** d) ORD
  10. Del siguiente fragmento de código podemos decir que..
       PROCEDURE Imprimir( VAR A: SET OF CHAR )
    
       *** a) la invocación Imprimir(dato) es incorrecta.
    b) A es un conjunto abierto.
    c) la invocación Imprimir(dato) puede ser correcta.
    d) A es una cadena de caracteres.

Programación I, 2ª Semana, Febrero 2002:
Ejercicio Práctico

Construir un TAD (Tipo Abstracto de Datos) capaz de contener una figura como la del ejemplo en una cuadrícula de dimensión 3x3. El TAD dispondrá únicamente de los procedimientos RotarFigura e InvertirFigura, que transformarán la figura que reciban de entrada según se describe en el siguiente ejemplo:

ORIGINAL       ROTADA    INVERTIDA
 a b -         - - a      - b a
 - c -         d c b      - c -
 - d e         e - -      e d -

DEFINITION MODULE ModFig;
  CONST
    MAX = 3; (* tamaño de la matriz *)

  TYPE
    Dim = [1..MAX];
    TipoFig = ARRAY Dim, Dim OF CHAR;

  PROCEDURE RotarFigura( VAR fig :TipoFig);
  (*=======================================================================
    Transforma la matriz fig de forma que el elemento (i,j) pase a ocupar
    la posición (j , MAX-i+1).
  ========================================================================*)
  PROCEDURE InvertirFigura( VAR fig :TipoFig);
  (*=======================================================================
    Transforma la matriz fig de forma que el elemento (i,j) pase a ocupar
    la posición (i , MAX-j+1).
  ========================================================================*)
END ModFig.

IMPLEMENTATION MODULE ModFig;

  PROCEDURE RotarFigura( VAR fig :TipoFig);
  (*=======================================================================
    Transforma la matriz fig de forma que el elemento (i,j) pase a ocupar
    la posición (j , MAX-i+1).
  ========================================================================*)

    VAR
      fila, colum : Dim; (* índices que recorren la matriz *)
      figAux : TipoFig;

  BEGIN
    (*-- Obtener la figura rotada en la matriz auxiliar --*)
      FOR fila:=1 TO MAX DO
        FOR colum:=1 TO MAX DO
          figAux[fila, colum] := fig[colum, MAX-fila+1]; (*GIRO HORARIO de 90º*)
        END;
      END;
    (*-- Copiar en la matriz pasada por referencia la matriz rotada --*)
      fig:=figAux;
  END RotarFigura;

  PROCEDURE InvertirFigura( VAR fig :TipoFig);
  (*=======================================================================
    Transforma la matriz fig de forma que el elemento (i,j) pase a ocupar
    la posición (i , MAX-j+1).
  ========================================================================*)

    VAR
      fila, colum : Dim; (* índices que recorren la matriz *)
      figAux : TipoFig;

  BEGIN
    (*-- Obtener la figura invertida en la matriz auxiliar --*)
      FOR fila:=1 TO MAX DO
        FOR colum:=1 TO MAX DO
          figAux[fila, colum] := fig[fila, MAX-colum+1]; (*CAMBIO*)
        END;
      END;
    (*-- Copiar en la matriz pasada por referencia la matriz invertida --*)
      fig:=figAux;
  END InvertirFigura;
END ModFig.

No dudes en escribir si tienes alguna duda sobre estos ejercicios
abellogijon.uned.es