Práctica 13: Simulacro de examen


 
Fecha
30 de mayo de 2008
Conceptos
Todos los estudiados
Soluciones
solución.rar
Profesores
Luis de la Fuente, Pablo Basanta Val* Jorge Ruiz Magaña, José María Rubio

Introducción

Son de sobra conocidas las ventajas que presenta la realización de problemas a la hora de fortalecer los conocimientos adquiridos en esta asignatura. Y es que llegados a esta altura resulta difícil aseverar que se aprende lo mismo yendo a las sesiones de laboratorio que dejándolas de lado desde el principio, como si no formasen parte de de la asignatura. Eso es así por que es en en estas sesiones, mediante la exposición a pequeños problemas de programación, donde día a día vamos forjando, a golpe de tecla y de forma claramente incremental, el cuerpo de los conocimientos cuya osamenta se ha articulado en las clases magistrales de teoría. A este respecto, podemos decir que el JDK nos ayuda, mediante mensajes de error, excepciones y comportamientos anómalos de nuestro código, a colocar tendones y músculos sobre los conceptos de la teoría.

Llegados al final de la asignatura ya pensamos más en lo que va a ser el examen, qué apartados va a tener, el tiempo que tenemos para realizar cada uno de ellos, o como voy a terminar el juego a tiempo  que en las sesiones de prácticas. Por lo que el objetivo de esta sesión es facilitaros esta tarea mediante una sesión un poco atípica donde os enfrentaréis a  la parte práctica de un examen correspondiente a una edición pasada. Este tipo de práctica os ayudará en dos aspectos fundamentales:

Y todo ello sin que perdáis ninguna de vuestras codiciadas convocatorias, empleando  para ello  una sesión de dos horas de laboratorio.


Adaptando el examen de junio 2007

A fin de practicar hemos tomado el examen de Junio del 2007 y lo hemos transformado en práctica, introduciendo tan sólo pequeñas variantes que lo adapten al formato del laboratorio. Dos son los cambios más relevantes que se han introducido:

Y así, sin ningún otro tipo de preámbulo os dejamos con el examen deseándoos buena suerte.

 

Examen Organización de Contenidos Audiovisuales, 25 de junio 2007

NOMBRE:
APELLIDOS:
NIA:
GRUPO:

2ª Parte: Problemas

Duración: 2:30 horas
Puntuación: 5 puntos (sobre 10)
Fecha: 25 de junio de 2007
No se podrán usar libros y apuntes

Problema 1 (2.5 puntos sobre 5)

El famoso juego del Tetris se basa en el uso de figuras bidimensionales construidas en base a agrupaciones de cuatro piezas o bloques en distintas disposiciones y que caen de la parte superior de la pantalla del juego. A continuación se muestran los distintos tipos de figuras que pueden darse en el juego:

 

 

 

Como se puede observar en la imagen, cualquier figura se puede inscribir en un rectángulo asociado que contenga a sus piezas. Para modelar dichas figuras mediante Programación Orientación a Objetos (POO), se establece que cada pieza sea un objeto de la clase Button (java.awt.Button) y, por consiguiente, que una FiguraTetris contiene un array de dos dimensiones (piezas) de objetos Button tal y como se muestra a continuación:

 

 

Figura 1.

 Aunque el jugador no puede impedir la caída de las FiguraTetris, sin embargo sí que puede decidir el sentido de la rotación de las mismas en múltiplos de 90º(0°, 90°, 180°, 270°). La rotación de una FiguraTetris produce como resultado una FiguraTetris "transpuesta" y que es aquella en la que el número de filas y columnas  de su array de piezas se intercambian (el número de filas del array de piezas coincide con el del número de columnas de su transpuesta y viceversa). Para establecer el sentido de rotación de una FiguraTetris, se establece una variable de tipo boolean que indica si la rotación es en sentido horario o no. A continuación se muestran los dos tipos de rotación posible en las sucesivas invocaciones al método que rota la FiguraTetris:

   - Si la variable boolean está a true, la rotación se efectúa en sentido de las agujas del reloj:

 


   - Si la variable boolean está a false entonces se rota en sentido contrario de las agujas del reloj:

 


