ESTRUCTURAS ITERATIVAS

Tipos de Bucles en R

R proporciona tres tipos principales de bucles:
for: Cuando sabes exactamente cuántas veces quieres repetir algo
while: Cuando quieres repetir mientras una condición sea verdadera
repeat: Para crear bucles infinitos con control de salida manual

Bucles for

Anatomía de un Bucle for

#for (variable_iteracion in secuencia) {
  # Cuerpo del bucle: código que se ejecuta en cada iteración
  # La variable_iteracion toma el valor de cada elemento de la secuencia
#}

Componentes clave:
•for: Palabra clave que inicia el bucle
•variable_iteracion: Variable que almacena el valor actual en cada iteración
•in: Operador que conecta la variable con la secuencia
•secuencia: Conjunto de elementos sobre los que se itera
•{}: Delimitadores que contienen el código a ejecutar

Proceso de Ejecución en R

# Ejemplo de seguimiento paso a paso
numeros <- c(10, 20, 30)
for (numero in numeros) {
  resultado <- numero * 2
  print(paste("Número:", numero, "- Doble:", resultado))
}
## [1] "Número: 10 - Doble: 20"
## [1] "Número: 20 - Doble: 40"
## [1] "Número: 30 - Doble: 60"
# Proceso interno:
# Iteración 1: numero = 10, resultado = 20, imprime "Número: 10 - Doble: 20"
# Iteración 2: numero = 20, resultado = 40, imprime "Número: 20 - Doble: 40"
# Iteración 3: numero = 30, resultado = 60, imprime "Número: 30 - Doble: 60"
# Fin del bucle

Proceso de Ejecución en Python

numeros = [10, 20, 30]
for numero in numeros:
    resultado = numero * 2
    print(f"Número: {numero} - Doble: {resultado}")
## Número: 10 - Doble: 20
## Número: 20 - Doble: 40
## Número: 30 - Doble: 60

Tipos de Secuencias para Iterar

1. Secuencias Numéricas en R

# Usando el operador : para crear secuencias
cat("=== SECUENCIAS NUMÉRICAS BÁSICAS ===\n")
## === SECUENCIAS NUMÉRICAS BÁSICAS ===
# Secuencia ascendente
cat("Conteo del 1 al 5:\n")
## Conteo del 1 al 5:
for (i in 1:5) {
  cat(sprintf("Número: %d\n", i))
}
## Número: 1
## Número: 2
## Número: 3
## Número: 4
## Número: 5
# Secuencia descendente
cat("\nConteo descendente del 5 al 1:\n")
## 
## Conteo descendente del 5 al 1:
for (i in 5:1) {
  cat(sprintf("Número: %d\n", i))
}
## Número: 5
## Número: 4
## Número: 3
## Número: 2
## Número: 1
# Usando seq() para mayor control
cat("\nNúmeros pares del 2 al 10:\n")
## 
## Números pares del 2 al 10:
for (i in seq(2, 10, by = 2)) {
  cat(sprintf("Número par: %d\n", i))
}
## Número par: 2
## Número par: 4
## Número par: 6
## Número par: 8
## Número par: 10
# Secuencia con decimales
cat("\nSecuencia decimal:\n")
## 
## Secuencia decimal:
for (valor in seq(0.5, 2.5, by = 0.5)) {
  cat(sprintf("Valor: %.1f\n", valor))
}
## Valor: 0.5
## Valor: 1.0
## Valor: 1.5
## Valor: 2.0
## Valor: 2.5

1. Secuencias Numéricas en Python

# Usando range() para crear secuencias
print("=== SECUENCIAS NUMÉRICAS BÁSICAS ===")
## === SECUENCIAS NUMÉRICAS BÁSICAS ===
# Secuencia ascendente
print("Conteo del 1 al 5:")
## Conteo del 1 al 5:
for i in range(1, 6):  # range(inicio, fin) - fin es exclusivo
    print(f"Número: {i}")
## Número: 1
## Número: 2
## Número: 3
## Número: 4
## Número: 5
# Secuencia descendente
print("\nConteo descendente del 5 al 1:")
## 
## Conteo descendente del 5 al 1:
for i in range(5, 0, -1):  # range(inicio, fin, paso)
    print(f"Número: {i}")
## Número: 5
## Número: 4
## Número: 3
## Número: 2
## Número: 1
# Usando range() con paso para mayor control
print("\nNúmeros pares del 2 al 10:")
## 
## Números pares del 2 al 10:
for i in range(2, 11, 2):  # range(2, 11, 2) = 2, 4, 6, 8, 10
    print(f"Número par: {i}")
## Número par: 2
## Número par: 4
## Número par: 6
## Número par: 8
## Número par: 10
# Secuencia con decimales usando numpy
print("\nSecuencia decimal:")
## 
## Secuencia decimal:
import numpy as np
for valor in np.arange(0.5, 3.0, 0.5):  # np.arange(inicio, fin, paso)
    print(f"Valor: {valor:.1f}")
## Valor: 0.5
## Valor: 1.0
## Valor: 1.5
## Valor: 2.0
## Valor: 2.5

2. Vectores de Caracteres en R

# Iterando sobre texto
cat("\n=== PROCESAMIENTO DE TEXTO ===\n")
## 
## === PROCESAMIENTO DE TEXTO ===
# Lista de estudiantes:
# Vector de nombres
estudiantes <- c("Ana María", "Pedro José", "Lucía Carmen", "Miguel Ángel")
cat("Lista de estudiantes:\n")
## Lista de estudiantes:
for (nombre in estudiantes) {
  # Procesar cada nombre
  num_palabras <- length(strsplit(nombre, " ")[[1]])
  num_caracteres <- nchar(nombre)
  cat(sprintf("- %s: %d palabras, %d caracteres\n",
              nombre, num_palabras, num_caracteres))
}
## - Ana María: 2 palabras, 9 caracteres
## - Pedro José: 2 palabras, 10 caracteres
## - Lucía Carmen: 2 palabras, 12 caracteres
## - Miguel Ángel: 2 palabras, 12 caracteres
# Días de la semana con información
dias_semana <- c("Lunes", "Martes", "Miércoles", "Jueves", "Viernes", "Sábado", "Domingo")
tipos_dia <- c("Laboral", "Laboral", "Laboral", "Laboral", "Laboral", "Fin de semana", "Fin de semana")
cat("\nCalendario semanal:\n")
## 
## Calendario semanal:
for (i in 1:length(dias_semana)) {
  dia <- dias_semana[i]
  tipo <- tipos_dia[i]
  emoji <- if (tipo == "Laboral") "maletin" else "fiesta"
  cat(sprintf("%s %s - %s\n", emoji, dia, tipo))
}
## maletin Lunes - Laboral
## maletin Martes - Laboral
## maletin Miércoles - Laboral
## maletin Jueves - Laboral
## maletin Viernes - Laboral
## fiesta Sábado - Fin de semana
## fiesta Domingo - Fin de semana

2. Vectores de Caracteres en Python

# Iterando sobre texto
print("\n=== PROCESAMIENTO DE TEXTO ===")
## 
## === PROCESAMIENTO DE TEXTO ===
# Lista de estudiantes:
# Lista de nombres
estudiantes = ["Ana María", "Pedro José", "Lucía Carmen", "Miguel Ángel"]
print("Lista de estudiantes:")
## Lista de estudiantes:
for nombre in estudiantes:
    # Procesar cada nombre
    num_palabras = len(nombre.split())
    num_caracteres = len(nombre)
    print(f"- {nombre}: {num_palabras} palabras, {num_caracteres} caracteres")
## - Ana María: 2 palabras, 9 caracteres
## - Pedro José: 2 palabras, 10 caracteres
## - Lucía Carmen: 2 palabras, 12 caracteres
## - Miguel Ángel: 2 palabras, 12 caracteres
# Días de la semana con información
dias_semana = ["Lunes", "Martes", "Miércoles", "Jueves", "Viernes", "Sábado", "Domingo"]
tipos_dia = ["Laboral", "Laboral", "Laboral", "Laboral", "Laboral", "Fin de semana", "Fin de semana"]
print("\nCalendario semanal:")
## 
## Calendario semanal:
for i in range(len(dias_semana)):
    dia = dias_semana[i]
    tipo = tipos_dia[i]
    print(f"{dia} - {tipo}")
## Lunes - Laboral
## Martes - Laboral
## Miércoles - Laboral
## Jueves - Laboral
## Viernes - Laboral
## Sábado - Fin de semana
## Domingo - Fin de semana

3. Listas Complejas en R

# Trabajando con estructuras de datos complejas
cat("\n=== PROCESAMIENTO DE LISTAS ===\n")
## 
## === PROCESAMIENTO DE LISTAS ===
# Lista de información de empleados
empleados <- list(
  list(
    nombre = "Carlos Mendoza",
    departamento = "Ventas",
    salario = 45000,
    años_experiencia = 3,
    certificaciones = c("Ventas Avanzadas", "CRM")
  ),
  list(
    nombre = "María González",
    departamento = "IT",
    salario = 65000,
    años_experiencia = 7,
    certificaciones = c("Java", "Python", "Scrum Master")
  ),
  list(
    nombre = "Roberto Silva",
    departamento = "Marketing",
    salario = 50000,
    años_experiencia = 5,
    certificaciones = c("Google Ads", "Analytics", "SEO")
  )
)

