Autor Tema: Herencia Java  (Leído 3980 veces)

drate

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 24
    • Ver Perfil
Herencia Java
« en: 10 de Marzo 2023, 13:30 »
Buenas tardes.
Estoy tratando de hacer este ejercicio Java pero no consigo ver la solución. Dejo enunciado por si alguien me puede echar una mano.
Muchas gracias. Un saludo.


En la universidad existe una plantilla de personal que está dividida en dos grupos:
•   Personal de Administración y Servicios (PAS): En el personal de administración se encuentra todo el personal que desempeña labores administrativas o de gestión de algún tipo de servicio. En este caso, por simplicidad, solo vamos a considerar que existe personal administrativo y personal informático.
•   Personal Docente Investigador (PDI): Personal que se dedica a la docencia y a la investigación y en el que incluimos a profesores y a investigadores contratados en algún proyecto de investigación.
Todo el personal se identifica con su nombre y DNI y recibe un salario mensual que debemos de calcular, de forma simplificada, como el número de horas de trabajo a la semana multiplicado por el importe/hora de su categoría y por el número de semanas al mes (4).
Los datos de cada tipo de personal son los siguientes (las cantidades no son reales):
•   Administrativos: 37 horas/semana y un importe de 7,5 euros/hora.
•   Informáticos: 40 horas/semanas y un importe de 6 euros/hora.
•   Profesores: 37 horas/semana con un importe de 8 euros/hora.
•   Investigadores: 35 horas/semana con un importe de 7 euros/hora.

Además los profesores y los PAS tienen los siguientes ingresos adicionales:
•   Profesores: A los profesores se les añade un complemento salarial en función de lo que se conoce como sexenios (periodos de 6 años evaluados positivamente), y que se pueden conceder hasta un máximo de 6. En concreto, se les añade 100 euros al mes por sexenio reconocido. Una vez concedido el sexenio el aumento de sueldo se mantiene para siempre.
•   PAS: En un mes determinado los PAS (tanto administrativos como informáticos) pueden acumular horas extras. Cada hora extra se paga a 6 euros/hora. Las horas extra, una vez pagadas, se inicializan a cero de nuevo (por ejemplo, a la hora de calcular el sueldo de personal).

Se pide:
•   Crear una estructura de clases y subclases que represente a los trabajadores de la universidad. En dicha estructura tiene que existir una superclase común a todos los trabajadores que sea Personal.
•   Crear una clase Universidad con una función public static void imprimirNominas(Personal[] listaPersonal) que imprima por pantalla, para cada Personal incluido en listaPersonal, el nombre del personal, su categoría y su sueldo.
•   Crear en la misma clase Universidad, una función obtenerPresupuestoTotal que devuelva el total de dinero que se gasta la universidad en personal.
Para evitar usar decimales en cantidades monetarias podemos trabajar con el dinero en céntimos de Euro y solo convertirlo en euros a la hora de mostrarlo por pantalla.

« Última modificación: 10 de Marzo 2023, 13:42 por drate »

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 989
    • Ver Perfil
Re: Herencia Java
« Respuesta #1 en: 11 de Marzo 2023, 02:42 »
A ver, el enunciado ya nos da bastantes pistas.
Todas las clases heredan de la superclase Personal, que es la que ha de tener los atributos y métodos comunes a todas las demás clases. Así que empecemos por ella:
Citar
Todo el personal se identifica con su nombre y DNI y recibe un salario mensual que debemos de calcular, de forma simplificada, como el número de horas de trabajo a la semana multiplicado por el importe/hora de su categoría y por el número de semanas al mes (4).

Así que de momento esta podría ser la clase Personal. Puede que luego se deba modificar, o no..

