Saltar al contenido
schedule 10 min Lógica de Programación

Resolver problemas como un programador

La diferencia entre un programador junior y uno senior no es que el senior conozca más lenguajes o más funciones. Es que el senior tiene un método para resolver problemas. Cuando le pones un problema delante, no empieza a escribir código como un loco. Se sienta, piensa, planifica y LUEGO programa. En esta lección vas a aprender ese método.

La metodología de 4 pasos

Este enfoque viene de George Pólya, un matemático que en 1945 publicó "Cómo plantear y resolver problemas". Su método funciona igual de bien para ecuaciones matemáticas que para programación:

  1. Entender el problema
  2. Planificar la solución
  3. Ejecutar el plan
  4. Verificar el resultado

Parece obvio, ¿no? Pero te sorprendería saber cuánta gente se salta el paso 1 y 2 y se lanza directamente al 3. Es como salir de viaje sin saber a dónde vas ni qué ruta tomar.

Paso 1: Entender el problema

Antes de resolver nada, tienes que asegurarte de que entiendes exactamente qué te están pidiendo. Para eso, hazte estas preguntas:

  • ¿Cuáles son las entradas? ¿Qué datos me dan?
  • ¿Cuáles son las salidas? ¿Qué resultado esperan?
  • ¿Qué restricciones hay? ¿Hay límites, reglas o casos especiales?
  • ¿Puedo dar un ejemplo concreto? Con números y datos reales

Vamos a practicarlo con un problema real: diseñar el sistema de un parking.

// PASO 1: Entender el problema del parking

ENTRADAS:
- Capacidad máxima del parking (por ejemplo, 50 plazas)
- Vehículos que entran y salen
- Hora de entrada y hora de salida de cada vehículo

SALIDAS:
- Saber si hay plazas disponibles
- Calcular cuánto debe pagar cada vehículo al salir
- Mostrar cuántas plazas quedan libres

RESTRICCIONES:
- No pueden entrar más coches de los que caben
- La tarifa es 2€ por hora (mínimo 1 hora)
- Se cobra la hora completa (si estás 1 hora y 10 min, pagas 2 horas)

EJEMPLO CONCRETO:
- Parking de 3 plazas (para simplificar)
- Entra coche A a las 10:00 → quedan 2 plazas
- Entra coche B a las 10:30 → queda 1 plaza
- Entra coche C a las 11:00 → quedan 0 plazas
- Intenta entrar coche D → "Parking completo"
- Sale coche A a las 12:15 → estuvo 2h 15min → paga 3 horas = 6€
  → queda 1 plaza libre

Paso 2: Planificar la solución

Ahora que entiendes el problema, toca diseñar la solución. Aquí hay tres estrategias clave:

Descomponer en sub-problemas

Un problema grande es simplemente un montón de problemas pequeños pegados. Tu trabajo es separarlos. Es como montar un mueble de IKEA: no intentas montarlo de golpe, sigues los pasos uno a uno.

// PASO 2: Descomponer el problema del parking en sub-problemas

Sub-problema 1: Registrar la entrada de un vehículo
    - Comprobar si hay plazas libres
    - Registrar la matrícula y la hora de entrada
    - Reducir el contador de plazas disponibles

Sub-problema 2: Registrar la salida de un vehículo
    - Buscar el vehículo por su matrícula
    - Calcular el tiempo que estuvo aparcado
    - Calcular el importe a pagar
    - Aumentar el contador de plazas disponibles

Sub-problema 3: Calcular el precio
    - Calcular la diferencia de horas entre entrada y salida
    - Redondear hacia arriba (hora incompleta = hora completa)
    - Multiplicar por la tarifa

Sub-problema 4: Consultar estado del parking
    - Mostrar plazas ocupadas y disponibles
    - Listar los vehículos aparcados actualmente

Identificar patrones

Muchos problemas se parecen a otros que ya resolviste. El parking es básicamente una lista donde añades y eliminas elementos, con un límite máximo. Si ya sabes trabajar con listas (lección anterior), ya tienes medio problema resuelto.

Elegir las herramientas adecuadas

Para cada sub-problema, decide qué necesitas: ¿variables? ¿listas? ¿funciones? ¿bucles? ¿condicionales?

// Herramientas para el parking:

Variables:
    - capacidadMaxima (número)
    - plazasOcupadas (número)

Listas:
    - matriculas[] (las matrículas de los coches aparcados)
    - horasEntrada[] (la hora de entrada de cada coche)