cat("=== REPORTE DE EMPLEADOS ===\n")
## === REPORTE DE EMPLEADOS ===
for (i in 1:length(empleados)) {
  emp <- empleados[[i]]
  # Calcular información derivada
  salario_mensual <- emp$salario / 12
  nivel_experiencia <- if (emp$años_experiencia >= 5) "Senior" else if (emp$años_experiencia >= 2) "Intermedio" else "Junior"
  cat(sprintf("\n--- EMPLEADO %d ---\n", i))
  cat(sprintf("Nombre: %s\n", emp$nombre))
  cat(sprintf("Departamento: %s\n", emp$departamento))
  cat(sprintf("Salario anual: $%s\n", format(emp$salario, big.mark = ",")))
  cat(sprintf("Salario mensual: $%s\n", format(round(salario_mensual), big.mark = ",")))
  cat(sprintf("Experiencia: %d años (%s)\n", emp$años_experiencia, nivel_experiencia))
  cat(sprintf("Certificaciones (%d):\n", length(emp$certificaciones)))
  for (cert in emp$certificaciones) {
    cat(sprintf("• %s\n", cert))
  }
}
## 
## --- EMPLEADO 1 ---
## Nombre: Carlos Mendoza
## Departamento: Ventas
## Salario anual: $45,000
## Salario mensual: $3,750
## Experiencia: 3 años (Intermedio)
## Certificaciones (2):
## • Ventas Avanzadas
## • CRM
## 
## --- EMPLEADO 2 ---
## Nombre: María González
## Departamento: IT
## Salario anual: $65,000
## Salario mensual: $5,417
## Experiencia: 7 años (Senior)
## Certificaciones (3):
## • Java
## • Python
## • Scrum Master
## 
## --- EMPLEADO 3 ---
## Nombre: Roberto Silva
## Departamento: Marketing
## Salario anual: $50,000
## Salario mensual: $4,167
## Experiencia: 5 años (Senior)
## Certificaciones (3):
## • Google Ads
## • Analytics
## • SEO

3. Listas Complejas en Python

print("\n=== PROCESAMIENTO DE LISTAS ===")
## 
## === PROCESAMIENTO DE LISTAS ===
# Lista de información de empleados
empleados = [
    {
        "nombre": "Carlos Mendoza",
        "departamento": "Ventas",
        "salario": 45000,
        "años_experiencia": 3,
        "certificaciones": ["Ventas Avanzadas", "CRM"]
    },
    {
        "nombre": "María González",
        "departamento": "IT",
        "salario": 65000,
        "años_experiencia": 7,
        "certificaciones": ["Java", "Python", "Scrum Master"]
    },
    {
        "nombre": "Roberto Silva",
        "departamento": "Marketing",
        "salario": 50000,
        "años_experiencia": 5,
        "certificaciones": ["Google Ads", "Analytics", "SEO"]
    }
]

print("=== REPORTE DE EMPLEADOS ===")
## === REPORTE DE EMPLEADOS ===
for i, emp in enumerate(empleados, 1):
    # Calcular información derivada
    salario_mensual = emp["salario"] / 12
    if emp["años_experiencia"] >= 5:
        nivel_experiencia = "Senior"
    elif emp["años_experiencia"] >= 2:
        nivel_experiencia = "Intermedio"
    else:
        nivel_experiencia = "Junior"
    
    print(f"\n--- EMPLEADO {i} ---")
    print(f"Nombre: {emp['nombre']}")
    print(f"Departamento: {emp['departamento']}")
    print(f"Salario anual: ${emp['salario']:,.0f}")
    print(f"Salario mensual: ${round(salario_mensual):,.0f}")
    print(f"Experiencia: {emp['años_experiencia']} años ({nivel_experiencia})")
    print(f"Certificaciones ({len(emp['certificaciones'])}):")
    for cert in emp["certificaciones"]:
        print(f"• {cert}")
## 
## --- EMPLEADO 1 ---
## Nombre: Carlos Mendoza
## Departamento: Ventas
## Salario anual: $45,000
## Salario mensual: $3,750
## Experiencia: 3 años (Intermedio)
## Certificaciones (2):
## • Ventas Avanzadas
## • CRM
## 
## --- EMPLEADO 2 ---
## Nombre: María González
## Departamento: IT
## Salario anual: $65,000
## Salario mensual: $5,417
## Experiencia: 7 años (Senior)
## Certificaciones (3):
## • Java
## • Python
## • Scrum Master
## 
## --- EMPLEADO 3 ---
## Nombre: Roberto Silva
## Departamento: Marketing
## Salario anual: $50,000
## Salario mensual: $4,167
## Experiencia: 5 años (Senior)
## Certificaciones (3):
## • Google Ads
## • Analytics
## • SEO

Procesamiento de Datos Financieros en R

# Sistema de análisis financiero
cat("\n=== ANÁLISIS FINANCIERO TRIMESTRAL ===\n")
## 
## === ANÁLISIS FINANCIERO TRIMESTRAL ===
# Datos de ventas por trimestre
meses <- c("Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio",
           "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre")
ventas_2024 <- c(125000, 138000, 142000, 156000, 149000, 163000,
                 178000, 171000, 165000, 183000, 195000, 210000)
# Metas mensuales progresivas
metas <- c(120000, 125000, 130000, 135000, 140000, 145000,
           150000, 155000, 160000, 165000, 170000, 175000)
# Análisis detallado por mes
total_ventas <- 0
total_metas <- 0
meses_exitosos <- 0
mejor_mes <- ""
mejor_rendimiento <- 0

cat("REPORTE MENSUAL DETALLADO:\n")
## REPORTE MENSUAL DETALLADO:
cat(sprintf("%-12s %12s %12s %12s %10s %s\n", "Mes", "Ventas", "Meta", "Diferencia", "% Meta", "Estado"))
## Mes                Ventas         Meta   Diferencia     % Meta Estado
cat(strrep("-", 80), "\n")
## --------------------------------------------------------------------------------
for (i in 1:length(meses)) {
  mes <- meses[i]
  venta <- ventas_2024[i]
  meta <- metas[i]
  diferencia <- venta - meta
  porcentaje_meta <- (venta / meta) * 100
  # Actualizar totales
  total_ventas <- total_ventas + venta
  total_metas <- total_metas + meta
  # Determinar estado
  if (venta >= meta) {
    meses_exitosos <- meses_exitosos + 1
    estado <- " ÉXITO"
  } else {
    estado <- " Bajo"
  }
  # Buscar mejor rendimiento
  if (porcentaje_meta > mejor_rendimiento) {
    mejor_rendimiento <- porcentaje_meta
    mejor_mes <- mes
  }
  # Formatear y mostrar resultados
  cat(sprintf("%-12s $%10s $%10s %+10s %9.1f%% %s\n",
              mes,
              format(venta, big.mark = ","),
              format(meta, big.mark = ","),
              format(diferencia, big.mark = ","),
              porcentaje_meta,
              estado))
}
## Enero        $   125,000 $   120,000      5,000     104.2%  ÉXITO
## Febrero      $   138,000 $   125,000     13,000     110.4%  ÉXITO
## Marzo        $   142,000 $   130,000     12,000     109.2%  ÉXITO
## Abril        $   156,000 $   135,000     21,000     115.6%  ÉXITO
## Mayo         $   149,000 $   140,000      9,000     106.4%  ÉXITO
## Junio        $   163,000 $   145,000     18,000     112.4%  ÉXITO
## Julio        $   178,000 $   150,000     28,000     118.7%  ÉXITO
## Agosto       $   171,000 $   155,000     16,000     110.3%  ÉXITO
## Septiembre   $   165,000 $   160,000      5,000     103.1%  ÉXITO
## Octubre      $   183,000 $   165,000     18,000     110.9%  ÉXITO
## Noviembre    $   195,000 $   170,000     25,000     114.7%  ÉXITO
## Diciembre    $   210,000 $   175,000     35,000     120.0%  ÉXITO
# Resumen anual
cat(strrep("-", 80), "\n")
## --------------------------------------------------------------------------------
porcentaje_anual <- (total_ventas / total_metas) * 100
superavit_total <- total_ventas - total_metas
cat(sprintf("%-12s $%10s $%10s %+10s %9.1f%%\n",
            "TOTAL AÑO",
            format(total_ventas, big.mark = ","),
            format(total_metas, big.mark = ","),
            format(superavit_total, big.mark = ","),
            porcentaje_anual))
## TOTAL AÑO   $ 1,975,000 $ 1,770,000    205,000     111.6%
cat("\n=== RESUMEN EJECUTIVO ===\n")
## 
## === RESUMEN EJECUTIVO ===
cat(sprintf(" Total vendido: $%s\n", format(total_ventas, big.mark = ",")))
##  Total vendido: $1,975,000
cat(sprintf(" Total de metas: $%s\n", format(total_metas, big.mark = ",")))
##  Total de metas: $1,770,000
cat(sprintf(" Rendimiento anual: %.1f%%\n", porcentaje_anual))
##  Rendimiento anual: 111.6%
cat(sprintf(" Meses exitosos: %d de %d\n", meses_exitosos, length(meses)))
##  Meses exitosos: 12 de 12
cat(sprintf("Mejor mes: %s (%.1f%% de la meta)\n", mejor_mes, mejor_rendimiento))
## Mejor mes: Diciembre (120.0% de la meta)
if (porcentaje_anual >= 100) {
  cat(" ¡Felicitaciones! Se superaron las metas anuales\n")
} else {
  deficit <- total_metas - total_ventas
  cat(sprintf(" Área de mejora: $%s por debajo de la meta\n", format(deficit, big.mark = ",")))
}
##  ¡Felicitaciones! Se superaron las metas anuales

Procesamiento de Datos Financieros en Python

print("\n=== ANÁLISIS FINANCIERO TRIMESTRAL ===")
## 
## === ANÁLISIS FINANCIERO TRIMESTRAL ===
meses = ["Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio",
         "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre"]
ventas_2024 = [125000, 138000, 142000, 156000, 149000, 163000,
               178000, 171000, 165000, 183000, 195000, 210000]
metas = [120000, 125000, 130000, 135000, 140000, 145000,
         150000, 155000, 160000, 165000, 170000, 175000]

total_ventas = 0
total_metas = 0
meses_exitosos = 0
mejor_mes = ""
mejor_rendimiento = 0

print("REPORTE MENSUAL DETALLADO:")
## REPORTE MENSUAL DETALLADO:
print(f"{'Mes':<12} {'Ventas':>12} {'Meta':>12} {'Diferencia':>12} {'% Meta':>10} {'Estado':<10}")
## Mes                Ventas         Meta   Diferencia     % Meta Estado
print("-" * 80)
## --------------------------------------------------------------------------------
for i in range(len(meses)):
    mes = meses[i]
    venta = ventas_2024[i]
    meta = metas[i]
    diferencia = venta - meta
    porcentaje_meta = (venta / meta) * 100
    
    total_ventas += venta
    total_metas += meta
    
    if venta >= meta:
        meses_exitosos += 1
        estado = "ÉXITO"
    else:
        estado = "Bajo"
    
    if porcentaje_meta > mejor_rendimiento:
        mejor_rendimiento = porcentaje_meta
        mejor_mes = mes
    
    print(f"{mes:<12} ${venta:>10,} ${meta:>10,} {diferencia:>+10,} {porcentaje_meta:>9.1f}% {estado:<10}")
## Enero        $   125,000 $   120,000     +5,000     104.2% ÉXITO     
## Febrero      $   138,000 $   125,000    +13,000     110.4% ÉXITO     
## Marzo        $   142,000 $   130,000    +12,000     109.2% ÉXITO     
## Abril        $   156,000 $   135,000    +21,000     115.6% ÉXITO     
## Mayo         $   149,000 $   140,000     +9,000     106.4% ÉXITO     
## Junio        $   163,000 $   145,000    +18,000     112.4% ÉXITO     
## Julio        $   178,000 $   150,000    +28,000     118.7% ÉXITO     
## Agosto       $   171,000 $   155,000    +16,000     110.3% ÉXITO     
## Septiembre   $   165,000 $   160,000     +5,000     103.1% ÉXITO     
## Octubre      $   183,000 $   165,000    +18,000     110.9% ÉXITO     
## Noviembre    $   195,000 $   170,000    +25,000     114.7% ÉXITO     
## Diciembre    $   210,000 $   175,000    +35,000     120.0% ÉXITO
print("-" * 80)
## --------------------------------------------------------------------------------
porcentaje_anual = (total_ventas / total_metas) * 100
superavit_total = total_ventas - total_metas

print(f"{'TOTAL AÑO':<12} ${total_ventas:>10,} ${total_metas:>10,} {superavit_total:>+10,} {porcentaje_anual:>9.1f}%")
## TOTAL AÑO    $ 1,975,000 $ 1,770,000   +205,000     111.6%
print("\n=== RESUMEN EJECUTIVO ===")
## 
## === RESUMEN EJECUTIVO ===
print(f" Total vendido: ${total_ventas:,}")
##  Total vendido: $1,975,000
print(f" Total de metas: ${total_metas:,}")
##  Total de metas: $1,770,000
print(f" Rendimiento anual: {porcentaje_anual:.1f}%")
##  Rendimiento anual: 111.6%
print(f" Meses exitosos: {meses_exitosos} de {len(meses)}")
##  Meses exitosos: 12 de 12
print(f"Mejor mes: {mejor_mes} ({mejor_rendimiento:.1f}% de la meta)")
## Mejor mes: Diciembre (120.0% de la meta)
if porcentaje_anual >= 100:
    print(" ¡Felicitaciones! Se superaron las metas anuales")
else:
    deficit = total_metas - total_ventas
    print(f" Área de mejora: ${deficit:,} por debajo de la meta")
##  ¡Felicitaciones! Se superaron las metas anuales

Sistema de Gestión Académica en R

# Procesamiento de calificaciones estudiantiles
cat("\n=== SISTEMA DE GESTIÓN ACADÉMICA ===\n")
## 
## === SISTEMA DE GESTIÓN ACADÉMICA ===
# Base de datos de estudiantes
estudiantes_db <- list(
  list(nombre = "Ana Rodríguez", id = "EST001",
       materias = list(
         "Matemáticas" = list(parcial1 = 85, parcial2 = 88, final = 92, asistencia = 95),
         "Física" = list(parcial1 = 78, parcial2 = 82, final = 85, asistencia = 90),
         "Química" = list(parcial1 = 90, parcial2 = 87, final = 94, asistencia = 98)
       )),
  list(nombre = "Pedro Martínez", id = "EST002",
       materias = list(
         "Matemáticas" = list(parcial1 = 75, parcial2 = 79, final = 82, asistencia = 88),
         "Física" = list(parcial1 = 82, parcial2 = 85, final = 88, asistencia = 92),
         "Química" = list(parcial1 = 77, parcial2 = 80, final = 83, asistencia = 85)
       )),
  list(nombre = "Lucía Fernández", id = "EST003",
       materias = list(
         "Matemáticas" = list(parcial1 = 92, parcial2 = 94, final = 96, asistencia = 100),
         "Física" = list(parcial1 = 88, parcial2 = 91, final = 93, asistencia = 95),
         "Química" = list(parcial1 = 95, parcial2 = 92, final = 97, asistencia = 98)
       ))
)
# Función para calcular nota final
calcular_nota_final <- function(parcial1, parcial2, final, asistencia) {
  # 25% cada parcial, 40% examen final, 10% asistencia
  nota <- (parcial1 * 0.25) + (parcial2 * 0.25) + (final * 0.40) + (asistencia * 0.10)
  return(round(nota, 2))
}
# Función para determinar letra y estado
obtener_calificacion <- function(nota) {
  if (nota >= 90) {
    return(list(letra = "A", estado = "Excelente", puntos = 4.0))
  } else if (nota >= 80) {
    return(list(letra = "B", estado = "Bueno", puntos = 3.0))
  } else if (nota >= 70) {
    return(list(letra = "C", estado = "Satisfactorio", puntos = 2.0))
  } else if (nota >= 60) {
    return(list(letra = "D", estado = "Mínimo", puntos = 1.0))
  } else {
    return(list(letra = "F", estado = "Reprobado", puntos = 0.0))
  }
}

# Procesar todos los estudiantes
cat("REPORTE ACADÉMICO DETALLADO\n")
## REPORTE ACADÉMICO DETALLADO
cat(strrep("=", 60), "\n")
## ============================================================
for (estudiante in estudiantes_db) {
  cat(sprintf("\nESTUDIANTE: %s (ID: %s)\n", estudiante$nombre, estudiante$id))
  cat(strrep("-", 50), "\n")
  total_puntos <- 0
  materias_cursadas <- 0
  materias_aprobadas <- 0
  # Procesar cada materia
  for (materia_nombre in names(estudiante$materias)) {
    materia_data <- estudiante$materias[[materia_nombre]]
    # Calcular nota final
    nota_final <- calcular_nota_final(
      materia_data$parcial1,
      materia_data$parcial2,
      materia_data$final,
      materia_data$asistencia
    )
    # Obtener calificación
    calificacion <- obtener_calificacion(nota_final)
    # Actualizar contadores
    materias_cursadas <- materias_cursadas + 1
    total_puntos <- total_puntos + calificacion$puntos
    if (calificacion$puntos > 0) {
      materias_aprobadas <- materias_aprobadas + 1
    }
    # Mostrar detalles de la materia
    cat(sprintf(" %s:\n", materia_nombre))
    cat(sprintf(" Parcial 1: %d | Parcial 2: %d | Final: %d | Asistencia: %d%%\n",
                materia_data$parcial1, materia_data$parcial2,
                materia_data$final, materia_data$asistencia))
    cat(sprintf("→ Nota final: %.2f (%s) - %s\n",
                nota_final, calificacion$letra, calificacion$estado))
    # Identificar áreas de mejora
    if (nota_final < 80) {
      if (materia_data$asistencia < 90) {
        cat("  Recomendación: Mejorar asistencia\n")
      }
      if (materia_data$final < materia_data$parcial1 || materia_data$final < materia_data$parcial2) {
        cat("  Recomendación: Prepararse mejor para exámenes finales\n")
      }
    }
    cat("\n")
  }
  # Calcular GPA
  gpa <- if (materias_cursadas > 0) round(total_puntos / materias_cursadas, 2) else 0
  # Determinar estado académico
  if (gpa >= 3.5) {
    estado_academico <- " Lista de Honor"
  } else if (gpa >= 3.0) {
    estado_academico <- " Buen Rendimiento"
  } else if (gpa >= 2.0) {
    estado_academico <- " Rendimiento Satisfactorio"
  } else {
    estado_academico <- " Necesita Mejora"
  }
  # Resumen del estudiante
  cat(" RESUMEN ACADÉMICO:\n")
  cat(sprintf(" GPA: %.2f/4.0\n", gpa))
  cat(sprintf(" Materias cursadas: %d\n", materias_cursadas))
  cat(sprintf(" Materias aprobadas: %d\n", materias_aprobadas))
  cat(sprintf(" Tasa de aprobación: %.1f%%\n", (materias_aprobadas / materias_cursadas) * 100))
  cat(sprintf(" Estado académico: %s\n", estado_academico))
  cat(strrep("=", 60), "\n")
}
## 
## ESTUDIANTE: Ana Rodríguez (ID: EST001)
## -------------------------------------------------- 
##  Matemáticas:
##  Parcial 1: 85 | Parcial 2: 88 | Final: 92 | Asistencia: 95%
## → Nota final: 89.55 (B) - Bueno
## 
##  Física:
##  Parcial 1: 78 | Parcial 2: 82 | Final: 85 | Asistencia: 90%
## → Nota final: 83.00 (B) - Bueno
## 
##  Química:
##  Parcial 1: 90 | Parcial 2: 87 | Final: 94 | Asistencia: 98%
## → Nota final: 91.65 (A) - Excelente
## 
##  RESUMEN ACADÉMICO:
##  GPA: 3.33/4.0
##  Materias cursadas: 3
##  Materias aprobadas: 3
##  Tasa de aprobación: 100.0%
##  Estado académico:  Buen Rendimiento
## ============================================================ 
## 
## ESTUDIANTE: Pedro Martínez (ID: EST002)
## -------------------------------------------------- 
##  Matemáticas:
##  Parcial 1: 75 | Parcial 2: 79 | Final: 82 | Asistencia: 88%
## → Nota final: 80.10 (B) - Bueno
## 
##  Física:
##  Parcial 1: 82 | Parcial 2: 85 | Final: 88 | Asistencia: 92%
## → Nota final: 86.15 (B) - Bueno
## 
##  Química:
##  Parcial 1: 77 | Parcial 2: 80 | Final: 83 | Asistencia: 85%
## → Nota final: 80.95 (B) - Bueno
## 
##  RESUMEN ACADÉMICO:
##  GPA: 3.00/4.0
##  Materias cursadas: 3
##  Materias aprobadas: 3
##  Tasa de aprobación: 100.0%
##  Estado académico:  Buen Rendimiento
## ============================================================ 
## 
## ESTUDIANTE: Lucía Fernández (ID: EST003)
## -------------------------------------------------- 
##  Matemáticas:
##  Parcial 1: 92 | Parcial 2: 94 | Final: 96 | Asistencia: 100%
## → Nota final: 94.90 (A) - Excelente
## 
##  Física:
##  Parcial 1: 88 | Parcial 2: 91 | Final: 93 | Asistencia: 95%
## → Nota final: 91.45 (A) - Excelente
## 
##  Química:
##  Parcial 1: 95 | Parcial 2: 92 | Final: 97 | Asistencia: 98%
## → Nota final: 95.35 (A) - Excelente
## 
##  RESUMEN ACADÉMICO:
##  GPA: 4.00/4.0
##  Materias cursadas: 3
##  Materias aprobadas: 3
##  Tasa de aprobación: 100.0%
##  Estado académico:  Lista de Honor
## ============================================================