Código: [Seleccionar]
public class Personal {

//Atributos
protected String DNI;
protected String nombre;
protected int salario;

//Constructor
public Personal(String DNI, String nombre) {
this.DNI = DNI;
this.nombre = nombre;
}

//Métodos
public String getDNI() {
return DNI;
}

public void setDNI(String DNI) {
this.DNI = DNI;
}

public String getNombre() {
return nombre;
}

public void setNombre(String nombre) {
this.nombre = nombre;
}

public void calcularSalario() {
//Este cálculo dependerá de las clases hijas
}
}
Yo habría declarado esta clase como "abstracta" pero por no alterar las plantillas que han dado hechas, no lo haremos.
El salario es un cálculo que se hace en un momento dado (a final de mes para pagar la nómina) y además depende las clases hijas.

Sigamos...
Detrás de Personal, tenemos las categorias PAS y PDI

Veamos que nos dicen de los PAS
Citar
PAS: En un mes determinado los PAS (tanto administrativos como informáticos) pueden acumular horas extras. Cada hora extra se paga a 6 euros/hora. Las horas extra, una vez pagadas, se inicializan a cero de nuevo (por ejemplo, a la hora de calcular el sueldo de personal).

Esto quizás se podría modelar de esta manera:
Código: [Seleccionar]
public class PAS extends Personal{

//Atributos
private final int VALOR_HORA_EXTRA = 600; //6€
protected int horasExtra;

//Constructor
public PAS(String DNI, String nombre) {
super(DNI, nombre);
horasExtra = 0;
}

//Métodos
public void acumularHorasExtra(int horas) {
horasExtra += horas;
}

public int calcularHorasExtra() {
int extra = horasExtra * VALOR_HORA_EXTRA;
horasExtra = 0; //Reinicio a 0
return extra;
}

}

OK, ¿y de los PDI?
Pues de los PDI no nos dicen nada, así que esta clase parece que por ahora se va a quedar así:

Código: [Seleccionar]
public class PDI extends Personal{

public PDI(String DNI, String nombre) {
super(DNI, nombre);
}

}

Es una clase que no va a aportar nada, más allá de ser una subclase intermedia entre la superclase y las clases hijas Profesor e Investigador.

Por cierto, de Profesor si nos dicen que tienen un ingreso adicional:
Citar
Profesores: A los profesores se les añade un complemento salarial en función de lo que se conoce como sexenios (periodos de 6 años evaluados positivamente), y que se pueden conceder hasta un máximo de 6. En concreto, se les añade 100 euros al mes por sexenio reconocido. Una vez concedido el sexenio el aumento de sueldo se mantiene para siempre.

Lo cuál es un complemento de su cálculo salarial base:
Citar
Profesores: 37 horas/semana con un importe de 8 euros/hora.


Así que la clase Profesor podría ser esta.
Fíjate que para el calculo de salario, lo que hacemos es "sobre escribir"(Override) el método que viene heredado de la clase Personal
Código: [Seleccionar]
public class Profesor extends PDI{

private final int VALOR_SEXENIO = 100000; //100€
private final int HORAS_SEMANA = 37;
private final int VALOR_HORAS = 800; //8€
private int sexenios;

public Profesor(String DNI, String nombre, int sexenios) {
super(DNI, nombre);
this.sexenios = 0;
aumentarSexenios(sexenios);
}

public void aumentarSexenios(int sexenios) {
this.sexenios += sexenios;
if (sexenios > 6) //Máximo 6 sexenios
sexenios = 6;
}

@Override
public void calcularSalario() {
//Sueldo base
salario = HORAS_SEMANA * VALOR_HORAS;
salario *= 4;//4 semanas de salario
//Complemento sexenios
salario += (sexenios * VALOR_SEXENIO);
}
}


El otro PDI, la clase Investigador, no tiene complementos, así que segun su salario base...

Citar
Investigadores: 35 horas/semana con un importe de 7 euros/hora.

...queda así:
Código: [Seleccionar]
public class Investigador extends PDI{

private final int HORAS_SEMANA = 35;
private final int VALOR_HORAS = 700; //7€

public Investigador(String DNI, String nombre) {
super(DNI, nombre);
}

@Override
public void calcularSalario() {
salario =  HORAS_SEMANA * VALOR_HORAS;
salario *= 4;//4 semanas de salario
}
}

Nos faltan los dos PAS
Tenemos Administrativo
Citar
Administrativos: 37 horas/semana y un importe de 7,5 euros/hora.
a lo que hay que sumarle el valor de sus horas extra por ser un PAS
Código: [Seleccionar]
public class Administrativo extends PAS{

private final int HORAS_SEMANA = 37;
private final int VALOR_HORAS = 750; //7,5€
   
    public Administrativo(String nombre, String dni, int horasExtra) {
    super(nombre, dni);
    this.horasExtra = horasExtra;
    }
   
    @Override
    public void calcularSalario() {
    salario = HORAS_SEMANA * VALOR_HORAS;
    salario *= 4;//4 semanas de salario
    salario += calcularHorasExtra(); //Método heredado de PAS
    }
}

Y lo mismo con los Informatico
Citar
Informáticos: 40 horas/semanas y un importe de 6 euros/hora.

Código: [Seleccionar]
public class Informatico extends PAS{

private final int HORAS_SEMANA = 40;
private final int VALOR_HORAS = 600; //6€
   
    public Informatico(String nombre, String dni, int horasExtra) {
    super(nombre, dni);
    this.horasExtra = horasExtra;
    }
   
    @Override
    public void calcularSalario() {
    salario = HORAS_SEMANA * VALOR_HORAS;
    salario *= 4; //4 semanas de salario
    salario += calcularHorasExtra(); //Método heredado de PAS
    }
}

Pasemos  a la clase Universidad
Citar
•   Crear una clase Universidad con una función public static void imprimirNominas(Personal[] listaPersonal) que imprima por pantalla, para cada Personal incluido en listaPersonal, el nombre del personal, su categoría y su sueldo.
•   Crear en la misma clase Universidad, una función obtenerPresupuestoTotal que devuelva el total de dinero que se gasta la universidad en personal.
Para evitar usar decimales en cantidades monetarias podemos trabajar con el dinero en céntimos de Euro y solo convertirlo en euros a la hora de mostrarlo por pantalla.

Aquí lo tenemos:
Código: [Seleccionar]
public class Universidad {

public static void imprimirNominas(Personal[] listaPersonal) {
      System.out.println("\n\t\tNOMINAS DEL PERSONAL");
     
      for (Personal pers: listaPersonal) {
     
      pers.calcularSalario();
     
      String categoria;
      if (pers instanceof Administrativo || pers instanceof Informatico)
      categoria = "PAS";
      else
      categoria = "PDI";
     
      System.out.printf("-> Nombre: %-25s Categoria: %-15s Sueldo: %.2f\n",
      pers.getNombre(), categoria, pers.salario / 100f);
      }
}
   
public static long obtenerPresupuestoTotal(Personal[] listaPersonal) {
      int total = 0;
      for (Personal pers: listaPersonal)
      total += pers.salario;
     
      return total;
}

}

Y por último el main para ponerlo a prueba.
Yo hago un ejemplo con solo 4 personas, tú añade más si quieres.
Código: [Seleccionar]
public class Main {

public static void main(String[] args) {

//Crear personal
Personal[] listaPersonal = new Personal[4];
listaPersonal[0] = new Administrativo("45678901X", "Luis Segura", 15);
listaPersonal[1] = new Informatico("34890012M", "Ana Montes", 23);
listaPersonal[2] = new Investigador("23987634K", "Susana Rego");
listaPersonal[3] = new Profesor("43789011G", "Antonio Paz", 4);


//Imprimir las nóminas
Universidad.imprimirNominas(listaPersonal);

//Ver el presupuesto total
System.out.printf("\nPresupuesto total: %.2f",
Universidad.obtenerPresupuestoTotal(listaPersonal) / 100f);
}
}

Pregunta si algo no se entiende.
Un saludo.
NO respondo dudas por mensaje privado
Publicando vuestras dudas en el foro público conseguimos:
- Que más gente aporte respuestas mejores o complementarias.
- Que otras personas puedan aprender de vuestras dudas.

Mejor en PÚBLICO que en privado. Gracias

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".