Curso Algoritmos y Estructuras de Programación
🧠

Algoritmos y Estructuras
de Programación

Aprende programación con teoría clara, analogías de la vida real, ejercicios resueltos en tres niveles, simuladores interactivos tipo juego y quizzes de repaso. Lenguaje: Python.

🔁 Bucle For🎲 Aleatorios ⚙️ Funciones📊 Arreglos 🎮 5 Simuladores
4
Temas centrales
24
Preguntas de quiz
24
Ejercicios resueltos
5
Simuladores
Contenido del curso
Cada tema incluye teoría, analogías, ejercicios (básico/intermedio/avanzado) y FAQ
🔁

Tema 1 — Estructura repetitiva For

Bucles que repiten instrucciones. La función range(), el paso (step), contadores y acumuladores. Cuándo usar for y cómo trazar su ejecución.

🎲

Tema 2 — Números Aleatorios

La librería random: randint, random, uniform, choice, sample y shuffle. Cómo simular dados, sorteos y juegos de azar con código.

⚙️

Tema 3 — Funciones

Bloques de código reutilizable. Funciones con retorno (return) y sin retorno. Parámetros y argumentos. La diferencia entre print y return.

📊

Tema 4 — Arreglos Unidimensionales

Listas que guardan muchos valores. Índices, recorrido con for, suma, promedio, máximo, mínimo. La base de las estructuras de datos.

🎮 Aprende practicando

Este dashboard incluye 5 simuladores interactivos: traza un bucle for paso a paso, lanza dados con random, construye funciones, explora arreglos y juega "Adivina el número". ¡La mejor forma de aprender a programar es programando!

🔗 Herramientas que ya conoces y usarás aquí

A lo largo de los temas reutilizaremos: condicionales (if / else / elif — simples, compuestas y anidadas), contadores (variables que cuentan ocurrencias) y acumuladores (variables que suman valores). Verás cómo se combinan con los nuevos temas.

1 de 8
Temas Tema 1
01

Estructura Repetitiva: For

El bucle for permite repetir un bloque de instrucciones un número conocido de veces, sin escribir el mismo código una y otra vez.

🔁 Iteraciónrange()🔢 Contador➕ Acumulador
¿Qué es un bucle For?

Definición

Un bucle for es una estructura de control que repite un bloque de código un número determinado de veces. Se usa cuando sabemos (o podemos calcular) cuántas veces queremos repetir algo.

Sintaxis en Python:

for variable in range(inicio, fin, paso): # bloque que se repite print(variable)
📌 La función range()

range(5) → 0,1,2,3,4 · range(2,6) → 2,3,4,5 · range(0,10,2) → 0,2,4,6,8. El límite final nunca se incluye.

🔗 Analogía de la vida real

Las repeticiones en el gimnasio: cuando tu entrenador dice "haz 10 sentadillas", no escribe "sentadilla, sentadilla, sentadilla…" 10 veces. Simplemente dice "repite 10 veces".

for rep in range(10): hacer_sentadilla()

Otras analogías cotidianas:

  • 🎵 El coro de una canción que se repite varias veces
  • 📅 Tomar una pastilla cada 8 horas durante 7 días
  • 🏫 Pasar lista a 30 alumnos, uno por uno
Contador vs. Acumulador
🔢

Contador

Variable que cuenta cuántas veces ocurre algo. Siempre suma una cantidad fija (normalmente 1).

contador = 0 for i in range(5): contador += 1 # +1 cada vez print(contador) # 5

Acumulador

Variable que suma valores variables. Acumula un total que va creciendo según los datos.

suma = 0 for i in range(1, 6): suma += i # suma 1,2,3,4,5 print(suma) # 15
⚠️ Inicialización correcta

Un acumulador de suma se inicializa en 0. Un acumulador de multiplicación (productorio) se inicializa en 1, porque cualquier número multiplicado por 0 daría 0.

Combinando For con Condicionales

Dentro de un for podemos usar if / else para tomar decisiones en cada iteración. Por ejemplo, contar solo los números pares:

# Contar números pares del 1 al 10 pares = 0 for num in range(1, 11): if num % 2 == 0: # si es par pares += 1 # contador print("Hay", pares, "números pares") # 5
🎮 ¡Practica con el simulador!

Ve a la sección Simuladores / Juegos en la barra lateral y prueba el "Trazador de bucle For": cambia inicio, fin y paso, y observa en tiempo real qué valores genera el bucle.

Ejercicios — Estructura For
🟢Ejercicio 1 — Imprimir números del 1 al 10
Básico

Escribe un programa que imprima los números del 1 al 10, cada uno en una línea.

✅ Resolución:
for num in range(1, 11): print(num)

Explicación: range(1, 11) genera del 1 al 10 (el 11 no se incluye). En cada vuelta, la variable num toma el siguiente valor y se imprime.

🟢Ejercicio 2 — Tabla de multiplicar
Básico

Imprime la tabla de multiplicar del 7 (del 7×1 al 7×12).

✅ Resolución:
for i in range(1, 13): resultado = 7 * i print("7 x", i, "=", resultado)

Explicación: el bucle va de 1 a 12. En cada vuelta multiplica 7 por el valor actual de i y muestra el resultado con formato.

🟡Ejercicio 3 — Suma de los primeros N números
Intermedio

Pide al usuario un número N y calcula la suma de todos los números del 1 hasta N usando un acumulador.

✅ Resolución:
n = int(input("Ingresa un número: ")) suma = 0 # acumulador inicia en 0 for i in range(1, n + 1): suma += i # acumula cada número print("La suma es:", suma)

Clave: usamos n + 1 en el range para que N sí se incluya. El acumulador suma va guardando el total.

🟡Ejercicio 4 — Contar múltiplos de 3
Intermedio

Cuenta cuántos múltiplos de 3 hay entre 1 y 50, y muéstralos.

✅ Resolución:
contador = 0 for num in range(1, 51): if num % 3 == 0: # si es múltiplo de 3 print(num) contador += 1 # contador print("Total múltiplos de 3:", contador)

Combina for + if + contador: el operador % (módulo) da el residuo. Si num % 3 == 0, es múltiplo de 3.

🔴Ejercicio 5 — Factorial de un número
Avanzado