Sistema de Gestión Académica en Python

print("\n=== SISTEMA DE GESTIÓN ACADÉMICA ===")
## 
## === SISTEMA DE GESTIÓN ACADÉMICA ===
estudiantes_db = [
    {
        "nombre": "Ana Rodríguez", 
        "id": "EST001",
        "materias": {
            "Matemáticas": {"parcial1": 85, "parcial2": 88, "final": 92, "asistencia": 95},
            "Física": {"parcial1": 78, "parcial2": 82, "final": 85, "asistencia": 90},
            "Química": {"parcial1": 90, "parcial2": 87, "final": 94, "asistencia": 98}
        }
    },
    {
        "nombre": "Pedro Martínez", 
        "id": "EST002",
        "materias": {
            "Matemáticas": {"parcial1": 75, "parcial2": 79, "final": 82, "asistencia": 88},
            "Física": {"parcial1": 82, "parcial2": 85, "final": 88, "asistencia": 92},
            "Química": {"parcial1": 77, "parcial2": 80, "final": 83, "asistencia": 85}
        }
    },
    {
        "nombre": "Lucía Fernández", 
        "id": "EST003",
        "materias": {
            "Matemáticas": {"parcial1": 92, "parcial2": 94, "final": 96, "asistencia": 100},
            "Física": {"parcial1": 88, "parcial2": 91, "final": 93, "asistencia": 95},
            "Química": {"parcial1": 95, "parcial2": 92, "final": 97, "asistencia": 98}
        }
    }
]

def calcular_nota_final(parcial1, parcial2, final, asistencia):
    nota = (parcial1 * 0.25) + (parcial2 * 0.25) + (final * 0.40) + (asistencia * 0.10)
    return round(nota, 2)

def obtener_calificacion(nota):
    if nota >= 90:
        return {"letra": "A", "estado": "Excelente", "puntos": 4.0}
    elif nota >= 80:
        return {"letra": "B", "estado": "Bueno", "puntos": 3.0}
    elif nota >= 70:
        return {"letra": "C", "estado": "Satisfactorio", "puntos": 2.0}
    elif nota >= 60:
        return {"letra": "D", "estado": "Mínimo", "puntos": 1.0}
    else:
        return {"letra": "F", "estado": "Reprobado", "puntos": 0.0}

print("REPORTE ACADÉMICO DETALLADO")
## REPORTE ACADÉMICO DETALLADO
print("=" * 60)
## ============================================================
for estudiante in estudiantes_db:
    print(f"\nESTUDIANTE: {estudiante['nombre']} (ID: {estudiante['id']})")
    print("-" * 50)
    
    total_puntos = 0
    materias_cursadas = 0
    materias_aprobadas = 0
    
    for materia_nombre, materia_data in estudiante["materias"].items():
        nota_final = calcular_nota_final(
            materia_data["parcial1"],
            materia_data["parcial2"],
            materia_data["final"],
            materia_data["asistencia"]
        )
        
        calificacion = obtener_calificacion(nota_final)
        materias_cursadas += 1
        total_puntos += calificacion["puntos"]
        
        if calificacion["puntos"] > 0:
            materias_aprobadas += 1
        
        print(f" {materia_nombre}:")
        print(f" Parcial 1: {materia_data['parcial1']} | Parcial 2: {materia_data['parcial2']} | Final: {materia_data['final']} | Asistencia: {materia_data['asistencia']}%")
        print(f"→ Nota final: {nota_final:.2f} ({calificacion['letra']}) - {calificacion['estado']}")
        
        if nota_final < 80:
            if materia_data["asistencia"] < 90:
                print("  Recomendación: Mejorar asistencia")
            if materia_data["final"] < materia_data["parcial1"] or materia_data["final"] < materia_data["parcial2"]:
                print("  Recomendación: Prepararse mejor para exámenes finales")
        print()
    
    gpa = round(total_puntos / materias_cursadas, 2) if materias_cursadas > 0 else 0
    
    if gpa >= 3.5:
        estado_academico = "Lista de Honor"
    elif gpa >= 3.0:
        estado_academico = "Buen Rendimiento"
    elif gpa >= 2.0:
        estado_academico = "Rendimiento Satisfactorio"
    else:
        estado_academico = "Necesita Mejora"
    
    print(" RESUMEN ACADÉMICO:")
    print(f" GPA: {gpa}/4.0")
    print(f" Materias cursadas: {materias_cursadas}")
    print(f" Materias aprobadas: {materias_aprobadas}")
    print(f" Tasa de aprobación: {(materias_aprobadas/materias_cursadas*100):.1f}%")
    print(f" Estado académico: {estado_academico}")
    print("=" * 60)
## 
## ESTUDIANTE: Ana Rodríguez (ID: EST001)
## --------------------------------------------------
##  Matemáticas:
##  Parcial 1: 85 | Parcial 2: 88 | Final: 92 | Asistencia: 95%
## → Nota final: 89.55 (B) - Bueno
## 
##  Física:
##  Parcial 1: 78 | Parcial 2: 82 | Final: 85 | Asistencia: 90%
## → Nota final: 83.00 (B) - Bueno
## 
##  Química:
##  Parcial 1: 90 | Parcial 2: 87 | Final: 94 | Asistencia: 98%
## → Nota final: 91.65 (A) - Excelente
## 
##  RESUMEN ACADÉMICO:
##  GPA: 3.33/4.0
##  Materias cursadas: 3
##  Materias aprobadas: 3
##  Tasa de aprobación: 100.0%
##  Estado académico: Buen Rendimiento
## ============================================================
## 
## ESTUDIANTE: Pedro Martínez (ID: EST002)
## --------------------------------------------------
##  Matemáticas:
##  Parcial 1: 75 | Parcial 2: 79 | Final: 82 | Asistencia: 88%
## → Nota final: 80.10 (B) - Bueno
## 
##  Física:
##  Parcial 1: 82 | Parcial 2: 85 | Final: 88 | Asistencia: 92%
## → Nota final: 86.15 (B) - Bueno
## 
##  Química:
##  Parcial 1: 77 | Parcial 2: 80 | Final: 83 | Asistencia: 85%
## → Nota final: 80.95 (B) - Bueno
## 
##  RESUMEN ACADÉMICO:
##  GPA: 3.0/4.0
##  Materias cursadas: 3
##  Materias aprobadas: 3
##  Tasa de aprobación: 100.0%
##  Estado académico: Buen Rendimiento
## ============================================================
## 
## ESTUDIANTE: Lucía Fernández (ID: EST003)
## --------------------------------------------------
##  Matemáticas:
##  Parcial 1: 92 | Parcial 2: 94 | Final: 96 | Asistencia: 100%
## → Nota final: 94.90 (A) - Excelente
## 
##  Física:
##  Parcial 1: 88 | Parcial 2: 91 | Final: 93 | Asistencia: 95%
## → Nota final: 91.45 (A) - Excelente
## 
##  Química:
##  Parcial 1: 95 | Parcial 2: 92 | Final: 97 | Asistencia: 98%
## → Nota final: 95.35 (A) - Excelente
## 
##  RESUMEN ACADÉMICO:
##  GPA: 4.0/4.0
##  Materias cursadas: 3
##  Materias aprobadas: 3
##  Tasa de aprobación: 100.0%
##  Estado académico: Lista de Honor
## ============================================================

