domingo, 27 de septiembre de 2015

Examen POO Junio 2015 prMaternidad (Segunda Parte)

Aquí os traigo la segunda parte. Lo siento por haber sido un vago... Al final ha sido uno de mis alumnos de éste verano quien ha hecho el código conmigo y me lo ha mandado. Gracias Álvaro ;)

Os recuerdo que la primera parte y el enunciado a descargar se encuentran aquí.

De todas formas os pego la segunda parte del enunciado:
(2 ptos.) La clase MaternidadLimiteBebeHabitacion se comporta como la clase Maternidad, con la diferencia de que va a detectar aquellas habitaciones que tienen un número de bebés que supera el valor máximo definido en la variable llamada maximo (int). Para cada habitación que supere el máximo permitido se guardará un mensaje informando de tal situación en la variable cambios (List). Con el propósito de saber la ocupación actual de cada habitación esta clase cuenta con una variable ocupacion (Map) que asocia cada habitación con el número de bebés actualmente asignados a ella. La variable ocupación se va actualizando cada vez que un nuevo bebé es registrado en el sistema y será consultada para ver si se supera el mencionado límite. 
a. Los constructores MaternidadLimiteBebeHabitacion(int maximo) y MaternidadLimiteBebeHabitacion(int maximo, String nombreFichero) deben crear todas las estructuras de datos: en el primer caso se crean vacías; en el segundo caso se añade toda la información del fichero cuyo nombre se pasa como segundo parámetro. El formato de dicho fichero es el mismo que el utilizado para la clase Maternidad. 
b. Redefinir addMadreBebes(Persona madre, Collection bebes). La nueva versión el método debe añadir la información de pacientes a la estructura de datos paciente sin tener en cuenta el límite de bebés. En caso de que se detecte que ello hace que alguna habitación supere dicho límite, se deberá añadir un mensaje informativo donde conste el número de habitación al listado de cambios (cambios) que han de hacerse. Se debe tener en cuenta que la incubadora (habitación con código 0) no estará sujeta a dicho límite. 
c. Redefinir String toString() para que a la información sobre las madres y bebés a las que atiende el servicio de maternidad mostrada en la clase Maternidad, añada todos los mensajes contenidas en la lista de cambios.

5) (1.5 ptos.) La clase ControladorMaternidad controla e interactúa con el modelo (clases Maternidad y Persona) y la vista (se proporcionan en el campus virtual la interfaz VistaMaternidad y la clase PanelMaternidad). El constructor debe habilitar la parte de inicialización de la vista (introducción del fichero de pacientes, y el botón de inicio) 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. El resto de la vista estará deshabilitado. La pulsación del botón “Inicio” hará que se cree un objeto de la clase Maternidad (pasándole el nombre del fichero introducido), se deshabilite la zona de inicialización y se habilite el resto de la vista. Cada vez que el usuario pulse algunos de los demás botones se procederá a realizar la acción correspondiente. El botón “Guardar” guarda la información sobre pacientes en el fichero indicado en el campo de texto a su derecha. En caso de que dicho campo contenga la cadena vacía, la información se imprime en el área de texto del panel. El botón “Buscar Madre” hará que se lea el código del bebé del campo de texto a su derecha y se muestre en el área de texto la habitación en que se encuentra su madre. El botón “Media” muestra en el área de texto el resultado de calcular la media de bebés. Tras cada operación se debe mostrar un mensaje de confirmación o error en la parte baja de la vista. 
Las clases Main y MainGUI se proporcionan en el campus virtual, para que se pueda probar el funcionamiento de las distintas clases a implementar.
Aquí os dejo las clases que deberían porporcionaos: VistaMaternidad PanelMaternidad
Y aquí os dejo ya las soluciones:
Empezamos con la clase MaternidadLimiteBebeHabitacion

package prMaternidad;

import java.io.FileNotFoundException;
import java.util.Collection;
import java.util.List;
import java.util.SortedMap;
import java.util.TreeSet;

public class MaternidadLimiteBebesHabitacion extends Maternidad {
 private int maximo;
 private List<String> cambios;
 private SortedMap<Integer, Integer> ocupacion;//no he encontrado nada que me pida usarlo pero abajo
 //esta señalado donde lo utilizaria si fuese necesario

