Hola.
Para hacer que se repita la petición hasta que el usuario introduzca un valor dentro del rango admitido, sí, hay que usar while.
Pero hay que poner una condición de repetición que sea lógica.
Tu has puesto una variable "contador" que mientras sea menor que 1, se repita.
Eso puede funcionar, siempre y cuando luego modifiques el valor de "contador" para evitar que el bucle sea infinito.
Pero no es "lógico", porque no estamos contando nada.
Imagina que otra persona lee tu código, sin tener el enunciado así que no sabe cuáles son las condiciones impuestas al programa.
Si ve una variable "contadora", y ve que el valor de ese contador influye en la condición del bucle... pensará que este programa debería estar "contando" algo, pero no es así.
¿Entiendes lo que quiero decir?
Nuestros programas han de ser lo más entendible posible para otras personas, e incluso para ti.
Porque a lo mejor dentro de 6 meses, que quizás ya has olvidado este ejercicio, te encuentras con este código... y tu mismo puedes quedarte confuso y preguntándote por qué pusiste un contador como condición del bucle... si no se está contando nada.
Para lograr que el programa sea entendible, hay que intentar transmitir al código el mismo proceso mental que hacemos en nuestra cabeza.
Es decir, la lógica que seguimos en la cabeza es:
* Pido una nota
* ¿Está FUERA del rango admitido?
- SÍ/TRUE: Pues vuelvo a pedirla sin computar nada
- NO/FALSE: Pues dejo de pedirla y la computo
De ahí podemos deducir cuál sería la condición idónea para el bucle WHILE: que se repita mientras nota fuera de rango sea cierto (true)
Esto lo podemos representar con una variable boolean y dándole el nombre adecuado.
public class Calificaciones {
public static void main(String[] args) {
float calificacion = 0;
boolean fueraDeRango = true;
while(fueraDeRango){ //Mientras la nota esté fuera de rango, se repetirá el bucle
calificacion=Float.parseFloat(JOptionPane.showInputDialog("Ingresar Nota"));
if (calificacion > 10 || calificacion < 0)
JOptionPane.showMessageDialog(null, "Introduzca una calificación valida entre 0 y 10 ");
else {
fueraDeRango = false; //La nota es valida, está DENTRO de rango, ya no se repetirá el bucle
if(calificacion <= 7)
JOptionPane.showMessageDialog(null, "Esta Reprobado");
else
JOptionPane.showMessageDialog(null, "Esta Aprobado");
}
}
}
}
¿Ves? Ahí no estamos usando ningún "contador" que pueda llevar a confusión.
Solo con leerlo ya se adivina la lógica que sigue el programa.
Por cierto, ahí también se ve como controlar correctamente si está dentro del rango o no.
De nuevo, es casi como escribir lo que tenemos en la cabeza.
Si la nota es mayor que 10 ó es menor que 0
avisamos que la nota está fuera de rangoif (calificacion > 10 || calificacion < 0)
JOptionPane.showMessageDialog(null, "Introduzca una calificación valida entre 0 y 10 ");
Pregunta si algo no ha quedado claro.
Un saludo.