Simulación y Modelado en R

# Simulación de crecimiento poblacional
cat("\n=== SIMULACIÓN DE CRECIMIENTO POBLACIONAL ===\n")
## 
## === SIMULACIÓN DE CRECIMIENTO POBLACIONAL ===
# Parámetros de simulación
poblacion_inicial <- 10000
tasa_natalidad <- 0.025  # 2.5% anual
tasa_mortalidad <- 0.015  # 1.5% anual
tasa_migracion <- 0.008  # 0.8% anual (inmigración neta)
años_simulacion <- 20
# Variables para tracking
poblacion_actual <- poblacion_inicial
historial_poblacion <- numeric(años_simulacion + 1)
historial_poblacion[1] <- poblacion_inicial
cat("SIMULACIÓN A 20 AÑOS:\n")
## SIMULACIÓN A 20 AÑOS:
cat(sprintf("Población inicial: %s habitantes\n", format(poblacion_inicial, big.mark = ",")))
## Población inicial: 10,000 habitantes
cat(sprintf("Tasa de natalidad: %.1f%% anual\n", tasa_natalidad * 100))
## Tasa de natalidad: 2.5% anual
cat(sprintf("Tasa de mortalidad: %.1f%% anual\n", tasa_mortalidad * 100))
## Tasa de mortalidad: 1.5% anual
cat(sprintf("Migración neta: %.1f%% anual\n\n", tasa_migracion * 100))
## Migración neta: 0.8% anual
cat(sprintf("%-6s %12s %8s %8s %8s %12s\n",
            "Año", "Población", "Nacim.", "Muertes", "Migrac.", "Crecimiento"))
## Año     Población   Nacim.  Muertes  Migrac.  Crecimiento
cat(strrep("-", 65), "\n")
## -----------------------------------------------------------------
for (año in 1:años_simulacion) {
  # Calcular cambios poblacionales
  nacimientos <- round(poblacion_actual * tasa_natalidad)
  muertes <- round(poblacion_actual * tasa_mortalidad)
  migracion <- round(poblacion_actual * tasa_migracion)
  # Aplicar cambios
  poblacion_anterior <- poblacion_actual
  poblacion_actual <- poblacion_actual + nacimientos - muertes + migracion
  crecimiento_neto <- poblacion_actual - poblacion_anterior
  # Guardar en historial
  historial_poblacion[año + 1] <- poblacion_actual
  # Mostrar resultados del año
  cat(sprintf("%-6d %12s %8s %8s %8s %+12s\n",
              año,
              format(poblacion_actual, big.mark = ","),
              format(nacimientos, big.mark = ","),
              format(muertes, big.mark = ","),
              format(migracion, big.mark = ","),
              format(crecimiento_neto, big.mark = ",")))
  # Análisis de tendencias cada 5 años
  if (año %% 5 == 0) {
    crecimiento_periodo <- poblacion_actual - historial_poblacion[año - 4]
    tasa_crecimiento_periodo <- ((poblacion_actual / historial_poblacion[año - 4]) ^ (1/5) - 1) * 100
    cat(sprintf("  Crecimiento últimos 5 años: %s (%.2f%% anual promedio)\n",
                format(crecimiento_periodo, big.mark = ","),
                tasa_crecimiento_periodo))
  }
}
## 1            10,180      250      150       80          180
## 2            10,362      254      153       81          182
## 3            10,549      259      155       83          187
## 4            10,739      264      158       84          190
## 5            10,932      268      161       86          193
##   Crecimiento últimos 5 años: 932 (1.80% anual promedio)
## 6            11,128      273      164       87          196
## 7            11,328      278      167       89          200
## 8            11,532      283      170       91          204
## 9            11,739      288      173       92          207
## 10           11,950      293      176       94          211
##   Crecimiento últimos 5 años: 1,018 (1.80% anual promedio)
## 11           12,166      299      179       96          216
## 12           12,385      304      182       97          219
## 13           12,608      310      186       99          223
## 14           12,835      315      189      101          227
## 15           13,066      321      193      103          231
##   Crecimiento últimos 5 años: 1,116 (1.80% anual promedio)
## 16           13,302      327      196      105          236
## 17           13,541      333      200      106          239
## 18           13,785      339      203      108          244
## 19           14,033      345      207      110          248
## 20           14,286      351      210      112          253
##   Crecimiento últimos 5 años: 1,220 (1.80% anual promedio)
# Análisis final
crecimiento_total <- poblacion_actual - poblacion_inicial
tasa_crecimiento_anual_promedio <- ((poblacion_actual / poblacion_inicial) ^ (1/años_simulacion) - 1) * 100
duplicacion_años <- log(2) / log(1 + (tasa_crecimiento_anual_promedio / 100))
cat(strrep("-", 65), "\n")
## -----------------------------------------------------------------
cat("\nANÁLISIS FINAL DE LA SIMULACIÓN:\n")
## 
## ANÁLISIS FINAL DE LA SIMULACIÓN:
cat(sprintf("Población final: %s habitantes\n", format(poblacion_actual, big.mark = ",")))
## Población final: 14,286 habitantes
cat(sprintf("Crecimiento total: %s habitantes (%.1f%%)\n",
            format(crecimiento_total, big.mark = ","),
            (crecimiento_total / poblacion_inicial) * 100))
## Crecimiento total: 4,286 habitantes (42.9%)
cat(sprintf("Tasa de crecimiento anual promedio: %.2f%%\n", tasa_crecimiento_anual_promedio))
## Tasa de crecimiento anual promedio: 1.80%
cat(sprintf("Tiempo estimado para duplicar población: %.1f años\n", duplicacion_años))
## Tiempo estimado para duplicar población: 38.9 años
# Proyecciones adicionales
if (tasa_crecimiento_anual_promedio > 0) {
  población_en_50_años <- poblacion_inicial * (1 + tasa_crecimiento_anual_promedio / 100) ^ 50
  cat(sprintf("Proyección a 50 años: %s habitantes\n",
              format(round(población_en_50_años), big.mark = ",")))
}
## Proyección a 50 años: 24,394 habitantes

Simulación y Modelado en Python

import math

print("\n=== SIMULACIÓN DE CRECIMIENTO POBLACIONAL ===")
## 
## === SIMULACIÓN DE CRECIMIENTO POBLACIONAL ===
poblacion_inicial = 10000
tasa_natalidad = 0.025
tasa_mortalidad = 0.015
tasa_migracion = 0.008
años_simulacion = 20

poblacion_actual = poblacion_inicial
historial_poblacion = [0] * (años_simulacion + 1)
historial_poblacion[0] = poblacion_inicial

print("SIMULACIÓN A 20 AÑOS:")
## SIMULACIÓN A 20 AÑOS:
print(f"Población inicial: {poblacion_inicial:,} habitantes")
## Población inicial: 10,000 habitantes
print(f"Tasa de natalidad: {tasa_natalidad*100:.1f}% anual")
## Tasa de natalidad: 2.5% anual
print(f"Tasa de mortalidad: {tasa_mortalidad*100:.1f}% anual")
## Tasa de mortalidad: 1.5% anual
print(f"Migración neta: {tasa_migracion*100:.1f}% anual\n")
## Migración neta: 0.8% anual
print(f"{'Año':<6} {'Población':>12} {'Nacim.':>8} {'Muertes':>8} {'Migrac.':>8} {'Crecimiento':>12}")
## Año       Población   Nacim.  Muertes  Migrac.  Crecimiento
print("-" * 65)
## -----------------------------------------------------------------
for año in range(1, años_simulacion + 1):
    nacimientos = round(poblacion_actual * tasa_natalidad)
    muertes = round(poblacion_actual * tasa_mortalidad)
    migracion = round(poblacion_actual * tasa_migracion)
    
    poblacion_anterior = poblacion_actual
    poblacion_actual = poblacion_actual + nacimientos - muertes + migracion
    crecimiento_neto = poblacion_actual - poblacion_anterior
    
    historial_poblacion[año] = poblacion_actual
    
    print(f"{año:<6} {poblacion_actual:>12,} {nacimientos:>8,} {muertes:>8,} {migracion:>8,} {crecimiento_neto:>+12,}")
    
    if año % 5 == 0 and año >= 5:
        crecimiento_periodo = poblacion_actual - historial_poblacion[año - 5]
        tasa_crecimiento_periodo = ((poblacion_actual / historial_poblacion[año - 5]) ** (1/5) - 1) * 100
        print(f"  Crecimiento últimos 5 años: {crecimiento_periodo:,} ({tasa_crecimiento_periodo:.2f}% anual promedio)")
## 1            10,180      250      150       80         +180
## 2            10,362      254      153       81         +182
## 3            10,549      259      155       83         +187
## 4            10,739      264      158       84         +190
## 5            10,932      268      161       86         +193
##   Crecimiento últimos 5 años: 932 (1.80% anual promedio)
## 6            11,128      273      164       87         +196
## 7            11,328      278      167       89         +200
## 8            11,532      283      170       91         +204
## 9            11,739      288      173       92         +207
## 10           11,950      293      176       94         +211
##   Crecimiento últimos 5 años: 1,018 (1.80% anual promedio)
## 11           12,166      299      179       96         +216
## 12           12,385      304      182       97         +219
## 13           12,608      310      186       99         +223
## 14           12,835      315      189      101         +227
## 15           13,066      321      193      103         +231
##   Crecimiento últimos 5 años: 1,116 (1.80% anual promedio)
## 16           13,302      327      196      105         +236
## 17           13,541      333      200      106         +239
## 18           13,785      339      203      108         +244
## 19           14,033      345      207      110         +248
## 20           14,286      351      210      112         +253
##   Crecimiento últimos 5 años: 1,220 (1.80% anual promedio)
print("-" * 65)
## -----------------------------------------------------------------
crecimiento_total = poblacion_actual - poblacion_inicial
tasa_crecimiento_anual_promedio = ((poblacion_actual / poblacion_inicial) ** (1/años_simulacion) - 1) * 100
duplicacion_años = math.log(2) / math.log(1 + (tasa_crecimiento_anual_promedio / 100))