Calcula el factorial de un número N. Recuerda: 5! = 5×4×3×2×1 = 120. Usa un acumulador de multiplicación.

✅ Resolución:
n = int(input("Ingresa un número: ")) factorial = 1 # inicia en 1, NO en 0 for i in range(1, n + 1): factorial *= i # acumulador de producto print(n, "! =", factorial)

¡Importante! El acumulador de multiplicación inicia en 1. Si iniciara en 0, todo el resultado sería 0.

🔴Ejercicio 6 — Patrón de triángulo con asteriscos
Avanzado

Dibuja un triángulo de asteriscos de 5 filas (fila 1 = 1 asterisco, fila 5 = 5 asteriscos) usando bucles for anidados.

✅ Resolución:
for fila in range(1, 6): linea = "" for col in range(fila): linea += "* " # acumula asteriscos print(linea) # Salida: # * # * * # * * * # * * * * # * * * * *

Bucles anidados: el for externo controla las filas; el interno dibuja los asteriscos de cada fila. En la fila N se dibujan N asteriscos.

Casos Aplicados — Contextos reales
Ejercicios con situaciones de la vida real que combinan For con condicionales, contadores y acumuladores
🏪Caso 1 — Caja registradora de una bodega
For + acumulador + contador

Una bodega registra las ventas del día. El programa debe pedir cuántas ventas hubo, luego solicitar el monto de cada venta, y al final mostrar el total recaudado y cuántas ventas superaron los S/50.

✅ Resolución:
cantidad = int(input("¿Cuántas ventas hubo hoy? ")) total = 0 # acumulador del dinero ventas_altas = 0 # contador de ventas > 50 for i in range(1, cantidad + 1): monto = float(input("Monto de la venta " + str(i) + ": S/ ")) total += monto # acumula if monto > 50: ventas_altas += 1 # cuenta print("Total recaudado: S/", total) print("Ventas mayores a S/50:", ventas_altas)

Combina: for (repetir por cada venta) + acumulador (total) + condicional + contador (ventas altas).

🎓Caso 2 — Control de asistencia de un salón
For + condicional + porcentaje

Un profesor registra la asistencia de su salón. Para N alumnos, pregunta si asistió (s/n). Al final debe mostrar cuántos asistieron, cuántos faltaron y el porcentaje de asistencia.

✅ Resolución:
n = int(input("¿Cuántos alumnos hay? ")) presentes = 0 # contador for i in range(1, n + 1): rpta = input("¿Alumno " + str(i) + " asistió? (s/n): ") if rpta == "s": presentes += 1 ausentes = n - presentes porcentaje = (presentes / n) * 100 print("Presentes:", presentes) print("Ausentes:", ausentes) print("Asistencia:", round(porcentaje, 1), "%")

Combina: for + condicional + contador, y luego un cálculo de porcentaje con el total.

🚀Caso 3 — Cuenta regresiva de lanzamiento
For con paso negativo

El centro espacial necesita una cuenta regresiva. Imprime del 10 al 1 (uno por línea) y al terminar muestra "¡DESPEGUE! 🚀". Usa un for con paso negativo.

✅ Resolución:
for i in range(10, 0, -1): # de 10 a 1, paso -1 print(i) print("¡DESPEGUE! 🚀")

Clave: range(10, 0, -1) cuenta hacia atrás. El límite 0 no se incluye, por eso llega hasta 1. Pruébalo en el simulador "Trazador de For".

💰Caso 4 — Planilla con bono para sueldos bajos
For + condicional + acumulador

Una empresa tiene N empleados. Por cada uno se ingresa su sueldo. Si el sueldo es menor a S/1025 (RMV en Perú), se le otorga un bono de S/100. Calcula el total de la planilla incluyendo los bonos y cuántos empleados recibieron bono.

✅ Resolución:
n = int(input("¿Cuántos empleados? ")) planilla = 0 # acumulador con_bono = 0 # contador for i in range(1, n + 1): sueldo = float(input("Sueldo del empleado " + str(i) + ": ")) if sueldo < 1025: sueldo += 100 # aplica bono con_bono += 1 planilla += sueldo # acumula (ya con bono si aplica) print("Total planilla: S/", planilla) print("Empleados con bono:", con_bono)

Combina: for + condicional (modifica el sueldo) + contador + acumulador. El bono se suma antes de acumular.

✖️Caso 5 — Generador de tablas de multiplicar
For anidado

Una maestra de primaria necesita imprimir las tablas de multiplicar del 1 al 5 (cada una del ×1 al ×10). Usa bucles for anidados.

✅ Resolución:
for tabla in range(1, 6): # tablas del 1 al 5 print("--- Tabla del", tabla, "---") for i in range(1, 11): # del x1 al x10 print(tabla, "x", i, "=", tabla * i)

For anidado: el bucle externo recorre las tablas (1-5); el interno genera las multiplicaciones (1-10) de cada tabla. En total imprime 50 multiplicaciones.

Preguntas Frecuentes
¿Cuándo uso for y cuándo while?
Usa for cuando sabes cuántas veces vas a repetir (recorrer una lista, contar del 1 al 100). Usa while cuando repites mientras se cumpla una condición y no sabes cuántas veces será (pedir contraseña hasta que sea correcta). Regla práctica: ¿conoces el número de repeticiones? → for. ¿Depende de una condición? → while.
¿Por qué range(5) llega solo hasta 4?
Porque range empieza en 0 por defecto y el límite superior nunca se incluye. range(5) genera 0,1,2,3,4 → son exactamente 5 valores. Esto es una convención de Python: facilita trabajar con índices de listas, que también empiezan en 0.
¿Qué significa i += 1?
i += 1 es una forma abreviada de escribir i = i + 1. Toma el valor actual de i, le suma 1 y lo guarda de nuevo en i. Funciona igual con otros operadores: suma += x es suma = suma + x, y prod *= x es prod = prod * x.
¿Puedo usar el paso (step) negativo para contar al revés?
Sí. range(10, 0, -1) cuenta de 10 hasta 1 hacia atrás. El primer número es el inicio (10), el segundo el límite (0, no incluido) y el tercero el paso (-1). Es útil para cuentas regresivas. Pruébalo en el simulador de la sección de juegos.
2 de 8
Temas Tema 2
02

