Autor Tema: (Ayuda) Cómo puedo mejorar este trabajo? (POO Java)  (Leído 1653 veces)

Rocka

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 2
    • Ver Perfil
(Ayuda) Cómo puedo mejorar este trabajo? (POO Java)
« en: 21 de Octubre 2022, 23:48 »
Hola a todos, soy nuevo en el tema de la programacion orientada a objetos e hice esta consigna, pero no estoy contento con los resultados y creo que no cumplí correctamente todos los puntos que piden...

"Control de cada alumno que posee con sus materias y notas. Una
materia tiene muchos alumnos asignados y un alumno puede cursar varias materias.
Sabemos que:
Una materia posee un nombre y un cuatrimestre de cursada.
Un alumno posee un nombre y su edad.
Una asignación corresponde a la relación de una materia con un alumno.
Para toda asignación hay al menos tres notas, primer parcial, segundo parcial y trabajo práctico.
Para que la materia esté aprobada para el alumno, el promedio de las 3 notas debe ser mayor o igual a 6, en ese
caso, está la materia “Aprobada” si no “Reprobado”.
La escuela tiene una lista de asignaciones asociadas y un mecanismo para mostrar el estado de las asignaciones,
donde por pantalla se verá la siguiente información:
-Nombre del Alumno
-Nombre de la Materia
-Cuatrimestre de la Materia
-Notas
-Promedio
-Estado (Aprobado o Reprobado).
Actividades:
1. Hacer el diagrama de las clases necesarias y las relaciones para modelar el sistema.
2. Crear las clases necesarias para modelar el sistema solicitado con los atributos y métodos que consideres
necesarios para poder setear y obtener los datos de cada uno de los atributos descriptos anteriormente
con el constructor más adecuado.
3. Cada clase diseñada debe contener las declaraciones de métodos y variables siguiendo las reglas
sintácticas y por convención. También se aplican las reglas para los identificadores de proyecto y
paquete.
4. El código debe representar la sobreescritura del método toString().
5. Crear una clase EscuelaTest que:
1. Cree al menos 3 materias.
2. Cree al menos 3 alumnos.
3. Agregar a la lista de asignaciones de la escuela al menos 6 asignaciones de materias con
alumnos.
4. Para cada asignación se deben configurar el conjunto de notas.
5. Mostrar el resultado del estado de las asignaciones de materias y alumnos de la escuela."


Código: [Seleccionar]
package domain;

public class Alumno {
private String nombre;
private int edad;


public Alumno() {

}

public Alumno(String nombre, int edad) {
this.nombre = nombre;
this.edad = edad;
}

public String getNombre() {
return nombre;
}

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

public int getEdad() {
return edad;
}

public void setEdad(int edad) {
this.edad = edad;
}


@Override
public String toString() {
return "Alumno [nombre=" + nombre + ", edad=" + edad + "]";
}





}

Código: [Seleccionar]
package domain;

public class Materia {

private String nombre;
private int cuatrimestre;


// Constructores

public Materia() {

}

public Materia(String nombre, int cuatrimestre) {

this.nombre = nombre;
this.cuatrimestre = cuatrimestre;
}


//get y set

public String getNombre() {
return nombre;
}


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


public int getCuatrimestre() {
return cuatrimestre;
}


public void setCuatrimestre(int cuatrimestre) {
this.cuatrimestre = cuatrimestre;
}


// Metodos



@Override
public String toString() {
return "Materia [nombre=" + nombre + ", cuatrimestre=" + cuatrimestre + "]";
}



}

Código: [Seleccionar]
package domain;


public class Nota {

  public int nota1;
  public int nota2;
  public int nota3;
 


  public Nota(int nota1, int nota2, int nota3){
    this.nota1 = nota1;
    this.nota2 = nota2;
    this.nota3 = nota3;

  }


public double calcularPromedio(){
    return (double)(nota1 + nota2 + nota3) / 3;
  }


public boolean estadoNota() {
if(this.calcularPromedio() >= 6) {
return true;
}else {
return false;
}
}

public String mostrarEnCadena() {
    return String.format(estadoNota() ? "APROBADO" : "REPROBADO");
}

  @Override
public String toString() {
return "Notas [Parcial 1= " + nota1 + ", Parcial 2= " + nota2 + " Promedio= " + calcularPromedio() + " Estado: " + mostrarEnCadena() + "]";
}


}

Código: [Seleccionar]
package test;
import domain.Materia;
import domain.Alumno;
import domain.Nota;

public class EscuelaTest {
public static void main(String[] args) {
Alumno alumno1 = new Alumno("Pepe", 24);
Materia materia1 = new Materia("Biologia", 2);
Nota nota1 = new Nota(1, 1, 1);


System.out.println(alumno1);
System.out.println(materia1);
System.out.println(nota1);
    System.out.println("-----------------");


}
}

Valoro cualquier consejo que me puedan dar, gracias

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 988
    • Ver Perfil
Re: (Ayuda) Cómo puedo mejorar este trabajo? (POO Java)
« Respuesta #1 en: 22 de Octubre 2022, 01:22 »
Hola Rocka.

Las clases Alumno y Materia bien, lo único que yo cambiaría son los constructores sin parámetros.
Código: [Seleccionar]


public Alumno() {

}
Nunca me ha gustado dejarlos vacíos sin código, de hecho, para dejarlos vacíos entonces no hace falta ni ponerlos.

Ya que los ponemos, interesa inicializar los atributos a unos valores por defecto.
Esto es especialmente importante para los atributos que sean clases, como por ejemplo el nombre del alumno que es clase String.
Si no los inicializamos, se quedan con valor nulo (null) y esto deja abierta la posibilidad de que pueda ocurrir una excepción(ya aprenderás más adelante qué son las excepciones) por intentar acceder al valor de un atributo..., que en realidad no tiene valor, porque es null

