import javax.swing.JOptionPane;
public class Main
{
public static void llenar(Nodo n, Lista obj)
{
int id, sem;
float nota;
do
{
id = Integer.parseInt(JOptionPane.showInputDialog(null, "Digite identificación:"));
}
while(obj.validarId(id) == true);
n.setId(id);
String nom = JOptionPane.showInputDialog(null, "Digite su nombre:");
n.setNombre(nom);
sem = Integer.parseInt(JOptionPane.showInputDialog(null, "Digite su semestre"));
n.setSemestre(sem);
for (int i = 0; i < 3; i++)
{
do
{
nota = Float.parseFloat(JOptionPane.showInputDialog("Digite la nota " + (i+1)));
}
while (nota < 0 || nota > 5);
n.setNotas(i, nota);
}
}
public static void mostrar(Nodo n)
{
String datosNodo = "";
datosNodo += String.valueOf(
"ID: " + n.getId() + "\n" +
"Nombre: " + n.getNombre() + "\n" +
"Semestre: " + n.getSemestre() + "\n" +
"Nota 1: " + n.getNotas(0) + "\n" +
"Nota 2: " + n.getNotas(1) + "\n" +
"Nota 2: " + n.getNotas(2) + "\n" +
"Promedio: " + n.promedio() + "\n\n");
JOptionPane.showMessageDialog(null, "=========== INFORMACÓN DE LOS NODOS DE LA LISTA =========== \n"+ datosNodo);
}
public static void listar(Nodo n)
{
Nodo temp = n;
while(temp != null)
{
mostrar(temp);
temp = temp.getSiguiente();
}
}
public static int menu()
{
int opcion = 0;
do
{
opcion = Integer.parseInt(JOptionPane.showInputDialog("=========== SELECCIONE UNA OPCIÓN DEL MENÚ =========== \n" +
"1. Registrar estudiante.\n" +
"2. Buscar por ID.\n" +
"3. Mostar estudiantes aprobados ordenados ascendemente por el semestre.\n" +
"4. Mostar estudiantes con promedio superior al promedio de notas ordenados descendemente por el semestre.\n" +
"5. Eliminar estudiantes con promedio de notas igual al promedio general.\n" +
"6. Mostrar toda la lista\n" +
"7. Salir\n\n" +
" Seleccione una opción del 1 al 7:"));
}
while(opcion < 1 || opcion > 7);
return opcion;
}
public static void main(String[] args)
{
Lista obj = new Lista();
int opcion, id;
String nombre;
Nodo aux;
do
{
opcion = menu();
switch(opcion)
{
case 1:
aux = new Nodo();
llenar(aux, obj);
obj.agregarFinal(aux);
break;
case 2:
id = Integer.parseInt(JOptionPane.showInputDialog("Digite ID del estudiante que quiere agregar: "));
aux = obj.buscarId(id);
if(aux != null)
{
mostrar(aux);
}
else
{
JOptionPane.showMessageDialog(null, "La ID NO se encuentra en la lista");
}
break;
case 3:
aux = obj.getCabeza();
if(aux == null)
{
JOptionPane.showMessageDialog(null, "No hay estudiantes matriculados");
}
else
{
if(obj.contarNodos() > 1)
{
aux = obj.getCabeza();
obj.ordenarAscendentemente(aux);
while(aux != null)
{
if (aux.promedio() >= 3)
{
mostrar(aux);
}
aux = aux.getSiguiente();
}
}
else
{
JOptionPane.showMessageDialog(null, "Solo hay un estudiante, agregue por lo menos 1 estudiante mas para ordenar");
}
}
break;
case 4:
aux = obj.getCabeza();
if(aux == null)
{
JOptionPane.showMessageDialog(null, "No hay estudiantes matriculados");
}
else
{
if(obj.contarNodos() > 1)
{
aux = obj.getCabeza();
obj.ordenarDescendentemente(aux);
while(aux != null)
{
if (aux.promedio() > obj.promedioGeneral())
{
mostrar(aux);
}
aux = aux.getSiguiente();
}
}
else
{
JOptionPane.showMessageDialog(null, "Solo hay un estudiante, agregue por lo menos 1 estudiante mas para ordenar");
}
}
break;
case 5:
aux = obj.getCabeza();
if(aux == null)
{
JOptionPane.showMessageDialog(null, "No hay estudiantes matriculados");
}
else
{
obj.limpiar();
}
break;
case 6:
aux = obj.getCabeza();
if(aux == null)
{
JOptionPane.showMessageDialog(null, "No hay estudiantes matriculados");
}
else
{
listar(aux);
}
default:
break;
}
}
while(opcion != 7);
}
}
public class Nodo
{
private int id;
private String nombre;
private int semestre;
private float [] notas;
private Nodo siguiente;
public Nodo()
{
id = 0;
nombre = "";
semestre = 0;
notas = new float[3];
siguiente = null;
}
public void setId(int val)
{
id = val;
}
public int getId()
{
return id;
}
public void setNombre(String val)
{
nombre = val;
}
public String getNombre()
{
return nombre;
}
public void setSemestre(int val)
{
semestre = val;
}
public int getSemestre()
{
return semestre;
}
public void setNotas(int pos, float val)
{
notas[pos] = val;
}
public float getNotas(int pos)
{
return notas[pos];
}
public void setSiguiente(Nodo val)
{
siguiente = val;
}
public Nodo getSiguiente()
{
return siguiente;
}
public void copiar(Nodo nd)
{
id = nd.getId();
nombre = nd.getNombre();
semestre = nd.getSemestre();
for (int i = 0; i < 3; i++)
{
notas[i] = nd.getNotas(i);
}
}
public float promedio()
{
float suma = 0;
for (int i = 0; i < 3; i++)
{
suma += getNotas(i);
}
return suma/3;
}
}
public class Lista
{
private Nodo cabeza;
public Lista()
{
cabeza = null;
}
public void setCabeza(Nodo n)
{
cabeza = n;
}
public Nodo getCabeza()
{
return cabeza;
}
public boolean validarId(int c)
{
Nodo temp = cabeza;
boolean igual = false;
while(temp != null)
{
if(temp.getId() == c)
{
igual = true;
break;
}
temp = temp.getSiguiente();
}
return igual;
}
public Nodo ultimo()
{
Nodo temp = cabeza;
while(temp != null)
{
if (temp.getSiguiente() == null)
{
break;
}
else
{
temp = temp.getSiguiente();
}
}
return temp;
}
public int contarNodos()
{
Nodo temp = cabeza;
int contador = 0;
while(temp != null)
{
contador++;
temp = temp.getSiguiente();
}
return contador;
}
public void agregarFinal(Nodo n)
{
if(cabeza == null)
{
setCabeza(n);
}
else
{
ultimo().setSiguiente(n);
}
}
Nodo buscarId(int c)
{
Nodo temp = cabeza;
while(temp != null)
{
if(temp.getId() == c)
{
break;
}
temp = temp.getSiguiente();
}
return temp;
}
public void ordenarAscendentemente(Nodo n)
{
Nodo actual, siguiente;
actual = n;
while(actual.getSiguiente() != null)
{
siguiente = actual.getSiguiente();
while(siguiente != null)
{
if(actual.getSemestre() > siguiente.getSemestre())
{
cambiar(actual, siguiente);
}
siguiente = siguiente.getSiguiente();
}
actual = actual.getSiguiente();
}
}
public void ordenarDescendentemente(Nodo n)
{
Nodo actual, siguiente;
actual = n;
while(actual.getSiguiente() != null)
{
siguiente = actual.getSiguiente();
while(siguiente != null)
{
if(actual.getSemestre() < siguiente.getSemestre())
{
cambiar(actual, siguiente);
}
siguiente = siguiente.getSiguiente();
}
actual = actual.getSiguiente();
}
}
public void cambiar(Nodo p1, Nodo p2)
{
Nodo temp = new Nodo();
temp.copiar(p1);
p1.copiar(p2);
p2.copiar(temp);
}
public float promedioGeneral()
{
Nodo temp = cabeza;
float suma = 0;
while(temp != null)
{
suma += temp.promedio();
temp = temp.getSiguiente();
}
return suma/contarNodos();
}
public void eliminar(Nodo n)
{
Nodo anterior;
if(n.promedio() == promedioGeneral())
{
if(n == cabeza)
{
cabeza = cabeza.getSiguiente();
}
else
{
anterior = cabeza;
while(anterior.getSiguiente() != n)
{
anterior = anterior.getSiguiente();
}
anterior.setSiguiente(n.getSiguiente());
}
n.setSiguiente(null);
}
}
public void limpiar()
{
while(cabeza != null)
{
eliminar(cabeza);
}
}
}