print("\nANÁLISIS FINAL DE LA SIMULACIÓN:")
## 
## ANÁLISIS FINAL DE LA SIMULACIÓN:
print(f"Población final: {poblacion_actual:,} habitantes")
## Población final: 14,286 habitantes
print(f"Crecimiento total: {crecimiento_total:,} habitantes ({(crecimiento_total/poblacion_inicial)*100:.1f}%)")
## Crecimiento total: 4,286 habitantes (42.9%)
print(f"Tasa de crecimiento anual promedio: {tasa_crecimiento_anual_promedio:.2f}%")
## Tasa de crecimiento anual promedio: 1.80%
print(f"Tiempo estimado para duplicar población: {duplicacion_años:.1f} años")
## Tiempo estimado para duplicar población: 38.9 años
if tasa_crecimiento_anual_promedio > 0:
    población_en_50_años = poblacion_inicial * (1 + tasa_crecimiento_anual_promedio / 100) ** 50
    print(f"Proyección a 50 años: {round(población_en_50_años):,} habitantes")
## Proyección a 50 años: 24,394 habitantes

Procesamiento Secuencial Dependiente

ANÁLISIS DE SERIES TEMPORALES en R

# Cálculos que dependen de iteraciones anteriores
cat("\n=== ANÁLISIS DE SERIES TEMPORALES ===\n")
## 
## === ANÁLISIS DE SERIES TEMPORALES ===
# Datos de ventas mensuales
ventas_mensuales <- c(100000, 108000, 95000, 112000, 125000, 118000,
                      135000, 142000, 128000, 155000, 168000, 175000)
meses_nombres <- c("Ene", "Feb", "Mar", "Abr", "May", "Jun",
                   "Jul", "Ago", "Sep", "Oct", "Nov", "Dic")
# Variables para cálculos acumulativos
ventas_acumuladas <- numeric(length(ventas_mensuales))
variacion_mensual <- numeric(length(ventas_mensuales))
promedio_movil_3 <- numeric(length(ventas_mensuales))
cat("ANÁLISIS DE TENDENCIAS DE VENTAS:\n")
## ANÁLISIS DE TENDENCIAS DE VENTAS:
cat(sprintf("%-4s %10s %12s %10s %12s %s\n",
            "Mes", "Ventas", "Acumulado", "Variación", "Prom.Móvil", "Tendencia"))
## Mes      Ventas    Acumulado Variación  Prom.Móvil Tendencia
cat(strrep("-", 75), "\n")
## ---------------------------------------------------------------------------
for (i in 1:length(ventas_mensuales)) {
  mes <- meses_nombres[i]
  venta_actual <- ventas_mensuales[i]
  # Ventas acumuladas
  if (i == 1) {
    ventas_acumuladas[i] <- venta_actual
    variacion_mensual[i] <- 0  # No hay mes anterior
  } else {
    ventas_acumuladas[i] <- ventas_acumuladas[i - 1] + venta_actual
    variacion_mensual[i] <- ((venta_actual - ventas_mensuales[i - 1]) / ventas_mensuales[i - 1]) * 100
  }
  # Promedio móvil de 3 meses
  if (i >= 3) {
    promedio_movil_3[i] <- mean(ventas_mensuales[(i - 2):i])
  } else {
    promedio_movil_3[i] <- NA
  }
  # Determinar tendencia
  if (i == 1) {
    tendencia <- "Inicio"
  } else if (variacion_mensual[i] > 5) {
    tendencia <- " Alza fuerte"
  } else if (variacion_mensual[i] > 0) {
    tendencia <- " Crecimiento"
  } else if (variacion_mensual[i] > -5) {
    tendencia <- " Leve baja"
  } else {
    tendencia <- " Baja fuerte"
  }
  # Mostrar resultados
  variacion_str <- if (i == 1) " - " else sprintf("%+.1f%%", variacion_mensual[i])
  promedio_str <- if (is.na(promedio_movil_3[i])) " - " else sprintf("%8.0f", promedio_movil_3[i])
  cat(sprintf("%-4s %10s %12s %10s %12s %s\n",
              mes,
              format(venta_actual, big.mark = ","),
              format(ventas_acumuladas[i], big.mark = ","),
              variacion_str,
              promedio_str,
              tendencia))
}
## Ene       1e+05        1e+05         -            -  Inicio
## Feb     108,000      208,000      +8.0%           -   Alza fuerte
## Mar      95,000      303,000     -12.0%       101000  Baja fuerte
## Abr     112,000      415,000     +17.9%       105000  Alza fuerte
## May     125,000      540,000     +11.6%       110667  Alza fuerte
## Jun     118,000      658,000      -5.6%       118333  Baja fuerte
## Jul     135,000      793,000     +14.4%       126000  Alza fuerte
## Ago     142,000      935,000      +5.2%       131667  Alza fuerte
## Sep     128,000    1,063,000      -9.9%       135000  Baja fuerte
## Oct     155,000    1,218,000     +21.1%       141667  Alza fuerte
## Nov     168,000    1,386,000      +8.4%       150333  Alza fuerte
## Dic     175,000    1,561,000      +4.2%       166000  Crecimiento
# Análisis de resultados
cat(strrep("-", 75), "\n")
## ---------------------------------------------------------------------------
crecimiento_anual <- ((ventas_mensuales[12] - ventas_mensuales[1]) / ventas_mensuales[1]) * 100
promedio_mensual <- mean(ventas_mensuales)
mejor_mes_idx <- which.max(ventas_mensuales)
peor_mes_idx <- which.min(ventas_mensuales)
cat("\nRESUMEN ANUAL:\n")
## 
## RESUMEN ANUAL:
cat(sprintf("Ventas totales: $%s\n", format(sum(ventas_mensuales), big.mark = ",")))
## Ventas totales: $1,561,000
cat(sprintf("Promedio mensual: $%s\n", format(round(promedio_mensual), big.mark = ",")))
## Promedio mensual: $130,083
cat(sprintf("Crecimiento anual: %.1f%%\n", crecimiento_anual))
## Crecimiento anual: 75.0%
cat(sprintf("Mejor mes: %s ($%s)\n", meses_nombres[mejor_mes_idx], format(ventas_mensuales[mejor_mes_idx], big.mark = ",")))
## Mejor mes: Dic ($175,000)
cat(sprintf("Peor mes: %s ($%s)\n", meses_nombres[peor_mes_idx], format(ventas_mensuales[peor_mes_idx], big.mark = ",")))
## Peor mes: Mar ($95,000)

ANÁLISIS DE SERIES TEMPORALES en Python

print("\n=== ANÁLISIS DE SERIES TEMPORALES ===")
## 
## === ANÁLISIS DE SERIES TEMPORALES ===
ventas_mensuales = [100000, 108000, 95000, 112000, 125000, 118000,
                    135000, 142000, 128000, 155000, 168000, 175000]
meses_nombres = ["Ene", "Feb", "Mar", "Abr", "May", "Jun",
                 "Jul", "Ago", "Sep", "Oct", "Nov", "Dic"]

ventas_acumuladas = [0] * len(ventas_mensuales)
variacion_mensual = [0] * len(ventas_mensuales)
promedio_movil_3 = [0] * len(ventas_mensuales)

print("ANÁLISIS DE TENDENCIAS DE VENTAS:")
## ANÁLISIS DE TENDENCIAS DE VENTAS:
print(f"{'Mes':<4} {'Ventas':>10} {'Acumulado':>12} {'Variación':>10} {'Prom.Móvil':>12} {'Tendencia':<10}")
## Mes      Ventas    Acumulado  Variación   Prom.Móvil Tendencia
print("-" * 75)
## ---------------------------------------------------------------------------
for i in range(len(ventas_mensuales)):
    mes = meses_nombres[i]
    venta_actual = ventas_mensuales[i]
    
    if i == 0:
        ventas_acumuladas[i] = venta_actual
        variacion_mensual[i] = 0
    else:
        ventas_acumuladas[i] = ventas_acumuladas[i-1] + venta_actual
        variacion_mensual[i] = ((venta_actual - ventas_mensuales[i-1]) / ventas_mensuales[i-1]) * 100
    
    if i >= 2:
        promedio_movil_3[i] = sum(ventas_mensuales[i-2:i+1]) / 3
    else:
        promedio_movil_3[i] = None
    
    if i == 0:
        tendencia = "Inicio"
    elif variacion_mensual[i] > 5:
        tendencia = "Alza fuerte"
    elif variacion_mensual[i] > 0:
        tendencia = "Crecimiento"
    elif variacion_mensual[i] > -5:
        tendencia = "Leve baja"
    else:
        tendencia = "Baja fuerte"
    
    variacion_str = " - " if i == 0 else f"{variacion_mensual[i]:+.1f}%"
    promedio_str = " - " if promedio_movil_3[i] is None else f"{promedio_movil_3[i]:8.0f}"
    
    print(f"{mes:<4} {venta_actual:>10,} {ventas_acumuladas[i]:>12,} {variacion_str:>10} {promedio_str:>12} {tendencia:<10}")
