IF0100 - Programación OO II

Unidad 0: Fundamentos de Python

Clase 1: Estructuras de Control

Martes, 10 de febrero de 2026 Semana 2 - Martes (120 minutos) 60 min Teoría 60 min Práctica

E1: Examen POO - Jueves 26/02/2026 (16 días)

Objetivos de Aprendizaje

Al finalizar esta clase, serás capaz de:

  • Usar if, elif, else para tomar decisiones
  • Crear bucles for para repetir acciones con listas y rangos
  • Usar while para repetir mientras se cumpla una condición
  • Controlar bucles con break y continue
  • Crear un menú interactivo para el proyecto TaskFlow

Condicionales: if/elif/else (20 min)

Los condicionales permiten que el programa tome decisiones.

Sintaxis Básica

if condicion:
    # Código si es True
    pass
elif otra_condicion:
    # Código si otra es True
    pass
else:
    # Código si ninguna es True
    pass
Importante: Python usa indentación (4 espacios), no llaves. ¡Todo lo indentado pertenece al if!
Ejercicio Rápido 1: Clasificar Números (5 min)

Crea un programa que:

  1. Pida un número al usuario
  2. Diga si es positivo, negativo o cero
  3. Diga si es par o impar

Pista: Usa el operador % (módulo) para saber si es par: numero % 2 == 0

Ejemplo: Clasificar Edad

edad = int(input("Ingresa tu edad: "))

if edad < 13:
    print("Eres un niño")
elif edad < 20:
    print("Eres un adolescente")
elif edad < 65:
    print("Eres un adulto")
else:
    print("Eres un adulto mayor")

print("Programa terminado")  # Esto siempre se ejecuta
Ejercicio Rápido 2: Calculadora de Descuentos (5 min)

Crea un programa que calcule el precio final con descuentos:

  1. Pide el precio original del producto
  2. Si el precio es mayor a $100, aplica 10% de descuento
  3. Si el precio es mayor a $500, aplica 20% de descuento
  4. Muestra: precio original, descuento aplicado, precio final

Operadores Lógicos

# and - Ambos deben ser True
if edad >= 18 and tiene_licencia:
    print("Puede conducir")

# or - Al menos uno debe ser True
if es_estudiante or es_profesor:
    print("Tiene acceso a la biblioteca")

# not - Invierte el valor
if not es_bloqueado:
    print("Usuario activo")

# Combinados
if (edad >= 18 and tiene_licencia) or es_emergencia:
    print("Puede conducir")  
Ejercicio Rápido 3: Validador de Acceso (5 min)

Crea un validador de acceso a un sistema:

  1. Pide: nombre de usuario, contraseña, si tiene código de verificación
  2. Acceso permitido si: (usuario="admin" Y contraseña="1234") O tiene código de verificación
  3. Muestra mensaje de acceso permitido o denegado

Operador in

frutas = ["manzana", "banana", "naranja"]

if "manzana" in frutas:
    print("Tenemos manzanas en stock")

# También funciona con strings
if "@" in email:
    print("Email parece válido")

# Negado
if "admin" not in roles:
    print("No tienes permisos de administrador")  
Ejercicio Rápido 4: Buscador en Lista (5 min)

Usa el operador in:

  1. Crea una lista con 5 nombres de productos
  2. Pide al usuario un producto a buscar
  3. Usa in para verificar si existe
  4. Si no existe, muestra "Producto no disponible"
  5. Agrega opción para agregar producto si no existe

Bucles: for y while (25 min)

Bucle for - Iterar sobre colecciones

# Iterar sobre una lista
frutas = ["manzana", "banana", "naranja"]
for fruta in frutas:
    print(f"Tengo una {fruta}")

# Iterar sobre un string (caracter por caracter)
for letra in "Python":
    print(letra)

# range() - Generar números
for i in range(5):          # 0, 1, 2, 3, 4
    print(i)

for i in range(1, 6):       # 1, 2, 3, 4, 5
    print(i)

for i in range(0, 10, 2):   # 0, 2, 4, 6, 8 (pares)
    print(i)

# enumerate() - Índice y valor
for indice, fruta in enumerate(frutas):
    print(f"{indice}: {fruta}")
    
# enumerate con inicio en 1
for numero, fruta in enumerate(frutas, 1):
    print(f"{numero}. {fruta}")
Ejercicio Rápido 5: Tabla de Multiplicar (5 min)

Usa for con range():

  1. Pide al usuario un número
  2. Muestra la tabla de multiplicar del 1 al 10
  3. Formatea: "5 x 3 = 15"
  4. Usa enumerate() para numerar las filas

Bucle while - Repetir mientras se cumpla

# Contador simple
contador = 0
while contador < 5:
    print(contador)
    contador += 1  # IMPORTANTE: modificar la variable

