Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
1
respuesta

[Sugerencia] Mi propuesta de solución...

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: InputMismatchException
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
                ****************************************
                
                """);
    }
}
1 respuesta

Hola, Wilmar, espero que estés bien

Tu propuesta de solución es bastante completa y parece cumplir con los requisitos del ejercicio. Aquí hay algunos puntos clave que has implementado correctamente:

  1. Uso de Locale.US: Esto asegura que los números decimales se manejen con un punto en vez de una coma, lo cual es importante para la entrada y salida de datos en diferentes configuraciones regionales.

  2. Manejo de excepciones: Utilizar try/catch para manejar InputMismatchException es una excelente manera de garantizar que el programa no falle con entradas inválidas y continúe solicitando un valor válido.

  3. Lógica de negocio: La función processAverage(double average) implementa correctamente la lógica para determinar si el estudiante ha sido aprobado, está en recuperación o ha reprobado, de acuerdo con las reglas dadas.

  4. Interfaz de usuario: Has incluido mensajes claros para el usuario, lo que mejora la experiencia de uso del programa.

En general, tu código está bien estructurado y debería funcionar correctamente para el propósito del ejercicio. Si deseas mejorar aún más, podrías considerar añadir validaciones adicionales, como verificar que el promedio ingresado no sea negativo (excepto el -1 para salir), aunque ya lo manejas bien en el bucle do-while.

Espero haber ayudado y buenos estudios!