Error al ejecutar un código java

Estoy haciendo un programa en java que tiene 5 opciones mostradas por un menú realizado con joptimnessage el cual antes de mostrar ese menú pide el número de atletas los almacena en un arreglo y según la cantidad de atletas que uno ingrese el programa tiene una opción que es la primera de registrar atleta donde se piden datos como nombre, nacionalidad y tiempo, las ventanas para pedir esos datos los muestra el numero de veces segun atletas se hayan dicho que se quieren registrar, despues de eso vuelve a salir el menu con las opciones. Tiene una segunda opción en la cual se desea mostrar el campeón basado en el que menor tiempo se haya gastado todo funciona perfectamente y se ejecuta sin problema. Si se ingresan 3 atletas y el 2do o el 3ro fue el que obtuvo el menor tiempo funciona sin problema y muestra el nombre y tiempo del campeón pero si cuando se están registrando los atletas el tiempo del primer atleta es el menor y luego se le dice al programa que muestre los datos del campeón el programa no avanza del menú y no muestra el resultado.

Realizado con un switch case

Este es el bloque del código de la opción que molesta me gustaria si me podrian ayudar a mirar que es lo que esta mal que impide que funcione bien cuando el ganador es el primer atleta registrado

public class Competencia {
int NumTotalAtletas;

String nombre = null, nacionalidad = null;
double tiempo = 0;
public void menu() {

NumTotalAtletas = Integer.parseInt(JOptionPane.showInputDialog(null,
"Ingrese el número de atletas: "));
Atletas listsAtletas [] = new Atletas[NumTotalAtletas]; //areglo atletas
String opcionMenuPpal;
int opMenuPpal = 0;
do{

opcionMenuPpal = JOptionPane.showInputDialog(null,
"1. Registrar Atleta \n" + "2. Datos del campeón \n" +
"3. Atletas por país \n" + "4. Tiempo promedio de todos los "
+ "atletas \n" + "5. Salir");
if(opcionMenuPpal!=null && !opcionMenuPpal.equals("")) {
opMenuPpal = Integer.parseInt(opcionMenuPpal);
switch(opMenuPpal){

case 1:
for(int i = 0; i<listsAtletas.length;i++){
nombre = JOptionPane.showInputDialog(null,
"Ingrese nombre del atleta");
nacionalidad = JOptionPane.showInputDialog(null,
"Ingrese la nacionalidad del atleta");
tiempo = Double.parseDouble(JOptionPane.
showInputDialog(null,
"Ingrese el tiempo del atleta"));
listsAtletas[i] = new Atletas(nombre,nacionalidad,
tiempo);
JOptionPane.showMessageDialog(null, "Ingresado "
+ " correctamente el atleta No. " + (i + 1) +
" de " + listsAtletas.length);
}
break;

case 2:
Atletas menor = listsAtletas[0];
for(int i = 0; i < listsAtletas.length; i++){
if(listsAtletas[i].getTiempo() < menor.getTiempo())
JOptionPane.showMessageDialog(null,
"El campeón es " +
listsAtletas[i].getNombre() +
" su nacionalidad es " +
listsAtletas[i].getNacionalidad()+
" su tiempo fue " +
listsAtletas[i].getTiempo(), "Atletas",1);
}
break;

No coloco los otros case ya que no creo que influyan en que este molentando el codigo

El metodo getTiempo lo defini asi

public void setTiempo(double tiempo) {
this.tiempo = tiempo;
}
public double getTiempo() {
return tiempo;
}
Cuando se depura paso a paso si el atleta ganador es el 2do que se registro la variable getTiempo de la 2ra linea de código empezando desde case 2 toma valor bien y el código sigue la parte del campeón es y todo eso, pero si el menor es el primero que se ingreso esa variable no muestra que tome ningún valor y no pasa de ese pedazo directo a break

1 respuesta

Respuesta
1

Creo saber lo que esta pasando, usted esta intentando verificar el tiempo del primer participante con el mismo tiempo del primer participante (Valga la redundacia) en el case 2, el operador lógico que estas utilizando (menor que ~<~) solo toma los valores explícitos menores al valor y no toma en cuanta un valor igual, por consiguiente deberías utilizar el operador lógico menor o igual que (<=) ya que con este es más que suficiente para que el primero en registrarse sea el ganador.

Te recomendaría hacer una prueba de escritorio cuando no te salga algún punto, es decir, papel y lápiz, darle valores a los datos y hacer verificaciones manuales si con la depuración no es lo suficiente. Te pondré un ejemplo del cual realice en estos momentos el cual le di valores al tiempo de 3 participantes; 25, 30 y 35 respectivamente y haciendo la verificación de tu condicional con el operador lógico que dejaste, el condicional no efectúa verdadero a que el verificar que el primero sea menor que al primer tiempo, es decir, 25 no es menor que 25 ya que son iguales, entonces deberías colocar menor o igual que directamente; y efectuando los demás valores, 30 no es menor que 25 y 35 no es menor que 25, lo cual por eso se va directamente al break!

Sabes, este método que estas utilizando para determinar cual es el que hizo el menor tiempo en la carrera es poco útil, te sugiero que crees una función en donde en un vector guarde los indices del participante que obtuvo el menor tiempo, es decir, hacer un arreglo simple en el cual se vaya organizando los indices de los participantes de menor a mayor, más claro en un ejemplo es 3 participantes, cada uno con tiempos 1° participante: 30, 2° participante: 25, 3° participante: 35, en el vector organizado de menor a mayor por indices sería 2, 1, 3, en lo que en la verificación del campeón solo verificarías el valor de la primera posición del vector y así no tendrías tantos problemas para encontrar el campeón.

Aquí te dejo la idea y me resolución a tu problema, si deseas que te ayude aún más con respecto a lo que te sugerí, estaré esperando su respuesta, le deseo lo mejor y saludos!

¡Gracias! De verdad fue mucha tu ayuda, te tomaste el tiempo de explicar con un ejemplos todo quedo muy claro,  voy a tener en cuenta las recomendaciones que me das para un próximo ejercicio, y si tienes razón las pruebas de escritorio son muy útiles.

Muchisimas gracias de nuevo por toda tu colaboración  

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas