miércoles, 26 de febrero de 2014

Práctica de Alumnos, Notas y Asignaturas.

Buenas gente, aqui vuelvo con un nuevo ejercicio ;)
Esta vez vamos a crear una aplicación para anotar las calificaciones obtenidas por alumnos en una asignatura. Para ello se crearán las clases Alumno, Asignatura y AlumnoException:

• Crear la excepción comprobada AlumnoException para manejar situaciones excepcionales que podrán producirse en las siguientes clases. 
• La clase Alumno mantiene información de un alumno del cual se conocen el nombre (String), el dni (String) y la calificación obtenida en una asignatura (double). La clase tendrá dos constructores, uno en el que se proporcionan el nombre, el dni y la calificación y otro con solo el nombre y el dni siendo en este caso la calificación igual a cero. Si la calificación dada es negativa se deberá lanzar una excepción AlumnoException. Dos alumnos son iguales si coinciden sus nombres y sus dni. La letra del dni podrá estar indistintamente en mayúsculas o minúsculas. Crear también métodos para conocer el nombre, (String getNombre()), el dni (String getDni()) y la calificación (double getCalificacion()). La representación de un alumno debe mostrar el nombre y el dni pero no la calificación. 

• Crear la clase Asignatura. Una asignatura se crea a partir del nombre de la misma y de un array de String en la que cada elemento del array contendrá toda la información para crear un alumno con el siguiente formato (deben aparecer siempre los tres tokens separados por ;). Por ejemplo: 55343442L;Godoy Molina, Marina;6.31 
El constructor deberá crear, si es posible, el alumno con el nombre, dni y calificación dadas y almacenarlo en un array de alumnos. Si no fuera posible, deberá almacenar esta entrada en otro array de String (llamado malos) precedido de un comentario que indique cual ha sido el problema por lo que no se ha podido crear el alumno. Por ejemplo, ante la entrada: "342424f2J;Fernandez Vara, Pedro;tr"
Se incluirá en malos el siguiente String: "ERROR. Nota no numérica: 342424f2J;Fernandez Vara, Pedro;tr". 
La clase Asignatura incluirá el método: double getCalificacion(Alumno al) throws AlumnoException que devuelve la calificación del alumno al dado si es que existe. Si no existe se lanzará una excepción AlumnoException. También tendrá dos métodos, uno que devuelve el array de alumnos (Alumno[] getAlumnos()) y otro que devuelve al array de entradas malas (String [] getMalos()). 
Además incluirá un método que proporcione la media de las calificaciones de los alumnos de la asignatura (double getMedia()). Por último dispondrá de una representación de los objetos de la clase como la que se muestra en el ejemplo (usar StringBuilder para crear la representación).

Mucho que leer pero no es tanto, verdad? ;) Aquí teneis el test para probarlo:

public class Main {
  static String[] als = {
  "25653443S;Garcia Gomez, Juan;8.1",
  "23322443K;Lopez Turo, Manuel;4.3",
  "24433522M;Merlo Martinez, Juana;5.3",
  "53553421D;Santana Medina, Petra;-7.1",
  "55343442L,Godoy Molina, Marina;6.3",
  "342424f2J;Fernandez Vara, Pedro;2.l",
  "42424312G;Lopez Gama, Luisa;7.1" };

  public static void main(String[] args) {
    Asignatura algebra = new Asignatura("Algebra", als);
    try {
      Alumno al1 = new Alumno("Lopez Turo, Manuel", "23322443k");
      Alumno al2 = new Alumno("Fernandez Vara, Pedro", "342424f2J");
      System.out.println("Calificacion de " + al1 + ": "
        + algebra.getCalificacion(al1));
      System.out.println("Calificacion de " + al2 + ": "
        + algebra.getCalificacion(al2));
    } catch (AlumnoException e) {
      System.err.println(e.getMessage());
    }

    System.out.printf("Media %4.2f\n", algebra.getMedia());

    System.out.println("Alumnos...");

    for (Alumno alumno : algebra.getAlumnos()) {
      System.out.println(alumno + ": " + alumno.getCalificacion());
    }
    System.out.println("Malos...");
    for (String malo : algebra.getMalos()) {
      System.out.println(malo);
    }
    System.out.println(algebra);
  }
}

Y este debe ser el resultado que os salga ;)

Calificacion de Lopez Turo, Manuel 23322443k: 4.3
El alumno Fernandez Vara, Pedro 342424f2J no se encuentra
Media 6,20
Alumnos...
Garcia Gomez, Juan 25653443S: 8.1
Lopez Turo, Manuel 23322443K: 4.3
Merlo Martinez, Juana 24433522M: 5.3
Lopez Gama, Luisa 42424312G: 7.1
Malos...
ERROR. Calificación Negativa: 53553421D;Santana Medina, Petra;-7.1
ERROR. Faltan datos: 55343442L,Godoy Molina, Marina;6.3
ERROR. Calificación no numérica: 342424f2J;Fernandez Vara, Pedro;2.l
Algebra : {[Garcia Gomez, Juan 25653443S, Lopez Turo, Manuel 23322443K, Merlo
Martinez, Juana 24433522M, Lopez Gama, Luisa 42424312G], [ERROR. Calificación
Negativa: 53553421D;Santana Medina, Petra;-7.1, ERROR. Faltan datos:
55343442L,Godoy Molina, Marina;6.3, ERROR. Calificación no numérica:
342424f2J;Fernandez Vara, Pedro;2.l]}
Aquí os doy el resultado de las clases:
Si queréis descargarlo, aquí teneis AlumnoException, Alumno y Asignatura, en otro caso...

 Primero AlumnoException:

public class AlumnoException extends Exception{
 /**
  * 
  */
 private static final long serialVersionUID = 1L;
 public AlumnoException() {
  super();
 }
 public AlumnoException(String e) {
  super(e);
 }
} 
Luego Alumno:
public class Alumno {
 private String nombre;
 private String dni;
 private double nota;
 
 public Alumno (String n, String d, double not) throws AlumnoException{
  this.nombre = n;
  this.dni = d;
  if(not <0) throw new AlumnoException("Nota negativa");
  this.nota = not;
 }
 public Alumno (String n, String d) {
  this.nombre = n;
  this.dni = d;
  this.nota = 0;
 }
 
 public String getNombre()   { return this.nombre;}
 public String getDni()   { return this.dni;}
 public double getCalificacion() {return this.nota;}
 
 public boolean equals(Object o) {
  return o instanceof Alumno && 
    nombre.equals(((Alumno)o).nombre) &&
    dni.equalsIgnoreCase(((Alumno)o).dni);
 }
 public int hashCode() {
  return nombre.hashCode() + dni.toLowerCase().hashCode();
 }

 public String toString() {
  return this.dni + ";" + this.nombre;
 }
 
}


Y ya por último Asignatura:

import java.util.Arrays;
import java.util.InputMismatchException;
import java.util.Locale;
import java.util.NoSuchElementException;
import java.util.Scanner;


public class Asignatura {
 private String nombre;
 private Alumno[] alumnos;
 private String[] malos;
 
 public Asignatura (String n, String[] entradas) {
  nombre = n;
  Alumno[] alumnosAux = new Alumno[entradas.length];
  int correctos = 0;
  String[] erroresAux = new String[entradas.length];
  int erroneos = 0;
  
  for(String linea: entradas) {
   Scanner sc = new Scanner(linea);
   try{ 
    sc.useDelimiter("[;]");
    sc.useLocale(Locale.ENGLISH);
    String dniAlumno = sc.next();
    String nombreAlumno = sc.next();
    double notaAlumno = sc.nextDouble();
    Alumno alumno = new Alumno(dniAlumno, nombreAlumno, notaAlumno);
    alumnosAux[correctos] = alumno;
    correctos++;
   }
     catch(InputMismatchException e) {
    erroresAux[erroneos] = "ERROR. Calificacion no numerica" + linea;
    erroneos++;
   } catch(NoSuchElementException e) {
    erroresAux[erroneos] = "ERROR. Faltan Datos" + linea;
    erroneos++;
   } catch(AlumnoException e) {
    erroresAux[erroneos] = "ERROR."+ e.getMessage() + ":" + linea;
    erroneos++;
   } finally {
    sc.close();
   }
  } //fin for
  
  alumnos = Arrays.copyOf(alumnosAux, correctos);
  malos = Arrays.copyOf(erroresAux, erroneos);
 }

  public double getCalificacion(Alumno al) throws AlumnoException {
  int i = 0;
  while(i<alumnos.length && !(alumnos[i].equals(al))) {
   i++;
  }
  if(i==alumnos.length){
   String std = "El alumno "+ al + " no se encuentra.";
   throw new AlumnoException(std);
  }
  return alumnos[i].getCalificacion();
 }

  public Alumno[] getAlumnos() {
   return alumnos;
  }
  public String[] getMalos() {
   return malos;
  }

  public double getMedia() {
   double sum = 0;
   for(int i = 0; i < alumnos.length; i++) {
    sum += alumnos[i].getCalificacion();
   }
   return sum/alumnos.length;
  }
  
  public String toString() {
   StringBuilder ss = new StringBuilder(nombre);
   ss.append(": {");
   ss.append(Arrays.toString(alumnos));
   ss.append(",");
   ss.append(Arrays.toString(malos));
   ss.append("}");
   return ss.toString();
  }
}


No hay comentarios:

Publicar un comentario