Saltar al contenido principal

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:

  1. pedir el nombre;
  2. pedir minutos disponibles de lunes a viernes y minutos del fin de semana;
  3. pedir un objetivo: fundamentos, proyecto o repaso;
  4. pedir si prefiere un ritmo intensivo mediante true o false;
  5. rechazar tiempos negativos;
  6. calcular minutos y horas semanales;
  7. elegir un plan según el objetivo;
  8. avisar si el tiempo recomendado no encaja;
  9. 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 String con ==;
  • el switch evita necesitar varias comparaciones de texto;
  • divide entre 60.0, no entre 60, 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.
  • switch convierte una opción discreta en horas y descripción sin cadenas repetitivas de if.
  • objetivoValido permite separar la selección de la respuesta final.
  • El cálculo conserva decimales gracias a 60.0.
  • El if interno del ritmo solo se alcanza cuando los datos básicos son válidos.

Pruebas manuales​

CasoDatos principalesResultado esperado
Plan viable60 min/día, 120 fin de semana, fundamentos, no intensivo7 horas disponibles; encaja
Tiempo insuficiente20 min/día, 0 fin de semana, proyecto, intensivorecomienda 8 horas; no encaja
Tiempo inválido−10 min/díamensaje de tiempo negativo
Objetivo inválidoobjetivo otroobjetivo no reconocido

Ampliaciones compatibles con Java 0​

  • añadir el objetivo entrevista con 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.