Sobre el while(true)...
Aquí entra la problemática que mencioné antes, hay profesores y "expertos" que lo utilizan y piensan que es un buen recurso a la hora de programar.
Pues no solo es un mal recurso, si no que es totalmente innecesario.
Para terminar un while(true), hay que utilizar un:
if (<condicion>).... break;O bien:
if (<condicion>).... System.exit(0);¿Pues no es más lógico y útil poner esa
<condicion> directamente en el while()?
Si necesitamos que ese bucle se ejecute como mínimo una vez independientemente de si se cumple o no esa condición, para ello tenemos el do...while(), que es el utilicé en mi ejemplo.
Con este bucle, este se ejecuta como mínimo una sola vez y luego evalúa la condición para decidir si el bucle se repite o se termina.
Si haces una búsqueda por Internet, verás que la opinión generalizada es que es una
mala práctica, incluso en este
otro enlace una persona comenta que está cursando un grado y al usarlo en un ejercicio le penalizaron restándole puntos.
Ahora bien, por desgracia, quien "manda" son tus profesores, así que si te dicen que uses el while(true), hazlo.
Pero hazlo solo por contentarles, luego tú intenta recordar que es mala práctica, que en ejercicios simples no importa pero en programas más avanzados usar un while (true) conlleva inevitablemente problemas a posteriori, especialmente de "legibilidad" del programa y de mantenimiento.
Cuando te pasan un código que tú no has escrito para mantenerlo y modificarlo, y ves un
while(respuesta == "si"), enseguida ves claramente cuál es la condición necesaria para que el bucle se repita o no.
Pero si te encuentras un
while(true), no sabes cuál es la condición real que mantiene el bucle funcionando y tienes que empezar a revisar lineas de código hasta encontrar un break; un System.exit(0)...o similar.
Y como digo, en un programa profesional avanzado, puede ser una locura.
Sobre esto:
Con los números de la edad que se han introducido, debo hacer un arreglo para al finalizar, sacar un promedio, el número máximo y mínimo.
De nuevo, para contentar al profesor y cumplir lo que pide el anunciado, hay que complicar más el código inútilmente.
Para calcular el promedio, el máximo y el mínimo,
no hace falta ningún arreglo, es un paso totalmente innecesario, se puede prescindir de él.
Pero si piden que se use, pues habrá que usarlo... pero esto plantea un problema importante.
En Java, para declarar un arreglo, tienes que saber de antemano que dimensión va a tener.
Es decir, necesitamos saber cuantas edades vamos a almacenar..., pero esto no lo podemos saber..., porque cada vez que se ejecute el programa no sabemos si el usuario va a meter los datos de 3 personas, de 5 personas, de 50, de 10000....
Tu declaración:
int [] arrEnteros = new int [strEdad.length()];
Esto no te sirve, le estás diciendo que la dimensión del arreglo ha de ser la longitud del valor de la variable String que contiene la edad.
Es decir, si en ese momento tiene almacenada la edad de una persona de 25 años:
strEdad = "25";Entonces le estas diciendo al arreglo que su dimensión es de tan solo dos elementos. Porque la longitud del valor de esa variable, es decir,
strEdad.length() es de dos, puesto que el string "25" tiene dos caracteres, el '2' y el '5'.
Vamos, que no puedes deducir cuál va a ser el tamaño del arreglo valiéndote de la longitud ( .length() ) de esa varaible, ni de ninguna otra.
De hecho, repito, no puedes deducir cuál ha de ser el tamaño de ninguna manera, porque tu no puedes saber cuantos datos de personas va a introducir el usuario.
En estos casos, se usa unas clases más avanzadas, como puede ser la clase Vector o la clase ArrayList.
Estas clases tienen la ventaja de que no hace falta indicarles ninguna dimensión al declararlos. Son como los arreglos "normales", pero puedes ir añadiendo y quitando datos y ellos irán aumentando o disminuyendo su longitud de forma dinámica.
Como aún no te los han explicado, supongo que no puedes recurrir a ellos.
Si vas a tener que usar un arreglo "normal", no te queda otra que decidir una dimensión lo suficientemente grande para poder hacer el ejercicio.
Total, es solo eso, un ejercicio, y no tiene porque ser perfecto si no tan solo servirte para aprender.
Puedes poner por ejemplo que mida 50, y ya vas sobrado porque para el ejercicio no vas a necesitar meter más de 50 personas.
int[] edades = new int[50];
Para calcular el promedio, vas a necesitar otra variable para contar de cuantas personas se han introducido datos.
int contPsn = 0;//Para contar personas
Esta variable, además, te puede servir como "indice" para el arreglo.
Ya que la primera vez que se meta el dato de una persona, la edad habrá que guardarla en la posicion 0 del arreglo y contar esa persona.
La próxima edad se ha de guardar en la posicion 1, y contra otra persona más.
Y así continuamente.....
Pero solo se han de introducir y contar cuando la edad haya quedado validada.
Tú has usado este código para capturar y validar la edad:
//capturar edad
indBien=false;
while (indBien==false)
{
strError = "";
indBien=true;
strEdad = JOptionPane.showInputDialog("\nDigite su edad : ", strEdad).trim();
try{
intEdad=Integer.parseInt(strEdad);
}
catch (Exception e)
{
strError += "debe ingresar valores numéricos\n";
JOptionPane.showMessageDialog(null, strError);
indBien=false;
continue;
}
if(intEdad<18||intEdad>125){
strError += "Edad fuera del rango entre 18 y 125";
}
if(strError.length()>0){
JOptionPane.showMessageDialog(null, strError);
indBien=false;
}
}
Yo lo habría hecho de otra forma, pero para seguir con tu enfoque, podríamos añadir lo siguiente (en color rojo):
//capturar edad
indBien=false;
while (indBien==false)
{
strError = "";
indBien=true;
strEdad = JOptionPane.showInputDialog("\nDigite su edad : ", strEdad).trim();
try{
intEdad=Integer.parseInt(strEdad);
}
catch (Exception e)
{
strError += "debe ingresar valores numéricos\n";
JOptionPane.showMessageDialog(null, strError);
indBien=false;
continue;
}
if(intEdad<18||intEdad>125){
strError += "Edad fuera del rango entre 18 y 125";
}
if(strError.length()>0){
JOptionPane.showMessageDialog(null, strError);
indBien=false;
}
if (indBien == true){
edades[contPsn] = intEdad;//Guardamos la edad validada en el arreglo
contPsn++;//Aumentamos en 1 el contador de personas, que a su vez nos sirver de indice para el arreglo
}
}
De este modo cada vez que se repite el bucle, se guarda la edad validad en la posición adecuada del arreglo y al mismo tiempo contamos las personas introducidas.
Bien, para mostrar y calcular el promedio, tenemos que esperar a que el usuario termine de introducir datos, es decir, hay que hacerlo cuando
haya terminado el bucle while().
Ahora mismo, tu bucle while en realidad no termina, sino que estamos cerrando el programa brúscamente con el
System.exit(0) (otra mala práctica por cierto)
Esto implica que no tenemos oportunidad de seguir haciendo operaciones al terminar de introducir datos de personas.
Para evitarlo, podemos cambiar el
System.exit(0) por la sentencia
break;De este modo, el bucle while() terminará pero el programa seguirá funcionando si le añadimos más codigo tras el //fin while
Así ahora ya tenemos la oportunidad de hacer más operaciones con los datos de la edad, como lo de calcular el promedio.
Para ello, necesitamos otra variable para sumar las edades que hemos almacenado en el arreglo.
Hay que recordar que para nuestro arreglo decidimos darle una dimension de 50, pero en realidad puede que solo tenga 5 edades, ó 7, ó 23..
Así que para sumar las edades, no debemos recorrer el arreglo entero, solo según las personas que hayamos introducido.
Y para esto nos servimos de la variable que hemos usado para contar personas:
//Calcular promedio edad
int sumaEdad = 0;
for (int i=0; i<contPsn; i++)
{
sumaEdad = sumaEdad + edades[i];
}
System.out.println("La edad promedio es: " + (sumaEdad / contPsn));
Con eso ya tienes el promedio de las edades validas introducidas, y funciona para cualquier número de personas introducidas (máximo 50).
Ahora te faltaría lo de calcular la edad máxima y la edad mínima. A ver si consigues averiguar como hacerlo.
Un saludo.