Se propone el siguiente ejercicio de programación en Java:
Caso Universidad: Haciendo uso de la programación orientada a objetos complete el ejercicio propuesto sobre el registro de notas de los estudiantes de la universidad que brinde las funcionalidades de:
- registrar la nota de 5 estudiantes en 5 asignaturas diferentes
- Obtenga una nota definitiva de cada asignatura para cada estudiante se tienen 3 notas parciales en cada asignatura (todas con igualdad de valor)
- Un promedio general de cada estudiante en todas sus asignaturas.
- Un promedio de la nota definitiva de todos los estudiantes por cada asignatura
Este ejercicio ya fue resuelto en un mensaje anterior hace tiempo, pero por si quizás no quedó claro, lo resolvemos de nuevo.
Se pide resolver mediante POO, así que lo primero es identificar la entidades que intervienen y podrían requerir ser modeladas mediante clases.
Normalmente, modelaremos como clases aquellas entidades que se componen de "otras cosas" y/o tienen algunas funcionalidades concretas que conviene que las resuelvan ellas mismas.
Nos dicen que hay
Estudiantes, que tienen
Asignaturas. Y que cada Asignatura tendría 3
notas parciales, a partir de las cuales se podría calcular la
nota definitiva para dicha Asignatura.
Estudiante y Asignatura es evidente que serán clases, ya que están compuestas de "otras cosas".
Un Estudiante se compone de Asignaturas y de al menos un nombre, aunque no se indique en el enunciado.
Además sería útil que un Estudiante, por si solo, tenga funcionalidades como darnos el promedio de las notas de sus Asignaturas
Una Asignatura se compone de tres notas parciales y también habría que darle un nombre.
Y también interesa que por si sola sepa hacer cosas como calcular su nota definitiva mediante las tres notas parciales que la componen
Una nota parcial no se compone de nada, es simplemente un valor int, o double si lo preferimos. Ni requiere poseer ninguna funcionalidad especial, así que no será una clase.
Una nota definitiva sí se compone de tres notas parciales. ¿Debería ser una clase?
Podría serlo... Quizás si el ejercicio fuera más avanzado y las notas definitivas tuvieran un tratamiento más especial, entonces interesaría modelarlo como una clase.
Pero en este caso no sería necesario, aquí la nota definitiva en realidad es un mero cálculo aritmético que lo único que ha de hacer es mostrarse en pantalla cuando se requiera. Y para resolver eso basta con usar un método, no hace falta modelar una clase.
Así que tendríamos la clase
Asignatura.
Se compone de un nombre y tres notas parciales, que las podemos agrupar en un array
Mediante constructor le damos un nombre.
Luego con métodos, podemos registrar una nota en una posición concreta del array.
Y también calcular y retornar la nota definitiva. (por eso no requiere modelarse como una clase)
public class Asignatura {
//Cada asignatura tiene tres notas parciales
private int[] parciales = new int[3];
private String nombre;
public Asignatura(String nombre) {
this.nombre = nombre;
}
public String getNombre() {
return nombre;
}
/*
* Registra una nota parcial en la posición del array que
* se indique.
*/
public void registrarNotaParcial(int nota, int posicion) {
parciales[posicion] = nota;
}
/*
* Todas las notas tienen el mismo peso para calcular la nota
* definitiva. Así que basta con calcular el valor medio de las tres.
*/
public int getNotaDefinitiva() {
int sumaNotas = parciales[0] + parciales[1] + parciales[2];
return sumaNotas / 3;
}
}
Luego tendríamos la clase
Estudiante.
Se compone de nombre, que recibe por constructor, y 5 objetos Asignatura, que también agruparemos en un array.
Con métodos podemos registrar una Asignatura en una posición concreta del array.
También podemos obtener la nota definitiva de una Asignatura concreta, indicando la posición del array que se quiere consultar.
Y también podemos obtener el "promedio general" de este Estudiante, es decir, sumar las notas definitivas de todas sus Asignaturas y calcular el promedio de dicha suma.
public class Estudiante {
//Cada Estudiante tiene 5 asignaturas
private Asignatura[] asignaturas = new Asignatura[5];
private String nombre;
public Estudiante(String nombre) {
this.nombre = nombre;
}
public String getNombre() {
return nombre;
}
/*
* Registra una Asignatura en la posicion del array que
* se le indique
*/
public void registrarAsignatura(Asignatura asign, int posicion) {
asignaturas[posicion] = asign;
}
/*
* Retorna la nota definitiva de la asignatura que se encuentra
* en la posicion del array indicada.
*/
public int getNotaDeAsignatura(int posicion) {
return asignaturas[posicion].getNotaDefinitiva();
}
/*
* Hace un promedio general de todas las asignaturas
* de este estudiante
*/
public int getPromedioGeneral() {
//Sumamos las notas definitivas de sus asignaturas
int sumaNotas = 0;
for (Asignatura asig: asignaturas)
sumaNotas += asig.getNotaDefinitiva();
//Retornamos el promedio
return sumaNotas / 5;
}
}
Y con esto ya podemos componer la clase principal donde se pondrán en marcha todas las funcionalidades de la aplicación.
Lo vemos en el siguiente mensaje.