Funciones:
    - registrarEntrada(matricula, hora)
    - registrarSalida(matricula, hora)
    - calcularPrecio(horaEntrada, horaSalida)
    - consultarEstado()

Condicionales:
    - ¿Hay plazas disponibles?
    - ¿Existe esta matrícula en el parking?

Bucles:
    - Buscar un coche por matrícula en la lista

Paso 3: Ejecutar el plan

Ahora sí: escribe el pseudocódigo. Como ya tienes el plan, esto es básicamente "traducir" cada sub-problema a pseudocódigo. Fíjate en cómo cada función corresponde a un sub-problema del paso anterior:

INICIO
    capacidadMaxima = 50
    plazasOcupadas = 0
    matriculas = []
    horasEntrada = []
FIN

FUNCION registrarEntrada(matricula, hora)
    SI plazasOcupadas >= capacidadMaxima ENTONCES
        MOSTRAR "Parking completo. No hay plazas disponibles"
        DEVOLVER FALSO
    FIN SI

    AÑADIR matriculas, matricula
    AÑADIR horasEntrada, hora
    plazasOcupadas = plazasOcupadas + 1

    plazasLibres = capacidadMaxima - plazasOcupadas
    MOSTRAR "Bienvenido. Plazas disponibles: " + plazasLibres
    DEVOLVER VERDADERO
FIN FUNCION

FUNCION registrarSalida(matricula, horaSalida)
    // Buscar el coche
    posicion = -1
    PARA i = 1 HASTA LONGITUD(matriculas) HACER
        SI matriculas[i] == matricula ENTONCES
            posicion = i
        FIN SI
    FIN PARA

    SI posicion == -1 ENTONCES
        MOSTRAR "No se encontró el vehículo " + matricula
        DEVOLVER FALSO
    FIN SI

    // Calcular precio
    horasAparcado = horaSalida - horasEntrada[posicion]
    precio = calcularPrecio(horasAparcado)

    // Eliminar el coche de las listas
    ELIMINAR matriculas, posicion
    ELIMINAR horasEntrada, posicion
    plazasOcupadas = plazasOcupadas - 1

    MOSTRAR "Vehículo: " + matricula
    MOSTRAR "Tiempo: " + horasAparcado + " horas"
    MOSTRAR "Total a pagar: " + precio + "€"
    DEVOLVER VERDADERO
FIN FUNCION

FUNCION calcularPrecio(horas)
    tarifaPorHora = 2
    // Redondear hacia arriba: 2.3 horas → 3 horas
    horasFacturadas = REDONDEAR_ARRIBA(horas)
    SI horasFacturadas < 1 ENTONCES
        horasFacturadas = 1
    FIN SI
    DEVOLVER horasFacturadas * tarifaPorHora
FIN FUNCION

FUNCION consultarEstado()
    plazasLibres = capacidadMaxima - plazasOcupadas
    MOSTRAR "=== Estado del Parking ==="
    MOSTRAR "Capacidad total: " + capacidadMaxima
    MOSTRAR "Plazas ocupadas: " + plazasOcupadas
    MOSTRAR "Plazas libres: " + plazasLibres

    SI LONGITUD(matriculas) > 0 ENTONCES
        MOSTRAR "Vehículos aparcados:"
        PARA i = 1 HASTA LONGITUD(matriculas) HACER
            MOSTRAR "  - " + matriculas[i] + " (desde las " + horasEntrada[i] + ")"
        FIN PARA
    FIN SI
FIN FUNCION

Paso 4: Verificar el resultado

Tu solución no está terminada hasta que la pruebas. Y no basta con probar el "caso feliz" (todo sale bien). Tienes que probar también los casos borde: situaciones extremas o raras que podrían romper tu código.

// PASO 4: Verificar con diferentes escenarios

// Caso normal: entrada y salida correcta
registrarEntrada("1234ABC", 10)    // OK, entra
registrarSalida("1234ABC", 12)     // 2 horas → 4€ ✓

// Caso borde: parking lleno
// (simular que las 50 plazas están ocupadas)
registrarEntrada("9999ZZZ", 10)    // "Parking completo" ✓

// Caso borde: coche que no existe
registrarSalida("0000XXX", 15)     // "No se encontró" ✓

// Caso borde: menos de 1 hora
registrarEntrada("5678DEF", 10)
registrarSalida("5678DEF", 10.5)   // 0.5 horas → mínimo 1h → 2€ ✓