 public MaternidadLimiteBebesHabitacion(int maximo) {
  super();
  this.maximo = maximo;
 }

 public MaternidadLimiteBebesHabitacion(int maximo, String nombreFichero) throws FileNotFoundException {
  super(nombreFichero);
  this.maximo = maximo;

 }

 public void addMadreBebes(Persona madre, Collection<Persona> bebes) {
  int cont = 1;
  if (!pacientes.containsKey(madre))
   pacientes.put(madre, new TreeSet<Persona>());
  if(!ocupacion.containsKey(madre.getHabitacion())){
   ocupacion.put(madre.getHabitacion(),0);
  }

  for (Persona b : bebes) {
   pacientes.get(madre).add(b);
   if (b.getHabitacion() != 0) {
    cont++;
   }
   ocupacion.put(madre.getHabitacion(), cont+ocupacion.get(madre.getHabitacion()));
   //en cada habitacion a traves de ocupacion lo añadiria aqui
   if (ocupacion.get(madre.getHabitacion()) >= maximo) {
    cambios.add("habitacion " + madre.getHabitacion()
      + "se encuentra llena");
   }
   
  }
 }

 public String toString() {
  String std = "";
  for (Persona madre : pacientes.keySet()) {
   std = std + madre;
  //para poder concatenar un string con el toString de una clase, el string ha de estar inicializado
   //aunque sea un string vacio como en este caso
   for (Persona hijo : pacientes.get(madre)) {
    std = std + "#" + hijo;
   }
   
   
   std = std + "\n";

  }
  for(int i=0;i<cambios.size();i++){
  std=std+cambios.get(i)+"\n ";//meto la lista de las habitaciones que superan el limite
  //de pacientes en el string
  }
  return std;
 }

}

Y acabamos con la clase ControladorMaternidad
package prMaternidad;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.FileNotFoundException;

public class ControladorMaternidad implements ActionListener {
 private Maternidad model;
 private VistaMaternidad vistamaternidad;

 public ControladorMaternidad(VistaMaternidad vm, Maternidad m) {
  this.vistamaternidad = vm;
  this.model = m;

  vistamaternidad.habilitarInit(true);
 }

 public void actionPerformed(ActionEvent ae) {
  String command = ae.getActionCommand();

  if (command.equals(VistaMaternidad.BUSCAR)) {
   try{
   int c = vistamaternidad.codigoBebe();
   try {
    int habit = model.encontrarMadre(c);
    vistamaternidad
      .entradaHistorial("La habitacion de la madre del bebe con codigo: "
        + c + "es: " + habit);
   } catch (MaternidadException e) {
    vistamaternidad.error("No se encuentra a la madre del bebe.");
   }
   }catch (NumberFormatException e){
    vistamaternidad.error("Hay un error con el codigo del bebe.");
   }
  } else if (command.equals(VistaMaternidad.GUARDAR)) {
   try {
    String ruta = vistamaternidad.fichSalida();
    model.escribirFichero(ruta);
   } catch (FileNotFoundException e) {

    vistamaternidad.entradaHistorial(model.toString());
   }
  } else if (command.equals(VistaMaternidad.INICIO)) {

   vistamaternidad.habilitarInit(true);
   try {
    model = new Maternidad(vistamaternidad.fichEntrada());
    vistamaternidad.habilitarInit(false);
    vistamaternidad.mensaje("Fichero cargado.");
   } catch (FileNotFoundException e) {
    vistamaternidad.error("Fichero no encontrado.");
   }

  } else if (command.equals(VistaMaternidad.MEDIA)) {
   double media = model.mediaBebes();
   vistamaternidad
     .entradaHistorial("La media de los bebes por cada madre en el hospital es: "
       + media);
  }

 }
}


Es trivial ver que ésto es más un trabajo duro que complejo... Por eso mismo me he demorado tanto en hacerlo, me daba demasiada pereza :P

Espero que os sea tan simple como a mí, pero sino ya sabéis que podeis preguntar las dudas aquí abajo;)

Saludos;)