Números Aleatorios

La librería random de Python permite generar números y elegir elementos al azar. Es la base de juegos, simulaciones, sorteos y mucho más.

🎲 randomrandintchoiceshuffle
La librería random

¿Qué es?

random es una librería de Python que genera números pseudoaleatorios. Para usarla, primero hay que importarla:

import random numero = random.randint(1, 6) print(numero) # un dado: 1 a 6
🤔 ¿"Pseudo" aleatorios?

Las computadoras no generan azar real; usan algoritmos que producen secuencias que parecen aleatorias. Para casi todos los usos (juegos, simulaciones), funcionan perfectamente.

🔗 Analogías de la vida real

  • 🎲 Lanzar un dado: randint(1, 6)
  • 🪙 Tirar una moneda: choice(["cara", "sello"])
  • 🎰 Tómbola / sorteo: choice(participantes)
  • 🃏 Barajar cartas: shuffle(mazo)
  • 🎱 Lotería (bolillas sin repetir): sample(numeros, 6)

Cada vez que necesites algo "al azar" en un programa, la librería random tiene una función para ello.

Las 6 funciones principales
Función¿Qué hace?EjemploResultado posible
randint(a, b)Entero aleatorio entre a y b (ambos incluidos)randint(1, 6)4
random()Decimal aleatorio entre 0.0 y 1.0random()0.7234
uniform(a, b)Decimal aleatorio entre a y buniform(1, 10)6.83
choice(lista)Elige UN elemento al azarchoice(["a","b","c"])"b"
sample(lista, k)Elige k elementos ÚNICOS (sin repetir)sample(range(1,50), 6)[4, 18, 22, 31, 39, 45]
shuffle(lista)Desordena/mezcla la lista originalshuffle(mazo)la lista queda revuelta
randint vs. random vs. uniform
🎯

randint(1, 6)

Da enteros: 1, 2, 3, 4, 5 o 6. Ambos extremos incluidos. Ideal para dados, edades, cantidades.

🔢

random()

Da un decimal entre 0.0 y 1.0. Útil para probabilidades (ej: si random() < 0.3 → 30% de probabilidad).

📏

uniform(1, 10)

Da un decimal en el rango que elijas. Útil para precios, temperaturas, medidas con decimales.

🎮 ¡Practica con el simulador!

En la sección Simuladores / Juegos encontrarás el "Laboratorio de random": lanza dados, observa la distribución de resultados y prueba choice con frutas. También está el juego "Adivina el número" que combina random con condicionales.

Ejercicios — Números Aleatorios
🟢Ejercicio 1 — Simular un dado
Básico

Simula el lanzamiento de un dado de 6 caras y muestra el resultado.

✅ Resolución:
import random dado = random.randint(1, 6) print("Salió:", dado)

Explicación: randint(1, 6) incluye tanto el 1 como el 6, igual que un dado real.

🟢Ejercicio 2 — Elegir un ganador al azar
Básico

Tienes una lista de participantes de un sorteo. Elige uno al azar como ganador.

✅ Resolución:
import random participantes = ["Ana", "Luis", "María", "Carlos"] ganador = random.choice(participantes) print("El ganador es:", ganador)

Explicación: choice() selecciona un elemento al azar de la lista. Perfecto para sorteos.

🟡Ejercicio 3 — Lanzar dos dados 10 veces
Intermedio

Simula el lanzamiento de dos dados 10 veces y muestra la suma de cada lanzamiento. Combina for + random.

✅ Resolución:
import random for tirada in range(1, 11): d1 = random.randint(1, 6) d2 = random.randint(1, 6) suma = d1 + d2 print("Tirada", tirada, ":", d1, "+", d2, "=", suma)

Combina for + random: el bucle repite 10 veces; en cada vuelta se generan dos dados nuevos y se suma.

🟡Ejercicio 4 — Generar billete de lotería
Intermedio

Genera 6 números únicos (sin repetir) del 1 al 49 para un billete de lotería, y muéstralos ordenados.

✅ Resolución:
import random billete = random.sample(range(1, 50), 6) billete.sort() # ordena de menor a mayor print("Tus números:", billete)

¿Por qué sample y no choice? En la lotería los números NO se repiten. sample() garantiza elementos únicos; choice() podría repetir.

🔴Ejercicio 5 — Juego: adivina el número
Avanzado

El programa piensa un número del 1 al 100. El usuario intenta adivinarlo y el programa le dice si su intento es muy alto o muy bajo. Cuenta los intentos.

✅ Resolución:
import random secreto = random.randint(1, 100) intentos = 0 adivinado = False while not adivinado: intento = int(input("Tu número: ")) intentos += 1 # contador if intento == secreto: print("¡Correcto en", intentos, "intentos!") adivinado = True elif intento < secreto: print("Muy bajo, sube") else: print("Muy alto, baja")

Combina random + while + condicionales anidadas + contador. ¡Pruébalo en el simulador "Adivina el número"!

🔴Ejercicio 6 — Estadística de 1000 lanzamientos
Avanzado

Lanza un dado 1000 veces y cuenta cuántas veces salió cada número (del 1 al 6). Esto demuestra que con muchas tiradas, la distribución se vuelve pareja.

✅ Resolución:
import random # Lista de 6 contadores (índices 0 a 5 = caras 1 a 6) conteo = [0, 0, 0, 0, 0, 0] for i in range(1000): dado = random.randint(1, 6) conteo[dado - 1] += 1 # contador por cara for cara in range(6): print("Cara", cara + 1, ":", conteo[cara], "veces")

Combina random + for + arreglo de contadores. Cada cara debería salir alrededor de 166 veces (1000/6). ¡Es un adelanto del tema de arreglos!

Casos Aplicados — Contextos reales
Ejercicios que combinan Números Aleatorios con For, condicionales y contadores
🎁Caso 1 — Sorteo de 3 ganadores de un evento
sample + for

Una empresa hace un sorteo entre sus clientes. De una lista de participantes, elige 3 ganadores distintos (sin que se repitan) y los anuncia numerados.