# Validar entrada
while True:
    edad = input("Ingresa tu edad (número positivo): ")
    if edad.isdigit() and int(edad) > 0:
        edad = int(edad)
        break  # Sale del bucle
    print("Por favor ingresa un número válido.")

print(f"Edad registrada: {edad}")
Ejercicio Rápido 6: Validación de PIN (5 min)

Crea un sistema de validación de PIN:

  1. Define un PIN correcto (ej: "1234")
  2. Pide al usuario que ingrese el PIN
  3. Usa while para permitir máximo 3 intentos
  4. Si acierta antes de 3 intentos, muestra "Acceso concedido"
  5. Si falla 3 veces, bloquea y muestra "Cuenta bloqueada"
Precaución: Siempre asegúrate de que la condición del while eventualmente sea False, o tendrás un bucle infinito.

Control de Flujo (10 min)

break - Salir del bucle

# Buscar un elemento y detenerse
usuarios = ["ana", "juan", "maria", "pedro", "luisa"]
buscar = "maria"

for usuario in usuarios:
    print(f"Buscando: {usuario}")
    if usuario == buscar:
        print(f"¡Encontrado! {usuario}")
        break  # Sale del bucle inmediatamente

continue - Saltar a la siguiente iteración

# Mostrar solo números pares
for numero in range(1, 11):
    if numero % 2 != 0:  # Si es impar
        continue         # Salta al siguiente número
    print(numero)        # Solo imprime pares: 2, 4, 6, 8, 10

else en bucles - Se ejecuta si NO hubo break

# Buscar usuario
usuarios = ["ana", "juan", "pedro"]
buscar = "maria"

for usuario in usuarios:
    if usuario == buscar:
        print(f"{buscar} encontrado")
        break
else:
    # Solo se ejecuta si no encontramos el usuario
    print(f"{buscar} NO está en la lista")

                    
                    
Ejercicio Rápido 7: Filtro de Números (5 min)

Crea un programa que procese una lista de números:

  1. Crea una lista con números del 1 al 20
  2. Usa continue para saltar los números pares
  3. Usa break si encuentra un número divisible por 7
  4. Muestra solo los números impares procesados antes del break
  5. Usa el else del for para mostrar si se encontró o no el número divisible por 7

Laboratorio 1: Menú de Usuarios Mejorado (25 min)

Crea un menú interactivo para gestionar usuarios (base del proyecto TaskFlow).

# sistema_usuarios.py
usuarios = []

def mostrar_menu():
    print("\n=== SISTEMA DE USUARIOS ===")
    print("1. Ver usuarios")
    print("2. Agregar usuario")
    print("3. Buscar usuario")
    print("4. Salir")

def ver_usuarios():
    if len(usuarios) == 0:
        print("\nNo hay usuarios registrados.")
        return
    
    print("\n--- Lista de Usuarios ---")
    for i, usuario in enumerate(usuarios, 1):
        print(f"{i}. {usuario}")

def agregar_usuario():
    nombre = input("\nIngresa el nombre del usuario: ")
    
    # Validar que no esté vacío
    if not nombre.strip():
        print("❌ El nombre no puede estar vacío.")
        return
    
    # Validar que no exista
    if nombre in usuarios:
        print("❌ Ese usuario ya existe.")
        return
    
    usuarios.append(nombre)
    print(f"✅ Usuario '{nombre}' agregado correctamente.")

def buscar_usuario():
    if len(usuarios) == 0:
        print("\nNo hay usuarios para buscar.")
        return
    
    nombre = input("\n¿Qué usuario buscas? ")
    
    for usuario in usuarios:
        if usuario.lower() == nombre.lower():
            print(f"✅ Usuario encontrado: {usuario}")
            return
    
    print(f"❌ Usuario '{nombre}' no encontrado.")

# Programa principal
while True:
    mostrar_menu()
    opcion = input("\nSelecciona una opción (1-4): ")
    
    if opcion == "1":
        ver_usuarios()
    elif opcion == "2":
        agregar_usuario()
    elif opcion == "3":
        buscar_usuario()
    elif opcion == "4":
        print("\n¡Hasta luego!")
        break
    else:
        print("\n❌ Opción no válida. Intenta de nuevo.")
Conexión con TaskFlow: Este menú es la base del sistema. Más adelante agregaremos: validaciones de email, contraseñas, estados (activo/inactivo), y persistencia en base de datos.

Retos Adicionales

  • Agrega opción 5: Eliminar usuario por nombre
  • Valida que el nombre tenga al menos 3 caracteres
  • Permite buscar coincidencias parciales (ej: "ju" encuentra "juan")

Laboratorio 2: Sistema de Calificaciones (25 min)

Crea un sistema completo para gestionar calificaciones de estudiantes con múltiples evaluaciones.