## Ene     100,000      100,000         -            -  Inicio    
## Feb     108,000      208,000      +8.0%           -  Alza fuerte
## Mar      95,000      303,000     -12.0%       101000 Baja fuerte
## Abr     112,000      415,000     +17.9%       105000 Alza fuerte
## May     125,000      540,000     +11.6%       110667 Alza fuerte
## Jun     118,000      658,000      -5.6%       118333 Baja fuerte
## Jul     135,000      793,000     +14.4%       126000 Alza fuerte
## Ago     142,000      935,000      +5.2%       131667 Alza fuerte
## Sep     128,000    1,063,000      -9.9%       135000 Baja fuerte
## Oct     155,000    1,218,000     +21.1%       141667 Alza fuerte
## Nov     168,000    1,386,000      +8.4%       150333 Alza fuerte
## Dic     175,000    1,561,000      +4.2%       166000 Crecimiento
print("-" * 75)
## ---------------------------------------------------------------------------
crecimiento_anual = ((ventas_mensuales[11] - ventas_mensuales[0]) / ventas_mensuales[0]) * 100
promedio_mensual = sum(ventas_mensuales) / len(ventas_mensuales)
mejor_mes_idx = ventas_mensuales.index(max(ventas_mensuales))
peor_mes_idx = ventas_mensuales.index(min(ventas_mensuales))

print("\nRESUMEN ANUAL:")
## 
## RESUMEN ANUAL:
print(f"Ventas totales: ${sum(ventas_mensuales):,}")
## Ventas totales: $1,561,000
print(f"Promedio mensual: ${round(promedio_mensual):,}")
## Promedio mensual: $130,083
print(f"Crecimiento anual: {crecimiento_anual:.1f}%")
## Crecimiento anual: 75.0%
print(f"Mejor mes: {meses_nombres[mejor_mes_idx]} (${ventas_mensuales[mejor_mes_idx]:,})")
## Mejor mes: Dic ($175,000)
print(f"Peor mes: {meses_nombres[peor_mes_idx]} (${ventas_mensuales[peor_mes_idx]:,})")
## Peor mes: Mar ($95,000)

Bucles while

Los bucles while representan una estructura de control fundamental que se ejecuta mientras una condición específica permanezca verdadera.
A diferencia de los bucles for, que iteran sobre secuencias predefinidas, los bucles while continúan ejecutándose hasta que una condición cambie, lo que los hace ideales para situaciones donde no sabemos exactamente cuántas iteraciones necesitaremos.

Anatomía de un Bucle while en R

# Estructura básica
#while (condición) {
# Cuerpo del bucle
# Código que se ejecuta mientras la condición sea TRUE
# IMPORTANTE: Debe incluir algo que eventualmente cambie la condición
#}

Anatomía de un Bucle while en Python

# Estructura básica
# while condición:
#     # Cuerpo del bucle
#     # Código que se ejecuta mientras la condición sea True
#     # IMPORTANTE: Debe incluir algo que eventualmente cambie la condición

Proceso de Ejecución en R

# Ejemplo paso a paso
contador <- 1
while (contador <= 3) {
  print(paste("Iteración:", contador))
  contador <- contador + 1  # CRÍTICO: actualizar la variable de control
}
## [1] "Iteración: 1"
## [1] "Iteración: 2"
## [1] "Iteración: 3"
# Proceso interno:
# Evaluación 1: contador(1) <= 3 → TRUE → ejecutar cuerpo → contador = 2
# Evaluación 2: contador(2) <= 3 → TRUE → ejecutar cuerpo → contador = 3
# Evaluación 3: contador(3) <= 3 → TRUE → ejecutar cuerpo → contador = 4
# Evaluación 4: contador(4) <= 3 → FALSE → terminar bucle

Proceso de Ejecución en Python

# Ejemplo paso a paso
contador = 1
while contador <= 3:
    print(f"Iteración: {contador}")
    contador = contador + 1  # CRÍTICO: actualizar la variable de control
## Iteración: 1
## Iteración: 2
## Iteración: 3

# Proceso interno:
# Evaluación 1: contador(1) <= 3 → True → ejecutar cuerpo → contador = 2
# Evaluación 2: contador(2) <= 3 → True → ejecutar cuerpo → contador = 3
# Evaluación 3: contador(3) <= 3 → True → ejecutar cuerpo → contador = 4
# Evaluación 4: contador(4) <= 3 → False → terminar bucle

Contadores y Acumuladores en R

# Sistema de contador simple
cat("=== CONTADOR BÁSICO ===\n")
## === CONTADOR BÁSICO ===
numero <- 1
suma_total <- 0
cat("Sumando números del 1 al 5:\n")
## Sumando números del 1 al 5:
while (numero <= 5) {
  suma_total <- suma_total + numero
  cat(sprintf("Sumando %d: total = %d\n", numero, suma_total))
  numero <- numero + 1
}
## Sumando 1: total = 1
## Sumando 2: total = 3
## Sumando 3: total = 6
## Sumando 4: total = 10
## Sumando 5: total = 15
cat(sprintf("Suma final: %d\n", suma_total))
## Suma final: 15
# Contador con condición más compleja
cat("\n=== SUMA HASTA LÍMITE ===\n")
## 
## === SUMA HASTA LÍMITE ===
suma <- 0
contador <- 1
limite <- 100
cat(sprintf("Sumando números hasta que la suma supere %d:\n", limite))
## Sumando números hasta que la suma supere 100:
while (suma <= limite) {
  suma <- suma + contador
  cat(sprintf("Suma = %d (agregando %d)\n", suma, contador))
  contador <- contador + 1
}
## Suma = 1 (agregando 1)
## Suma = 3 (agregando 2)
## Suma = 6 (agregando 3)
## Suma = 10 (agregando 4)
## Suma = 15 (agregando 5)
## Suma = 21 (agregando 6)
## Suma = 28 (agregando 7)
## Suma = 36 (agregando 8)
## Suma = 45 (agregando 9)
## Suma = 55 (agregando 10)
## Suma = 66 (agregando 11)
## Suma = 78 (agregando 12)
## Suma = 91 (agregando 13)
## Suma = 105 (agregando 14)
cat(sprintf("Se necesitaron %d números para superar %d\n", contador - 1, limite))
## Se necesitaron 14 números para superar 100

Contadores y Acumuladores en Python

# Sistema de contador simple
print("=== CONTADOR BÁSICO ===")
## === CONTADOR BÁSICO ===
numero = 1
suma_total = 0
print("Sumando números del 1 al 5:")
## Sumando números del 1 al 5:
while numero <= 5:
    suma_total += numero  # Equivalente a suma_total = suma_total + numero
    print(f"Sumando {numero}: total = {suma_total}")
    numero += 1  # Operador de incremento más conciso
## Sumando 1: total = 1
## Sumando 2: total = 3
## Sumando 3: total = 6
## Sumando 4: total = 10
## Sumando 5: total = 15
print(f"Suma final: {suma_total}")
## Suma final: 15
# Contador con condición más compleja
print("\n=== SUMA HASTA LÍMITE ===")
## 
## === SUMA HASTA LÍMITE ===
suma = 0
contador = 1
limite = 100
print(f"Sumando números hasta que la suma supere {limite}:")
## Sumando números hasta que la suma supere 100:
while suma <= limite:
    suma += contador
    print(f"Suma = {suma} (agregando {contador})")
    contador += 1
## Suma = 1 (agregando 1)
## Suma = 3 (agregando 2)
## Suma = 6 (agregando 3)
## Suma = 10 (agregando 4)
## Suma = 15 (agregando 5)
## Suma = 21 (agregando 6)
## Suma = 28 (agregando 7)
## Suma = 36 (agregando 8)
## Suma = 45 (agregando 9)
## Suma = 55 (agregando 10)
## Suma = 66 (agregando 11)
## Suma = 78 (agregando 12)
## Suma = 91 (agregando 13)
## Suma = 105 (agregando 14)
print(f"Se necesitaron {contador-1} números para superar {limite}")
## Se necesitaron 14 números para superar 100

Búsqueda y Validación en R

# Sistema de búsqueda secuencial
cat("\n=== BÚSQUEDA EN LISTA ===\n")
## 
## === BÚSQUEDA EN LISTA ===
productos <- c("Laptop", "Mouse", "Teclado", "Monitor", "Auriculares")
producto_buscado <- "Monitor"
indice <- 1
encontrado <- FALSE
cat(sprintf("Buscando '%s' en la lista:\n", producto_buscado))
## Buscando 'Monitor' en la lista:
while (indice <= length(productos) && !encontrado) {
  producto_actual <- productos[indice]
  cat(sprintf("Revisando posición %d: %s\n", indice, producto_actual))
  if (producto_actual == producto_buscado) {
    encontrado <- TRUE
    cat(sprintf("¡Encontrado! '%s' está en la posición %d\n", producto_buscado, indice))
  } else {
    indice <- indice + 1
  }
}
## Revisando posición 1: Laptop
## Revisando posición 2: Mouse
## Revisando posición 3: Teclado
## Revisando posición 4: Monitor
## ¡Encontrado! 'Monitor' está en la posición 4
if (!encontrado) {
  cat(sprintf("'%s' no se encontró en la lista\n", producto_buscado))
}