✅ Resolución:
import random clientes = ["Ana", "Beto", "Carla", "Diego", "Elsa", "Fito"] ganadores = random.sample(clientes, 3) # 3 únicos print("🎉 Ganadores del sorteo:") for i in range(3): print("Puesto", i + 1, ":", ganadores[i])

Combina: sample (elementos únicos, nadie gana 2 veces) + for (para numerar y mostrar a cada ganador).

🎲Caso 2 — Duelo de dados: "el mayor gana"
random + for + contadores

Dos jugadores juegan 5 rondas. En cada ronda ambos lanzan un dado; gana quien saque el número mayor (empate no suma). Al final declara quién ganó más rondas.

✅ Resolución:
import random gana_j1 = 0 gana_j2 = 0 for ronda in range(1, 6): d1 = random.randint(1, 6) d2 = random.randint(1, 6) print("Ronda", ronda, "- J1:", d1, "| J2:", d2) if d1 > d2: gana_j1 += 1 elif d2 > d1: gana_j2 += 1 print("Resultado → J1:", gana_j1, "| J2:", gana_j2) if gana_j1 > gana_j2: print("🏆 Gana el Jugador 1") elif gana_j2 > gana_j1: print("🏆 Gana el Jugador 2") else: print("🤝 Empate")

Combina: random (dados) + for (5 rondas) + condicionales anidadas (if/elif) + dos contadores. ¡Como el simulador de dados pero con dos jugadores!

🔐Caso 3 — Generador de contraseñas seguras
choice + for + acumulador

Un sistema necesita generar contraseñas temporales de 6 caracteres, eligiendo al azar de un conjunto de letras y números. Genera y muestra una contraseña.

✅ Resolución:
import random caracteres = "ABCDEFGHJKMNPQRSTUVWXYZ23456789" clave = "" # acumulador de texto for i in range(6): letra = random.choice(caracteres) clave += letra # acumula caracteres print("Tu contraseña temporal es:", clave)

Combina: choice (elige 1 carácter) + for (repite 6 veces) + acumulador de texto (concatena con +=). Nota: se omiten letras confusas como I, L, O, 0, 1.

🌦️Caso 4 — Simulador de clima semanal
choice + for + contadores

Una app del clima simula el pronóstico de una semana (7 días). Cada día puede ser soleado, nublado o lluvioso (al azar). Muestra el clima de cada día y cuenta cuántos días hubo de cada tipo.

✅ Resolución:
import random opciones = ["☀️ Soleado", "☁️ Nublado", "🌧️ Lluvioso"] soleados = 0 nublados = 0 lluviosos = 0 for dia in range(1, 8): clima = random.choice(opciones) print("Día", dia, ":", clima) if clima == opciones[0]: soleados += 1 elif clima == opciones[1]: nublados += 1 else: lluviosos += 1 print("Soleados:", soleados, "| Nublados:", nublados, "| Lluviosos:", lluviosos)

Combina: choice (clima al azar) + for (7 días) + condicionales (if/elif/else) + tres contadores.

🪙Caso 5 — Experimento: 100 lanzamientos de moneda
random + for + porcentaje

Para una clase de probabilidad, lanza una moneda 100 veces. Cuenta cuántas caras y cuántos sellos salieron, y muestra el porcentaje de cada uno. ¿Se acerca al 50%?

✅ Resolución:
import random caras = 0 sellos = 0 for i in range(100): moneda = random.choice(["cara", "sello"]) if moneda == "cara": caras += 1 else: sellos += 1 print("Caras:", caras, "(", caras, "%)") print("Sellos:", sellos, "(", sellos, "%)") # Con 100 tiros, el % es directo. Tiende a ~50% cada uno.

Combina: random + for (100 veces) + condicional + contadores. Demuestra la ley de los grandes números: a más lanzamientos, más se acerca al 50/50.

Preguntas Frecuentes
¿Por qué debo escribir "import random" al inicio?
random es una librería externa al núcleo del lenguaje. import random le dice a Python: "voy a usar estas herramientas". Sin el import, Python no reconoce funciones como randint() y dará un error. Es como sacar una caja de herramientas antes de empezar a trabajar.
¿Cuál es la diferencia entre randint(1,6) y randrange(1,6)?
randint(1, 6) incluye ambos extremos → puede dar 1, 2, 3, 4, 5 o 6. randrange(1, 6) funciona como range → NO incluye el 6, da 1, 2, 3, 4 o 5. Para simular un dado usa randint, que es más intuitivo.
¿Cuándo uso choice y cuándo sample?
Usa choice cuando quieres UN solo elemento (un ganador, una carta). Usa sample cuando quieres VARIOS elementos sin repetir (6 números de lotería, 3 preguntas de un banco). Si necesitaras varios CON posible repetición, usarías choice dentro de un bucle for.
¿shuffle devuelve una lista nueva?
No. shuffle() modifica la lista ORIGINAL directamente (in-place) y devuelve None. Por eso se escribe random.shuffle(mazo) y NO mazo = random.shuffle(mazo) (esto último pondría None en mazo). Si quieres conservar la original, haz una copia antes.
3 de 8
Temas Tema 3
03

Funciones

Bloques de código con nombre que podemos reutilizar. Las funciones evitan repetir código y organizan los programas en piezas manejables.

⚙️ defreturn📥 Parámetros📤 Argumentos
¿Qué es una función?

Definición

Una función es un bloque de código con nombre que realiza una tarea específica. Se define una vez y se puede usar (llamar) las veces que quieras.

Sintaxis en Python:

def nombre_funcion(parametros): # bloque de código return resultado # Llamar a la función: valor = nombre_funcion(argumentos)
📌 ¿Por qué usar funciones?

