Diciembre POO 2012-13 (Tipo Medicamento)

5
PROGRAMACIÓN ORIENTADA A OBJETOS Curso: 2012/13 EXAMEN DICIEMBRE 18/12/2012 Sea el tipo Medicamento con las siguientes propiedades: Código, de tipo entero, consultable. Nombre, de tipo cadena, consultable. Precio, de tipo real, consultable y modificable. Debe tomar un valor mayor que cero. Receta, de tipo lógico, consultable y modificable. Orden natural: los medicamentos se ordenan por nombre, y en caso de igualdad en el nombre por precio. Sea el tipo PrincipioActivo con las siguientes propiedades: Nombre, de tipo cadena, consultable. Porcentaje, de tipo real, consultable y modificable. % de participación en cada Medicamento. Sea el tipo Vademecum con la siguiente propiedad: Diccionario, de tipo SortedMap entre Medicamento y lista de PrincipioActivo, consultable. El Diccionario relaciona cada medicamento con su composición: un listado de principios activos que contiene el medicamento y el porcentaje de su composición. Suponga implementados todos los métodos consultores y modificadores que necesite para implementar los siguientes apartados. 1. Para el tipo Medicamento: 1.1. Cree una clase excepción que herede de RuntimeException y que se denomine ExcepcionPrecioMenorCero. (0.5 P) 1.2. Proporcione un constructor con cuatro argumentos, que proporcionen el código, el nombre, el precio y si tiene receta. Compruebe que el precio es válido; en caso contrario, debe lanzarse la excepción ExcepcionPrecioMenorCero, con un mensaje adecuado. (1 P) 1.3. Implemente el método para el criterio de igualdad. (0.5 P) 1.4. Proporciónese un método incrementaPrecio que recibe un valor entero entre 1 y 100 representando un porcentaje y actualiza el precio del medicamento en ese valor. Por ejemplo, si el precio del medicamento es de 100.00 y se recibe un valor de 10 se actualizará el precio a 110.00. (1 P) 2. Escriba un método estático en la clase de utilidad Medicamentos tal que dado el nombre de un fichero que contiene una estructura como la siguiente 1015, Aspirina,3.98 3526, Neubrofen, 6.2 4567, Frenadol, 7.5 1234, Bisolgrip, 8.5 sea leído y devuelva un objeto de tipo List<Medicamento> con la información contenida en el fichero. Tenga en cuenta que los medicamentos contenidos en el fichero no necesitan receta. Compruebe que el precio cumple con las restricciones y si no lance la excepción adecuada indicando la línea del fichero dónde se ha producido el error. (1 P) 3. Para el tipo Vademecum implemente los siguientes métodos: 3.1 Un método que calcule el precio medio de todos los medicamentos del vademecum. (1 P) 3.2 Un método que devuelva una lista con los nombres de aquellos medicamentos que tienen un precio menor que uno dado. (1 P) 3.3 Un método que calcule el número de medicamentos que necesitan receta. (1 P) 3.4 Un método que devuelva un SortedMap<String, List<Medicamento>> en la que a cada nombre de principio activo que aparezca como clave se le asociará la lista de medicamentos que tienen ese principio activo. (1 P) 3.5 Usando el método 3.4, construye otro tal que dado el nombre de un principio activo devuelva el medicamento más barato de entre los que incluyan ese principio activo. (1 P) 3.6 Un método que dado el nombre de un fichero escriba en él los medicamentos y su composición mediante una estructura como (1 P): Augmentine: amoxicilina 75.7% + ácido clavulánico 24.3% Frenadol : paracetamol 55.0% + clorfenamina 35.0% + dextrometorfano 20.0% ....

description

java