La clase FiguraTetris tiene la siguiente declaración:

import java.awt.Button;
import java.awt.Label;
import java.awt.Color;
import java.awt.Panel;
import java.awt.GridLayout;

public class FiguraTetris {
    /** El array de piezas */
    public Button[][] piezas = null;
    /** El nombre de la figura*/
    public String nombre;   
    /** El ancho de las piezas.*/
    int ancho = 0;    
    /** El alto de las piezas.*/
    int alto = 0;


public FiguraTetris(String nombre, Color color, int ancho, int alto,      boolean[][] bPiezas ) { ... }
    public void rota( boolean bSentido ) { ... }    
    public Panel getPanel() { ... }
}

 

Apartado 1
Implementar el constructor de la clase FiguraTetris:

public FiguraTetris(String nombre, Color color, int ancho, int alto, boolean[][] bPiezas ) { ... }

El funcionamiento del constructor de FiguraTetris es el siguiente:

1.   Comprueba si el número total de piezas de la figura es 4. Para ello, cada pieza viene caracterizada porque el elemento bPiezas[i][j] está establecido a true. Si el número total de piezas no es 4, deberá imprimir por pantalla el siguiente mensaje: ERROR: NÚMERO DE PIEZAS INCORRECTO.

2.   Crea el array piezas con el mismo tamaño que el del array bPiezas.

3.   Inicializa el array piezas de tal manera que, para cada elemento de bPiezas[i][j] que esté a true, se crea el Button en la posición correspondiente del array piezas con las dimensiones y color correspondientes.

 

Apartado 2
Implementar el método para rotar la FiguraTetris.

public void rota( boolean bSentido ) { ... }

El funcionamiento de este método es el siguiente:

1.   Crea un nuevo array transpuesto de Button con sus dimensiones correctas en base al array piezas

2.   Recorre el nuevo array y, en función del sentido de rotación bSentido, copia el elemento correspondiente de piezas en el nuevo array transpuesto que se ha creado.

3.   Por último, actualiza piezas con el nuevo array.

NOTA IMPORTANTE: Para obtener el número de filas y columnas del array bidimensional (piezas)  ten en cuenta las siguientes sentencias que permiten calcularlos:
int numFilas = piezas.length;
int numColumnas = piezas[i].length;  // Número de columnas de la fila i

 

Apartado 3
Implementar el método que devuelve un Panel relleno con la representación gráfica de Figura que aparece en la figura 1.

public Panel getPanel() { ... }

Como se puede observar, dicho panel tiene una estructura de array rectangular con el mismo tamaño que piezas y para construirlo hay que tener en cuenta los siguientes aspectos:

·       En el caso de que el elemento piezas[i][j] contenga un Button, lo añade en la posición correspondiente del panel.

·       Si, por el contrario, el elemento piezas[i][j] es null, para simular el hueco correspondiente del panel, se crea una etiqueta (Label) completamente negra con las mismas dimensiones que las piezas y se asignará en la posición correspondiente del panel.

PISTA: Para construir el panel, utiliza el gestor GridLayout que se importan en la declaración de la clase

 

                                                                                                                                                                                               

Problema 2 (2.5 puntos sobre 5)

Apartado a)

Implemente una base de datos de contactos (nombre y teléfono). La base de datos debe permitir:

    - Añadir nuevos contactos.

    - Buscar el contacto que corresponde a un nombre dado.

 La base de datos utilizará como identificador el nombre de un   contacto por lo que no deberá haber dos contactos con el mismo nombre.

Apartado b)

Implemente una GUI que permita buscar contactos a partir del nombre. La GUI deberá ser lo más simple posible, su aspecto y comportamiento se deja a su criterio, pero recuerde que no dispone de mucho tiempo.

Para la realización de ambos apartados, tenga en cuenta las siguientes advertencias:

    - Incluya en la solución todas las clases que necesite y que no vengan incluidas en el API de Java.

    - Aproveche toda la memoria disponible para la base de datos.

    - No es necesario evitar que la GUI quede congelada durante las búsquedas.

    - Sea claro y conciso: