miércoles, 26 de marzo de 2014

Examen Programación orientada a Objetos Sept 2012 Asignar Plazas

Buenas gente. Os traigo otro examen de Programación Orientada a Objetos (Java de primero, del segundo cuatrimestre. No voy a copiar los códigos porque haríamos esto interminable; por eso os pido que si, por cualquier razón, los enlaces no funcionan, aviséis y los resubiré lo antes posible ;)

Aquí tenéis las clases necesarias para implementarlo todo:
Con plaza
Con plaza familiar
Sin plaza
Sin plaza familiar
Solicitudes

Programa Principal
Programa Principal GUI

Enunciado en pdf

Las soluciones os las pongo linkeadas en los apartados, para mayor comodidad ;)

EDICION: Faltaban dos clases. Os las pongo a continuación. Gracias por avisar ;)
VistaAsignacion.java
PanelAsignacion.java

Se desea llevar a cabo la gestión informatizada de la asignación de plazas en un colegio de educación infantil y primaria. Para ello, se creará un proyecto prAsignacionPlazas con las clases siguientes:

1) (0.25 ptos.) La clase AsignacionException se utilizará para tratar diferentes situaciones excepcionales tal y como se indica más adelante. Se trata de una excepción no comprobada.

2) (1.5 ptos.) La clase Solicitante debe mantener información sobre un solicitante de plaza. En concreto, el NIF del tutor legal del solicitante (String), el nombre del solicitante (String), los puntos (double) del solicitante después de ser baremado, y una indicación (boolean) de si ese solicitante tiene plaza o no. También dispondrá del constructor y los métodos necesarios para:
- a. (0.25 ptos.) Construir un objeto de la clase a partir del NIF, nombre y puntos del solicitante. La representación de un solicitante (String toString()) viene dada por esos tres datos, separados por espacios en blanco.
- b. (0.25 ptos.) Obtener el NIF (String getNIF()), obtener el nombre (String getNombre()), obtener los puntos (String getPuntos()), ver si se le ha asignado una plaza (boolean getTienePlaza()) y asignarle o quitarle una plaza al solicitante (void setTienePlaza(boolean plaza)).
- c. (0.5 ptos.) Dos objetos de la clase Solicitante son iguales si coinciden sus nombres y sus puntos. No se tendrán en cuenta las diferencias por mayúsculas o minúsculas.
- d. (0.5 ptos.) Un objeto de la clase Solicitante s1 es menor que otro s2 cuando el número de puntos de s1 sea mayor que el número de puntos de s2. Si el número de puntos es igual, entonces s1 será menor cuando su nombre sea menor alfabéticamente (independientemente de minúsculas y mayúsculas) que el nombre de s2. 

3) (3.50 ptos.) La clase Colegio almacenará la información de los solicitantes en una estructura solicitudes de tipo SortedMap>, donde los posibles valores del campo clave de la estructura solicitudes serán “I3”, “I4” o “I5”, para hacer referencia a los cursos de infantil de 3, 4 ó 5 años, y “P1”, “P2”, “P3”,…,”P6”, para hacer referencia a los cursos de primaria entre 1º y 6º (no tiene por qué haber solicitudes para cada curso escolar). También dispondrá del constructor y los métodos necesarios para: 
- a. (1.75 ptos.) Construir un objeto de la clase a partir del nombre del fichero (String) que contiene la información necesaria para crear la aplicación solicitudes. Los datos para probar el correcto funcionamiento del examen son los que aparecen en el fichero solicitudes.txt proporcionado en el campus virtual. Una parte de este fichero se muestra a continuación para ver su formato. Para cada curso para el que haya solicitudes se indica: (1) una línea con el nombre del curso (ej. I3 en la primera línea del fichero) y el número de alumnos en ese curso (ej. 3 en la primera línea del fichero), y (2) una línea con los datos de cada solicitante incluyendo NIF del tutor, número de puntos y nombre del solicitante (ej. si para el curso I3 se indicaba que había 3 solicitudes, en el fichero habrá 3 líneas, una para cada solicitante). I3 3 111111110A 25 María Martín Arrebola 111111111B 26.5 Antonio Gómez Muñoz 111111112C 30 Antonio Pérez Gallardo I4 1 222222220A 14 Eva López García Cualquier error de formato detectado (falta algún dato del solicitante, o bien el dato no es del tipo correcto), provocará el lanzamiento de una excepción del tipo AsignacionException. 
- b. (1 pto.) Hacer la asignación de plazas (void asignarPlazas(Map plazas)). Este método recibe una aplicación donde se indica el número de plazas libres para cada curso escolar (ver programa Principal.java proporcionado en el campus virtual). Si para un determinado curso escolar no existe una entrada en la aplicación es que el número de plazas libres para ese curso es 0. Para cada curso en el que haya plazas libres habrá que modificar la aplicación solicitudes para indicar para cada solicitante si tiene o no tiene plaza. La asignación de plazas se realizará de la forma siguiente: Se le asignará plaza primero a los solicitantes que tengan más puntos. En caso de empate se le asignará plaza primero al que su nombre sea alfabéticamente menor. 
- c. (0.25 puntos) Hacer que todos los solicitantes queden sin plazas (void limpiar()). 
- d. (0.5 ptos.) Mostrar asignaciones de plazas con orden natural. Dos métodos, uno para mostrar sobre un PrintWriter la información de los solicitantes organizados por curso (void mostrarSolicitantes (boolean conPlaza, PrintWriter pw)) y otro para almacenarla en un fichero (void mostrarSolicitantes (boolean conPlaza, String nombreFichero)). Si el parámetro conPlaza es true, se mostrarán los solicitantes a los que se les ha podido asignar plaza. Si es false, se mostrarán los solicitantes a los que no se les ha podido asignar plaza. El formato de salida es como el mostrado en los ficheros conPlaza.txt y sinPlaza.txt proporcionados en el campus virtual. 

