lección 6

Proyecto mini: un programa que resuelve un problema real

Combina todo lo aprendido (variables, if/else, bucles, funciones) para crear un programa completo que resuelve un problema de verdad.

60 min

Has llegado al final de la Skill 2 y es hora de demostrar todo lo que sabes. En las lecciones anteriores aprendiste los cuatro pilares de la programación: variables (memoria), decisiones (if/else), bucles (repetición) y funciones (reutilización). Ahora vas a combinarlos todos en un programa completo que resuelve un problema REAL. No es un ejercicio de juguete — es un programa que podrías usar de verdad.

### El problema: gestor de gastos personales

El proyecto que vas a construir es un gestor de gastos personal por consola. El programa permite registrar gastos, verlos clasificados por categoría, calcular totales y mostrar estadísticas. Es un problema real — mucha gente necesita exactamente esto para controlar sus finanzas. Y combina absolutamente todo lo que has aprendido.

Antes de escribir ni una línea de código, vamos a pensar. Recuerda la lección 1: si no puedes explicar tu programa en una servilleta, es demasiado complejo. Vamos a desglosar el problema en partes pequeñas:

  1. 01.El programa muestra un MENÚ con opciones (bucle while — se repite hasta que el usuario elija salir).
  2. 02.El usuario puede AÑADIR un gasto (input + variables + almacenamiento en lista).
  3. 03.El usuario puede VER todos los gastos (bucle for para recorrer la lista).
  4. 04.El usuario puede ver un RESUMEN por categoría (bucle + condicional + acumulador).
  5. 05.Cada operación es una FUNCIÓN separada (organización y reutilización).
El programa se organiza con un bucle principal (menú) que llama a funciones, y una estructura de datos compartida.

### Paso 1: la estructura de datos

Necesitamos guardar los gastos. Cada gasto tiene tres datos: concepto (qué compraste), cantidad (cuánto costó) y categoría (comida, transporte, ocio...). En Python, podemos guardar cada gasto como un "diccionario" (pares clave:valor) y todos los gastos en una lista. No te preocupes si no has visto diccionarios formalmente — son intuitivos:

1# Estructura: lista de diccionarios
2# Cada gasto es un diccionario con 3 campos
3gastos = [] # Empieza vacío
4
5# Ejemplo de cómo se verá cuando tenga datos:
6# gastos = [
7# {"concepto": "Café", "cantidad": 2.50, "categoria": "comida"},
8# {"concepto": "Metro", "cantidad": 1.50, "categoria": "transporte"},
9# {"concepto": "Netflix", "cantidad": 12.99, "categoria": "ocio"},
10# ]
11
12# Acceder a datos de un gasto:
13# gastos[0]["concepto"] → "Café"
14# gastos[0]["cantidad"] → 2.50

Un diccionario es como una ficha: tiene campos con nombre. Una lista de diccionarios es como un archivador de fichas.

### Paso 2: las funciones

Vamos a construir el programa función por función. Cada función hace UNA cosa. Esto es diseño modular — si mañana quieres cambiar cómo se muestra la lista de gastos, solo tocas una función sin afectar al resto.

1def mostrar_menu():
2 """Muestra las opciones disponibles."""
3 print("")
4 print("=" * 35)
5 print(" 💰 GESTOR DE GASTOS PERSONALES")
6 print("=" * 35)
7 print(" 1. Añadir gasto")
8 print(" 2. Ver todos los gastos")
9 print(" 3. Resumen por categoría")
10 print(" 4. Buscar gastos")
11 print(" 5. Salir")
12 print("-" * 35)
13
14
15def agregar_gasto(gastos):
16 """Pide datos al usuario y añade un gasto a la lista."""
17 print("")
18 concepto = input(" ¿Qué compraste? ")
19 cantidad = float(input(" ¿Cuánto costó? (€): "))
20 print(" Categorías: comida, transporte, ocio, hogar, otros")
21 categoria = input(" Categoría: ").lower()
22
23 gasto = {
24 "concepto": concepto,
25 "cantidad": cantidad,
26 "categoria": categoria
27 }
28 gastos.append(gasto) # Añadir a la lista
29 print(f" ✓ Gasto registrado: {concepto} ({cantidad:.2f}€)")
30
31
32def ver_gastos(gastos):
33 """Muestra todos los gastos registrados."""
34 if len(gastos) == 0:
35 print(" No hay gastos registrados todavía.")
36 return
37
38 print("")
39 print(f" {'#':<4}{'Concepto':<20}{'Cantidad':<12}{'Categoría'}")
40 print(" " + "-" * 50)
41
42 total = 0
43 for i in range(len(gastos)):
44 g = gastos[i]
45 print(f" {i+1:<4}{g['concepto']:<20}{g['cantidad']:<12.2f}{g['categoria']}")
46 total = total + g["cantidad"]
47
48 print(" " + "-" * 50)
49 print(f" TOTAL: {total:.2f}€ ({len(gastos)} gastos)")

Cada función tiene un propósito claro y un nombre que lo explica.

