A tener en cuenta:
- Uso Locale.US para que cuando el usuario ingrese valores con decimales, use punto en lugar de coma, sin importar la ubicación geográfica del usuario.
- También uso Locale.US para imprimir el valor ingresado con punto y no con coma, sin importar la ubicación geográfica del usuario.
- Uso try/catch para controlar valores no válidos ingresados por el usuario, de esta manera no sale del ciclo y continúa en espera de un valor válido.
- Uso el método processAverage(double average) para la lógica de negocio solicitada en el ejercicio.
- InputMismatchException es la excepción que arroja el método nextDouble() cuando el valor ingresado no es double:
import java.util.InputMismatchException;
import java.util.Locale;
import java.util.Scanner;
public class StudentPasses {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in).useLocale(Locale.US);
double media = 0;
showHeader();
do {
System.out.println("* Enter the student's positive average or -1 to finish *");
try {
media = scanner.nextDouble();
if (media > -1) processAverage(media);
} catch (InputMismatchException _) {
System.out.println("""
Type a valid positive average please,
use a dot to separate decimals, examples 5.1, 9.8
""");
scanner.nextLine();
}
} while (media > -1);
System.out.println("\nClosing app... Thanks for using our service");
scanner.close();
}
private static void processAverage (double media) {
String messagePrefix = String.format(Locale.US, "El estudiante tuvo un promedio de %.1f y", media);
if (media >= 7) {
System.out.printf("%n%s fue aprobado.%n%n", messagePrefix);
} else if (media >= 5) {
System.out.printf("%n%s está en recuperación.%n%n", messagePrefix);
} else {
System.out.printf("%n%s fue reprobado.%n%n", messagePrefix);
}
}
private static void showHeader() {
System.out.println("""
****************************************
The student passes the subject app
****************************************
""");
}
}