# Validación de entrada con bucle while
cat("\n=== VALIDACIÓN DE ENTRADA ===\n")
## 
## === VALIDACIÓN DE ENTRADA ===
# Simulación de validación de edad
entradas_simuladas <- c("abc", "-5", "150", "25")  # Simular entradas del usuario
indice_entrada <- 1
edad_valida <- FALSE
edad <- NA
cat("Solicitando edad válida (18-100 años):\n")
## Solicitando edad válida (18-100 años):
while (!edad_valida && indice_entrada <= length(entradas_simuladas)) {
  entrada <- entradas_simuladas[indice_entrada]
  cat(sprintf("Entrada del usuario: '%s'\n", entrada))
  # Intentar convertir a número
  edad_convertida <- suppressWarnings(as.numeric(entrada))
  if (is.na(edad_convertida)) {
    cat("Error: Debe ingresar un número válido\n")
  } else if (edad_convertida < 18) {
    cat("Error: Debe ser mayor de 18 años\n")
  } else if (edad_convertida > 100) {
    cat("Error: Edad no puede ser mayor a 100 años\n")
  } else {
    edad <- edad_convertida
    edad_valida <- TRUE
    cat(sprintf("Edad válida aceptada: %d años\n", edad))
  }
  indice_entrada <- indice_entrada + 1
}
## Entrada del usuario: 'abc'
## Error: Debe ingresar un número válido
## Entrada del usuario: '-5'
## Error: Debe ser mayor de 18 años
## Entrada del usuario: '150'
## Error: Edad no puede ser mayor a 100 años
## Entrada del usuario: '25'
## Edad válida aceptada: 25 años
if (!edad_valida) {
  cat("No se pudo obtener una edad válida después de varios intentos\n")
}

Búsqueda y Validación en Python

# Sistema de búsqueda secuencial
print("\n=== BÚSQUEDA EN LISTA ===")
## 
## === BÚSQUEDA EN LISTA ===
productos = ["Laptop", "Mouse", "Teclado", "Monitor", "Auriculares"]
producto_buscado = "Monitor"
indice = 0  # Python usa índices base 0 (no base 1 como R)
encontrado = False
print(f"Buscando '{producto_buscado}' en la lista:")
## Buscando 'Monitor' en la lista:
while indice < len(productos) and not encontrado:
    producto_actual = productos[indice]
    print(f"Revisando posición {indice + 1}: {producto_actual}")  # +1 para mostrar posición humana
    if producto_actual == producto_buscado:
        encontrado = True
        print(f"¡Encontrado! '{producto_buscado}' está en la posición {indice + 1}")
    else:
        indice += 1
## Revisando posición 1: Laptop
## Revisando posición 2: Mouse
## Revisando posición 3: Teclado
## Revisando posición 4: Monitor
## ¡Encontrado! 'Monitor' está en la posición 4
if not encontrado:
    print(f"'{producto_buscado}' no se encontró en la lista")

# Validación de entrada con bucle while
print("\n=== VALIDACIÓN DE ENTRADA ===")
## 
## === VALIDACIÓN DE ENTRADA ===
# Simulación de validación de edad
entradas_simuladas = ["abc", "-5", "150", "25"]
indice_entrada = 0
edad_valida = False
edad = None  # Equivalente a NA en R
print("Solicitando edad válida (18-100 años):")
## Solicitando edad válida (18-100 años):
while not edad_valida and indice_entrada < len(entradas_simuladas):
    entrada = entradas_simuladas[indice_entrada]
    print(f"Entrada del usuario: '{entrada}'")
    
    # Intentar convertir a número (manejo de errores más explícito)
    try:
        edad_convertida = float(entrada)
        if edad_convertida < 18:
            print("Error: Debe ser mayor de 18 años")
        elif edad_convertida > 100:
            print("Error: Edad no puede ser mayor a 100 años")
        else:
            edad = int(edad_convertida)  # Convertir a entero
            edad_valida = True
            print(f"Edad válida aceptada: {edad} años")
    except ValueError:  # Capturar error de conversión
        print("Error: Debe ingresar un número válido")
    
    indice_entrada += 1
## Entrada del usuario: 'abc'
## Error: Debe ingresar un número válido
## Entrada del usuario: '-5'
## Error: Debe ser mayor de 18 años
## Entrada del usuario: '150'
## Error: Edad no puede ser mayor a 100 años
## Entrada del usuario: '25'
## Edad válida aceptada: 25 años

if not edad_valida:
    print("No se pudo obtener una edad válida después de varios intentos")

Bucles repeat

Los bucles repeat crean bucles infinitos que deben terminarse explícitamente con break.
Se ejecutan al menos una vez, garantizado.

Estructura Básica en R

#repeat {
# código a ejecutar
# if (condición_de_salida) {
# break
# }
#}

Estructura Básica en Python

# Estructura básica
# while True:
#     # código a ejecutar
#     if condición_de_salida:
#         break

Ejemplo en R

contador <- 1
repeat {
  print(paste("Iteración:", contador))
  contador <- contador + 1
  if (contador > 3) {
    break
  }
}
## [1] "Iteración: 1"
## [1] "Iteración: 2"
## [1] "Iteración: 3"

Ejemplo en Python

contador = 1
while True:
    print(f"Iteración: {contador}")
    contador += 1
    if contador > 3:
        break
## Iteración: 1
## Iteración: 2
## Iteración: 3

Menús Interactivos en R

repeat {
  cat("1. Opción A\n2. Opción B\n3. Salir\n")
  # opcion <- readline("Seleccione: ")
  opcion <- "3"  # Simulación
  if (opcion == "1") {
    print("Ejecutando opción A")
  } else if (opcion == "2") {
    print("Ejecutando opción B")
  } else if (opcion == "3") {
    print("Saliendo...")
    break
  } else {
    print("Opción inválida")
  }
}
## 1. Opción A
## 2. Opción B
## 3. Salir
## [1] "Saliendo..."

Menús Interactivos en Python

while True:
    print("1. Opción A")
    print("2. Opción B")
    print("3. Salir")
    opcion = "3"  # Simulación
    # opcion = input("Seleccione: ")
    
    if opcion == "1":
        print("Ejecutando opción A")
    elif opcion == "2":
        print("Ejecutando opción B")
    elif opcion == "3":
        print("Saliendo...")
        break
    else:
        print("Opción inválida")
## 1. Opción A
## 2. Opción B
## 3. Salir
## Saliendo...

Procesamiento Hasta Condición en R

suma <- 0
repeat {
  numero <- sample(1:10, 1)  # Número aleatorio
  suma <- suma + numero
  print(paste("Sumando:", numero, "Total:", suma))
  if (suma >= 20) {
    print("Meta alcanzada")
    break
  }
}
## [1] "Sumando: 8 Total: 8"
## [1] "Sumando: 9 Total: 17"
## [1] "Sumando: 9 Total: 26"
## [1] "Meta alcanzada"

Procesamiento Hasta Condición en Python

import random
suma = 0
while True:
    numero = random.randint(1, 10)
    suma += numero
    print(f"Sumando: {numero} Total: {suma}")
    if suma >= 20:
        print("Meta alcanzada")
        break
## Sumando: 5 Total: 5
## Sumando: 2 Total: 7
## Sumando: 3 Total: 10
## Sumando: 9 Total: 19
## Sumando: 1 Total: 20
## Meta alcanzada

Control de bucles

Declaraciones de Control

break - Terminar Bucle

Termina inmediatamente el bucle más interno y continúa con la siguiente instrucción.

Ejemplo 1 en R:

# Buscar primer número par mayor que 10
for (i in 1:20) {
  if (i > 10 && i %% 2 == 0) {
    print(paste("Primer par mayor que 10:", i))
    break
  }
}
## [1] "Primer par mayor que 10: 12"

Ejemplo 1 en Python:

for i in range(1, 21):
    if i > 10 and i % 2 == 0:
        print(f"Primer par mayor que 10: {i}")
        break
## Primer par mayor que 10: 12

next - Saltar Iteración

Salta el resto de la iteración actual y continúa con la siguiente.

Ejemplo 2 en R:

# Procesar solo números impares
for (i in 1:10) {
  if (i %% 2 == 0) {
    next  # Saltar números pares
  }
  print(paste("Número impar:", i))
}
## [1] "Número impar: 1"
## [1] "Número impar: 3"
## [1] "Número impar: 5"
## [1] "Número impar: 7"
## [1] "Número impar: 9"

Ejemplo 2 en Python:

for i in range(1, 11):
    if i % 2 == 0:
        continue
    print(f"Número impar: {i}")
## Número impar: 1
## Número impar: 3
## Número impar: 5
## Número impar: 7
## Número impar: 9

Bucles Anidados con Control

Ejemplo 3 en R:

# Matriz: salir de bucle interno vs externo
for (i in 1:3) {
  print(paste("Fila", i))
  for (j in 1:3) {
    if (i == 2 && j == 2) {
      print("Saltando elemento (2,2)")
      next  # Solo salta esta iteración del bucle interno
    }
    print(paste(" Columna", j))
  }
}
## [1] "Fila 1"
## [1] " Columna 1"
## [1] " Columna 2"
## [1] " Columna 3"
## [1] "Fila 2"
## [1] " Columna 1"
## [1] "Saltando elemento (2,2)"
## [1] " Columna 3"
## [1] "Fila 3"
## [1] " Columna 1"
## [1] " Columna 2"
## [1] " Columna 3"

Ejemplo 3 en Python:

for i in range(1, 4):
    print(f"Fila {i}")
    for j in range(1, 4):
        if i == 2 and j == 2:
            print("Saltando elemento (2,2)")
            continue
        print(f" Columna {j}")
## Fila 1
##  Columna 1
##  Columna 2
##  Columna 3
## Fila 2
##  Columna 1
## Saltando elemento (2,2)
##  Columna 3
## Fila 3
##  Columna 1
##  Columna 2
##  Columna 3