Proyecto: asistente interactivo de consola
Vas a construir un asistente que recomienda un plan de aprendizaje según el tiempo disponible, el objetivo y la preferencia de ritmo. Todo se resolverá con las herramientas de Java 0.
Contexto
Una persona quiere empezar a estudiar, pero necesita una recomendación concreta. El programa recogerá sus datos, validará los más importantes, calculará horas semanales y elegirá un plan.
Requisitos funcionales
El asistente debe:
- pedir el nombre;
- pedir minutos disponibles de lunes a viernes y minutos del fin de semana;
- pedir un objetivo:
fundamentos,proyectoorepaso; - pedir si prefiere un ritmo intensivo mediante
trueofalse; - rechazar tiempos negativos;
- calcular minutos y horas semanales;
- elegir un plan según el objetivo;
- avisar si el tiempo recomendado no encaja;
- mostrar un resumen personalizado.
No hace falta repetir preguntas incorrectas: la validación repetitiva requeriría bucles, que pertenecen al siguiente nivel.
Reglas de recomendación
fundamentos: recomienda 4 horas semanales.proyecto: recomienda 6 horas semanales.repaso: recomienda 2 horas semanales.- otro objetivo: se considera desconocido.
- si el ritmo es intensivo, añade 2 horas a la recomendación base.
- si el tiempo disponible alcanza la recomendación, el plan es viable; si no, sugiere reducir el ritmo o liberar tiempo.
Desarrollo por etapas
1. Dibuja el flujo
leer datos
↓
¿tiempos válidos?
├─ no → mostrar error
└─ sí → calcular disponibilidad
↓
elegir objetivo con switch
↓
ajustar ritmo con if
↓
comparar y recomendar
2. Representa los datos
Necesitarás String para nombre y objetivo, int para minutos, boolean para el ritmo y double para convertir minutos en horas.
3. Calcula la disponibilidad
Los minutos laborables se repiten cinco días:
int minutosSemanales = minutosDiarios * 5 + minutosFinDeSemana;
double horasSemanales = minutosSemanales / 60.0;
4. Traduce el objetivo
Un switch permite asignar horas base y una descripción a cada objetivo. Usa un booleano para recordar si el valor era válido.
5. Decide el mensaje
Primero descarta tiempos u objetivos inválidos. Solo después compara la disponibilidad con las horas recomendadas.
Pistas
- consume el salto de línea después del último
nextInt()antes de leer el objetivo; - no compares
Stringcon==; - el
switchevita necesitar varias comparaciones de texto; - divide entre
60.0, no entre60, para conservar decimales; - da nombres distintos a horas disponibles y recomendadas.
Propuesta de solución
import java.util.Scanner;
public class AsistenteEstudio {
public static void main(String[] args) {
Scanner entrada = new Scanner(System.in);
System.out.print("Nombre: ");
String nombre = entrada.nextLine();
System.out.print("Minutos disponibles cada día laborable: ");
int minutosDiarios = entrada.nextInt();
System.out.print("Minutos disponibles durante el fin de semana: ");
int minutosFinDeSemana = entrada.nextInt();
entrada.nextLine();
System.out.print("Objetivo (fundamentos/proyecto/repaso): ");
String objetivo = entrada.nextLine();
System.out.print("¿Prefieres ritmo intensivo? (true/false): ");
boolean intensivo = entrada.nextBoolean();
if (minutosDiarios < 0 || minutosFinDeSemana < 0) {
System.out.println("El tiempo disponible no puede ser negativo");
} else {
int minutosSemanales = minutosDiarios * 5 + minutosFinDeSemana;
double horasDisponibles = minutosSemanales / 60.0;
double horasBase = 0;
String descripcion = "";
boolean objetivoValido = true;
switch (objetivo) {
case "fundamentos":
horasBase = 4;
descripcion = "práctica guiada de fundamentos";
break;
case "proyecto":
horasBase = 6;
descripcion = "avance de un proyecto pequeño";
break;
case "repaso":
horasBase = 2;
descripcion = "repaso y ejercicios breves";
break;
default:
objetivoValido = false;
}
if (!objetivoValido) {
System.out.println("Objetivo no reconocido");
} else {
double horasRecomendadas = horasBase;
if (intensivo) {
horasRecomendadas += 2;
}
System.out.println("Hola, " + nombre);
System.out.println("Disponibilidad semanal: " + horasDisponibles + " horas");
System.out.println("Plan: " + descripcion);
System.out.println("Dedicación recomendada: " + horasRecomendadas + " horas");
if (horasDisponibles >= horasRecomendadas) {
System.out.println("Tu disponibilidad encaja con el plan");
} else {
System.out.println("Reduce el ritmo o reserva más tiempo semanal");
}
}
}
entrada.close();
}
}
Decisiones importantes
- Los tiempos se validan antes de calcular la disponibilidad o elegir un plan.
switchconvierte una opción discreta en horas y descripción sin cadenas repetitivas deif.objetivoValidopermite separar la selección de la respuesta final.- El cálculo conserva decimales gracias a
60.0. - El
ifinterno del ritmo solo se alcanza cuando los datos básicos son válidos.
Pruebas manuales
| Caso | Datos principales | Resultado esperado |
|---|---|---|
| Plan viable | 60 min/día, 120 fin de semana, fundamentos, no intensivo | 7 horas disponibles; encaja |
| Tiempo insuficiente | 20 min/día, 0 fin de semana, proyecto, intensivo | recomienda 8 horas; no encaja |
| Tiempo inválido | −10 min/día | mensaje de tiempo negativo |
| Objetivo inválido | objetivo otro | objetivo no reconocido |
Ampliaciones compatibles con Java 0
- añadir el objetivo
entrevistacon su dedicación; - aplicar una recomendación distinta cuando solo hay tiempo el fin de semana;
- pedir un presupuesto y recomendar recursos gratuitos o de pago;
- mostrar los minutos que faltan para alcanzar el plan.
No añadas todavía repetición de preguntas, listas de objetivos, métodos propios ni clases adicionales. Con este proyecto ya has recorrido el flujo completo de Java 0: datos, entrada, cálculo y decisiones en un programa reproducible.