Saltar al contenido

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.

⏱ 30 min

Has llegado al final de Pensamiento lógico 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.

Este proyecto no se hace aquí: se hace en tu ordenador, que es donde se hacen los programas de verdad. Antes de empezar necesitas Python instalado en tu ordenador. Si todavía no lo tienes, ve a la skill Python desde cero (la siguiente) y abre la lección «Instalar Python y ejecutar tu primer script»: instálalo siguiendo esos pasos (son unos diez minutos) y vuelve aquí; después el proyecto va seguido. Con Python ya instalado, estos son los pasos (los de VS Code los viste en la lección «Instalar VS Code» de Tu ordenador): 1. Abre la carpeta del proyecto. En la terminal, ve a la carpeta proyecto-ventas que creaste en Tu ordenador y escribe code . (con el punto). Si no tienes esa carpeta, créala antes con mkdir proyecto-ventas y luego cd proyecto-ventas. También vale desde VS Code: menú File → Open Folder (en español, Archivo → Abrir carpeta) y eliges la carpeta. 2. Crea el fichero. En el explorador de la izquierda, pulsa una vez sobre la carpeta scripts (si no la tienes, créala con mkdir scripts en la terminal) y luego en el icono de «fichero nuevo» que sale arriba (una hoja con un +). Escribe gastos.py y pulsa Enter. Se abre vacío a la derecha: ahí escribes el código. 3. Ejecútalo. Abre la terminal integrada: en Windows, Ctrl+ñ o Ctrl+J con teclado español; en Mac, Ctrl+` (con Ctrl, no con Cmd). Como con teclado español los atajos cambian de un ordenador a otro, en los dos sistemas tienes el menú, que funciona siempre: Terminal → New Terminal (en español, Terminal → Nuevo terminal). Ahí escribe python scripts/gastos.py en Windows o python3 scripts/gastos.py en Mac. Lleva scripts/ delante porque la terminal integrada se abre en la carpeta del proyecto, no dentro de scripts: si escribes solo python gastos.py te dirá que no encuentra el fichero. Cada vez que cambies algo, guardas (Ctrl+S o Cmd+S) y vuelves a ejecutar. Ese ciclo — escribir, guardar, ejecutar, ver qué pasa — es en el que vas a vivir a partir de ahora.

Antes de empezar: cuatro cosas nuevas que vas a ver en la solución. 1) lista.append(algo) — mete un elemento nuevo al final de una lista. 2) lista[0] y ficha["concepto"] — coger UN elemento por su posición o por el nombre del campo. 3) len(algo) — cuántos elementos tiene una lista o cuántas letras tiene un texto. 4) if algo in coleccion — pregunta si algo está dentro (no confundir con el "in" del for, que recorre). No hace falta que las domines: reconócelas cuando las veas y vuelve aquí si te pierdes.

## 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" [OK] 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 Python desde cero aprenderás a guardar en archivo)")
20 break
21 else:
22 print(" [ERROR] 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 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 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 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.

Regístrate para guardar tu progreso.