Transcript of Diciembre POO 2012-13 (Tipo Medicamento)

  • PROGRAMACIN ORIENTADA A OBJETOS Curso: 2012/13

    EXAMEN DICIEMBRE 18/12/2012

    Sea el tipo Medicamento con las siguientes propiedades:

    Cdigo, de tipo entero, consultable.

    Nombre, de tipo cadena, consultable.

    Precio, de tipo real, consultable y modificable. Debe tomar un valor mayor que cero.

    Receta, de tipo lgico, consultable y modificable.

    Orden natural: los medicamentos se ordenan por nombre, y en caso de igualdad en el nombre por precio.

    Sea el tipo PrincipioActivo con las siguientes propiedades:

    Nombre, de tipo cadena, consultable.

    Porcentaje, de tipo real, consultable y modificable. % de participacin en cada Medicamento.

    Sea el tipo Vademecum con la siguiente propiedad:

    Diccionario, de tipo SortedMap entre Medicamento y lista de PrincipioActivo, consultable.

    El Diccionario relaciona cada medicamento con su composicin: un listado de principios activos que contiene el

    medicamento y el porcentaje de su composicin. Suponga implementados todos los mtodos consultores y

    modificadores que necesite para implementar los siguientes apartados.

    1. Para el tipo Medicamento: 1.1. Cree una clase excepcin que herede de RuntimeException y que se denomine

    ExcepcionPrecioMenorCero. (0.5 P)

    1.2. Proporcione un constructor con cuatro argumentos, que proporcionen el cdigo, el nombre, el precio y si tiene receta. Compruebe que el precio es vlido; en caso contrario, debe lanzarse la excepcin

    ExcepcionPrecioMenorCero, con un mensaje adecuado. (1 P)

    1.3. Implemente el mtodo para el criterio de igualdad. (0.5 P)

    1.4. Proporcinese un mtodo incrementaPrecio que recibe un valor entero entre 1 y 100 representando un

    porcentaje y actualiza el precio del medicamento en ese valor. Por ejemplo, si el precio del medicamento es de

    100.00 y se recibe un valor de 10 se actualizar el precio a 110.00. (1 P)

    2. Escriba un mtodo esttico en la clase de utilidad Medicamentos tal que dado el nombre de un fichero que contiene una estructura como la siguiente

    1015, Aspirina,3.98 3526, Neubrofen, 6.2 4567, Frenadol, 7.5 1234, Bisolgrip, 8.5

    sea ledo y devuelva un objeto de tipo List con la informacin contenida en el fichero.

    Tenga en cuenta que los medicamentos contenidos en el fichero no necesitan receta. Compruebe que el precio

    cumple con las restricciones y si no lance la excepcin adecuada indicando la lnea del fichero dnde se ha

    producido el error. (1 P)

    3. Para el tipo Vademecum implemente los siguientes mtodos:

    3.1 Un mtodo que calcule el precio medio de todos los medicamentos del vademecum. (1 P)

    3.2 Un mtodo que devuelva una lista con los nombres de aquellos medicamentos que tienen un precio menor que uno

    dado. (1 P)

    3.3 Un mtodo que calcule el nmero de medicamentos que necesitan receta. (1 P)

    3.4 Un mtodo que devuelva un SortedMap en la que a cada nombre de

    principio activo que aparezca como clave se le asociar la lista de medicamentos que tienen ese principio activo. (1 P)

    3.5 Usando el mtodo 3.4, construye otro tal que dado el nombre de un principio activo devuelva el medicamento ms

    barato de entre los que incluyan ese principio activo. (1 P)

    3.6 Un mtodo que dado el nombre de un fichero escriba en l los medicamentos y su composicin mediante una

    estructura como (1 P):

    Augmentine: amoxicilina 75.7% + cido clavulnico 24.3% Frenadol : paracetamol 55.0% + clorfenamina 35.0% + dextrometorfano 20.0% ....

  • PROGRAMACIN ORIENTADA A OBJETOS

    Curso: 2012/13

    EXAMEN DICIEMBRE. SOLUCIONES 17/12/2012

    1.

    1.1 public class ExcepcionPrecioMenorCero extends RuntimeException{ public ExcepcionPrecioMenorCero( ) { super(); } public ExcepcionPrecioMenorCero(String texto ) { super(texto); } } 1.2 public MedicamentoImpl(Integer codigo, String nombre, Double precio, Boolean receta){ if (precio

  • 2.

    public static List leeMedicamentos(String nomFich) { List lp = new LinkedList(); try{ Scanner sc=new Scanner(new File(nomFich)); int cont=0; while (sc.hasNextLine()) { String linea = sc.nextLine(); List lisat= Utilidad.separaElementos(linea, ","); if (lisat.size()!=3){ throw new IllegalArgumentException("linea"+ cont +"Lectura de medicamento errnea "+lisat.size()); } Integer codigo = new Integer(lisat.get(0)); String nombre = lisat.get(1); Double precio = new Double(lisat.get(2)); Medicamento m = new MedicamentoImpl(codigo, nombre, precio, false); lp.add(m); cont++; } } catch (FileNotFoundException e) { System.out.println("Fichero no encontrado "+nomFich); } return lp;

    }

    3.

    3.1 public Double mediaPrecios(){ Double suma = 0.0; for (Medicamento m: getDiccionario().keySet()){ suma = suma + m.getPrecio(); } return suma/getDiccionario().size(); }

    3.2 public List medicamentosPrecioMenor(Double precio){ List lis = new LinkedList(); for (Medicamento m: getDiccionario().keySet()){ if(m.getPrecio().compareTo(precio) < 0){ lis.add(m.getNombre()); } } return lis; }

  • 3.3 public SortedMap pActMed(){ SortedMap res = new TreeMap(); for (Medicamento m: getDiccionario().keySet()){ for(PrincipioActivo pa: getDiccionario().get(m)){ if(res.containsKey(pa.getNombre())){ res.get(pa.getNombre()).add(m); } else{ List l = new LinkedList(); l.add(m); res.put(pa.getNombre(), l); } } } return res; } 3.4 public Integer cuentaReceta(){ Integer cont = 0; for (Medicamento m: getDiccionario().keySet()){ if(m.getReceta()){ cont++; } } return cont; } 3.5 public Medicamento masBaratoPrincipio(String pa){ SortedMap map = pActMed(); List lm = map.get(pa); Comparator comprecio = new ComparadorPrecio(); return Collections.min(lm, comprecio); } public class ComparadorPrecio implements Comparator{ public int compare(Medicamento m1, Medicamento m2){ return m1.getPrecio().compareTo(m2.getPrecio()); } }

  • 3.6 public void escribeFicheroMedicamentosComposicion(String nomFich){ File file = new File(nomFich); try { PrintWriter ps = new PrintWriter(file); for (Medicamento m: getDiccionario().keySet()) { String sPA = m.getNombre() + ": "; for (PrincipioActivo pa: getDiccionario().get(m)){ sPA = sPA + pa.getNombre()+ " " + pa.getPorcentaje()+"% + "; } ps.println(sPA); } ps.close(); } catch (FileNotFoundException e) { System.out.println("Fichero no encontrado "+nomFich); } }