4) (2.75 ptos.) La clase ColegioFamiliar se comporta como la clase Colegio. La diferencia radica en que si dos hermanos piden plaza en el mismo colegio, en el mismo o en distinto curso, según la asignación de plazas que se realiza en la clase Colegio puede ocurrir que uno de los hermanos consiga la plaza y el otro no. Para evitar esto, en esta clase la asignación de plazas tiene en cuenta el hecho de que dos o más solicitantes pueden ser hermanos (son solicitantes que tienen el mismo NIF de su tutor) y siempre se cumplirá que o todos los hermanos consiguen plaza o ninguno de ellos la consigue. Para ello, dispondrá del constructor y los métodos necesarios para: 
- a. (0.25 ptos.) Construir un objeto de la clase a partir del nombre del fichero (String) que contiene la información necesaria para crear la aplicación solicitudes. El formato del fichero es el mismo que el usado para crear un objeto de la clase Colegio.  
- b. (2.5 ptos.) Una redefinición del método public void asignarPlazas(Map plazas) que se comporte de la siguiente forma: antes de asignar una plaza a un solicitante hay que localizar a todos sus hermanos (incluyendo al solicitante) y comprobar si sería posible asignarles plaza a todos (no se tendrá en cuenta la puntuación de los hermanos del solicitante, sólo si hay plaza o no disponible para todos ellos). Si es posible, se le asigna la plaza a todos ellos; en otro caso, no se le asigna a ninguno. Para ello, se deben implementar los siguientes métodos auxiliares: 
   1. <SortedMap> buscarHermanos ( String nif) que recibe un NIF y devuelve una aplicación donde el campo clave es el nombre de los cursos y el campo valor es la lista de hermanos que han solicitado plaza en ese curso (todos los hermanos tienen el mismo NIF de su tutor).    2. boolean hayPlazas(<SortedMap> hermanos, Map plazas), que recibe dos valores: el primero es la aplicación con la información de los hermanos obtenida con el método anterior; el segundo es otra aplicación donde el campo clave son los cursos y los valores son el número de plazas disponibles en ese curso. El método devuelve true si es posible asignarle una plaza a cada uno de los hermanos indicados en el primer parámetro, y false en caso contrario.   3. void asignarPlazaHermanos (<SortedMap> hermanos, Map plazas), que recibe también la información de los hermanos y las plazas disponibles en cada curso y, suponiendo como precondición que hay plaza para todos los hermanos hace las asignaciones de plazas, reduciendo el número de plazas disponibles de acuerdo a las asignaciones realizadas. 

5) (2 ptos.) La clase ControladorAsignacion controla e interactúa con el modelo (compuesto por las clases anteriormente descritas) y la vista (se proporcionan en el campus virtual la interfaz VistaAsignacion y la clase PanelAsignacion). El constructor debe habilitar la parte de inicialización de la vista (introducción del fichero de solicitudes, y los botones de iniciar la asignación) y mostrar un mensaje en la parte baja de la misma indicando al usuario que introduzca el nombre del fichero y pulse el botón iniciar que desee. El resto de la vista estará deshabilitado. La pulsación de uno de los botones de iniciar hará que se cree un objeto de la clase Colegio o de la clase ColegioFamiliar, se deshabilite la zona de inicialización, se habilite el resto de la vista y se muestre un mensaje al usuario invitándolo a realizar la asignación. Cada vez que el usuario pulse el botón “Realizar Asignación” se procederá a realizar la asignación a todos los solicitantes y todos los cursos. El resultado se mostrará en el área de texto y se escribirá en el fichero de salida especificado. El botón “Finalizar” deshabilita esta zona de proceso, limpia las zonas de texto y habilita la parte de inicialización de la vista para poder empezar de nuevo con otros ficheros de entrada. Si al pulsar un determinado botón, no se han introducido los datos necesarios en los campos de texto, se debe mostrar un mensaje de error en la parte baja de la vista. Las clases principales con ejemplos de uso de las clases anteriormente descritas (SSin GUIs y con GUIs) están disponibles en el campus virtual. 


Y esto es todo. Espero que comentéis con cualquier duda o problema con que os encontréis.

Saludos ;)

2 comentarios:

  1. Se te olvido colgar las clases Vista y Panel de la GUI :)
    Y el archivo ConPlaza no esta, hay otro en su lugar.

    ResponderEliminar