Requisitos

  • Registrar múltiples estudiantes
  • Cada estudiante tiene 3 calificaciones (parcial 1, parcial 2, final)
  • Calcular promedio ponderado: P1(30%) + P2(30%) + Final(40%)
  • Determinar si aprobó (promedio >= 3.0)
  • Mostrar estadísticas: mejor estudiante, promedio general, tasa de aprobación

Código Base

# sistema_calificaciones.py
print("📚 SISTEMA DE CALIFICACIONES 📚\n")

estudiantes = []

while True:
    print("\n" + "="*50)
    print("MENÚ PRINCIPAL")
    print("="*50)
    print("1. Registrar estudiante")
    print("2. Ver todos los estudiantes")
    print("3. Ver estadísticas")
    print("4. Buscar estudiante")
    print("5. Salir")
    
    opcion = input("\nSelecciona una opción: ")
    
    if opcion == "1":
        nombre = input("Nombre del estudiante: ").strip()
        
        if not nombre:
            print("❌ El nombre no puede estar vacío")
            continue
        
        # Verificar si ya existe
        ya_existe = False
        for est in estudiantes:
            if est["nombre"].lower() == nombre.lower():
                ya_existe = True
                break
        
        if ya_existe:
            print("❌ Este estudiante ya está registrado")
            continue
        
        # Pedir calificaciones con validación
        def pedir_nota(mensaje):
            while True:
                try:
                    nota = float(input(mensaje))
                    if 0 <= nota <= 5:
                        return nota
                    print("❌ La nota debe estar entre 0 y 5")
                except ValueError:
                    print("❌ Ingresa un número válido")
        
        p1 = pedir_nota("Parcial 1 (30%): ")
        p2 = pedir_nota("Parcial 2 (30%): ")
        final = pedir_nota("Final (40%): ")
        
        # Calcular promedio ponderado
        promedio = (p1 * 0.3) + (p2 * 0.3) + (final * 0.4)
        
        # Determinar estado
        if promedio >= 3.0:
            estado = "✅ Aprobado"
        else:
            estado = "❌ Reprobado"
        
        estudiante = {
            "nombre": nombre,
            "p1": p1,
            "p2": p2,
            "final": final,
            "promedio": promedio,
            "estado": estado
        }
        
        estudiantes.append(estudiante)
        print(f"\n✅ Estudiante registrado. Promedio: {promedio:.2f} - {estado}")
    
    elif opcion == "2":
        if not estudiantes:
            print("\n📭 No hay estudiantes registrados")
            continue
        
        print("\n" + "="*70)
        print(f"{'NOMBRE':<20} {'P1':<6} {'P2':<6} {'FINAL':<6} {'PROM':<6} {'ESTADO'}")
        print("="*70)
        
        for est in estudiantes:
            print(f"{est['nombre']:<20} {est['p1']:<6.1f} {est['p2']:<6.1f} "
                  f"{est['final']:<6.1f} {est['promedio']:<6.2f} {est['estado']}")
        print("="*70)
    
    elif opcion == "3":
        if not estudiantes:
            print("\n📭 No hay datos para estadísticas")
            continue
        
        # Calcular estadísticas
        total_est = len(estudiantes)
        aprobados = 0
        suma_promedios = 0
        mejor_estudiante = estudiantes[0]
        
        for est in estudiantes:
            suma_promedios += est["promedio"]
            if "Aprobado" in est["estado"]:
                aprobados += 1
            if est["promedio"] > mejor_estudiante["promedio"]:
                mejor_estudiante = est
        
        promedio_general = suma_promedios / total_est
        tasa_aprobacion = (aprobados / total_est) * 100
        
        print("\n" + "="*50)
        print("📊 ESTADÍSTICAS")
        print("="*50)
        print(f"Total estudiantes: {total_est}")
        print(f"Aprobados: {aprobados}")
        print(f"Reprobados: {total_est - aprobados}")
        print(f"Tasa de aprobación: {tasa_aprobacion:.1f}%")
        print(f"Promedio general: {promedio_general:.2f}")
        print(f"\n🏆 Mejor estudiante: {mejor_estudiante['nombre']}")
        print(f"   Promedio: {mejor_estudiante['promedio']:.2f}")
        print("="*50)
    
    elif opcion == "4":
        if not estudiantes:
            print("\n📭 No hay estudiantes registrados")
            continue
        
        buscar = input("Nombre a buscar: ").strip().lower()
        encontrados = []
        
        for est in estudiantes:
            if buscar in est["nombre"].lower():
                encontrados.append(est)
        
        if encontrados:
            print(f"\n✅ {len(encontrados)} estudiante(s) encontrado(s):")
            for est in encontrados:
                print(f"  • {est['nombre']}: {est['promedio']:.2f} {est['estado']}")
        else:
            print(f"❌ No se encontró '{buscar}'")
    
    elif opcion == "5":
        print("\n👋 ¡Hasta luego!")
        break
    
    else:
        print("\n❌ Opción no válida")