Así que mejor dar a los atributos unos valores iniciales, los que sean, aunque sea una cadena vacía para los String y un 0 para los valores numéricos como la edad.
Código: [Seleccionar]

public Alumno() {
nombre = "";
edad = 0;
}
Y lo mismo para la clase Materia

Pero bueno, al margen de este detalle, ambas clases estarían bien.

Sin embargo, la clase Nota, ya no me parece tan bien.
Para empezar, creo que el nombre correcto para esta entidad debería ser Asignacion

Y lo más importante, nos dicen que:
Citar
Una asignación corresponde a la relación de una materia con un alumno
Pues esa "relación" no ha quedado modelada en tu clase.
Además de las 3 notas, esta clase debería tener dos atributos más: un objeto Materia y un objeto Alumno

De esta manera, alumno y materia quedan relacionados.

Yo escribiría dicha clase de la siguiente manera.
Cambio nombres de algunos atributos y métodos, por gusto mío, pero en realidad son casi iguales a los que habías escrito tú.
El método toString() si lo he hecho más elaborado, para que sea él quien nos de toda la info que necesitamos presentar en pantalla, y que salga más o menos presentable.
Código: [Seleccionar]
public class Asignacion {

private Materia materia;
private Alumno alumno;
private int parcial1;
private int parcial2;
private int practico;

public Asignacion() {
materia = new Materia();
alumno = new Alumno();
parcial1 = 0;
parcial2 = 0;
practico = 0;
}

public Asignacion(Materia materia, Alumno alumno, int parcial1, int parcial2, int practico) {
this.materia = materia;
this.alumno = alumno;
this.parcial1 = parcial1;
this.parcial2 = parcial2;
this.practico = practico;
}

public Materia getMateria() {
return materia;
}

public void setMateria(Materia materia) {
this.materia = materia;
}

public Alumno getAlumno() {
return alumno;
}

public void setAlumno(Alumno alumno) {
this.alumno = alumno;
}

public int getParcial1() {
return parcial1;
}

public void setParcial1(int parcial1) {
this.parcial1 = parcial1;
}

public int getParcial2() {
return parcial2;
}

public void setParcial2(int parcial2) {
this.parcial2 = parcial2;
}

public int getPractico() {
return practico;
}

public void setPractico(int practico) {
this.practico = practico;
}

public double calcularPromedio(){
return (parcial1 + parcial2 + practico) / 3;
}

public boolean estaAprobada() {
return calcularPromedio() >= 6;
}

public String estadoAsignacion() {
return estaAprobada()?"Aprobada":"Reprobada";
}

@Override
public String toString() {
StringBuilder cadena = new StringBuilder();
cadena.append("-Nombre Alumno: " + alumno.getNombre());
cadena.append("\n-Nombre Materia: " + materia.getNombre());
cadena.append("\n-Cuatrimestre: " + materia.getCuatrimestre());
cadena.append("\n-Notas:");
cadena.append("\n\tParcial 1: " + parcial1);
cadena.append("\n\tParcial 2: " + parcial2);
cadena.append("\n\tPractico: " + practico);
cadena.append(String.format("\n-Promedio: %.2f", calcularPromedio()));
cadena.append("\n-Estado: " + estadoAsignacion());

return cadena.toString();
}
}

Ya luego solo queda hacer la clase EscuelaTest.
Tres alumnos, tres materias y seis asignaciones.

Las asignaciones las colecciono en un ArrayList.
No se si los conoces ya, si no es así, también se pueden hacer en un arreglo "primitivo".

Pero es importante coleccionarlos de una manera u otra, porque así luego se pueden presentar todas en pantalla usando un simple bucle.
Código: [Seleccionar]
public class EscuelaTest {

public static void main(String[] args) {
Materia materia1 = new Materia("Matematicas", 2);
Materia materia2 = new Materia("Filosofia", 1);
Materia materia3 = new Materia("Economia", 3);
Alumno alumno1 = new Alumno("Felipe Reyes", 17);
Alumno alumno2 = new Alumno("Sara Pelaez", 16);
Alumno alumno3 = new Alumno("Laura Juan", 17);
//Lista asignaciones
ArrayList<Asignacion> lista = new ArrayList<Asignacion>();
lista.add(new Asignacion(materia1, alumno1, 7, 4, 5));
lista.add(new Asignacion(materia1, alumno3, 9, 6, 7));
lista.add(new Asignacion(materia2, alumno2, 5, 5, 6));
lista.add(new Asignacion(materia2, alumno3, 4, 8, 8));
lista.add(new Asignacion(materia3, alumno1, 8, 5, 8));
lista.add(new Asignacion(materia3, alumno2, 9, 0, 5));

System.out.println("\t\tLISTADO ASIGNACIONES\n");

for (Asignacion asig: lista) {
System.out.println(asig);
System.out.println("\n\t--------------------\n");
}
}

}

No dudes en preguntar si algo no lo entiendes o piensas que debería hacerse de otra manera.

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

Rocka

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 2
    • Ver Perfil
Re: (Ayuda) Cómo puedo mejorar este trabajo? (POO Java)
« Respuesta #2 en: 23 de Octubre 2022, 02:47 »
Gracias Kabuto por tu ayuda! Creo que con tu explicación ya entendi mejor muchas cosas. Y también modifique el diagrama porque tambien habia que hacerle arreglos. Gracias de nuevo!

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 988
    • Ver Perfil
Re: (Ayuda) Cómo puedo mejorar este trabajo? (POO Java)
« Respuesta #3 en: 23 de Octubre 2022, 11:18 »
Me alegro.
Siempre que podamos ayudarte, aquí estaremos.

Saludos.
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".