1def resumen_categorias(gastos):
2 """Muestra el total gastado por categoría."""
3 if len(gastos) == 0:
4 print(" No hay gastos registrados.")
5 return
6
7 # Acumular por categoría
8 categorias = {}
9 for gasto in gastos:
10 cat = gasto["categoria"]
11 if cat in categorias:
12 categorias[cat] = categorias[cat] + gasto["cantidad"]
13 else:
14 categorias[cat] = gasto["cantidad"]
15
16 # Mostrar resumen
17 print("")
18 print(" === RESUMEN POR CATEGORÍA ===")
19 total_general = 0
20 for cat in categorias:
21 total_cat = categorias[cat]
22 total_general = total_general + total_cat
23 print(f" {cat:<15} {total_cat:>8.2f}€")
24
25 print(f" {'TOTAL':<15} {total_general:>8.2f}€")
26
27
28def buscar_gastos(gastos):
29 """Busca gastos por categoría o por importe mínimo."""
30 print(" Buscar por: (1) categoría (2) importe mínimo")
31 tipo = input(" Opción: ")
32
33 encontrados = []
34 if tipo == "1":
35 cat = input(" ¿Qué categoría? ").lower()
36 for gasto in gastos:
37 if gasto["categoria"] == cat:
38 encontrados.append(gasto)
39 elif tipo == "2":
40 minimo = float(input(" ¿Importe mínimo? (€): "))
41 for gasto in gastos:
42 if gasto["cantidad"] >= minimo:
43 encontrados.append(gasto)
44
45 if len(encontrados) == 0:
46 print(" No se encontraron gastos con esos criterios.")
47 else:
48 print(f" Encontrados: {len(encontrados)} gastos")
49 for g in encontrados:
50 print(f" - {g['concepto']}: {g['cantidad']:.2f}€ ({g['categoria']})")

Las funciones de resumen y búsqueda usan bucles, condicionales y acumuladores — todo lo aprendido.

### Paso 3: el bucle principal

El corazón del programa es un bucle while que muestra el menú, pide una opción y llama a la función correspondiente. Se repite hasta que el usuario elija "salir". Este patrón (menú + while + if/elif) es la columna vertebral de miles de programas de consola:

1# Bucle principal del programa
2gastos = [] # Lista donde se guardan todos los gastos
3
4while True:
5 mostrar_menu()
6 opcion = input(" Tu elección (1-5): ")
7
8 if opcion == "1":
9 agregar_gasto(gastos)
10 elif opcion == "2":
11 ver_gastos(gastos)
12 elif opcion == "3":
13 resumen_categorias(gastos)
14 elif opcion == "4":
15 buscar_gastos(gastos)
16 elif opcion == "5":
17 print("")
18 print(" ¡Hasta luego! Tus gastos NO se guardan al cerrar.")
19 print(" (En la Skill 3 aprenderás a guardar en archivo)")
20 break
21 else:
22 print(" ❌ Opción no válida. Elige entre 1 y 5.")

while True + break es un patrón clásico para menús: repite infinitamente hasta que el usuario elija salir.

Felicidades. Acabas de escribir un programa REAL de ~80 líneas que combina TODOS los conceptos de esta skill. Hagamos inventario de lo que has usado:

  • Variables: gastos (lista), opcion, concepto, cantidad, categoria, total...
  • Tipos: strings, floats, ints, listas, diccionarios, booleanos.
  • Decisiones: if/elif/else para el menú, para clasificar, para buscar.
  • Bucles: while True para el menú, for para recorrer gastos.
  • Funciones: 5 funciones separadas, cada una con un propósito claro.
  • Input/output: input() para pedir datos, print() para mostrar resultados.
  • Patrón acumulador: sumar totales, contar gastos por categoría.

### Ideas para mejorar (por tu cuenta)

Si quieres practicar más, aquí tienes ideas para extender el proyecto. Cada una te obliga a pensar y combinar lo aprendido de formas nuevas:

  • Añadir la opción de ELIMINAR un gasto (pedir el número y sacarlo de la lista).
  • Mostrar el gasto más caro y el más barato.
  • Calcular la media de gastos por día (pidiendo la fecha de cada gasto).
  • Establecer un presupuesto mensual y avisar cuando se supere.
  • Exportar los gastos como texto formateado (para copiar/pegar en un email).

Limitación: cuando cierras el programa, los gastos desaparecen. No hemos aprendido aún a guardar datos en archivos — eso viene en la Skill 3 (Python desde cero) donde aprenderás a leer y escribir ficheros. Por ahora, cada ejecución empieza de cero.

### ¿Qué viene después?

Has completado la Skill 2: Pensamiento lógico y programación. Ahora sabes PENSAR como un programador — descomponer problemas, usar variables para recordar datos, tomar decisiones con if/else, repetir acciones con bucles y organizar código en funciones. En la Skill 3 (Python desde cero) vas a profundizar en el lenguaje: instalar Python formalmente, trabajar con estructuras de datos avanzadas, leer y escribir archivos, usar módulos de otros programadores y construir scripts que procesen datos reales. La base lógica que tienes ahora hará que todo lo demás sea mucho más fácil de aprender.

## ejercicios

[01]

Proyecto: Gestor de gastos completo

Escribe el programa completo del gestor de gastos juntando todas las funciones explicadas en la lección. Debe tener menú, añadir gastos, verlos, resumen por categoría y salir.

Cargando editor...
[02]

Proyecto alternativo: Quiz de cultura general

Crea un juego de preguntas tipo test. Ten 5 preguntas con 3 opciones cada una. El programa pregunta una a una, el usuario elige, y al final muestra la puntuación. Usa una lista de diccionarios para las preguntas y funciones para organizar el código.

Cargando editor...
[03]

Proyecto alternativo: Agenda de contactos

Crea una agenda de contactos por consola: añadir contacto (nombre, teléfono, email), buscar por nombre, listar todos, y eliminar contacto. Mismo patrón que el gestor de gastos pero con datos diferentes.

Cargando editor...

Regístrate para guardar tu progreso.

## comentarios

Reporta erratas, ayuda a otros o comparte tu opinión. Sé constructivo.

Inicia sesión para comentar y responder.

cargando comentarios...