Conexión con TaskFlow: Este sistema de calificaciones usa las mismas estructuras de control que necesitarás para calcular métricas de proyectos y tareas (promedios, porcentajes, filtrados).

Retos Adicionales

  1. Validación: Agrega límite máximo de 20 estudiantes
  2. Editar: Permite modificar calificaciones de un estudiante existente
  3. Histórico: Muestra la nota más alta y más baja de cada parcial
  4. Ranking: Muestra los estudiantes ordenados por promedio

Ejercicios Adicionales (10 min)

Ejercicio 8: Juego "Adivina el Número"

Crea un juego donde:

  • La computadora genera un número aleatorio (1-100)
  • El usuario tiene 7 intentos para adivinar
  • Después de cada intento, indica "mayor" o "menor"
  • Muestra mensaje de victoria o derrota

Pista: Usa import random y random.randint(1, 100)

Ejercicio 9: Validador de Contraseñas

Crea un validador que verifique:

  • Mínimo 8 caracteres
  • Al menos una letra mayúscula
  • Al menos un número
  • Al menos un caracter especial (!@#$%^&*)

Pista: Usa bucles for para recorrer la contraseña

Ejercicio 10: Patrones con Bucles

Usa bucles anidados para crear:

*
**
***
****
*****

    *
   ***
  *****
 *******
*********
Ejercicio 11: Calculadora Científica

Extiende la calculadora para incluir:

  • Potencia (base^exponente)
  • Raíz cuadrada
  • Factorial
  • Logaritmo

Pista: Usa import math

Git: Primeros Pasos (20 min)

Ahora que tienes código, es momento de versionarlo con Git.

Inicializar un Repositorio

# En la terminal, dentro de tu carpeta de proyectos:
cd poo2-practicas

# Inicializar Git en esta carpeta
git init

# Verificar que se creó (archivo oculto .git)
ls -la
Ejercicio Práctico: Versiona tu Código (10 min)

Vamos a guardar el sistema de usuarios en Git:

  1. Crea una carpeta clase-01 dentro de poo2-practicas
  2. Copia tu archivo sistema_usuarios.py a esa carpeta
  3. Abre la terminal en VSCode (Ctrl+`)
  4. Ejecuta: git status (verás archivos en rojo)
  5. Agrega el archivo: git add clase-01/sistema_usuarios.py
  6. Verifica: git status (ahora en verde)
  7. Crea tu primer commit: git commit -m "Sistema de usuarios básico"
  8. Ver historial: git log

Los 3 Estados de Git

Estado Descripción Comando
Working Directory Archivos modificados pero no preparados Editas archivos
Staging Area Archivos listos para guardar git add
Repository Historial guardado git commit

Comandos Esenciales

# Ver estado actual
$ git status

# Agregar archivo específico
$ git add nombre_archivo.py

# Agregar todos los cambios
$ git add .

# Guardar cambios con mensaje
$ git commit -m "Mensaje descriptivo"

# Ver historial de commits
$ git log

# Ver historial resumido
$ git log --oneline

Archivo .gitignore

Archivos que Git debe ignorar (no versionar):

# Crear archivo .gitignore
touch .gitignore

# Contenido típico para Python:
__pycache__/
*.pyc
*.pyo
.env
.vscode/
*.log
Importante: Nunca subas información sensible (contraseñas, tokens) a GitHub. Usa .gitignore para excluir archivos .env.
Ejercicio Rápido: Flujo de Trabajo (5 min)

Practica el ciclo completo:

  1. Modifica el sistema de usuarios (agrega un print de bienvenida)
  2. git status - verás el archivo modificado
  3. git diff - verás exactamente qué cambió
  4. git add . - prepara todos los cambios
  5. git commit -m "Agregado mensaje de bienvenida"
  6. git log --oneline - deberías ver 2 commits
Convención de Mensajes:
  • "feat: sistema de usuarios básico" - nueva funcionalidad
  • "fix: validación de nombres vacíos" - corrección de bug
  • "docs: agregado README" - documentación

Resumen

Python

Estructura Uso Ejemplo
if/elif/else Tomar decisiones if edad >= 18:
for Iterar colecciones for u in usuarios:
while Repetir condicionalmente while opcion != "4":
break Salir del bucle Al encontrar elemento
continue Saltar iteración Omitir elementos

Git

Comando Función
git init Inicializar repositorio
git status Ver estado actual
git add Preparar archivos
git commit Guardar versión
git log Ver historial
Práctica: Crea commits cada vez que termines un ejercicio o funcionalidad. Esto te permitirá volver atrás si algo falla.