// Caso borde: parking vacío
consultarEstado()                   // "0 plazas ocupadas, 50 libres" ✓

// Caso borde: hora exacta
registrarEntrada("1111AAA", 10)
registrarSalida("1111AAA", 13)     // Exactamente 3 horas → 6€ ✓

Los casos borde son donde se esconden la mayoría de los bugs. Un buen programador siempre piensa: "¿Qué pasa si la lista está vacía? ¿Qué pasa si el número es 0? ¿Qué pasa si el usuario introduce algo inesperado?"

Errores comunes de principiantes

Después de ver a cientos de estudiantes aprender a programar, estos son los errores que se repiten una y otra vez:

  • Empezar a "programar" sin entender el problema. Si no puedes explicar en una frase qué hace tu programa, no lo has entendido.
  • No descomponer. Intentar resolver todo de golpe en vez de dividir en partes pequeñas. Si tu pseudocódigo tiene más de 30 líneas sin funciones, probablemente necesitas descomponer más.
  • No probar con casos borde. Tu programa funciona con los datos "normales" pero se rompe con una lista vacía, un número negativo o un texto inesperado.
  • Copiar sin entender. Copiar una solución de otro sitio sin entender cada línea. Si no puedes explicar qué hace cada línea, no la has aprendido.
  • No hacer dry run. "Me parece que funciona" no es suficiente. Traza la ejecución con datos reales y verifica cada paso.
  • Variables con nombres crípticos. Usar x, temp, dato en vez de precioTotal, plazasLibres, nombreUsuario. Los nombres claros hacen que tu pseudocódigo se explique solo.

Resumen del método

┌──────────────────────────────────────────────────────────┐
│                 MÉTODO DE 4 PASOS                        │
├──────────────┬───────────────────────────────────────────┤
│ 1. ENTENDER  │ ¿Qué me piden? ¿Entradas? ¿Salidas?     │
│              │ ¿Restricciones? ¿Puedo dar un ejemplo?   │
├──────────────┼───────────────────────────────────────────┤
│ 2. PLANIFICAR│ Descomponer en sub-problemas             │
│              │ Identificar patrones conocidos            │
│              │ Elegir herramientas (variables, listas..) │
├──────────────┼───────────────────────────────────────────┤
│ 3. EJECUTAR  │ Escribir pseudocódigo paso a paso        │
│              │ Una función por sub-problema              │
│              │ Nombres claros y descriptivos             │
├──────────────┼───────────────────────────────────────────┤
│ 4. VERIFICAR │ Probar con datos normales                │
│              │ Probar casos borde y extremos             │
│              │ Hacer dry run con papel y boli            │
└──────────────┴───────────────────────────────────────────┘

En la siguiente lección te espera el ejercicio final: tres problemas reales donde tendrás que aplicar todo lo aprendido en esta sección. Variables, condicionales, bucles, funciones, listas y el método de 4 pasos, todo junto.

code

Diseña un sistema de préstamo de libros de una biblioteca

Avanzado schedule 20 min

Aplica el método completo de 4 pasos para diseñar un sistema de préstamo de libros. La biblioteca tiene estas reglas:

  • Cada socio puede tener máximo 3 libros prestados a la vez
  • El préstamo dura 14 días. Si se devuelve tarde, hay una multa de 0.50€ por día de retraso
  • Un libro solo puede estar prestado a una persona a la vez

Debes entregar, usando papel y bolígrafo:

  1. Paso 1 (Entender): lista de entradas, salidas, restricciones y un ejemplo concreto con datos reales
  2. Paso 2 (Planificar): sub-problemas identificados, herramientas necesarias (variables, listas, funciones)
  3. Paso 3 (Ejecutar): pseudocódigo completo con funciones para: prestarLibro, devolverLibro, calcularMulta y consultarPrestamos
  4. Paso 4 (Verificar): al menos 5 escenarios de prueba, incluyendo casos borde (socio con 3 libros intenta sacar otro, libro ya prestado, devolución con retraso, devolución a tiempo)
lightbulb Pistas

Para el paso 1, piensa en qué datos necesitas de cada libro (título, si está disponible o no) y de cada socio (nombre, cuántos libros tiene prestados). Para el paso 2, los sub-problemas principales son: prestar, devolver, calcular multa y consultar estado. Para los casos borde del paso 4, no olvides: ¿qué pasa si el socio no existe? ¿Qué pasa si intenta devolver un libro que no tiene? ¿Qué pasa si devuelve exactamente el día 14?