Lo de modificar nota te falla porque, a pesar de que buscas el carnet de alumno, no estás recuperando en que posición se encuentra ese carnet.
Usas una variable llamada "nueva" inicializada a 0 para elegir las calificaciones que vas a alterar, por eso siempre te va a modificar la primera línea de los arreglos.
Te señalo en rojo donde está el problema:
public static void modificar(){
boolean elCarnetEsta = false;
String car = JOptionPane.showInputDialog("INGRESA EL CARNET DEL ALUMNO");
for(int contador=0; contador < tamaño; contador++)
if (car.equals(carnet[contador])){
elCarnetEsta = true;
int seleccion;
int nueva = 0;
seleccion =Integer.parseInt(JOptionPane.showInputDialog("QUE NOTA DESEAS CAMBIAR: \n1.\n2.\n3.\n4."));
if(seleccion==1){
calific[nueva] =Integer.parseInt(JOptionPane.showInputDialog("NUEVA NOTA ["+seleccion+"]"));
}
else if(seleccion==2){
calific2[nueva] =Integer.parseInt(JOptionPane.showInputDialog("NUEVA NOTA ["+seleccion+"]"));
}
else if(seleccion==3){
calific3[nueva] =Integer.parseInt(JOptionPane.showInputDialog("NUEVA NOTA ["+seleccion+"]"));
}
else if(seleccion==4){
calific4[nueva] =Integer.parseInt(JOptionPane.showInputDialog("NUEVA NOTA ["+seleccion+"]"));
}
}
if(elCarnetEsta == false) {
JOptionPane.showMessageDialog(null, "EL CARNET NO EXISTE");
}
}
No hay que usar esa variable, basta con usar la variable "contador" del mismo bucle donde estamos buscando el carnet.
Además esa misma variable nos sirve para recalcular el promedio:
public static void modificar(){
boolean elCarnetEsta = false;
String car = JOptionPane.showInputDialog("INGRESA EL CARNET DEL ALUMNO");
for(int contador=0; contador < tamaño; contador++)
if (car.equals(carnet[contador])){
elCarnetEsta = true;
int seleccion = Integer.parseInt(
JOptionPane.showInputDialog("QUE NOTA DESEAS CAMBIAR: \n1.\n2.\n3.\n4."));
if(seleccion==1)
calific[contador] = Integer.parseInt(
JOptionPane.showInputDialog("NUEVA NOTA ["+seleccion+"]"));
else if(seleccion==2)
calific2[contador] = Integer.parseInt(
JOptionPane.showInputDialog("NUEVA NOTA ["+seleccion+"]"));
else if(seleccion==3)
calific3[contador] = Integer.parseInt(
JOptionPane.showInputDialog("NUEVA NOTA ["+seleccion+"]"));
else if(seleccion==4)
calific4[contador] = Integer.parseInt(
JOptionPane.showInputDialog("NUEVA NOTA ["+seleccion+"]"));
//Nota cambiada, hay que recalcular el promedio
promedios[contador] = (calific[contador] + calific2[contador] +
calific3[contador] + calific4[contador]) / 4;
//Ya hemos encontrado alumno y cambiado su nota, podemos interrumpir este bucle
break;
}
if(elCarnetEsta == false) {
JOptionPane.showMessageDialog(null, "EL CARNET NO EXISTE");
}
}
Con esto ya se puede
Agregar Estudiante y
Modificar Nota.
Lo de
Listar Estudiante habría que hacer un pequeño cambio para mostrar el promedio:
public static void listar(){
//Mostrar alumno y su calificacion en pantalla:
System.out.println("Numero\tCarnet\tNombre\tnota1\tnota2\tnota3\tnota4\tPromedio");
for(int contador=0; contador < nombres.length; contador++)
System.out.println(contador+1+"\t" + carnet[contador]+"\t"+nombres[contador]+"\t"
+calific[contador]+"\t"+calific2[contador]+"\t"+calific3[contador]+
"\t"+calific4[contador]+"\t"+promedios[contador]);
}
Bien, ya solo te queda hacer lo de
Eliminar Estudiante, inténtalo y lo consigas o no, compártelo por aquí y te ayudamos a corregirlo.
Antes de terminar, quiero comentar un par de cosas.
En cada método, al terminar, haces una llamada al método menu(), que es el menu principal que muestra las opciones.
Esto no es necesario, es más, es
peligroso...y ahora verás por qué..
Cuando el programa se inicia, comienza el método main() que llama a menu() y lo pone en marcha.
main() no hace nada, ahora mismo es menu() quien se encarga de todo
main() > menu()Si dentro de menu(), llamamos por ejemplo a agregar(), esto no significa que el método menu() termine. Sigue ejecutándose, lo que ocurre es que queda a espera de que agregar() haga sus cosas y termine.
Ahora, es agregar() quien está al cargo de la ejecución del programa:
main() > menu() > agregar()El método agregar() lo que hace es iniciar un bucle y pedir datos al usuario.
Si nos fijamos en cómo he escrito yo su código:
public static void agregar(){
//Pedir tamaño del Arreglo al usuario:
tamaño=Integer.parseInt(JOptionPane.showInputDialog
("¿De que tamaño desea su Arreglo?"));
//recibe los arreglos globalizados arriba
nombres = new String[tamaño];
carnet = new String[tamaño];
calific = new int[tamaño];
calific2 = new int[tamaño];
calific3 = new int[tamaño];
calific4 = new int[tamaño];
promedios = new int[tamaño];
//Pedimos datos
for (int contador = 0; contador < tamaño; contador++) {
//Carnet
carnet[contador]=JOptionPane.showInputDialog
("Carnet del alumno");
//Nombre
nombres[contador]=JOptionPane.showInputDialog
("Nombre?");
//Calificaciones
calific[contador]=Integer.parseInt
(JOptionPane.showInputDialog
("Cual es la nota 1 de "
+nombres[contador]+"?"));
calific2[contador]=Integer.parseInt
(JOptionPane.showInputDialog
("Cual es la nota 2 de "
+nombres[contador]+"?"));
calific3[contador]=Integer.parseInt
(JOptionPane.showInputDialog
("Cual es la nota 3 de "
+nombres[contador]+"?"));
calific4[contador]=Integer.parseInt
(JOptionPane.showInputDialog
("Cual es la nota 4 de "
+nombres[contador]+"?"));
//Calculamos promedio
promedios[contador] = (calific[contador] + calific2[contador] +
calific3[contador] + calific4[contador]) / 4;
}
//Fin del bucle que pide datos
}
Cuando este bucle termina, ahí donde he puesto el comentario azul, agregar() ya no tiene nada más que hacer, así que este método termina y devuelve el hilo de ejecución al método menu()
main() > menu()Esto es lo ideal, ahora menu() puede volver llamar a agregar(), o a listar().., o terminar si el usuario lo ordena y fin del progama.
Pero, ¿y si hacemos lo que tú has hecho, llamar a menu() al terminar el método:
public static void agregar(){
//Pedir tamaño del Arreglo al usuario:
tamaño=Integer.parseInt(JOptionPane.showInputDialog
("¿De que tamaño desea su Arreglo?"));
//recibe los arreglos globalizados arriba
nombres = new String[tamaño];
carnet = new String[tamaño];
calific = new int[tamaño];
calific2 = new int[tamaño];
calific3 = new int[tamaño];
calific4 = new int[tamaño];
promedios = new int[tamaño];
//Pedimos datos
for (int contador = 0; contador < tamaño; contador++) {
//Carnet
carnet[contador]=JOptionPane.showInputDialog
("Carnet del alumno");
//Nombre
nombres[contador]=JOptionPane.showInputDialog
("Nombre?");
//Calificaciones
calific[contador]=Integer.parseInt
(JOptionPane.showInputDialog
("Cual es la nota 1 de "
+nombres[contador]+"?"));
calific2[contador]=Integer.parseInt
(JOptionPane.showInputDialog
("Cual es la nota 2 de "
+nombres[contador]+"?"));
calific3[contador]=Integer.parseInt
(JOptionPane.showInputDialog
("Cual es la nota 3 de "
+nombres[contador]+"?"));
calific4[contador]=Integer.parseInt
(JOptionPane.showInputDialog
("Cual es la nota 4 de "
+nombres[contador]+"?"));
//Calculamos promedio
promedios[contador] = (calific[contador] + calific2[contador] +
calific3[contador] + calific4[contador]) / 4;
}
//Fin del bucle que pide datos
menu(); //Llamamos a menu()
}
Esta llamada, implica que el método agregar() NO TERMINA.
Lo que hace es generar una nueva instancia de menu(), pero no el mismo menu() que le había llamado a él, este es "otro" menu() distinto:
main() > menu() > agregar() > menu()Y si este nuevo menu(), llama ahora a listar()...
main() > menu() > agregar() > menu() > listar()Y como listar(), en tu código, cuando termina también llama a menu(), pues...
main() > menu() > agregar() > menu() > listar() > menu()¿Ves lo que ocurre?
Los métodos no finalizan, porque se están produciendo unas llamadas "recursivas" que hacen que el hilo de ejecución se vaya pasando de un método a otro, pero sin que ninguno termine...los métodos se van anidando unos dentro de otros.
¿Esto es un problema?
Pues sí. Es cierto que en este caso, al ser un ejercicio sencillo, no notamos nada raro a nivel usuario.
Pero en un programa más complejo, podríamos encontrarnos con que unos datos que yo he introducido, luego se viesen alterados por un método que había quedado anidado anteriormente.
Y además, cada método anidado se almacena en una "pila", y esta pila tiene un límite. El límite es bastante amplio, pero si esto ocurre en un programa profesional de una empresa que tiene el ordenador funcionando 24 horas al día, tarde o temprano la pila se desbordaría y el programa caería.
Por eso los métodos de este programa, no deben terminar llamando de nuevo a menu().
No es necesario, cuando los métodos terminen sus tareas, menu() recuperará automáticamente el hilo de ejecución.
Por último te dejo mi código al completo tal y como lo tengo ahora.
He quitado algunas cosas como el objeto Scanner que no va a ser necesario, o un método llamado buscar() que habías puesto vacío, que tampoco parece que vaya a tener función alguna.
Un saludo.
import javax.swing.JOptionPane;
public class Arreglo {
//Crear y establecer tamaño de los Arreglos de manera global para que
//funcione en los demas metodos:
public static int tamaño;
private static String carnet[];
private static String nombres[];
private static int calific[];
private static int calific2[];
private static int calific3[];
private static int calific4[];
private static int promedios[];
public static void main(String[] args) {
menu();
}
public static void menu(){
String opcion;
do {
opcion =JOptionPane.showInputDialog("------------REGISTRO DE ESTUDIANTES------------"
+ " \n1. INGRESAR ESTUDIANTES\n2. MODIFICAR NOTA\n3. ELIMINAR ESTUDIANTE\n4. LISTAR ESTUDIANTES\ns. Salir"
+ "\n------------------------------------------------\nINGRESE LA OPCION [1 - 4]: ");
switch (opcion) {
case "1":
agregar();
break;
case "2":
modificar();
break;
case "3":
eliminar();
break;
case "4":
listar();
break;
case "s":
System.exit(0);
break;
default:
break;
}
} while (true);
}
public static void agregar(){
//Pedir tamaño del Arreglo al usuario:
tamaño=Integer.parseInt(JOptionPane.showInputDialog
("¿De que tamaño desea su Arreglo?"));
//recibe los arreglos globalizados arriba
nombres = new String[tamaño];
carnet = new String[tamaño];
calific = new int[tamaño];
calific2 = new int[tamaño];
calific3 = new int[tamaño];
calific4 = new int[tamaño];
promedios = new int[tamaño];
//Pedimos datos
for (int contador = 0; contador < tamaño; contador++) {
//Carnet
carnet[contador]=JOptionPane.showInputDialog
("Carnet del alumno");
//Nombre
nombres[contador]=JOptionPane.showInputDialog
("Nombre?");
//Calificaciones
calific[contador]=Integer.parseInt
(JOptionPane.showInputDialog
("Cual es la nota 1 de "
+nombres[contador]+"?"));
calific2[contador]=Integer.parseInt
(JOptionPane.showInputDialog
("Cual es la nota 2 de "
+nombres[contador]+"?"));
calific3[contador]=Integer.parseInt
(JOptionPane.showInputDialog
("Cual es la nota 3 de "
+nombres[contador]+"?"));
calific4[contador]=Integer.parseInt
(JOptionPane.showInputDialog
("Cual es la nota 4 de "
+nombres[contador]+"?"));
//Calculamos promedio
promedios[contador] = (calific[contador] + calific2[contador] +
calific3[contador] + calific4[contador]) / 4;
}
//Fin del bucle que pide datos
}
public static void modificar(){
boolean elCarnetEsta = false;
String car = JOptionPane.showInputDialog("INGRESA EL CARNET DEL ALUMNO");
for(int contador=0; contador < tamaño; contador++)
if (car.equals(carnet[contador])){
elCarnetEsta = true;
int seleccion = Integer.parseInt(
JOptionPane.showInputDialog("QUE NOTA DESEAS CAMBIAR: \n1.\n2.\n3.\n4."));
if(seleccion==1)
calific[contador] = Integer.parseInt(
JOptionPane.showInputDialog("NUEVA NOTA ["+seleccion+"]"));
else if(seleccion==2)
calific2[contador] = Integer.parseInt(
JOptionPane.showInputDialog("NUEVA NOTA ["+seleccion+"]"));
else if(seleccion==3)
calific3[contador] = Integer.parseInt(
JOptionPane.showInputDialog("NUEVA NOTA ["+seleccion+"]"));
else if(seleccion==4)
calific4[contador] = Integer.parseInt(
JOptionPane.showInputDialog("NUEVA NOTA ["+seleccion+"]"));
//Nota cambiada, hay que recalcular el promedio
promedios[contador] = (calific[contador] + calific2[contador] +
calific3[contador] + calific4[contador]) / 4;
//Alumno encontrado y cambiado su nota y promedio, podemos interrumpir este bucle
break;
}
if(elCarnetEsta == false) {
JOptionPane.showMessageDialog(null, "EL CARNET NO EXISTE");
}
}
public static void listar(){
//Mostrar alumno y su calificacion en pantalla:
System.out.println("Numero\tCarnet\tNombre\tnota1\tnota2\tnota3\tnota4\tPromedio");
for(int contador=0; contador < nombres.length; contador++)
System.out.println(contador+1+"\t" + carnet[contador]+"\t"+nombres[contador]+"\t"
+calific[contador]+"\t"+calific2[contador]+"\t"+calific3[contador]+
"\t"+calific4[contador]+"\t"+promedios[contador]);
}
public static void eliminar(){
}
}