Evitan repetir código (principio DRY: Don't Repeat Yourself), organizan el programa, facilitan corregir errores y permiten reutilizar lógica.

🔗 Analogía de la vida real

Una licuadora: le pones ingredientes (entrada/argumentos), realiza un proceso interno (el código) y te devuelve un jugo (return). No necesitas saber cómo funciona por dentro; solo la usas.

def licuar(frutas): jugo = procesar(frutas) return jugo mi_jugo = licuar("piña")

Otras analogías:

  • ☕ Una máquina de café: monedas → café
  • 🏧 Un cajero automático: tarjeta + monto → dinero
  • 📐 Una fórmula matemática: f(x) = x²
Con retorno vs. Sin retorno
📤

Función CON retorno

Usa return para devolver un valor que puede guardarse y reutilizarse.

def sumar(a, b): return a + b total = sumar(5, 3) print(total) # 8 # total guarda el valor 8
🔊

Función SIN retorno

Realiza una acción (como imprimir) pero no devuelve un valor. Retorna None implícitamente.

def saludar(nombre): print("Hola", nombre) saludar("Ana") # Hola Ana # no se puede guardar un valor útil
⚠️ print NO es lo mismo que return

print muestra algo en pantalla pero el valor se "pierde". return entrega un valor que puedes guardar en una variable y seguir usando en cálculos posteriores. Una función puede calcular con return y luego tú decides si imprimirlo.

Parámetros y Argumentos
ConceptoQué esDónde aparece
ParámetroVariable en la DEFINICIÓN de la funcióndef sumar(a, b): → a y b
ArgumentoValor REAL que se pasa al LLAMARsumar(5, 3) → 5 y 3
RetornoValor que la función DEVUELVEreturn a + b → el resultado
🎮 ¡Practica con el simulador!

En Simuladores / Juegos está el "Constructor de funciones": elige una operación, ingresa dos números y observa cómo se construye la función y qué valor retorna.

Ejercicios — Funciones
🟢Ejercicio 1 — Función que saluda
Básico

Crea una función sin retorno llamada saludar que reciba un nombre e imprima "Hola, [nombre]! Bienvenido".

✅ Resolución:
def saludar(nombre): print("Hola,", nombre, "! Bienvenido") saludar("Rodrigo") # Hola, Rodrigo ! Bienvenido

Sin retorno: solo imprime, no devuelve valor. El parámetro es nombre; el argumento es "Rodrigo".

🟢Ejercicio 2 — Área de un rectángulo
Básico

Crea una función con retorno que calcule el área de un rectángulo (base × altura).

✅ Resolución:
def area_rectangulo(base, altura): return base * altura resultado = area_rectangulo(5, 3) print("El área es:", resultado) # 15

Con retorno: devuelve el área y la guardamos en resultado para usarla después.

🟡Ejercicio 3 — ¿Par o impar?
Intermedio

Crea una función que reciba un número y retorne el texto "par" o "impar" según corresponda (usa condicional dentro de la función).

✅ Resolución:
def par_o_impar(numero): if numero % 2 == 0: return "par" else: return "impar" print(par_o_impar(7)) # impar print(par_o_impar(10)) # par

Función + condicional: el return puede estar dentro de un if. La función decide qué texto devolver.

🟡Ejercicio 4 — Calcular promedio de 3 notas
Intermedio

Crea una función que reciba 3 notas, retorne el promedio, e indica si el alumno aprobó (promedio ≥ 11 en la escala peruana).

✅ Resolución:
def calcular_promedio(n1, n2, n3): return (n1 + n2 + n3) / 3 prom = calcular_promedio(14, 11, 16) print("Promedio:", prom) if prom >= 11: print("Aprobado") else: print("Desaprobado")

Combina función con retorno + condicional fuera de la función. La función calcula; el programa decide qué hacer con el resultado.

🔴Ejercicio 5 — Función que valida una contraseña
Avanzado

Crea una función que reciba una contraseña y retorne True si tiene al menos 8 caracteres, o False si no. Luego úsala para validar.

✅ Resolución:
def es_valida(contrasena): if len(contrasena) >= 8: return True else: return False clave = input("Crea tu contraseña: ") if es_valida(clave): print("Contraseña válida ✓") else: print("Muy corta, mínimo 8 caracteres")

Función que retorna booleano (True/False): muy usada para validaciones. len() cuenta los caracteres del texto.

🔴Ejercicio 6 — Conversor de temperatura reutilizable
Avanzado

Crea dos funciones: una que convierta Celsius a Fahrenheit y otra de Fahrenheit a Celsius. Úsalas en un bucle para convertir varias temperaturas.

✅ Resolución:
def celsius_a_fahrenheit(c): return (c * 9/5) + 32 def fahrenheit_a_celsius(f): return (f - 32) * 5/9 temperaturas = [0, 25, 37, 100] for t in temperaturas: f = celsius_a_fahrenheit(t) print(t, "°C =", round(f, 1), "°F")

Reutilización + for: definimos las funciones una vez y las usamos para muchas conversiones. round(f, 1) redondea a 1 decimal.

Casos Aplicados — Contextos reales
Ejercicios que combinan Funciones con For, Random, condicionales y contadores
🧾Caso 1 — Calculadora de IGV para una tienda
Función + for

Una tienda necesita calcular el precio final (con IGV del 18%) de varios productos. Crea una función agregar_igv(precio) que retorne el precio con IGV, y aplícala a una lista de precios.

✅ Resolución:
def agregar_igv(precio): return precio * 1.18 # +18% IGV precios = [100, 50, 25.5, 80] for p in precios: final = agregar_igv(p) print("Precio S/", p, "→ con IGV: S/", round(final, 2))

Combina: función con retorno (calcula IGV) + for (recorre los precios y reutiliza la función en cada uno).

🔢Caso 2 — Detector de números primos
Función booleana + for

Crea una función es_primo(n) que retorne True si el número es primo. Úsala para listar todos los números primos del 1 al 30.

✅ Resolución:
def es_primo(n): if n < 2: return False for i in range(2, n): if n % i == 0: # tiene divisor → no es primo return False return True print("Primos del 1 al 30:") for num in range(1, 31): if es_primo(num): print(num, end=" ")

Combina: función con for ANIDADO interno (busca divisores) + return booleano + for externo que la usa. ¡Una función puede tener su propio bucle dentro!

🎰Caso 3 — Juego del dado de la suerte
Función + random + for + acumulador

Crea una función lanzar_dado() que retorne un valor aleatorio del 1 al 6. Llámala 3 veces, suma los resultados; si la suma supera 12, el jugador gana.

✅ Resolución:
import random def lanzar_dado(): return random.randint(1, 6) total = 0 # acumulador for tiro in range(1, 4): valor = lanzar_dado() total += valor print("Tiro", tiro, ":", valor) print("Suma total:", total) if total > 12: print("🎉 ¡Ganaste!") else: print("😢 Perdiste, intenta de nuevo")

Combina: función con random (encapsula el lanzamiento) + for + acumulador + condicional. ¡Ya estamos juntando 3 temas!

📝Caso 4 — Conversor de nota numérica a literal
Función + condicional anidado + for

En un colegio se usa escala literal. Crea una función nota_a_letra(nota) que reciba una nota (0-20) y retorne: AD (18-20), A (14-17), B (11-13) o C (0-10). Aplícala a varias notas.

✅ Resolución:
def nota_a_letra(nota): if nota >= 18: return "AD (Logro destacado)" elif nota >= 14: return "A (Logro esperado)" elif nota >= 11: return "B (En proceso)" else: return "C (En inicio)" notas = [19, 15, 12, 8] for n in notas: print("Nota", n, "→", nota_a_letra(n))

Combina: función con condicionales encadenadas (if/elif/else) + return + for que la aplica a una lista de notas.

🛒Caso 5 — Descuentos según tipo de cliente
Función + for + acumulador

Un e-commerce aplica descuentos: clientes VIP tienen 20% y los regulares 5%. Crea una función precio_final(precio, tipo) que retorne el precio con descuento. Calcula el total de un carrito de un cliente VIP.

✅ Resolución:
def precio_final(precio, tipo): if tipo == "VIP": return precio * 0.80 # -20% else: return precio * 0.95 # -5% carrito = [120, 80, 200, 45] cliente = "VIP" total = 0 # acumulador for producto in carrito: total += precio_final(producto, cliente) print("Total a pagar (cliente", cliente, "): S/", round(total, 2))

Combina: función con 2 parámetros + condicional + for + acumulador. La función decide el descuento y el bucle suma el carrito completo.

Preguntas Frecuentes
¿Cuál es la diferencia real entre print y return?
print muestra texto en pantalla, pero ese valor se pierde (no lo puedes usar después). return entrega un valor que puedes guardar en una variable y seguir usando en cálculos. Ejemplo: si una función retorna 8, puedes hacer x = funcion() y luego x * 2. Si solo hiciera print(8), no podrías reutilizar ese 8.
¿Una función puede tener varios return?
Sí, pero solo se ejecuta UNO por llamada. Por ejemplo, en una función con if/else, puede haber un return en cada rama, pero solo se ejecutará el de la rama que se cumpla. Apenas Python encuentra un return, la función termina inmediatamente y devuelve ese valor.
¿Qué pasa si una función no tiene return?
Python automáticamente devuelve None (que significa "nada" o "ningún valor"). Esto es normal en funciones que solo realizan acciones, como imprimir o modificar algo. Si intentas guardar su resultado (x = funcion_sin_return()), x valdrá None.
¿Puedo llamar a una función dentro de otra función?
Sí, es muy común y recomendable. Una función puede usar (llamar) a otras funciones dentro de su código. Esto permite construir programas complejos a partir de piezas pequeñas y simples. Por ejemplo, una función calcular_factura() podría llamar a calcular_subtotal() y calcular_igv().
4 de 8
Temas Tema 4
04

Arreglos Unidimensionales

Estructuras que guardan muchos valores en una sola variable, organizados por posición (índice). En Python se implementan con listas.

📊 Listas🔢 Índices🔁 Recorridolen()
¿Qué es un arreglo?

Definición

Un arreglo unidimensional es una estructura que almacena varios valores en una sola variable, organizados en posiciones numeradas llamadas índices. En Python usamos listas.

# Crear una lista (arreglo) notas = [14, 11, 16, 8, 19] print(notas[0]) # 14 (primero) print(notas[4]) # 19 (último) print(notas[-1]) # 19 (último, índice negativo)
⚠️ Los índices empiezan en 0

El primer elemento es índice [0], NO [1]. Si la lista tiene 5 elementos, los índices van del 0 al 4.

🔗 Analogía de la vida real

Un edificio de departamentos: el edificio es la lista, cada departamento es un elemento, y el número de cada puerta es el índice. Para visitar al vecino del depto 0, dices edificio[0].

Otras analogías:

  • 🥚 Una caja de huevos: cada hueco es una posición
  • 🎵 Una playlist: canciones en orden numerado
  • 🚆 Los vagones de un tren: vagón 0, vagón 1...
  • 📋 Una lista de asistencia: cada fila es un alumno
Operaciones comunes con arreglos
OperaciónCódigoResultado (con [14,11,16,8,19])
Acceder a un elementonotas[2]16
Cantidad de elementoslen(notas)5
Agregar al finalnotas.append(20)[14,11,16,8,19,20]
Suma de todossum(notas)68
Valor máximomax(notas)19
Valor mínimomin(notas)8
Recorrer un arreglo con For
🔁

Recorrido por valor

Recorre directamente los elementos.

for nota in notas: print(nota) # 14, 11, 16, 8, 19
🔢

Recorrido por índice

Usa range(len()) para acceder por posición.

for i in range(len(notas)): print(i, "→", notas[i]) # 0 → 14, 1 → 11...
🎮 ¡Practica con el simulador!

En Simuladores / Juegos está el "Explorador de arreglos": agrega elementos, genera arreglos aleatorios y ejecuta operaciones (suma, promedio, máximo, mínimo, pares) viendo cómo se resaltan las celdas.

Ejercicios — Arreglos
🟢Ejercicio 1 — Mostrar todos los elementos
Básico

Dada la lista de frutas ["manzana", "plátano", "naranja"], muestra cada fruta con su posición.

✅ Resolución:
frutas = ["manzana", "plátano", "naranja"] for i in range(len(frutas)): print("Posición", i, ":", frutas[i])

range(len()) genera los índices 0, 1, 2 para acceder a cada elemento por posición.

🟢Ejercicio 2 — Sumar los elementos
Básico

Calcula la suma de todos los elementos de [10, 25, 30, 15] usando un acumulador.

✅ Resolución:
numeros = [10, 25, 30, 15] suma = 0 for n in numeros: suma += n print("Suma total:", suma) # 80

Acumulador + for sobre lista: recorre cada elemento sumándolo al total.

🟡Ejercicio 3 — Contar números mayores a un valor
Intermedio

Dada una lista de edades, cuenta cuántas personas son mayores de edad (≥ 18 años).

✅ Resolución:
edades = [15, 22, 18, 12, 30, 17] mayores = 0 for edad in edades: if edad >= 18: # condicional mayores += 1 # contador print("Mayores de edad:", mayores) # 3

Arreglo + for + if + contador: recorre las edades y cuenta las que cumplen la condición.

🟡Ejercicio 4 — Encontrar el mayor sin usar max()
Intermedio

Encuentra el valor máximo de [23, 8, 45, 16, 4, 42] SIN usar la función max().

✅ Resolución:
numeros = [23, 8, 45, 16, 4, 42] mayor = numeros[0] # asume el primero como mayor for n in numeros: if n > mayor: mayor = n # actualiza si encuentra uno más grande print("El mayor es:", mayor) # 45

Técnica clásica: empezamos asumiendo que el primero es el mayor, luego comparamos con cada elemento y actualizamos cuando encontramos uno más grande.

🔴Ejercicio 5 — Separar pares e impares
Avanzado

Dada una lista de números, crea dos listas nuevas: una con los pares y otra con los impares.

✅ Resolución:
numeros = [4, 7, 10, 3, 8, 15, 22] pares = [] impares = [] for n in numeros: if n % 2 == 0: pares.append(n) # agrega a pares else: impares.append(n) # agrega a impares print("Pares:", pares) print("Impares:", impares)

append() + condicional: según el residuo, cada número va a una lista distinta. Empezamos con dos listas vacías.

🔴Ejercicio 6 — Boleta de calificaciones completa
Avanzado

Dado un arreglo de notas, calcula: el promedio, la nota más alta, la más baja, y cuántos aprobaron (≥11). Combina todo lo aprendido.

✅ Resolución:
notas = [14, 8, 16, 11, 19, 7, 13] suma = 0 mayor = notas[0] menor = notas[0] aprobados = 0 for nota in notas: suma += nota # acumulador if nota > mayor: mayor = nota if nota < menor: menor = nota if nota >= 11: aprobados += 1 # contador promedio = suma / len(notas) print("Promedio:", round(promedio, 2)) print("Nota más alta:", mayor) print("Nota más baja:", menor) print("Aprobados:", aprobados, "de", len(notas))

¡El ejercicio integrador! Combina arreglo + for + condicionales + acumulador + contador + len() en un solo recorrido eficiente.

Casos Aplicados — Proyectos integradores
Ejercicios que integran TODO el curso: Arreglos + Funciones + For + Random + condicionales + contadores + acumuladores
🎓 ¡El momento de integrar todo!

Estos casos combinan los 4 temas del curso. Son el tipo de problemas que resolverás en evaluaciones y en proyectos reales. Tómate tu tiempo, intenta resolverlos antes de ver la solución.

🏫Caso 1 — Registro de puntajes de una academia
Funciones + arreglo + for

Una academia desea registrar los puntajes de 10 estudiantes en un examen. El programa debe:

  • Crear una función registrar_puntajes() que solicite los 10 puntajes y los almacene en un arreglo.
  • Crear una función calcular_promedio() que reciba el arreglo y retorne el promedio.
  • Mostrar: todos los puntajes, el más alto, el más bajo y el promedio.
✅ Resolución:
def registrar_puntajes(): puntajes = [] # arreglo vacío for i in range(1, 11): # 10 estudiantes p = float(input("Puntaje del estudiante " + str(i) + ": ")) puntajes.append(p) # agrega al arreglo return puntajes def calcular_promedio(arreglo): suma = 0 # acumulador for p in arreglo: suma += p return suma / len(arreglo) # Programa principal notas = registrar_puntajes() print("Puntajes registrados:", notas) # Buscar mayor y menor con for mayor = notas[0] menor = notas[0] for p in notas: if p > mayor: mayor = p if p < menor: menor = p print("Puntaje más alto:", mayor) print("Puntaje más bajo:", menor) print("Promedio:", round(calcular_promedio(notas), 2))

Integra: 2 funciones (una sin parámetro que retorna arreglo, otra que lo recibe) + for + append + acumulador + búsqueda de máx/mín con condicionales.

📦Caso 2 — Alerta de inventario de una bodega
Función + arreglo + for + contador

Una bodega tiene el stock de sus productos en un arreglo. Crea una función contar_por_agotarse() que reciba el arreglo y retorne cuántos productos tienen stock menor a 5 unidades. Muestra una alerta con el resultado.

✅ Resolución:
def contar_por_agotarse(stock): contador = 0 for cantidad in stock: if cantidad < 5: # umbral de alerta contador += 1 return contador inventario = [12, 3, 8, 2, 20, 4, 15] alertas = contar_por_agotarse(inventario) print("Inventario actual:", inventario) if alertas > 0: print("⚠️ ALERTA:", alertas, "producto(s) por agotarse") else: print("✓ Stock saludable")

Integra: función que recibe arreglo + for + condicional + contador + return, y condicional final para la alerta.

Caso 3 — Encuesta de satisfacción simulada
Random + arreglo + función + for

Un restaurante simula 20 calificaciones de clientes (de 1 a 5 estrellas) generadas al azar. Guárdalas en un arreglo, calcula el promedio con una función, y cuenta cuántos clientes dieron 5 estrellas.

✅ Resolución:
import random def promedio(arr): return sum(arr) / len(arr) # Generar 20 calificaciones aleatorias calificaciones = [] for i in range(20): estrella = random.randint(1, 5) calificaciones.append(estrella) print("Calificaciones:", calificaciones) # Contar las de 5 estrellas cinco_estrellas = 0 for c in calificaciones: if c == 5: cinco_estrellas += 1 print("Promedio:", round(promedio(calificaciones), 2), "⭐") print("Clientes muy satisfechos (5⭐):", cinco_estrellas)

Integra: random (genera datos) + arreglo (los guarda) + función (promedio) + for + contador. ¡Los 4 temas juntos!

🌡️Caso 4 — Análisis de temperaturas semanales
Funciones + arreglo + for + contador

Una estación meteorológica registró las temperaturas de 7 días. Crea funciones para el promedio, la máxima y la mínima. Luego cuenta cuántos días superaron el promedio semanal.

✅ Resolución:
def promedio(arr): return sum(arr) / len(arr) def maxima(arr): mayor = arr[0] for t in arr: if t > mayor: mayor = t return mayor def minima(arr): menor = arr[0] for t in arr: if t < menor: menor = t return menor temps = [22, 25, 19, 28, 21, 30, 24] prom = promedio(temps) print("Promedio semanal:", round(prom, 1), "°C") print("Máxima:", maxima(temps), "°C | Mínima:", minima(temps), "°C") # Contar días sobre el promedio calurosos = 0 for t in temps: if t > prom: calurosos += 1 print("Días sobre el promedio:", calurosos)

Integra: 3 funciones (cada una con su for interno) + arreglo + for + contador. Demuestra cómo organizar el código en funciones reutilizables.

📈Caso 5 — Reporte de ventas mensuales (PROYECTO FINAL)
¡Integra TODO!

Proyecto integrador final. Una tienda simula las ventas de 30 días (montos aleatorios entre S/100 y S/1000). El programa debe:

  • Generar las ventas con random y guardarlas en un arreglo.
  • Una función que calcule el total del mes y otra el promedio diario.
  • Encontrar el mejor y el peor día de ventas.
  • Contar cuántos días se superó la meta diaria de S/500.
✅ Resolución:
import random def total_ventas(arr): suma = 0 for v in arr: suma += v # acumulador return suma def promedio_diario(arr): return total_ventas(arr) / len(arr) # reusa otra función # 1) Generar 30 días de ventas aleatorias ventas = [] for dia in range(30): monto = random.randint(100, 1000) ventas.append(monto) # 2) Mejor y peor día + meta mejor = ventas[0] peor = ventas[0] sobre_meta = 0 for v in ventas: if v > mejor: mejor = v if v < peor: peor = v if v > 500: sobre_meta += 1 # 3) Reporte print("=== REPORTE DE VENTAS DEL MES ===") print("Total del mes: S/", total_ventas(ventas)) print("Promedio diario: S/", round(promedio_diario(ventas), 2)) print("Mejor día: S/", mejor, "| Peor día: S/", peor) print("Días sobre la meta (S/500):", sobre_meta, "de 30")

🏆 Integra TODO el curso: random (genera ventas) + arreglo (las guarda) + 2 funciones (una llama a la otra) + for + acumulador + búsqueda de máx/mín + contador. Este es el nivel de un examen final o proyecto.

Preguntas Frecuentes
¿Por qué el primer elemento es índice 0 y no 1?
Es una convención de la mayoría de lenguajes (Python, Java, C, JavaScript). El índice representa la "distancia desde el inicio": el primer elemento está a distancia 0 del comienzo. Al principio confunde, pero te acostumbras rápido. Recuerda: si la lista tiene N elementos, el último índice es N-1.
¿Qué pasa si accedo a un índice que no existe?
Python lanza un error: IndexError: list index out of range. Por ejemplo, si la lista tiene 3 elementos (índices 0, 1, 2) e intentas acceder a lista[3], dará error porque ese índice no existe. Siempre verifica que el índice esté dentro del rango con len().
¿Cuál es la diferencia entre append() y agregar con +?
lista.append(x) agrega UN elemento al final de la lista. lista + [x] crea una lista NUEVA combinando ambas (no modifica la original). Para agregar elementos uno por uno dentro de un bucle, usa append(), que es más eficiente.
¿Listas y arreglos son lo mismo en Python?
En Python, las listas cumplen el rol de los arreglos de otros lenguajes, pero son más flexibles: pueden cambiar de tamaño y guardar tipos de datos mixtos. Python también tiene un módulo array y la librería numpy con arreglos más estrictos y eficientes para cálculos numéricos. Para aprender, las listas son perfectas.
5 de 8
Práctica Juegos didácticos
🎮

Simuladores Interactivos

Practica los conceptos de forma visual e interactiva. Cambia valores, ejecuta y observa qué hace el código en tiempo real. ¡Aprender programando!

🔁 Trazador For🎲 Random⚙️ Funciones📊 Arreglos🎯 Adivina
🔁
Trazador de Bucle For
Cambia los valores y observa qué números genera range()
CÓDIGO GENERADO
Iteraciones: 0
VALORES DE i (salida)
🎲
Laboratorio de Random
Prueba las funciones de la librería random
RESULTADO
HISTORIAL
DISTRIBUCIÓN (solo dado)
Lanza muchas veces y observa cómo las 6 caras se emparejan (ley de los grandes números).
⚙️
Constructor de Funciones
Crea una función, pásale argumentos y observa qué retorna
FUNCIÓN GENERADA
VALOR RETORNADO
📊
Explorador de Arreglos
Agrega elementos y ejecuta operaciones viendo las celdas resaltarse
len() = 0
ARREGLO (con índices)
CÓDIGO
RESULTADO
🎯
Juego: Adivina el Número
Combina random + condicionales (if/elif/else) + contador de intentos
Intentos: 0
6 de 8
Evaluación Quiz 1
📝

Quiz — Temas 1 y 2

12 preguntas sobre Estructura For y Números Aleatorios. Mezcla de opción múltiple y Verdadero/Falso. ¡Retroalimentación inmediata!

🔁 Bucle For🎲 Random12 preguntas
1 / 12
Pregunta 1 de 12
0/12
7 de 8
Evaluación Quiz 2
🏆

Quiz — Temas 3 y 4

12 preguntas sobre Funciones y Arreglos Unidimensionales. Mezcla de opción múltiple y Verdadero/Falso. ¡Demuestra lo aprendido!

⚙️ Funciones📊 Arreglos12 preguntas
1 / 12
Pregunta 1 de 12
0/12
🎓 ¡Has completado el Dashboard de Algoritmos!

Repasaste los 4 temas, resolviste ejercicios en tres niveles, practicaste con los 5 simuladores y pusiste a prueba tu conocimiento. ¡Recuerda: la programación se aprende practicando todos los días!

  • 🔁 Tema 1: Estructura repetitiva For ✅
  • 🎲 Tema 2: Números Aleatorios ✅
  • ⚙️ Tema 3: Funciones (con y sin retorno) ✅
  • 📊 Tema 4: Arreglos Unidimensionales ✅
8 de 8