Desarrollo de Aplicaciones Java en Consola: Gestión de Entrada Validada y Menús Interactivos
Clasificado en Informática
Escrito el en español con un tamaño de 13,08 KB
Corrección y Estructuración de Código Java para Aplicaciones de Consola
Este documento presenta la corrección y mejora de un conjunto de clases Java diseñadas para la interacción por consola. El objetivo principal es validar la entrada de datos del usuario y construir un menú interactivo para ejecutar diversas funcionalidades. Se han corregido errores ortográficos y gramaticales, ajustado la capitalización, y añadido comentarios detallados para cada clase y función, explicando su propósito y funcionamiento.
Requisitos del Ejercicio
El ejercicio original solicitaba la creación y programación de dos componentes principales:
- La clase
Filtro.java
, encargada de la validación de entrada de números enteros y decimales. - La clase
Ejercicio01.java
(originalmenteEjercicio.java
), que implementa un menú interactivo utilizando las funciones de validación deFiltro.java
.
Implementación de Clases
Clase Filtro.java
Esta clase se ubica en el paquete ACT03_ASIX_asix.IntroDatos
y es fundamental para asegurar la robustez de la entrada de datos en aplicaciones de consola. Contiene métodos estáticos que solicitan y validan números, repitiendo la petición hasta que el usuario introduce un valor correcto.
Objetivo de la Clase Filtro
La clase Filtro
tiene como objetivo principal proporcionar utilidades para la entrada de datos segura desde la consola. Su propósito es evitar errores de tipo de dato (por ejemplo, introducir texto cuando se espera un número) mediante la implementación de bucles de validación y manejo de excepciones.
package ACT03_ASIX_asix.IntroDatos;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException; // Importación necesaria para manejar excepciones de I/O
/**
<h2>Clase Filtro</h2>
<p>Esta clase proporciona métodos estáticos para la <strong>validación de entrada de datos</strong>
desde la consola, asegurando que el usuario introduzca valores numéricos correctos (enteros o decimales).</p>
*/
public class Filtro {
/**
<h3>Método main (para pruebas)</h3>
<p>Este método es el punto de entrada principal para <strong>probar las funciones de entrada de datos</strong>
de la clase <code>Filtro</code>. Solicita un número entero y un número decimal al usuario para demostrar su funcionamiento.</p>
<p><em>Nota: En una aplicación real, estas funciones serían llamadas desde otras clases, no directamente desde este <code>main</code> para la lógica principal.</em></p>
@param args Argumentos de línea de comandos (no utilizados).
*/
public static void main(String[] args) {
int numeroEntero = pideEntero("Por favor, introduce un número entero:");
System.out.println("Número entero introducido: " + numeroEntero);
double numeroDecimal = pideDouble("Por favor, introduce un número decimal:");
System.out.println("Número decimal introducido: " + numeroDecimal);
}
/**
<h3>Función pideEntero</h3>
<p>Solicita al usuario un <strong>número entero</strong> a través de la consola. La función <strong>valida la entrada</strong>
y repite la solicitud hasta que se introduce un valor numérico entero válido. Utiliza <code>BufferedReader</code>
para leer la entrada de la consola.</p>
<p><em>Nota: La creación de <code>BufferedReader</code> dentro del bucle es funcional para este ejercicio,
pero en aplicaciones más complejas se recomienda una gestión más eficiente de los recursos de I/O.</em></p>
@param mensaje El mensaje que se mostrará al usuario para solicitar el número.
@return El número entero introducido por el usuario.
*/
public static int pideEntero(String mensaje) {
int numero = 0;
boolean valorCorrecto = false;
// BufferedReader se crea aquí para cada intento de lectura. Para System.in, no es crítico cerrarlo.
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
while (!valorCorrecto) {
System.out.println(mensaje); // Muestra la pregunta al usuario
try {
String linea = br.readLine(); // Lee la línea completa de entrada
numero = Integer.parseInt(linea); // Intenta convertir la línea a entero
valorCorrecto = true; // Si la conversión es exitosa, el valor es correcto
} catch (NumberFormatException e) {
// Captura la excepción si la entrada no es un número válido
System.out.println("Error: Valor incorrecto. Por favor, introduce un valor numérico entero.");
} catch (IOException e) {
// Captura excepciones de entrada/salida durante la lectura
System.out.println("Error de lectura de entrada: " + e.getMessage());
}
}
return numero;
}
/**
<h3>Función pideDouble</h3>
<p>Solicita al usuario un <strong>número decimal</strong> (tipo <code>double</code>) a través de la consola.
La función <strong>valida la entrada</strong> y repite la solicitud hasta que se introduce
un valor numérico decimal válido. Utiliza <code>BufferedReader</code> para leer la entrada.</p>
<p><em>Nota: Similar a <code>pideEntero</code>, la gestión de <code>BufferedReader</code> es simplificada para este ejercicio.</em></p>
@param mensaje El mensaje que se mostrará al usuario para solicitar el número.
@return El número decimal introducido por el usuario.
*/
public static double pideDouble(String mensaje) {
double numero = 0;
boolean valorCorrecto = false;
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
while (!valorCorrecto) {
System.out.println(mensaje); // Muestra la pregunta al usuario
try {
String linea = br.readLine(); // Lee la línea completa de entrada
numero = Double.parseDouble(linea); // Intenta convertir la línea a double
valorCorrecto = true; // Si la conversión es exitosa, el valor es correcto
} catch (NumberFormatException e) {
// Captura la excepción si la entrada no es un número válido
System.out.println("Error: Valor incorrecto. Por favor, introduce un valor numérico decimal.");
} catch (IOException e) {
// Captura excepciones de entrada/salida durante la lectura
System.out.println("Error de lectura de entrada: " + e.getMessage());
}
}
return numero;
}
}
Clase Ejercicio01.java
Esta clase, ubicada en el paquete ACT03_ASIX_asix.main
, es el punto de control principal de la aplicación. Implementa un menú que permite al usuario seleccionar y ejecutar diferentes operaciones matemáticas, haciendo uso de la validación de entrada proporcionada por la clase Filtro
.
Objetivo de la Clase Ejercicio01
La clase Ejercicio01
(originalmente nombrada Ejercicio
) tiene como objetivo principal orquestar la interacción con el usuario a través de un menú de opciones. Su propósito es demostrar cómo integrar la validación de entrada (usando Filtro
) con la lógica de negocio (llamando a métodos de Calculos1
y Operacionesmates
) en una aplicación de consola.
package ACT03_ASIX_asix.main;
// Importar la clase Filtro para usar sus métodos de entrada validada
import ACT03_ASIX_asix.IntroDatos.Filtro;
// Se asume que estas clases existen en sus respectivos paquetes y contienen los métodos mencionados.
// Se han ajustado los nombres de los métodos a la convención camelCase de Java.
import ACT03_ASIX_asix.Calculos1;
import ACT03_ASIX_asix.Operacionesmates; // Se asume que el nombre de la clase es Operacionesmates
/**
<h2>Clase Ejercicio01</h2>
<p>Esta clase implementa un <strong>menú interactivo por consola</strong>
que permite al usuario ejecutar diversas funciones matemáticas definidas en
otras clases (<code>Calculos1</code> y <code>Operacionesmates</code>).
Utiliza la clase <code>Filtro</code> para la <strong>validación de la entrada</strong> del usuario.</p>
*/
public class Ejercicio01 { // Renombrado de 'Ejercicio' a 'Ejercicio01' según la instrucción
/**
<h3>Método main</h3>
<p>Punto de entrada principal de la aplicación. Crea una instancia de <code>Ejercicio01</code>
y ejecuta el <strong>bucle principal del menú</strong>. Este método es el que se ejecuta al iniciar el programa.</p>
@param args Argumentos de línea de comandos (no utilizados).
*/
public static void main(String[] args) {
Ejercicio01 programa = new Ejercicio01();
programa.run();
}
/**
<h3>Función opciones</h3>
<p>Muestra el <strong>menú de opciones</strong> disponibles al usuario y solicita
la selección. Es crucial que utilice <code>Filtro.pideEntero</code> para asegurar una entrada válida
y robusta, en lugar de <code>Scanner.nextInt()</code> directamente.</p>
@return La opción numérica seleccionada por el usuario.
*/
public int opciones() {
// Se elimina el uso de Scanner.nextInt() para cumplir con la instrucción de usar Filtro.pideEntero()
// Scanner teclado = new Scanner(System.in);
System.out.println("\n--- MENÚ PRINCIPAL ---");
System.out.println("1. Mostrar el valor de PI");
System.out.println("2. Mostrar un valor redondeado");
System.out.println("3. Mostrar un valor aleatorio");
System.out.println("4. Calcular el seno de un ángulo");
System.out.println("5. Calcular la raíz cuadrada de un número");
System.out.println("----------------------");
System.out.println("0. Salir del programa");
System.out.println("----------------------");
// Se utiliza la función pideEntero de la clase Filtro para obtener una entrada validada
int opcion = Filtro.pideEntero("Por favor, introduce el número de la opción deseada:");
return opcion;
}
/**
<h3>Función run</h3>
<p>Contiene el <strong>bucle principal del programa</strong> que muestra el menú,
procesa la opción seleccionada por el usuario y ejecuta la función correspondiente.
El bucle continúa hasta que el usuario elige la opción de salir (0), garantizando
que el programa solo finalice bajo la indicación explícita del usuario.</p>
*/
public void run() {
int opcion;
do {
opcion = opciones(); // Obtiene la opción del usuario a través del menú
switch (opcion) {
case 1:
// Llama a la función para mostrar PI de la clase Calculos1
Calculos1.muestraPI();
break;
case 2:
// Llama a la función para mostrar un valor redondeado de la clase Calculos1
Calculos1.muestraValorRedondeado();
break;
case 3:
// Llama a la función para mostrar un valor aleatorio de la clase Calculos1
Calculos1.muestraValorAleatorio();
break;
case 4:
// Llama a la función para mostrar el seno de la clase Operacionesmates
// Se asume que el método se llama 'muestraSeno' siguiendo las convenciones de Java.
Operacionesmates.muestraSeno();
break;
case 5:
// Llama a la función para calcular la raíz de la clase Operacionesmates
// Se asume que el método se llama 'calculaRaiz' siguiendo las convenciones de Java.
Operacionesmates.calculaRaiz();
break;
case 0:
System.out.println("Saliendo del programa. ¡Hasta pronto!");
break;
default:
System.out.println("Opción no válida. Por favor, selecciona una opción del 0 al 5.");
break;
}
} while (opcion != 0);
}
}