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.
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:
Haga las suposiciones que considere oportunas y explíquelas convenientemente por medio de comentarios en el código.
Explique, con comentarios, sus decisiones de diseño y todo aquello que no resulte evidente. Evite poner comentarios de más, eligiendo nombres apropiados para sus métodos, atributos y variables.
Si no recuerda el nombre de algún método de la API, invénteselo y coméntelo adecuadamente para que podamos identificar a que método se está refiriendo.