para las ñoñis !

aprende y listo

para las ñoñis !

Aprende programación desde cero con juegos, historia y mucha creatividad.

Perrito negro 💡 🧠 💻

🔢 ¿Cómo entienden las computadoras los números?

Antes de programar, necesitas entender un secreto: las computadoras no entienden números como tú. Tú usas 10 dígitos (0-9), pero las computadoras solo entienden 2: 0 y 1. ¿Por qué? Porque funcionan con electricidad: apagado (0) o encendido (1). Aquí aprenderás cómo funciona esto y por qué es importante para programar Arduino.

🔟 Sistema Decimal (el que ya conoces)

¿Qué es? Es el sistema de números que usas todos los días. Se llama "decimal" porque usa 10 dígitos: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9.

¿Cómo funciona? Cada posición en un número tiene un valor que es una potencia de 10:

Ejemplo: El número 365

Posición Centenas (10²) Decenas (10¹) Unidades (10⁰)
Valor posicional 100 10 1
Dígito 3 6 5
Cálculo 3 × 100 = 300 6 × 10 = 60 5 × 1 = 5

Total: 300 + 60 + 5 = 365

💡 Punto clave: Cada posición vale 10 veces más que la posición a su derecha. Por eso se llama "base 10".

🔢 Sistema Binario (el lenguaje de las computadoras)

¿Qué es? Es un sistema que solo usa 2 dígitos: 0 y 1. Se llama "binario" porque "bi" significa "dos".

¿Por qué las computadoras usan binario? Porque las computadoras funcionan con electricidad y circuitos electrónicos. Un circuito solo puede estar en dos estados:

Apagado (0): No pasa electricidad

Encendido (1): Pasa electricidad

Es como un interruptor de luz: solo puede estar apagado o encendido, no hay punto medio.

¿Cómo funciona? Igual que el decimal, pero cada posición es una potencia de 2 (no de 10):

Ejemplo: El número binario 1011

Posición 2⁰
Valor posicional 8 4 2 1
Dígito binario 1 0 1 1
Cálculo 1 × 8 = 8 0 × 4 = 0 1 × 2 = 2 1 × 1 = 1

Total en decimal: 8 + 0 + 2 + 1 = 11

Entonces: 1011 en binario = 11 en decimal

🔄 Conversiones: Decimal ↔ Binario

📊 Convertir de Decimal a Binario

Método: Divide el número entre 2 repetidamente y guarda los residuos.

Ejemplo: Convertir 13 (decimal) a binario

1. 13 ÷ 2 = 6, residuo 1 ← (este es el último dígito)

2. 6 ÷ 2 = 3, residuo 0

3. 3 ÷ 2 = 1, residuo 1

4. 1 ÷ 2 = 0, residuo 1 ← (este es el primer dígito)

Lee los residuos de abajo hacia arriba: 1101

Resultado: 13 en decimal = 1101 en binario

Verificación:

1101 = (1×8) + (1×4) + (0×2) + (1×1) = 8 + 4 + 0 + 1 = 13 ✔️

🎯 Ejercicio: Convierte 25 a binario. Respuesta al final de esta sección.

📊 Convertir de Binario a Decimal

Método: Multiplica cada dígito por su valor posicional (potencia de 2) y suma todo.

Ejemplo: Convertir 10110 (binario) a decimal

Posición 2⁴ (16) 2³ (8) 2² (4) 2¹ (2) 2⁰ (1)
Dígito 1 0 1 1 0
Cálculo 1×16=16 0×8=0 1×4=4 1×2=2 0×1=0

Suma: 16 + 0 + 4 + 2 + 0 = 22

Resultado: 10110 en binario = 22 en decimal

🎯 Ejercicio: Convierte 11001 a decimal. Respuesta al final de esta sección.

⚡ ¿Cómo se relaciona con Arduino y circuitos?

En Arduino: Cuando programas un Arduino, trabajas directamente con señales eléctricas:

Pines digitales:

digitalWrite(13, HIGH); → Envía 5V (voltios) al pin 13 → Binario: 1

digitalWrite(13, LOW); → Envía 0V al pin 13 → Binario: 0

Ejemplo práctico: Encender un LED

// HIGH = 1 = 5V = LED encendido
digitalWrite(13, HIGH);

// LOW = 0 = 0V = LED apagado
digitalWrite(13, LOW);

Pines analógicos:

analogWrite(9, 127); → Envía un valor entre 0-255

• 127 en decimal = 01111111 en binario (8 bits)

• Esto controla la intensidad del LED (50% de brillo)

💡 Dato importante: Los números en programación se guardan en binario:

int numero = 5; → La computadora guarda: 00000101

int numero = 255; → La computadora guarda: 11111111

¿Por qué 255 es el máximo en muchos casos? Porque con 8 bits (8 dígitos binarios) puedes representar números del 0 al 255:

• 00000000 = 0

• 11111111 = 128+64+32+16+8+4+2+1 = 255

🎯 Ejercicios prácticos

Ejercicio 1: Conversiones básicas

Convierte estos números:

a) 7 (decimal) a binario

b) 1111 (binario) a decimal

c) 20 (decimal) a binario

d) 101010 (binario) a decimal

Ver respuestas

a) 7 = 111 (4+2+1)

b) 1111 = 15 (8+4+2+1)

c) 20 = 10100 (16+4)

d) 101010 = 42 (32+8+2)

Ejercicio 2: Aplicación con Arduino

Si tienes 8 LEDs conectados a un Arduino y quieres encender solo el LED 1, 3 y 5 (contando desde la derecha), ¿qué número binario necesitas?

Ver respuesta

Posiciones: 8 7 6 5 4 3 2 1

Encendidos: 0 0 0 1 0 1 0 1

Binario: 00010101

Decimal: 21 (16+4+1)

En Arduino escribirías: PORTB = 0b00010101; o PORTB = 21;

🔑 Puntos clave para recordar:

Decimal (base 10): Usa 10 dígitos (0-9), cada posición es potencia de 10

Binario (base 2): Usa 2 dígitos (0-1), cada posición es potencia de 2

Las computadoras usan binario porque funcionan con electricidad (encendido/apagado)

En Arduino: HIGH=1=5V, LOW=0=0V

8 bits pueden representar números del 0 al 255

• Cuando programas, los números se convierten automáticamente a binario

🚀 Ruta completa: De cero a Arduino con C++

Esta es tu ruta completa de programación en C++. Empiezas aprendiendo los fundamentos del lenguaje y terminas programando Arduino para controlar hardware real. Son 20 sesiones organizadas en 5 fases. Cada sesión tiene teoría explicada, ejemplos de código y ejercicios prácticos.

📍 Cómo funciona esta ruta: Fase 1 (Sesiones 1-4) = Fundamentos de C++. Fase 2 (Sesiones 5-8) = Operadores y control avanzado. Fase 3 (Sesiones 9-12) = Funciones y arreglos. Fase 4 (Sesiones 13-16) = Proyectos completos. Fase 5 (Sesiones 17-20) = Arduino y hardware.

🛠️ PREPARACIÓN: Antes de empezar

🎯 Objetivo: Configurar tu entorno de programación para que puedas escribir y ejecutar código C++.

📝 ¿Qué necesitas?

Para programar en C++ necesitas dos cosas:

1. Un editor - Donde escribes el código

2. Un compilador - Que convierte tu código en un programa ejecutable


🌐 OPCIÓN 1: Editores Online (Más fácil para empezar)

No necesitas instalar nada. Solo abre el navegador y empieza a programar:

💻 Replit (Recomendado)

Ventajas: Gratis, no requiere instalación, guarda tus proyectos automáticamente

Cómo usarlo:

1. Ve a replit.com

2. Crea una cuenta gratis (o usa Google/GitHub)

3. Haz clic en "+ Create Repl"

4. Busca "C++" en la lista de lenguajes

5. Dale un nombre a tu proyecto (ej: "MiPrimerPrograma")

6. Haz clic en "Create Repl"

7. Escribe tu código en el editor central

8. Presiona el botón "Run" (▶️) para ejecutar

🎯 Prueba tu primer programa:

#include <iostream>
using namespace std;

int main() {
  cout << "¡Hola! Mi entorno está listo." << endl;
  return 0;
}

Si ves el mensaje "¡Hola! Mi entorno está listo." en la consola, ¡todo funciona! 🎉

💻 OnlineGDB

Ventajas: Muy simple, no requiere cuenta

Cómo usarlo:

1. Ve a onlinegdb.com/online_c++_compiler

2. Escribe tu código directamente

3. Presiona "Run" para ejecutar

4. Ve el resultado en la parte inferior

Nota: No guarda tus proyectos automáticamente. Copia tu código a un archivo de texto si quieres guardarlo.

💻 Programiz C++ Compiler

Ventajas: Interfaz limpia, ejemplos incluidos

Cómo usarlo:

1. Ve a programiz.com/cpp-programming/online-compiler

2. Escribe tu código

3. Presiona "Run"

4. Incluye ejemplos de código que puedes probar


💾 OPCIÓN 2: Instalar en tu computadora (Más profesional)

Si quieres programar sin internet o tener más control:

🪟 Windows - Code::Blocks

Qué es: Editor + compilador todo en uno, fácil de usar

Instalación:

1. Ve a codeblocks.org/downloads

2. Descarga "codeblocks-XX.XXmingw-setup.exe" (¡importante el "mingw"!)

3. Ejecuta el instalador

4. Acepta todas las opciones por defecto

5. Abre Code::Blocks

6. File → New → Project → Console Application → C++

7. Escribe tu código en el archivo main.cpp

8. Presiona F9 para compilar y ejecutar

🍎 Mac - Xcode o VS Code

Opción A: Xcode (Oficial de Apple)

1. Abre la App Store

2. Busca "Xcode"

3. Descarga e instala (es grande, ~12GB)

4. Abre Terminal y escribe: xcode-select --install

5. Crea un archivo .cpp con TextEdit

6. Compila desde Terminal: g++ archivo.cpp -o programa

7. Ejecuta: ./programa

Opción B: VS Code (Más ligero)

1. Descarga VS Code de code.visualstudio.com

2. Instala la extensión "C/C++" de Microsoft

3. Instala compilador desde Terminal: xcode-select --install

4. Crea un archivo .cpp

5. Usa la terminal integrada para compilar y ejecutar

🐧 Linux - g++ desde terminal

Instalación:

1. Abre la terminal

2. Instala g++:

• Ubuntu/Debian: sudo apt-get install g++

• Fedora: sudo dnf install gcc-c++

• Arch: sudo pacman -S gcc

Uso:

1. Crea un archivo: nano programa.cpp

2. Escribe tu código

3. Guarda (Ctrl+O, Enter, Ctrl+X)

4. Compila: g++ programa.cpp -o programa

5. Ejecuta: ./programa


✅ Verifica que todo funciona

Copia este código en tu editor y ejecútalo:

#include <iostream>
using namespace std;

int main() {
  cout << "=== VERIFICACIÓN DEL ENTORNO ===" << endl;
  cout << "✅ El compilador funciona correctamente" << endl;
  cout << "✅ Puedes mostrar texto en pantalla" << endl;
  
  int numero = 42;
  cout << "✅ Las variables funcionan: " << numero << endl;
  
  cout << "\n🎉 ¡Todo listo para empezar a programar!" << endl;
  
  return 0;
}

Si ves todos los mensajes con ✅, estás listo para la Sesión 1!


❓ Problemas comunes

Error: "cout was not declared"

Causa: Falta #include <iostream> o using namespace std;

Solución: Agrega estas dos líneas al inicio de tu programa.

Error: "g++ not found" o "command not found"

Causa: El compilador no está instalado

Solución: Instala el compilador según tu sistema operativo (ver arriba) o usa un editor online.

El programa se cierra inmediatamente

Causa: Normal en algunos editores

Solución: Agrega system("pause"); antes de return 0; (Windows) o ejecuta desde la terminal.

💡 Recomendación: Si es tu primera vez programando, empieza con Replit. Es lo más fácil y te permite enfocarte en aprender sin preocuparte por instalaciones.

📘 FASE 1: Fundamentos de C++ (Sesiones 1-4)

🎯 Meta de esta fase: Escribir tus primeros programas en C++. Aprender la sintaxis básica, variables, entrada/salida, decisiones y bucles.

Sesión 1: Tu primer programa en C++

¿Qué es C++? C++ es un lenguaje de programación. Es el "idioma" que usas para darle instrucciones a la computadora. Tiene reglas estrictas de sintaxis (como la gramática en español).

Programa básico explicado:

#include <iostream>  // Importa herramientas para entrada/salida
using namespace std;  // Permite usar cout y cin sin prefijo

int main() {  // Aquí empieza el programa
  cout << "¡Hola mundo!" << endl;  // Muestra texto en pantalla
  return 0;  // Termina el programa exitosamente
}

Explicación detallada:

#include <iostream> - Trae la biblioteca que permite mostrar texto (cout) y leer entrada (cin).

using namespace std; - Simplifica el código. Sin esto tendrías que escribir std::cout en lugar de solo cout.

int main() - Función principal. TODO programa en C++ empieza aquí.

cout << - Comando para mostrar texto en pantalla. Los << son como flechas que envían el texto a la pantalla.

endl - Significa "end line" (fin de línea). Hace un salto de línea.

return 0; - Indica que el programa terminó sin errores.

🎯 Ejercicio: Copia este código en un editor de C++ (como Code::Blocks o replit.com). Ejecútalo. Luego modifícalo para que diga tu nombre en lugar de "Hola mundo".

✅ Ver solución
#include <iostream>
using namespace std;

int main() {
  cout << "¡Hola, soy María!" << endl;
  return 0;
}

Explicación: Solo cambiamos el texto dentro de las comillas. Puedes poner cualquier mensaje que quieras.

Sesión 2: Variables - Guardar información

¿Qué es una variable? Una variable es un espacio en la memoria de la computadora donde guardas un valor. Tiene un nombre y un tipo de dato.

Tipos de datos básicos:

int - Números enteros (sin decimales): 5, -10, 1000

double - Números con decimales: 3.14, -0.5, 99.99

string - Texto: "Hola", "Juan", "C++"

bool - Verdadero o falso: true, false

Cómo crear y usar variables:

int edad = 10;  // Crea variable "edad" con valor 10
string nombre = "Ana";  // Crea variable "nombre" con texto "Ana"
double altura = 1.45;  // Crea variable "altura" con decimal

cout << "Nombre: " << nombre << endl;
cout << "Edad: " << edad << endl;
cout << "Altura: " << altura << " metros" << endl;

Leer entrada del usuario:

string tuNombre;
cout << "¿Cómo te llamas? ";
cin >> tuNombre;  // Lee lo que escribes y lo guarda en tuNombre
cout << "Hola " << tuNombre << "!" << endl;

🎯 Ejercicio: Escribe un programa que pida tu nombre, tu edad y tu color favorito. Luego muestra: "Hola [nombre], tienes [edad] años y te gusta el color [color]".

✅ Ver solución
#include <iostream>
using namespace std;

int main() {
  string nombre, color;
  int edad;
  
  cout << "¿Cómo te llamas? ";
  cin >> nombre;
  
  cout << "¿Cuántos años tienes? ";
  cin >> edad;
  
  cout << "¿Cuál es tu color favorito? ";
  cin >> color;
  
  cout << "\nHola " << nombre << ", tienes " << edad 
       << " años y te gusta el color " << color << endl;
  
  return 0;
}

Explicación: Declaramos 3 variables (nombre, edad, color), pedimos cada valor con cout, los leemos con cin y luego los mostramos juntos en un mensaje.

Sesión 3: Decisiones con if/else

Concepto: Los programas pueden tomar decisiones usando if, else if y else.

Estructura básica:

if (condición) {
  // Código que se ejecuta si la condición es verdadera
} else {
  // Código que se ejecuta si la condición es falsa
}

Ejemplo completo:

int edad;
cout << "¿Cuántos años tienes? ";
cin >> edad;

if (edad >= 18) {
  cout << "Eres mayor de edad" << endl;
} else {
  cout << "Eres menor de edad" << endl;
}

Múltiples condiciones con else if:

int puntaje = 85;

if (puntaje >= 90) {
  cout << "Calificación: A (Excelente)" << endl;
} else if (puntaje >= 80) {
  cout << "Calificación: B (Muy bien)" << endl;
} else if (puntaje >= 70) {
  cout << "Calificación: C (Bien)" << endl;
} else {
  cout << "Calificación: D (Necesitas mejorar)" << endl;
}

Operadores de comparación:

== igual a (¡OJO! Son DOS signos de igual)

!= diferente de

> mayor que

< menor que

>= mayor o igual que

<= menor o igual que

🎯 Ejercicio: Crea un programa que pida un número del 1 al 7 y muestre el día de la semana (1=Lunes, 2=Martes, etc.). Usa if/else if.

✅ Ver solución
#include <iostream>
using namespace std;

int main() {
  int dia;
  
  cout << "Ingresa un número (1-7): ";
  cin >> dia;
  
  if (dia == 1) {
    cout << "Lunes" << endl;
  } else if (dia == 2) {
    cout << "Martes" << endl;
  } else if (dia == 3) {
    cout << "Miércoles" << endl;
  } else if (dia == 4) {
    cout << "Jueves" << endl;
  } else if (dia == 5) {
    cout << "Viernes" << endl;
  } else if (dia == 6) {
    cout << "Sábado" << endl;
  } else if (dia == 7) {
    cout << "Domingo" << endl;
  } else {
    cout << "Número inválido. Debe ser entre 1 y 7." << endl;
  }
  
  return 0;
}

Explicación: Comparamos el número con cada valor (1-7) usando else if. Si no es ninguno de esos, mostramos un mensaje de error.

Sesión 4: Bucles for y while

Concepto: Los bucles repiten código automáticamente sin tener que escribirlo varias veces. Hay dos tipos principales: for (cuando sabes cuántas veces repetir) y while (cuando repites hasta que una condición cambie).

Bucle FOR - Estructura:

for (inicio; condición; incremento) {
  // Código que se repite
}

Ejemplo - Contar del 1 al 10:

for (int i = 1; i <= 10; i++) {
  cout << i << endl;
}

// Explicación:
// int i = 1     → Empieza en 1
// i <= 10       → Continúa mientras i sea menor o igual a 10
// i++           → Aumenta i en 1 cada vez (i++ es lo mismo que i = i + 1)

Bucle WHILE - Estructura:

while (condición) {
  // Código que se repite mientras la condición sea verdadera
}

Ejemplo - Adivinar número:

int numeroSecreto = 7;
int intento;

cout << "Adivina el número (1-10): ";
cin >> intento;

while (intento != numeroSecreto) {
  cout << "Incorrecto. Intenta de nuevo: ";
  cin >> intento;
}

cout << "¡Correcto!" << endl;

🎯 Ejercicio 1: Usa un bucle for para mostrar la tabla de multiplicar del 5 (5x1=5, 5x2=10, etc. hasta 5x10=50).

✅ Ver solución
#include <iostream>
using namespace std;

int main() {
  cout << "Tabla del 5:" << endl;
  
  for (int i = 1; i <= 10; i++) {
    cout << "5 x " << i << " = " << (5 * i) << endl;
  }
  
  return 0;
}

Explicación: El bucle va de 1 a 10. En cada iteración multiplicamos 5 por el valor actual de i y mostramos el resultado.

🎯 Ejercicio 2: Crea un programa que dibuje un triángulo de asteriscos:

*
**
***
****
*****
💡 Ver pista

Usa un bucle for dentro de otro bucle for. El bucle externo controla las filas (1 a 5). El bucle interno imprime asteriscos (tantos como el número de fila).

✅ Ver solución
#include <iostream>
using namespace std;

int main() {
  // Bucle externo: controla las filas (1 a 5)
  for (int fila = 1; fila <= 5; fila++) {
    
    // Bucle interno: imprime asteriscos
    for (int asterisco = 1; asterisco <= fila; asterisco++) {
      cout << "*";
    }
    
    // Salto de línea después de cada fila
    cout << endl;
  }
  
  return 0;
}

Explicación:

• Fila 1: bucle interno se ejecuta 1 vez → imprime *

• Fila 2: bucle interno se ejecuta 2 veces → imprime **

• Fila 3: bucle interno se ejecuta 3 veces → imprime ***

• Y así sucesivamente hasta la fila 5.

� FASE 2: Operadores y Control Avanzado (Sesiones 5-8)

🎯 Meta de esta fase: Dominar operadores matemáticos y lógicos, aprender estructuras de control avanzadas (switch, do-while) y trabajar con números aleatorios para crear programas más interesantes.

Sesión 5: Operadores matemáticos y de asignación

Concepto: Los operadores son símbolos que le dicen a la computadora qué operación hacer con los valores. Ya conoces algunos (+, -, *, /), ahora aprenderás más.

Operadores aritméticos básicos:

int a = 10;
int b = 3;

cout << a + b << endl;  // Suma: 13
cout << a - b << endl;  // Resta: 7
cout << a * b << endl;  // Multiplicación: 30
cout << a / b << endl;  // División entera: 3 (no 3.33)
cout << a % b << endl;  // Módulo (residuo): 1

⚠️ División importante:

10 / 3 = 3 (división entera, descarta decimales)

10.0 / 3 = 3.33333 (división con decimales)

10 % 3 = 1 (residuo de la división)

Operadores de asignación compuesta:

int puntos = 100;

puntos += 10;   // Equivale a: puntos = puntos + 10 (ahora puntos = 110)
puntos -= 5;    // Equivale a: puntos = puntos - 5 (ahora puntos = 105)
puntos *= 2;    // Equivale a: puntos = puntos * 2 (ahora puntos = 210)
puntos /= 3;    // Equivale a: puntos = puntos / 3 (ahora puntos = 70)

cout << puntos << endl;  // Muestra: 70

Incremento y decremento:

int contador = 5;

contador++;  // Incrementa en 1 (ahora contador = 6)
contador--;  // Decrementa en 1 (ahora contador = 5)

// Es lo mismo que:
contador = contador + 1;
contador = contador - 1;

Operadores lógicos (para condiciones complejas):

int edad = 15;
bool tienePermiso = true;

// AND (&&) - Ambas condiciones deben ser verdaderas
if (edad >= 13 && edad <= 17) {
  cout << "Eres adolescente" << endl;
}

// OR (||) - Al menos una condición debe ser verdadera
if (edad < 13 || edad > 65) {
  cout << "Descuento especial" << endl;
}

// NOT (!) - Invierte el valor
if (!tienePermiso) {
  cout << "No tienes permiso" << endl;
}

🎯 Ejercicio 1: Crea un programa que pida dos números y muestre: suma, resta, multiplicación, división y módulo de esos números.

✅ Ver solución
#include <iostream>
using namespace std;

int main() {
  double num1, num2;
  
  cout << "Ingresa el primer número: ";
  cin >> num1;
  cout << "Ingresa el segundo número: ";
  cin >> num2;
  
  cout << "\nResultados:" << endl;
  cout << num1 << " + " << num2 << " = " << (num1 + num2) << endl;
  cout << num1 << " - " << num2 << " = " << (num1 - num2) << endl;
  cout << num1 << " * " << num2 << " = " << (num1 * num2) << endl;
  cout << num1 << " / " << num2 << " = " << (num1 / num2) << endl;
  
  // Módulo solo funciona con enteros
  cout << (int)num1 << " % " << (int)num2 << " = " << ((int)num1 % (int)num2) << endl;
  
  return 0;
}

Explicación: Usamos double para permitir decimales. El módulo requiere enteros, por eso usamos (int) para convertir.

🎯 Ejercicio 2: Crea un programa que determine si un número es par o impar usando el operador módulo (%).

💡 Ver pista

Un número es par si al dividirlo entre 2 el residuo es 0. Usa: if (numero % 2 == 0)

✅ Ver solución
#include <iostream>
using namespace std;

int main() {
  int numero;
  
  cout << "Ingresa un número: ";
  cin >> numero;
  
  if (numero % 2 == 0) {
    cout << numero << " es PAR" << endl;
  } else {
    cout << numero << " es IMPAR" << endl;
  }
  
  return 0;
}

Explicación: Si numero % 2 es 0, significa que 2 cabe exactamente en el número sin residuo, por lo tanto es par.

Sesión 6: Switch - Decisiones múltiples

Concepto: Cuando tienes que comparar una variable con muchos valores diferentes, switch es más claro y ordenado que muchos if/else if.

Estructura de switch:

switch (variable) {
  case valor1:
    // Código si variable == valor1
    break;
  case valor2:
    // Código si variable == valor2
    break;
  default:
    // Código si no coincide con ningún case
}

Ejemplo - Menú de opciones:

int opcion;

cout << "=== MENÚ ===" << endl;
cout << "1. Nuevo juego" << endl;
cout << "2. Cargar partida" << endl;
cout << "3. Opciones" << endl;
cout << "4. Salir" << endl;
cout << "Elige una opción: ";
cin >> opcion;

switch (opcion) {
  case 1:
    cout << "Iniciando nuevo juego..." << endl;
    break;
  case 2:
    cout << "Cargando partida guardada..." << endl;
    break;
  case 3:
    cout << "Abriendo opciones..." << endl;
    break;
  case 4:
    cout << "¡Hasta luego!" << endl;
    break;
  default:
    cout << "Opción inválida" << endl;
}

⚠️ Importante sobre break:

Si olvidas break, el código continúa ejecutando los siguientes casos (esto se llama "fall-through"):

int dia = 2;

switch (dia) {
  case 1:
    cout << "Lunes" << endl;
    // ¡Falta break!
  case 2:
    cout << "Martes" << endl;
    break;
}

// Resultado: Solo muestra "Martes" porque hay break

Casos múltiples (sin break intencional):

char letra;
cout << "Ingresa una letra: ";
cin >> letra;

switch (letra) {
  case 'a':
  case 'e':
  case 'i':
  case 'o':
  case 'u':
    cout << "Es una vocal" << endl;
    break;
  default:
    cout << "Es una consonante" << endl;
}

🎯 Ejercicio 1: Crea una calculadora con switch que pida dos números y una operación (+, -, *, /) y muestre el resultado.

✅ Ver solución
#include <iostream>
using namespace std;

int main() {
  double num1, num2;
  char operacion;
  
  cout << "Ingresa el primer número: ";
  cin >> num1;
  cout << "Ingresa la operación (+, -, *, /): ";
  cin >> operacion;
  cout << "Ingresa el segundo número: ";
  cin >> num2;
  
  switch (operacion) {
    case '+':
      cout << "Resultado: " << (num1 + num2) << endl;
      break;
    case '-':
      cout << "Resultado: " << (num1 - num2) << endl;
      break;
    case '*':
      cout << "Resultado: " << (num1 * num2) << endl;
      break;
    case '/':
      if (num2 != 0) {
        cout << "Resultado: " << (num1 / num2) << endl;
      } else {
        cout << "Error: No se puede dividir entre cero" << endl;
      }
      break;
    default:
      cout << "Operación inválida" << endl;
  }
  
  return 0;
}

Explicación: Usamos char para la operación. Verificamos división por cero antes de dividir.

🎯 Ejercicio 2: Crea un programa que convierta una calificación numérica (0-100) a letra (A, B, C, D, F) usando switch.

💡 Ver pista

Divide la calificación entre 10 para obtener un número del 0 al 10, luego usa switch con ese número.

✅ Ver solución
#include <iostream>
using namespace std;

int main() {
  int calificacion;
  
  cout << "Ingresa tu calificación (0-100): ";
  cin >> calificacion;
  
  int rango = calificacion / 10;
  
  switch (rango) {
    case 10:
    case 9:
      cout << "Calificación: A (Excelente)" << endl;
      break;
    case 8:
      cout << "Calificación: B (Muy bien)" << endl;
      break;
    case 7:
      cout << "Calificación: C (Bien)" << endl;
      break;
    case 6:
      cout << "Calificación: D (Suficiente)" << endl;
      break;
    default:
      cout << "Calificación: F (Reprobado)" << endl;
  }
  
  return 0;
}

Explicación: Dividimos entre 10 para convertir 90-100 en 9-10, 80-89 en 8, etc. Los casos 10 y 9 comparten el mismo código (ambos son A).

Sesión 7: Bucle do-while y números aleatorios

Concepto do-while: Es similar a while, pero garantiza que el código se ejecute AL MENOS UNA VEZ, porque la condición se verifica al final.

Diferencia entre while y do-while:

// WHILE - Puede no ejecutarse nunca
int x = 10;
while (x < 5) {
  cout << "Esto nunca se ejecuta" << endl;
}

// DO-WHILE - Se ejecuta al menos una vez
int y = 10;
do {
  cout << "Esto se ejecuta una vez" << endl;
} while (y < 5);

Uso típico - Validar entrada:

int edad;

do {
  cout << "Ingresa tu edad (1-120): ";
  cin >> edad;
  
  if (edad < 1 || edad > 120) {
    cout << "Edad inválida. Intenta de nuevo." << endl;
  }
} while (edad < 1 || edad > 120);

cout << "Edad válida: " << edad << endl;

Números aleatorios:

Para generar números al azar (útil para juegos), usamos rand() y srand():

#include <iostream>
#include <cstdlib>  // Para rand() y srand()
#include <ctime>    // Para time()
using namespace std;

int main() {
  // Inicializar generador de números aleatorios
  srand(time(0));  // Usa el tiempo actual como "semilla"
  
  // Generar número aleatorio entre 1 y 100
  int numeroAleatorio = (rand() % 100) + 1;
  
  cout << "Número aleatorio: " << numeroAleatorio << endl;
  
  return 0;
}

Explicación de rand():

rand() genera un número entre 0 y un valor muy grande

rand() % 100 da un número entre 0 y 99

(rand() % 100) + 1 da un número entre 1 y 100

srand(time(0)) asegura que los números sean diferentes cada vez que ejecutas el programa

Ejemplo completo - Juego de adivinar número:

#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;

int main() {
  srand(time(0));
  int numeroSecreto = (rand() % 100) + 1;
  int intento;
  int intentos = 0;
  
  cout << "=== ADIVINA EL NÚMERO ===" << endl;
  cout << "Estoy pensando en un número entre 1 y 100" << endl;
  
  do {
    cout << "\nTu intento: ";
    cin >> intento;
    intentos++;
    
    if (intento < numeroSecreto) {
      cout << "Muy bajo. Intenta con un número mayor." << endl;
    } else if (intento > numeroSecreto) {
      cout << "Muy alto. Intenta con un número menor." << endl;
    } else {
      cout << "¡CORRECTO! El número era " << numeroSecreto << endl;
      cout << "Lo adivinaste en " << intentos << " intentos." << endl;
    }
  } while (intento != numeroSecreto);
  
  return 0;
}

🎯 Ejercicio 1: Crea un programa que pida una contraseña y no deje continuar hasta que el usuario ingrese la contraseña correcta. Usa do-while.

✅ Ver solución
#include <iostream>
using namespace std;

int main() {
  string passwordCorrecta = "secreto123";
  string intento;
  
  do {
    cout << "Ingresa la contraseña: ";
    cin >> intento;
    
    if (intento != passwordCorrecta) {
      cout << "Contraseña incorrecta. Intenta de nuevo." << endl;
    }
  } while (intento != passwordCorrecta);
  
  cout << "¡Acceso concedido!" << endl;
  
  return 0;
}

Explicación: El bucle continúa pidiendo la contraseña hasta que el usuario ingrese la correcta.

🎯 Ejercicio 2: Mejora el juego de adivinar número para que genere un número entre 1 y 10 y le dé al jugador solo 3 intentos.

✅ Ver solución
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;

int main() {
  srand(time(0));
  int numeroSecreto = (rand() % 10) + 1;
  int intento;
  int intentosRestantes = 3;
  bool gano = false;
  
  cout << "=== ADIVINA EL NÚMERO ===" << endl;
  cout << "Número entre 1 y 10. Tienes 3 intentos." << endl;
  
  do {
    cout << "\nIntentos restantes: " << intentosRestantes << endl;
    cout << "Tu intento: ";
    cin >> intento;
    intentosRestantes--;
    
    if (intento == numeroSecreto) {
      cout << "¡GANASTE! El número era " << numeroSecreto << endl;
      gano = true;
    } else if (intentosRestantes > 0) {
      if (intento < numeroSecreto) {
        cout << "Muy bajo" << endl;
      } else {
        cout << "Muy alto" << endl;
      }
    }
  } while (intentosRestantes > 0 && !gano);
  
  if (!gano) {
    cout << "\n¡PERDISTE! El número era " << numeroSecreto << endl;
  }
  
  return 0;
}

Explicación: Usamos un contador de intentos y una variable gano para saber si el jugador adivinó. El bucle termina si se acaban los intentos O si el jugador gana.

Sesión 8: Matemáticas en C++ (biblioteca cmath)

Concepto: C++ tiene funciones matemáticas avanzadas en la biblioteca cmath para hacer cálculos complejos fácilmente.

Funciones matemáticas comunes:

#include <iostream>
#include <cmath>  // Biblioteca de matemáticas
using namespace std;

int main() {
  double numero = 16.7;
  
  // Potencias y raíces
  cout << "Raíz cuadrada de 16: " << sqrt(16) << endl;        // 4
  cout << "2 elevado a 3: " << pow(2, 3) << endl;             // 8
  cout << "Valor absoluto de -5: " << abs(-5) << endl;        // 5
  
  // Redondeo
  cout << "Redondear 16.7: " << round(16.7) << endl;          // 17
  cout << "Redondear hacia abajo 16.7: " << floor(16.7) << endl;  // 16
  cout << "Redondear hacia arriba 16.7: " << ceil(16.7) << endl;  // 17
  
  // Trigonometría (en radianes)
  cout << "Seno de 90°: " << sin(3.14159/2) << endl;          // 1
  cout << "Coseno de 0°: " << cos(0) << endl;                 // 1
  
  return 0;
}

Funciones útiles:

sqrt(x) - Raíz cuadrada

pow(base, exponente) - Potencia

abs(x) - Valor absoluto

round(x) - Redondear al entero más cercano

floor(x) - Redondear hacia abajo

ceil(x) - Redondear hacia arriba

sin(x), cos(x), tan(x) - Funciones trigonométricas

Ejemplo práctico - Calcular hipotenusa:

#include <iostream>
#include <cmath>
using namespace std;

int main() {
  double cateto1, cateto2, hipotenusa;
  
  cout << "Calculadora de hipotenusa (Teorema de Pitágoras)" << endl;
  cout << "Ingresa el primer cateto: ";
  cin >> cateto1;
  cout << "Ingresa el segundo cateto: ";
  cin >> cateto2;
  
  // Teorema de Pitágoras: c² = a² + b²
  // Por lo tanto: c = √(a² + b²)
  hipotenusa = sqrt(pow(cateto1, 2) + pow(cateto2, 2));
  
  cout << "La hipotenusa es: " << hipotenusa << endl;
  
  return 0;
}

Constantes matemáticas:

#include <iostream>
#include <cmath>
using namespace std;

int main() {
  const double PI = 3.14159265359;
  double radio;
  
  cout << "Ingresa el radio del círculo: ";
  cin >> radio;
  
  double area = PI * pow(radio, 2);
  double circunferencia = 2 * PI * radio;
  
  cout << "Área: " << area << endl;
  cout << "Circunferencia: " << circunferencia << endl;
  
  return 0;
}

🎯 Ejercicio 1: Crea un programa que calcule el área y perímetro de un rectángulo. Pide base y altura al usuario.

✅ Ver solución
#include <iostream>
using namespace std;

int main() {
  double base, altura;
  
  cout << "Ingresa la base del rectángulo: ";
  cin >> base;
  cout << "Ingresa la altura del rectángulo: ";
  cin >> altura;
  
  double area = base * altura;
  double perimetro = 2 * (base + altura);
  
  cout << "\nResultados:" << endl;
  cout << "Área: " << area << endl;
  cout << "Perímetro: " << perimetro << endl;
  
  return 0;
}

Explicación: Área = base × altura. Perímetro = 2 × (base + altura).

🎯 Ejercicio 2: Crea una calculadora de distancia entre dos puntos en un plano. Usa la fórmula: d = √[(x₂-x₁)² + (y₂-y₁)²]

💡 Ver pista

Necesitas pedir 4 valores: x1, y1, x2, y2. Usa pow() para elevar al cuadrado y sqrt() para la raíz.

✅ Ver solución
#include <iostream>
#include <cmath>
using namespace std;

int main() {
  double x1, y1, x2, y2;
  
  cout << "=== CALCULADORA DE DISTANCIA ===" << endl;
  cout << "Punto 1 - X: ";
  cin >> x1;
  cout << "Punto 1 - Y: ";
  cin >> y1;
  cout << "Punto 2 - X: ";
  cin >> x2;
  cout << "Punto 2 - Y: ";
  cin >> y2;
  
  // Fórmula de distancia euclidiana
  double distancia = sqrt(pow(x2 - x1, 2) + pow(y2 - y1, 2));
  
  cout << "\nLa distancia entre (" << x1 << "," << y1 << ") y (" 
       << x2 << "," << y2 << ") es: " << distancia << endl;
  
  return 0;
}

Explicación: Esta es la fórmula de distancia euclidiana. Primero calculamos la diferencia en X y en Y, las elevamos al cuadrado, las sumamos y sacamos raíz cuadrada del resultado.

🎯 Ejercicio 3: Crea un programa que resuelva ecuaciones cuadráticas (ax² + bx + c = 0) usando la fórmula general.

💡 Ver pista

Fórmula: x = (-b ± √(b²-4ac)) / 2a. Calcula el discriminante (b²-4ac) primero. Si es negativo, no hay soluciones reales.

✅ Ver solución
#include <iostream>
#include <cmath>
using namespace std;

int main() {
  double a, b, c;
  
  cout << "=== RESOLVER ECUACIÓN CUADRÁTICA ===" << endl;
  cout << "Formato: ax² + bx + c = 0" << endl;
  cout << "Ingresa a: ";
  cin >> a;
  cout << "Ingresa b: ";
  cin >> b;
  cout << "Ingresa c: ";
  cin >> c;
  
  // Calcular discriminante
  double discriminante = pow(b, 2) - 4 * a * c;
  
  if (discriminante > 0) {
    // Dos soluciones reales
    double x1 = (-b + sqrt(discriminante)) / (2 * a);
    double x2 = (-b - sqrt(discriminante)) / (2 * a);
    cout << "\nDos soluciones:" << endl;
    cout << "x1 = " << x1 << endl;
    cout << "x2 = " << x2 << endl;
  } else if (discriminante == 0) {
    // Una solución
    double x = -b / (2 * a);
    cout << "\nUna solución: x = " << x << endl;
  } else {
    // No hay soluciones reales
    cout << "\nNo hay soluciones reales (discriminante negativo)" << endl;
  }
  
  return 0;
}

Explicación: El discriminante (b²-4ac) determina cuántas soluciones hay. Si es positivo: 2 soluciones. Si es cero: 1 solución. Si es negativo: no hay soluciones reales.

�� FASE 3: C++ Intermedio (Sesiones 9-12)

🎯 Meta de esta fase: Organizar código profesionalmente con funciones, trabajar con listas de datos (arreglos) y aprender a encontrar y corregir errores.

Sesión 9: Funciones - Reutilizar código

¿Qué es una función? Una función es un bloque de código con nombre que hace una tarea específica. Puedes llamarla (usarla) muchas veces sin reescribir el código.

Estructura de una función:

tipoRetorno nombreFuncion(parámetros) {
  // Código de la función
  return valor;  // Si retorna algo
}

Ejemplo simple:

// Definir la función
int sumar(int a, int b) {
  int resultado = a + b;
  return resultado;
}

// Usar la función en main
int main() {
  int total = sumar(5, 3);  // total = 8
  cout << "5 + 3 = " << total << endl;
  
  cout << "10 + 20 = " << sumar(10, 20) << endl;  // Uso directo
  return 0;
}

Función sin retorno (void):

void saludar(string nombre) {
  cout << "¡Hola " << nombre << "!" << endl;
  // No tiene return porque es void
}

int main() {
  saludar("Ana");  // Muestra: ¡Hola Ana!
  saludar("Carlos");  // Muestra: ¡Hola Carlos!
  return 0;
}

🎯 Ejercicio: Crea una calculadora con 4 funciones: sumar, restar, multiplicar y dividir. Cada función recibe dos números y retorna el resultado. En main, pide dos números al usuario y muestra los 4 resultados.

✅ Ver solución
#include <iostream>
using namespace std;

// Funciones de la calculadora
double sumar(double a, double b) {
  return a + b;
}

double restar(double a, double b) {
  return a - b;
}

double multiplicar(double a, double b) {
  return a * b;
}

double dividir(double a, double b) {
  if (b != 0) {
    return a / b;
  } else {
    cout << "Error: No se puede dividir entre cero" << endl;
    return 0;
  }
}

int main() {
  double num1, num2;
  
  cout << "Ingresa el primer número: ";
  cin >> num1;
  cout << "Ingresa el segundo número: ";
  cin >> num2;
  
  cout << "\nResultados:" << endl;
  cout << num1 << " + " << num2 << " = " << sumar(num1, num2) << endl;
  cout << num1 << " - " << num2 << " = " << restar(num1, num2) << endl;
  cout << num1 << " * " << num2 << " = " << multiplicar(num1, num2) << endl;
  cout << num1 << " / " << num2 << " = " << dividir(num1, num2) << endl;
  
  return 0;
}

Explicación: Cada función hace una operación específica y retorna el resultado. En main llamamos a las 4 funciones y mostramos los resultados. La función dividir verifica que no se divida entre cero.

Sesión 10: Arreglos - Listas de datos

¿Qué es un arreglo? Un arreglo es una colección de variables del mismo tipo, guardadas en posiciones consecutivas de memoria. Cada posición tiene un índice (número).

Crear y usar arreglos:

// Declarar arreglo de 5 enteros
int numeros[5];

// Asignar valores
numeros[0] = 10;  // Primera posición (índice 0)
numeros[1] = 20;
numeros[2] = 30;
numeros[3] = 40;
numeros[4] = 50;  // Última posición (índice 4)

// Leer valores
cout << numeros[0] << endl;  // Muestra 10

Inicializar con valores:

int calificaciones[5] = {85, 92, 78, 95, 88};
string nombres[3] = {"Ana", "Luis", "María"};

Recorrer arreglo con bucle:

int numeros[5] = {10, 20, 30, 40, 50};

// Mostrar todos los valores
for (int i = 0; i < 5; i++) {
  cout << "Posición " << i << ": " << numeros[i] << endl;
}

Calcular promedio:

int calificaciones[5] = {85, 92, 78, 95, 88};
int suma = 0;

for (int i = 0; i < 5; i++) {
  suma = suma + calificaciones[i];
}

double promedio = suma / 5.0;
cout << "Promedio: " << promedio << endl;

🎯 Ejercicio: Crea un programa que pida 10 números al usuario, los guarde en un arreglo y luego muestre: el número mayor, el número menor y el promedio.

✅ Ver solución
#include <iostream>
using namespace std;

int main() {
  int numeros[10];
  int suma = 0;
  
  // Pedir 10 números
  cout << "Ingresa 10 números:" << endl;
  for (int i = 0; i < 10; i++) {
    cout << "Número " << (i + 1) << ": ";
    cin >> numeros[i];
    suma += numeros[i];
  }
  
  // Encontrar mayor y menor
  int mayor = numeros[0];
  int menor = numeros[0];
  
  for (int i = 1; i < 10; i++) {
    if (numeros[i] > mayor) {
      mayor = numeros[i];
    }
    if (numeros[i] < menor) {
      menor = numeros[i];
    }
  }
  
  // Calcular promedio
  double promedio = suma / 10.0;
  
  // Mostrar resultados
  cout << "\nResultados:" << endl;
  cout << "Número mayor: " << mayor << endl;
  cout << "Número menor: " << menor << endl;
  cout << "Promedio: " << promedio << endl;
  
  return 0;
}

Explicación: Primero pedimos y guardamos los 10 números. Luego recorremos el arreglo para encontrar el mayor y el menor comparándolos uno por uno. El promedio lo calculamos dividiendo la suma entre 10.

Sesión 11: Strings - Trabajar con texto

Operaciones con strings: Los strings (cadenas de texto) tienen funciones especiales para manipular texto.

Concatenar (unir) strings:

string nombre = "Juan";
string apellido = "Pérez";
string nombreCompleto = nombre + " " + apellido;
cout << nombreCompleto << endl;  // Juan Pérez

Longitud de un string:

string palabra = "Programación";
int longitud = palabra.length();
cout << "La palabra tiene " << longitud << " letras" << endl;

Acceder a caracteres individuales:

string palabra = "Hola";
cout << palabra[0] << endl;  // H
cout << palabra[1] << endl;  // o
cout << palabra[2] << endl;  // l
cout << palabra[3] << endl;  // a

Comparar strings:

string password = "secreto123";
string intento;

cout << "Ingresa la contraseña: ";
cin >> intento;

if (intento == password) {
  cout << "Acceso concedido" << endl;
} else {
  cout << "Contraseña incorrecta" << endl;
}

🎯 Ejercicio: Crea un programa que pida una palabra y cuente cuántas vocales tiene (a, e, i, o, u). Pista: recorre cada letra con un bucle y usa if para verificar si es vocal.

✅ Ver solución
#include <iostream>
#include <string>
using namespace std;

int main() {
  string palabra;
  int contadorVocales = 0;
  
  cout << "Ingresa una palabra: ";
  cin >> palabra;
  
  // Recorrer cada letra de la palabra
  for (int i = 0; i < palabra.length(); i++) {
    char letra = palabra[i];
    
    // Convertir a minúscula para comparar
    if (letra >= 'A' && letra <= 'Z') {
      letra = letra + 32;  // Convertir mayúscula a minúscula
    }
    
    // Verificar si es vocal
    if (letra == 'a' || letra == 'e' || letra == 'i' || 
        letra == 'o' || letra == 'u') {
      contadorVocales++;
    }
  }
  
  cout << "La palabra \"" << palabra << "\" tiene " 
       << contadorVocales << " vocales." << endl;
  
  return 0;
}

Explicación: Recorremos cada letra de la palabra con un bucle. Convertimos las mayúsculas a minúsculas para facilitar la comparación. Luego verificamos si la letra es una vocal (a, e, i, o, u) y aumentamos el contador.

Sesión 12: Depuración - Encontrar y corregir errores

Tipos de errores:

1. Errores de sintaxis: El código está mal escrito (falta un punto y coma, paréntesis mal cerrado). El compilador no puede ejecutar el programa.

2. Errores de lógica: El código funciona pero hace algo incorrecto (calcula mal, muestra resultado equivocado).

3. Errores de ejecución: El programa se ejecuta pero se detiene con error (división por cero, acceder a posición inválida de arreglo).

Técnica 1: Imprimir valores

int a = 5;
int b = 10;
int resultado = a * b;  // ¿Está bien?

// Imprime para verificar
cout << "a = " << a << endl;
cout << "b = " << b << endl;
cout << "resultado = " << resultado << endl;

Técnica 2: Probar con casos simples

Si tu programa calcula promedios y falla, prueba primero con 2 números fáciles (10 y 20, promedio = 15). Si funciona con casos simples, prueba con casos más complejos.

Técnica 3: Leer mensajes de error

Ejemplo de error: error: 'cout' was not declared in this scope

Solución: Falta #include <iostream> o using namespace std;

🎯 Ejercicio: Este código tiene errores. Encuéntralos y corrígelos:

#include <iostream>

int main() {
  int edad = 10
  cout << "Tienes " << edad << " años" << end;
  return 0
}

Pistas: Faltan 3 cosas importantes.

💡 Ver pista

Busca:

1. Algo que falta después de declarar la variable edad

2. Un error en end (debería ser otra cosa)

3. Algo que falta al final de return 0

4. Algo que falta al inicio del programa

✅ Ver solución

Errores encontrados:

1. ❌ Falta ; después de int edad = 10

2. ❌ Falta using namespace std; al inicio

3. ❌ Dice end pero debería ser endl

4. ❌ Falta ; después de return 0

Código corregido:

#include <iostream>
using namespace std;  // ✅ Agregado

int main() {
  int edad = 10;  // ✅ Punto y coma agregado
  cout << "Tienes " << edad << " años" << endl;  // ✅ end cambiado a endl
  return 0;  // ✅ Punto y coma agregado
}

Explicación de los errores:

Punto y coma (;): En C++ TODAS las instrucciones deben terminar con punto y coma.

using namespace std: Sin esto, tendrías que escribir std::cout en lugar de solo cout.

endl vs end: endl significa "end line" (fin de línea). end no existe en C++.

📕 FASE 4: Proyectos de Consola (Sesiones 13-16)

🎯 Meta de esta fase: Crear programas completos que funcionen de verdad. Aplicar todo lo aprendido en proyectos reales.

Sesión 13: Proyecto - Juego de aventura de texto

📖 Descripción del proyecto: Crearás un juego interactivo donde el jugador toma decisiones que afectan la historia. Es como un libro donde TÚ eliges qué hacer en cada momento.

🎯 Objetivo: Crear una aventura completa con al menos 5 escenas diferentes y múltiples finales posibles.

🛠️ Conceptos que usarás:

• Variables (para guardar decisiones del jugador)

• if/else (para crear diferentes caminos en la historia)

• Funciones (para organizar cada escena)

• Strings (para mostrar la historia)

📝 Estructura del juego:

#include <iostream>
using namespace std;

// Función para mostrar la introducción
void introduccion() {
  cout << "=== LA ISLA MISTERIOSA ===" << endl;
  cout << "\nDespiertas en una playa desconocida." << endl;
  cout << "No recuerdas cómo llegaste aquí." << endl;
  cout << "A lo lejos ves un bosque y unas montañas." << endl;
}

// Escena 1: La playa
void escenaPlaya() {
  int decision;
  
  cout << "\n--- EN LA PLAYA ---" << endl;
  cout << "Ves dos caminos:" << endl;
  cout << "1. Ir hacia el bosque oscuro" << endl;
  cout << "2. Caminar hacia las montañas" << endl;
  cout << "¿Qué haces? (1 o 2): ";
  cin >> decision;
  
  if (decision == 1) {
    escenaBosque();
  } else if (decision == 2) {
    escenaMontanas();
  } else {
    cout << "Opción inválida. Intenta de nuevo." << endl;
    escenaPlaya();  // Volver a preguntar
  }
}

// Escena 2A: El bosque
void escenaBosque() {
  int decision;
  
  cout << "\n--- EN EL BOSQUE ---" << endl;
  cout << "El bosque está oscuro y silencioso." << endl;
  cout << "Encuentras una cabaña abandonada." << endl;
  cout << "1. Entrar a la cabaña" << endl;
  cout << "2. Seguir caminando por el bosque" << endl;
  cout << "¿Qué haces? (1 o 2): ";
  cin >> decision;
  
  if (decision == 1) {
    cout << "\n--- DENTRO DE LA CABAÑA ---" << endl;
    cout << "Encuentras un mapa del tesoro!" << endl;
    cout << "El mapa señala una cueva en las montañas." << endl;
    cout << "\n🎉 FINAL BUENO: Sigues el mapa y encuentras el tesoro!" << endl;
  } else {
    cout << "\n--- PERDIDO EN EL BOSQUE ---" << endl;
    cout << "Caminas durante horas sin encontrar salida." << endl;
    cout << "La noche cae y escuchas ruidos extraños..." << endl;
    cout << "\n💀 FINAL MALO: Te pierdes para siempre en el bosque." << endl;
  }
}

// Escena 2B: Las montañas
void escenaMontanas() {
  int decision;
  
  cout << "\n--- EN LAS MONTAÑAS ---" << endl;
  cout << "Subes por un camino rocoso." << endl;
  cout << "Encuentras una cueva misteriosa." << endl;
  cout << "1. Entrar a la cueva" << endl;
  cout << "2. Regresar a la playa" << endl;
  cout << "¿Qué haces? (1 o 2): ";
  cin >> decision;
  
  if (decision == 1) {
    cout << "\n--- DENTRO DE LA CUEVA ---" << endl;
    cout << "Hay un dragón dormido... ¡y un cofre de oro!" << endl;
    cout << "1. Intentar tomar el oro sin despertar al dragón" << endl;
    cout << "2. Salir sigilosamente" << endl;
    cout << "¿Qué haces? (1 o 2): ";
    cin >> decision;
    
    if (decision == 1) {
      cout << "\n¡El dragón despierta!" << endl;
      cout << "Pero... ¡es un dragón amigable!" << endl;
      cout << "Te ayuda a cargar el tesoro." << endl;
      cout << "\n🎉 FINAL ÉPICO: ¡Ganas el tesoro y un amigo dragón!" << endl;
    } else {
      cout << "\nSales de la cueva con vida." << endl;
      cout << "Decides vivir en paz en la isla." << endl;
      cout << "\n😊 FINAL NEUTRAL: Vives tranquilo en la isla." << endl;
    }
  } else {
    escenaPlaya();  // Volver a la playa
  }
}

int main() {
  introduccion();
  escenaPlaya();
  
  cout << "\n=== FIN DEL JUEGO ===" << endl;
  cout << "¡Gracias por jugar!" << endl;
  
  return 0;
}

💡 Cómo funciona:

1. Cada escena es una función separada

2. Las decisiones del jugador (1 o 2) determinan qué función se llama después

3. Hay múltiples finales posibles según las decisiones

4. Si el jugador ingresa una opción inválida, se vuelve a preguntar

🎯 Ejercicio de extensión: Mejora el juego agregando:

• Un sistema de inventario (el jugador puede recoger objetos)

• Más escenas y decisiones

• Un sistema de puntos o vida

• Descripciones más detalladas

💡 Ver ejemplo de inventario
// Agregar al inicio del programa
bool tieneLinterna = false;
bool tieneLlave = false;

// En una escena:
cout << "Encuentras una linterna en el suelo." << endl;
cout << "¿La recoges? (1=Sí, 2=No): ";
cin >> decision;

if (decision == 1) {
  tieneLinterna = true;
  cout << "¡Linterna agregada al inventario!" << endl;
}

// Más adelante:
if (tieneLinterna) {
  cout << "Usas la linterna para ver en la oscuridad." << endl;
  // Desbloquear nueva ruta
} else {
  cout << "Está muy oscuro para continuar." << endl;
}

🏆 Desafío: Crea tu propia aventura con tema diferente (espacio, ciudad, escuela, etc.) con al menos 3 finales diferentes.

Sesión 14: Proyecto - Sistema de calificaciones

📊 Descripción del proyecto: Crearás un programa completo para gestionar calificaciones de estudiantes. Podrás agregar estudiantes, ingresar sus calificaciones, calcular promedios y ver estadísticas.

🎯 Objetivo: Crear un sistema que maneje al menos 5 estudiantes con 3 calificaciones cada uno.

🛠️ Conceptos que usarás:

• Arreglos (para guardar nombres y calificaciones)

• Bucles (para recorrer estudiantes)

• Funciones (para organizar el código)

• Operaciones matemáticas (promedios, máximos, mínimos)

📝 Código completo del sistema:

#include <iostream>
#include <string>
using namespace std;

const int MAX_ESTUDIANTES = 5;
const int NUM_CALIFICACIONES = 3;

// Arreglos globales
string nombres[MAX_ESTUDIANTES];
double calificaciones[MAX_ESTUDIANTES][NUM_CALIFICACIONES];
double promedios[MAX_ESTUDIANTES];
int numEstudiantes = 0;

// Función para agregar estudiante
void agregarEstudiante() {
  if (numEstudiantes >= MAX_ESTUDIANTES) {
    cout << "\nNo se pueden agregar más estudiantes." << endl;
    return;
  }
  
  cout << "\n--- AGREGAR ESTUDIANTE ---" << endl;
  cout << "Nombre del estudiante: ";
  cin >> nombres[numEstudiantes];
  
  cout << "Ingresa 3 calificaciones (0-100):" << endl;
  double suma = 0;
  
  for (int i = 0; i < NUM_CALIFICACIONES; i++) {
    cout << "Calificación " << (i + 1) << ": ";
    cin >> calificaciones[numEstudiantes][i];
    suma += calificaciones[numEstudiantes][i];
  }
  
  promedios[numEstudiantes] = suma / NUM_CALIFICACIONES;
  numEstudiantes++;
  
  cout << "\n✅ Estudiante agregado exitosamente!" << endl;
}

// Función para mostrar todos los estudiantes
void mostrarEstudiantes() {
  if (numEstudiantes == 0) {
    cout << "\nNo hay estudiantes registrados." << endl;
    return;
  }
  
  cout << "\n--- LISTA DE ESTUDIANTES ---" << endl;
  for (int i = 0; i < numEstudiantes; i++) {
    cout << "\nEstudiante: " << nombres[i] << endl;
    cout << "Calificaciones: ";
    
    for (int j = 0; j < NUM_CALIFICACIONES; j++) {
      cout << calificaciones[i][j] << " ";
    }
    
    cout << "\nPromedio: " << promedios[i] << endl;
  }
}

// Función para encontrar el mejor estudiante
void mejorEstudiante() {
  if (numEstudiantes == 0) {
    cout << "\nNo hay estudiantes registrados." << endl;
    return;
  }
  
  int indiceMejor = 0;
  double mejorPromedio = promedios[0];
  
  for (int i = 1; i < numEstudiantes; i++) {
    if (promedios[i] > mejorPromedio) {
      mejorPromedio = promedios[i];
      indiceMejor = i;
    }
  }
  
  cout << "\n🏆 MEJOR ESTUDIANTE:" << endl;
  cout << "Nombre: " << nombres[indiceMejor] << endl;
  cout << "Promedio: " << mejorPromedio << endl;
}

// Función para calcular promedio general
void promedioGeneral() {
  if (numEstudiantes == 0) {
    cout << "\nNo hay estudiantes registrados." << endl;
    return;
  }
  
  double suma = 0;
  for (int i = 0; i < numEstudiantes; i++) {
    suma += promedios[i];
  }
  
  double promedio = suma / numEstudiantes;
  cout << "\n📊 Promedio general del grupo: " << promedio << endl;
}

// Menú principal
void mostrarMenu() {
  cout << "\n=== SISTEMA DE CALIFICACIONES ===" << endl;
  cout << "1. Agregar estudiante" << endl;
  cout << "2. Mostrar todos los estudiantes" << endl;
  cout << "3. Ver mejor estudiante" << endl;
  cout << "4. Ver promedio general" << endl;
  cout << "5. Salir" << endl;
  cout << "Elige una opción: ";
}

int main() {
  int opcion;
  
  do {
    mostrarMenu();
    cin >> opcion;
    
    switch (opcion) {
      case 1:
        agregarEstudiante();
        break;
      case 2:
        mostrarEstudiantes();
        break;
      case 3:
        mejorEstudiante();
        break;
      case 4:
        promedioGeneral();
        break;
      case 5:
        cout << "\n¡Hasta luego!" << endl;
        break;
      default:
        cout << "\nOpción inválida" << endl;
    }
  } while (opcion != 5);
  
  return 0;
}

💡 Cómo funciona:

1. Usamos arreglos bidimensionales para guardar calificaciones (filas=estudiantes, columnas=calificaciones)

2. Cada función tiene una responsabilidad específica

3. El menú se repite hasta que el usuario elige salir

4. Validamos que no se excedan los límites de estudiantes

🎯 Ejercicio de extensión: Mejora el sistema agregando:

• Opción para eliminar estudiantes

• Buscar estudiante por nombre

• Mostrar quién tiene la calificación más baja

• Guardar datos en un archivo de texto

🏆 Desafío: Agrega calificaciones con letras (A, B, C, D, F) basadas en el promedio numérico.

Sesión 15: Proyecto - Juego de memoria

🧠 Descripción del proyecto: Crearás un juego que pone a prueba tu memoria. El programa muestra una secuencia de números, los oculta y tú debes recordarlos en el orden correcto.

🎯 Objetivo: Crear un juego con niveles de dificultad creciente (más números en cada nivel).

🛠️ Conceptos que usarás:

• Arreglos (para guardar la secuencia)

• Números aleatorios (para generar secuencias)

• Bucles (para mostrar y verificar)

• Comparaciones (para verificar respuestas)

📝 Código completo del juego:

#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;

const int MAX_SECUENCIA = 10;

// Función para generar secuencia aleatoria
void generarSecuencia(int secuencia[], int longitud) {
  for (int i = 0; i < longitud; i++) {
    secuencia[i] = (rand() % 9) + 1;  // Números del 1 al 9
  }
}

// Función para mostrar secuencia
void mostrarSecuencia(int secuencia[], int longitud) {
  cout << "\nMemoriza esta secuencia:" << endl;
  for (int i = 0; i < longitud; i++) {
    cout << secuencia[i] << " ";
  }
  cout << endl;
  
  // Pausa para que el jugador memorice
  cout << "\nPresiona Enter cuando estés listo...";
  cin.ignore();
  cin.get();
  
  // "Limpiar" pantalla mostrando líneas vacías
  for (int i = 0; i < 20; i++) {
    cout << endl;
  }
}

// Función para verificar respuestas
bool verificarRespuestas(int secuencia[], int longitud) {
  int respuesta;
  
  cout << "\nIngresa la secuencia que memorizaste:" << endl;
  
  for (int i = 0; i < longitud; i++) {
    cout << "Número " << (i + 1) << ": ";
    cin >> respuesta;
    
    if (respuesta != secuencia[i]) {
      cout << "\n❌ Incorrecto! El número era " << secuencia[i] << endl;
      return false;
    }
  }
  
  return true;
}

int main() {
  srand(time(0));
  
  int secuencia[MAX_SECUENCIA];
  int nivel = 1;
  int longitudSecuencia = 3;  // Empezar con 3 números
  int puntos = 0;
  
  cout << "=== JUEGO DE MEMORIA ===" << endl;
  cout << "Memoriza la secuencia de números y reprodúcela." << endl;
  
  while (longitudSecuencia <= MAX_SECUENCIA) {
    cout << "\n--- NIVEL " << nivel << " ---" << endl;
    cout << "Secuencia de " << longitudSecuencia << " números" << endl;
    
    // Generar y mostrar secuencia
    generarSecuencia(secuencia, longitudSecuencia);
    mostrarSecuencia(secuencia, longitudSecuencia);
    
    // Verificar respuestas
    if (verificarRespuestas(secuencia, longitudSecuencia)) {
      cout << "\n✅ ¡CORRECTO!" << endl;
      puntos += longitudSecuencia * 10;
      cout << "Puntos: " << puntos << endl;
      
      nivel++;
      longitudSecuencia++;  // Aumentar dificultad
      
      cout << "\nPresiona Enter para continuar al siguiente nivel...";
      cin.ignore();
      cin.get();
    } else {
      cout << "\n🚨 GAME OVER" << endl;
      cout << "Llegaste al nivel " << nivel << endl;
      cout << "Puntos totales: " << puntos << endl;
      break;
    }
  }
  
  if (longitudSecuencia > MAX_SECUENCIA) {
    cout << "\n🏆 ¡GANASTE! Completaste todos los niveles!" << endl;
    cout << "Puntos totales: " << puntos << endl;
  }
  
  return 0;
}

💡 Cómo funciona:

1. Cada nivel aumenta la cantidad de números a memorizar

2. La secuencia se genera aleatoriamente

3. Se "limpia" la pantalla para ocultar la secuencia

4. El jugador gana puntos por cada nivel completado

5. El juego termina si fallas o si completas todos los niveles

🎯 Ejercicio de extensión: Mejora el juego agregando:

• Tiempo límite para memorizar

• Diferentes modos (números, letras, colores)

• Sistema de vidas (3 intentos antes de perder)

• Tabla de mejores puntajes

🏆 Desafío: Crea una versión donde la secuencia se muestra una vez y luego se reproduce con sonidos (usando caracteres ASCII para simular sonidos).

Sesión 16: Proyecto - Conversor de unidades

🔄 Descripción del proyecto: Crearás una herramienta útil que convierte entre diferentes unidades de medida. Será como una calculadora especializada en conversiones.

🎯 Objetivo: Crear un conversor con al menos 5 tipos de conversiones diferentes.

🛠️ Conceptos que usarás:

• Funciones (una para cada tipo de conversión)

• Menús interactivos (switch)

• Operaciones matemáticas (fórmulas de conversión)

• Validación de entrada

📝 Código completo del conversor:

#include <iostream>
#include <cmath>
using namespace std;

// Conversiones de distancia
void convertirDistancia() {
  double valor;
  int opcion;
  
  cout << "\n--- CONVERSOR DE DISTANCIA ---" << endl;
  cout << "1. Kilómetros a Millas" << endl;
  cout << "2. Millas a Kilómetros" << endl;
  cout << "3. Metros a Pies" << endl;
  cout << "Elige: ";
  cin >> opcion;
  
  cout << "Ingresa el valor: ";
  cin >> valor;
  
  switch (opcion) {
    case 1:
      cout << valor << " km = " << (valor * 0.621371) << " millas" << endl;
      break;
    case 2:
      cout << valor << " millas = " << (valor * 1.60934) << " km" << endl;
      break;
    case 3:
      cout << valor << " m = " << (valor * 3.28084) << " pies" << endl;
      break;
    default:
      cout << "Opción inválida" << endl;
  }
}

// Conversiones de temperatura
void convertirTemperatura() {
  double valor;
  int opcion;
  
  cout << "\n--- CONVERSOR DE TEMPERATURA ---" << endl;
  cout << "1. Celsius a Fahrenheit" << endl;
  cout << "2. Fahrenheit a Celsius" << endl;
  cout << "3. Celsius a Kelvin" << endl;
  cout << "Elige: ";
  cin >> opcion;
  
  cout << "Ingresa el valor: ";
  cin >> valor;
  
  switch (opcion) {
    case 1:
      cout << valor << "°C = " << ((valor * 9/5) + 32) << "°F" << endl;
      break;
    case 2:
      cout << valor << "°F = " << ((valor - 32) * 5/9) << "°C" << endl;
      break;
    case 3:
      cout << valor << "°C = " << (valor + 273.15) << "K" << endl;
      break;
    default:
      cout << "Opción inválida" << endl;
  }
}

// Conversiones de peso
void convertirPeso() {
  double valor;
  int opcion;
  
  cout << "\n--- CONVERSOR DE PESO ---" << endl;
  cout << "1. Kilogramos a Libras" << endl;
  cout << "2. Libras a Kilogramos" << endl;
  cout << "3. Gramos a Onzas" << endl;
  cout << "Elige: ";
  cin >> opcion;
  
  cout << "Ingresa el valor: ";
  cin >> valor;
  
  switch (opcion) {
    case 1:
      cout << valor << " kg = " << (valor * 2.20462) << " lb" << endl;
      break;
    case 2:
      cout << valor << " lb = " << (valor * 0.453592) << " kg" << endl;
      break;
    case 3:
      cout << valor << " g = " << (valor * 0.035274) << " oz" << endl;
      break;
    default:
      cout << "Opción inválida" << endl;
  }
}

// Conversiones de tiempo
void convertirTiempo() {
  double valor;
  int opcion;
  
  cout << "\n--- CONVERSOR DE TIEMPO ---" << endl;
  cout << "1. Horas a Minutos" << endl;
  cout << "2. Minutos a Segundos" << endl;
  cout << "3. Días a Horas" << endl;
  cout << "Elige: ";
  cin >> opcion;
  
  cout << "Ingresa el valor: ";
  cin >> valor;
  
  switch (opcion) {
    case 1:
      cout << valor << " horas = " << (valor * 60) << " minutos" << endl;
      break;
    case 2:
      cout << valor << " minutos = " << (valor * 60) << " segundos" << endl;
      break;
    case 3:
      cout << valor << " días = " << (valor * 24) << " horas" << endl;
      break;
    default:
      cout << "Opción inválida" << endl;
  }
}

// Menú principal
void mostrarMenu() {
  cout << "\n=== CONVERSOR UNIVERSAL ===" << endl;
  cout << "1. Distancia" << endl;
  cout << "2. Temperatura" << endl;
  cout << "3. Peso" << endl;
  cout << "4. Tiempo" << endl;
  cout << "5. Salir" << endl;
  cout << "Elige una categoría: ";
}

int main() {
  int opcion;
  
  do {
    mostrarMenu();
    cin >> opcion;
    
    switch (opcion) {
      case 1:
        convertirDistancia();
        break;
      case 2:
        convertirTemperatura();
        break;
      case 3:
        convertirPeso();
        break;
      case 4:
        convertirTiempo();
        break;
      case 5:
        cout << "\n¡Hasta luego!" << endl;
        break;
      default:
        cout << "\nOpción inválida" << endl;
    }
  } while (opcion != 5);
  
  return 0;
}

💡 Cómo funciona:

1. Cada categoría tiene su propia función

2. Dentro de cada categoría hay múltiples conversiones

3. Usamos fórmulas matemáticas precisas para cada conversión

4. El menú se repite hasta que el usuario elige salir

🎯 Ejercicio de extensión: Mejora el conversor agregando:

• Conversiones de área (metros cuadrados, hectáreas)

• Conversiones de volumen (litros, galones)

• Conversiones de velocidad (km/h, mph)

• Historial de conversiones realizadas

🏆 Desafío: Agrega una calculadora de IMC (Indice de Masa Corporal) que use las conversiones de peso y altura.

🔧 FASE 5: ¡Arduino! (Sesiones 17-20)

🎯 Meta de esta fase: Conectar tu código con el mundo físico. Hacer que luces se enciendan, motores se muevan y sensores detecten cosas.

Sesión 17: ¿Qué es Arduino?

🤖 Explicación simple: Arduino es una computadora beburp (microcontrolador) que puedes programar para controlar cosas físicas: luces, motores, sensores, pantallas. Es el puente entre el mundo digital (tu código) y el mundo físico (LEDs, motores, etc.).

📦 Materiales necesarios para empezar:

Arduino Uno (o compatible) - $20-30 USD aproximadamente

Cable USB (tipo A a B) - Para conectar Arduino a la computadora

LEDs (5mm, varios colores) - $0.10 cada uno

Resistencias de 220Ω (ohms) - Para proteger los LEDs

Protoboard (breadboard) - Para hacer conexiones sin soldar

Cables jumper (macho-macho) - Para conectar componentes

📍 Partes importantes de Arduino:

Pines digitales (0-13): Pueden estar encendidos (HIGH/5V) o apagados (LOW/0V)

Pines analógicos (A0-A5): Leen valores entre 0 y 1023 (sensores)

Pin GND (tierra): Polo negativo, completa el circuito

Pin 5V: Proporciona 5 voltios de energía

Puerto USB: Conecta a la computadora para programar y dar energía

💡 Proyecto 1: LED parpadeante (Blink)

Cómo conectar:

1. Conecta el LED al pin 13 de Arduino (pata larga/positiva)

2. Conecta una resistencia de 220Ω entre el LED y GND

3. ¡Listo! El pin 13 ya tiene resistencia interna, pero es buena práctica usar una externa

Diagrama de conexión (descripción):

Arduino Pin 13 ----> LED (pata larga +)
                     LED (pata corta -) ----> Resistencia 220Ω ----> GND

Código completo:

// Programa Blink - Hacer parpadear un LED

void setup() {
  // setup() se ejecuta UNA VEZ al iniciar
  pinMode(13, OUTPUT);  // Configurar pin 13 como salida
}

void loop() {
  // loop() se repite INFINITAMENTE
  digitalWrite(13, HIGH);  // Encender LED (5V)
  delay(1000);             // Esperar 1000 milisegundos (1 segundo)
  digitalWrite(13, LOW);   // Apagar LED (0V)
  delay(1000);             // Esperar 1 segundo
}

// Resultado: El LED parpadea cada segundo

💡 Conceptos importantes:

void setup() - Se ejecuta UNA vez cuando Arduino enciende

void loop() - Se repite infinitamente (como un bucle while(true))

pinMode(pin, modo) - Configura un pin como INPUT o OUTPUT

digitalWrite(pin, valor) - Escribe HIGH (5V) o LOW (0V) en un pin

delay(milisegundos) - Pausa el programa (1000ms = 1 segundo)

🎯 Ejercicio 1: Modifica el código para que el LED parpadee más rápido (cada 0.5 segundos).

✅ Ver solución
void setup() {
  pinMode(13, OUTPUT);
}

void loop() {
  digitalWrite(13, HIGH);
  delay(500);  // Cambiado de 1000 a 500 (medio segundo)
  digitalWrite(13, LOW);
  delay(500);
}

Explicación: Cambiamos delay(1000) a delay(500) para que el LED esté encendido y apagado solo medio segundo cada vez.

🎯 Ejercicio 2: Conecta un segundo LED al pin 12 y haz que los dos LEDs parpadeen alternadamente (cuando uno está encendido, el otro apagado).

💡 Ver pista

Necesitas configurar el pin 12 como OUTPUT en setup(). Luego en loop(), cuando el pin 13 está HIGH, el pin 12 debe estar LOW, y viceversa.

✅ Ver solución

Conexiones:

Pin 13 ----> LED1 (+) ----> Resistencia ----> GND
Pin 12 ----> LED2 (+) ----> Resistencia ----> GND

Código:

void setup() {
  pinMode(13, OUTPUT);  // LED 1
  pinMode(12, OUTPUT);  // LED 2
}

void loop() {
  digitalWrite(13, HIGH);  // LED 1 encendido
  digitalWrite(12, LOW);   // LED 2 apagado
  delay(500);
  
  digitalWrite(13, LOW);   // LED 1 apagado
  digitalWrite(12, HIGH);  // LED 2 encendido
  delay(500);
}

Explicación: Los dos LEDs se alternan: cuando uno está encendido, el otro está apagado. Esto crea un efecto de parpadeo alternado.

🛠️ Software necesario:

1. Descarga Arduino IDE desde arduino.cc/en/software (gratis)

2. Instala el programa en tu computadora

3. Conecta Arduino con el cable USB

4. En Arduino IDE: Herramientas → Placa → Arduino Uno

5. En Arduino IDE: Herramientas → Puerto → (selecciona el puerto COM o /dev/tty)

6. Escribe tu código y presiona el botón de "Subir" (→)

Sesión 18: Sensores (leer el mundo)

🌡️ Qué aprenderás: Usar sensores para que Arduino detecte luz, temperatura, distancia, movimiento. Los sensores convierten el mundo físico en números que Arduino puede leer.

📦 Materiales adicionales:

Fotoresistencia (LDR) - Sensor de luz ($0.50)

Resistencia de 10kΩ - Para el divisor de voltaje

Sensor ultrasónico HC-SR04 - Mide distancia ($2-3)

Sensor de temperatura DHT11 - Mide temperatura y humedad ($2)

💡 Proyecto 1: Lámpara automática con fotoresistencia

Cómo funciona una fotoresistencia:

La fotoresistencia (LDR) cambia su resistencia según la luz. Más luz = menos resistencia. Menos luz = más resistencia. Arduino lee esto como un valor entre 0 (oscuro) y 1023 (muy brillante).

Cómo conectar:

5V ----> Fotoresistencia ----> A0 (pin analógico)
                               |
                          Resistencia 10kΩ
                               |
                              GND

Pin 13 ----> LED (+) ----> Resistencia 220Ω ----> GND

Código completo:

// Lámpara automática - Se enciende cuando está oscuro

const int pinLuz = A0;    // Fotoresistencia en pin A0
const int pinLED = 13;    // LED en pin 13
const int umbral = 300;   // Valor de oscuridad (ajustable)

void setup() {
  pinMode(pinLED, OUTPUT);
  Serial.begin(9600);  // Iniciar comunicación serial para ver valores
}

void loop() {
  // Leer valor del sensor (0-1023)
  int valorLuz = analogRead(pinLuz);
  
  // Mostrar valor en el monitor serial
  Serial.print("Luz: ");
  Serial.println(valorLuz);
  
  // Si está oscuro (valor bajo), encender LED
  if (valorLuz < umbral) {
    digitalWrite(pinLED, HIGH);
    Serial.println("LED encendido - Está oscuro");
  } else {
    digitalWrite(pinLED, LOW);
    Serial.println("LED apagado - Hay luz");
  }
  
  delay(500);  // Esperar medio segundo antes de leer de nuevo
}

💡 Conceptos nuevos:

analogRead(pin) - Lee un valor analógico (0-1023) de un pin A0-A5

Serial.begin(9600) - Inicia comunicación con la computadora

Serial.println() - Muestra valores en el Monitor Serial (Herramientas → Monitor Serial)

const int - Variable constante que no cambia

💡 Proyecto 2: Sensor de distancia ultrasónico

Cómo funciona:

El sensor HC-SR04 envía ondas de sonido (ultrasónicas) y mide cuánto tardan en regresar. Con ese tiempo calcula la distancia a un objeto.

Cómo conectar:

Sensor HC-SR04:
  VCC  ----> 5V
  TRIG ----> Pin 9
  ECHO ----> Pin 10
  GND  ----> GND

Código completo:

// Sensor de distancia ultrasónico

const int pinTrig = 9;
const int pinEcho = 10;

void setup() {
  pinMode(pinTrig, OUTPUT);
  pinMode(pinEcho, INPUT);
  Serial.begin(9600);
}

void loop() {
  // Enviar pulso ultrasónico
  digitalWrite(pinTrig, LOW);
  delayMicroseconds(2);
  digitalWrite(pinTrig, HIGH);
  delayMicroseconds(10);
  digitalWrite(pinTrig, LOW);
  
  // Leer el tiempo que tarda en regresar
  long duracion = pulseIn(pinEcho, HIGH);
  
  // Calcular distancia en centímetros
  // Velocidad del sonido = 343 m/s = 0.0343 cm/microsegundo
  // Distancia = (tiempo * velocidad) / 2 (ida y vuelta)
  int distancia = duracion * 0.0343 / 2;
  
  // Mostrar distancia
  Serial.print("Distancia: ");
  Serial.print(distancia);
  Serial.println(" cm");
  
  // Alerta si algo está muy cerca
  if (distancia < 10) {
    Serial.println("⚠️ ¡OBJETO CERCA!");
  }
  
  delay(500);
}

💡 Conceptos nuevos:

delayMicroseconds() - Pausa en microségundos (1 segundo = 1,000,000 microségundos)

pulseIn(pin, estado) - Mide cuánto tiempo un pin está en HIGH o LOW

long - Tipo de dato para números muy grandes

🎯 Ejercicio: Combina el sensor de distancia con un LED. Si un objeto está a menos de 20cm, enciende el LED. Si está más lejos, apágalo.

✅ Ver solución
const int pinTrig = 9;
const int pinEcho = 10;
const int pinLED = 13;

void setup() {
  pinMode(pinTrig, OUTPUT);
  pinMode(pinEcho, INPUT);
  pinMode(pinLED, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  digitalWrite(pinTrig, LOW);
  delayMicroseconds(2);
  digitalWrite(pinTrig, HIGH);
  delayMicroseconds(10);
  digitalWrite(pinTrig, LOW);
  
  long duracion = pulseIn(pinEcho, HIGH);
  int distancia = duracion * 0.0343 / 2;
  
  Serial.print("Distancia: ");
  Serial.print(distancia);
  Serial.println(" cm");
  
  // Encender LED si objeto está cerca
  if (distancia < 20) {
    digitalWrite(pinLED, HIGH);
    Serial.println("💡 LED encendido - Objeto cerca");
  } else {
    digitalWrite(pinLED, LOW);
    Serial.println("LED apagado - Objeto lejos");
  }
  
  delay(500);
}

Explicación: Agregamos un LED en el pin 13 y lo encendemos cuando la distancia es menor a 20cm. Esto podría ser la base de un sistema de estacionamiento o alarma de proximidad.

Sesión 19: Motores y movimiento

⚙️ Qué aprenderás: Controlar motores para hacer que cosas se muevan: ruedas de robot, brazos mecánicos, ventiladores. Los motores necesitan más energía que los LEDs, por eso usamos un controlador especial.

📦 Materiales necesarios:

Servomotor SG90 - Motor que gira a ángulos específicos ($3-5)

Motor DC con ruedas - Para robots móviles ($2-3 cada uno)

Controlador L298N - Para controlar motores DC ($3-5)

Baterías 9V o 4xAA - Fuente de energía externa para motores

💡 Proyecto 1: Servomotor (brazo mecánico simple)

Qué es un servomotor:

Un servomotor puede girar a un ángulo específico (0° a 180°). Es perfecto para brazos robóticos, puertas automáticas, etc.

Cómo conectar:

Servomotor SG90 (3 cables):
  Cable ROJO    ----> 5V
  Cable MARRÓN  ----> GND
  Cable NARANJA ----> Pin 9 (señal PWM)

Código completo:

// Control de servomotor - Mover de 0° a 180°

#include <Servo.h>  // Biblioteca para servomotores

Servo miServo;  // Crear objeto servo

void setup() {
  miServo.attach(9);  // Conectar servo al pin 9
  Serial.begin(9600);
}

void loop() {
  // Mover de 0° a 180° gradualmente
  for (int angulo = 0; angulo <= 180; angulo++) {
    miServo.write(angulo);  // Mover a este ángulo
    Serial.print("Angulo: ");
    Serial.println(angulo);
    delay(15);  // Esperar para movimiento suave
  }
  
  delay(1000);  // Pausa en 180°
  
  // Regresar de 180° a 0°
  for (int angulo = 180; angulo >= 0; angulo--) {
    miServo.write(angulo);
    Serial.print("Angulo: ");
    Serial.println(angulo);
    delay(15);
  }
  
  delay(1000);  // Pausa en 0°
}

💡 Conceptos nuevos:

#include <Servo.h> - Importa biblioteca para servos

Servo miServo; - Crea un objeto de tipo Servo

miServo.attach(pin) - Conecta el servo a un pin

miServo.write(angulo) - Mueve el servo a un ángulo (0-180)

💡 Proyecto 2: Robot con motores DC

Cómo funciona:

Los motores DC giran continuamente. El controlador L298N permite controlar la velocidad y dirección de 2 motores simultáneamente.

Cómo conectar (L298N):

Controlador L298N:
  Motor A:
    OUT1, OUT2 ----> Motor izquierdo
  Motor B:
    OUT3, OUT4 ----> Motor derecho
    
  Pines de control:
    IN1 ----> Pin 5
    IN2 ----> Pin 6
    IN3 ----> Pin 10
    IN4 ----> Pin 11
    ENA ----> Pin 9  (velocidad motor A)
    ENB ----> Pin 3  (velocidad motor B)
    
  Energía:
    12V ----> Batería 9V (+)
    GND ----> Batería (-) y Arduino GND (compartido)
    5V  ----> Dejar desconectado (Arduino tiene su propia energía)

Código completo:

// Robot con motores DC - Avanzar, retroceder, girar

// Pines motor izquierdo (A)
const int motorA1 = 5;
const int motorA2 = 6;
const int velocidadA = 9;

// Pines motor derecho (B)
const int motorB1 = 10;
const int motorB2 = 11;
const int velocidadB = 3;

void setup() {
  pinMode(motorA1, OUTPUT);
  pinMode(motorA2, OUTPUT);
  pinMode(velocidadA, OUTPUT);
  pinMode(motorB1, OUTPUT);
  pinMode(motorB2, OUTPUT);
  pinMode(velocidadB, OUTPUT);
  Serial.begin(9600);
}

void avanzar() {
  digitalWrite(motorA1, HIGH);
  digitalWrite(motorA2, LOW);
  digitalWrite(motorB1, HIGH);
  digitalWrite(motorB2, LOW);
  analogWrite(velocidadA, 200);  // Velocidad 0-255
  analogWrite(velocidadB, 200);
  Serial.println("⬆️ Avanzando");
}

void retroceder() {
  digitalWrite(motorA1, LOW);
  digitalWrite(motorA2, HIGH);
  digitalWrite(motorB1, LOW);
  digitalWrite(motorB2, HIGH);
  analogWrite(velocidadA, 200);
  analogWrite(velocidadB, 200);
  Serial.println("⬇️ Retrocediendo");
}

void girarDerecha() {
  digitalWrite(motorA1, HIGH);
  digitalWrite(motorA2, LOW);
  digitalWrite(motorB1, LOW);
  digitalWrite(motorB2, HIGH);
  analogWrite(velocidadA, 150);
  analogWrite(velocidadB, 150);
  Serial.println("➡️ Girando derecha");
}

void girarIzquierda() {
  digitalWrite(motorA1, LOW);
  digitalWrite(motorA2, HIGH);
  digitalWrite(motorB1, HIGH);
  digitalWrite(motorB2, LOW);
  analogWrite(velocidadA, 150);
  analogWrite(velocidadB, 150);
  Serial.println("⬅️ Girando izquierda");
}

void detener() {
  digitalWrite(motorA1, LOW);
  digitalWrite(motorA2, LOW);
  digitalWrite(motorB1, LOW);
  digitalWrite(motorB2, LOW);
  analogWrite(velocidadA, 0);
  analogWrite(velocidadB, 0);
  Serial.println("⏸️ Detenido");
}

void loop() {
  avanzar();
  delay(2000);
  
  detener();
  delay(1000);
  
  girarDerecha();
  delay(1000);
  
  detener();
  delay(1000);
  
  retroceder();
  delay(2000);
  
  detener();
  delay(1000);
  
  girarIzquierda();
  delay(1000);
  
  detener();
  delay(2000);
}

💡 Conceptos nuevos:

analogWrite(pin, valor) - Escribe un valor PWM (0-255) para controlar velocidad

PWM (Pulse Width Modulation): Técnica para controlar velocidad variando el voltaje promedio

• Pines PWM en Arduino Uno: 3, 5, 6, 9, 10, 11 (marcados con ~)

🎯 Ejercicio: Agrega control por comandos desde el Monitor Serial. Si escribes 'A' avanza, 'R' retrocede, 'D' gira derecha, 'I' gira izquierda, 'S' se detiene.

💡 Ver pista

Usa Serial.available() para verificar si hay datos, y Serial.read() para leer el comando. Luego usa switch o if para ejecutar la acción correspondiente.

✅ Ver solución
void loop() {
  if (Serial.available() > 0) {
    char comando = Serial.read();
    
    switch (comando) {
      case 'A':
      case 'a':
        avanzar();
        break;
      case 'R':
      case 'r':
        retroceder();
        break;
      case 'D':
      case 'd':
        girarDerecha();
        break;
      case 'I':
      case 'i':
        girarIzquierda();
        break;
      case 'S':
      case 's':
        detener();
        break;
      default:
        Serial.println("❌ Comando inválido. Usa: A, R, D, I, S");
    }
  }
}

Explicación: Ahora puedes controlar el robot escribiendo comandos en el Monitor Serial. Esto es la base para control remoto por Bluetooth o WiFi.

Sesión 20: Proyecto final - Sistema completo

🏆 Objetivo: Crear un proyecto completo que combine todo lo aprendido: sensores, actuadores (LEDs, motores), lógica de programación y creatividad.

📝 Opciones de proyecto final:

1️⃣ Estación meteorológica

Qué hace: Mide temperatura y humedad, muestra datos en pantalla LCD.

Materiales:

• Sensor DHT11 (temperatura y humedad)

• Pantalla LCD 16x2 con I2C

• LEDs de colores (opcional: verde=normal, amarillo=calor, azul=frío)

Funcionalidades:

• Leer temperatura y humedad cada 2 segundos

• Mostrar datos en pantalla LCD

• Encender LED verde si temperatura es normal (18-25°C)

• Encender LED amarillo si hace calor (>25°C)

• Encender LED azul si hace frío (<18°C)

• Enviar datos al Monitor Serial para graficar en computadora

Extensiones:

• Agregar sensor de presión atmosférica (BMP180)

• Guardar datos en tarjeta SD

• Enviar datos a internet con módulo WiFi ESP8266

2️⃣ Sistema de alarma inteligente

Qué hace: Detecta movimiento y activa alarma con luz y sonido.

Materiales:

• Sensor PIR (detector de movimiento)

• Buzzer (alarma sonora)

• LEDs rojos

• Botón (para activar/desactivar sistema)

Funcionalidades:

• Botón para armar/desarmar la alarma

• LED verde cuando está desarmada

• LED amarillo parpadeante cuando está armada

• Si detecta movimiento: LED rojo + buzzer + mensaje serial

• Contador de veces que se activó la alarma

Extensiones:

• Agregar teclado numérico para código de seguridad

• Enviar notificación por SMS o email

• Agregar cámara para tomar foto del intruso

3️⃣ Robot seguidor de línea

Qué hace: Robot autónomo que sigue una línea negra en el piso.

Materiales:

• 2 motores DC con ruedas

• Controlador L298N

• 2-3 sensores infrarrojos (detectan línea negra)

• Chasis de robot

• Baterías

Lógica de funcionamiento:

• Si sensor izquierdo detecta negro: girar izquierda

• Si sensor derecho detecta negro: girar derecha

• Si ambos sensores detectan blanco: avanzar recto

• Si ambos detectan negro: detenerse (fin de pista)

Extensiones:

• Agregar sensor ultrasónico para evitar obstáculos

• Medir velocidad y tiempo de recorrido

• Modo de competencia con cronometraje

4️⃣ Semáforo inteligente

Qué hace: Simula un semáforo real con botón peatonal y ciclos automáticos.

Materiales:

• 6 LEDs (3 rojos, 2 amarillos, 1 verde para cada dirección)

• Botón peatonal

• Buzzer (sonido para peatones)

• Resistencias 220Ω

Funcionalidades:

• Ciclo automático: Verde (30s) → Amarillo (3s) → Rojo (30s)

• Botón peatonal: acorta el ciclo para dar paso a peatones

• Sonido para peatones ciegos (beep cuando pueden cruzar)

• Modo nocturno: solo amarillo parpadeante

Código ejemplo (estructura básica):

const int ledVerde = 9;
const int ledAmarillo = 10;
const int ledRojo = 11;
const int botonPeaton = 2;

void setup() {
  pinMode(ledVerde, OUTPUT);
  pinMode(ledAmarillo, OUTPUT);
  pinMode(ledRojo, OUTPUT);
  pinMode(botonPeaton, INPUT_PULLUP);
}

void cicloNormal() {
  // Verde
  digitalWrite(ledVerde, HIGH);
  digitalWrite(ledAmarillo, LOW);
  digitalWrite(ledRojo, LOW);
  delay(30000);  // 30 segundos
  
  // Amarillo
  digitalWrite(ledVerde, LOW);
  digitalWrite(ledAmarillo, HIGH);
  delay(3000);  // 3 segundos
  
  // Rojo
  digitalWrite(ledAmarillo, LOW);
  digitalWrite(ledRojo, HIGH);
  delay(30000);  // 30 segundos
}

void loop() {
  if (digitalRead(botonPeaton) == LOW) {
    // Botón presionado - ciclo rápido
    // ... implementar lógica
  } else {
    cicloNormal();
  }
}

Extensiones:

• Agregar semáforo para otra dirección (cruce de 4 vías)

• Sensor de tráfico para ajustar tiempos dinámicamente

• Pantalla LCD mostrando tiempo restante

📝 Guía para tu proyecto:

1. Planificación: Dibuja un diagrama de conexiones y lista de materiales

2. Prototipo: Conecta los componentes en la protoboard

3. Programación: Escribe el código por partes (primero sensores, luego actuadores, luego lógica)

4. Pruebas: Verifica cada funcionalidad por separado

5. Integración: Combina todo y ajusta

6. Documentación: Toma fotos, escribe cómo funciona

🎯 Presentación del proyecto:

Prepara una presentación de 5 minutos explicando:

• ¿Qué problema resuelve tu proyecto?

• ¿Cómo funciona? (muestra el código importante)

• ¿Qué dificultades tuviste y cómo las resolviste?

• Demostración en vivo

• ¿Cómo podrías mejorarlo?

🎉 ¡Felicitaciones!

Si llegaste hasta aquí, ya sabes programar en C++ y controlar hardware con Arduino. Puedes crear proyectos increíbles que combinan software y electrónica. ¡Sigue creando!

¿Qué aprenderás en este curso?

🎮 Crear tus propios juegos

Sesión 7: Programarás un juego de adivinanza con números aleatorios.

Sesión 13: Crearás un juego de aventura completo donde TÚ decides la historia.

Sesión 15: Harás un juego de memoria que pone a prueba tu cerebro.

🤖 Controlar robots reales

Sesión 17: Harás parpadear un LED con tu código.

Sesión 18: Usarás sensores para que Arduino detecte luz y distancia.

Sesión 19: Controlarás motores para hacer que un robot se mueva.

🛠️ Resolver problemas reales

Sesión 14: Crearás un sistema de calificaciones completo.

Sesión 16: Harás un conversor de unidades (temperatura, distancia, peso).

Sesión 20: Proyecto final: estación meteorológica, alarma inteligente o robot seguidor de línea.

💡 Entender cómo funciona todo

Sistemas numéricos: Descubrirás cómo las computadoras piensan en binario (0s y 1s).

Depuración: Aprenderás a encontrar y corregir errores como un profesional.

Hardware: Entenderás qué hace cada parte de la computadora y cómo conectar circuitos.

🎯 Al terminar este curso podrás:

✅ Escribir programas en C++ desde cero

✅ Crear juegos interactivos y aplicaciones útiles

✅ Programar Arduino para controlar LEDs, sensores y motores

✅ Entender cómo funciona la tecnología que usas todos los días

✅ Resolver problemas usando lógica y creatividad

✅ Tener las bases para aprender cualquier otro lenguaje de programación

Historia de la computación en imágenes

Las computadoras no aparecieron de la nada. Muchas personas inteligentes tuvieron ideas geniales a lo largo de los años. Cada una resolvió un problema diferente y así, poco a poco, se construyó la tecnología que usamos hoy. Aquí te contamos esa historia paso a paso.

Ada Lovelace

1843 · Ada Lovelace

¿Qué había antes? En esa época no existían las computadoras. La gente hacía cálculos matemáticos a mano o con máquinas muy simples que solo sumaban y restaban.

¿Qué hizo Ada? Un señor llamado Charles Babbage diseñó una máquina enorme (llamada "máquina analítica") que podía hacer cálculos complicados. Ada Lovelace estudió esa máquina y tuvo una idea brillante: "Esta máquina no solo puede calcular números, ¡también puede seguir instrucciones para hacer otras cosas!" Escribió el primer programa de la historia: una lista de pasos que la máquina debía seguir.

¿Por qué fue importante? Ada fue la primera persona en imaginar que las máquinas podían hacer más que solo matemáticas. Gracias a su idea, hoy las computadoras pueden mostrar videos, crear juegos y hacer millones de cosas diferentes.

Alan Turing

1936 · Alan Turing

¿Qué problema existía? Nadie sabía exactamente qué cosas podía resolver una máquina y qué cosas no. ¿Puede una máquina resolver cualquier problema matemático? ¿Hay límites?

¿Qué hizo Alan Turing? Turing imaginó una máquina muy simple (solo de papel, no la construyó de verdad) que podía leer y escribir símbolos en una cinta infinita siguiendo reglas. Con este modelo demostró que hay problemas que ninguna máquina puede resolver, sin importar qué tan poderosa sea.

¿Por qué fue importante? Gracias a Turing, hoy sabemos qué tareas puede hacer una computadora y cuáles no. También ayudó a crear las primeras computadoras reales durante la Segunda Guerra Mundial para descifrar mensajes secretos. Su trabajo es la base de toda la programación moderna.

Computadoras antiguas

1940s · Máquinas gigantes

¿Cómo eran? Las primeras computadoras eran enormes: ocupaban habitaciones completas, pesaban toneladas y necesitaban tanta electricidad como una casa entera. Tenían miles de cables y tubos de vidrio que se calentaban mucho. Para programarlas, había que conectar cables manualmente en diferentes posiciones.

¿Para qué servían? Se usaban principalmente para cálculos militares durante la guerra: calcular trayectorias de proyectiles, descifrar códigos secretos y hacer operaciones matemáticas que a una persona le tomarían meses.

¿Qué cambió? Aunque eran lentas y difíciles de usar, demostraron que las máquinas SÍ podían hacer el trabajo de muchas personas calculando. Esto convenció a gobiernos y empresas de invertir dinero para crear computadoras mejores y más pequeñas.

Grace Hopper

1952 · Grace Hopper

¿Cuál era el problema? Programar las primeras computadoras era súper difícil. Había que escribir en "código máquina": números y símbolos raros que solo la computadora entendía. Era como hablar en un idioma alienígena. Si cometías un error pequeño, nada funcionaba.

¿Qué inventó Grace Hopper? Grace creó el primer "compilador": un programa especial que traduce instrucciones escritas en palabras parecidas al inglés (como "SUMA" o "IMPRIME") a código máquina. Así, los programadores podían escribir en un lenguaje más fácil de entender.

¿Por qué fue importante? Gracias a Grace, programar se volvió mucho más fácil y rápido. Más personas pudieron aprender a programar sin ser expertas en matemáticas complicadas. Esto aceleró el desarrollo de nuevos programas y aplicaciones.

Nacimiento de la web

1990 · Nace la web

¿Qué había antes? Las computadoras ya existían, pero cada una trabajaba sola. Si querías compartir información con alguien, tenías que copiarla en un disco y llevárselo físicamente. No había forma fácil de conectar computadoras de diferentes lugares.

¿Qué inventó Tim Berners-Lee? Tim trabajaba en un laboratorio de ciencia y necesitaba compartir documentos con colegas de otros países. Inventó tres cosas importantes: 1) Las páginas web (documentos con texto, imágenes y enlaces), 2) Las direcciones web (como www.ejemplo.com), y 3) El navegador (programa para ver páginas web).

¿Cómo cambió el mundo? La web conectó todas las computadoras del planeta. Ahora podías buscar información, enviar mensajes, ver videos y jugar con personas de cualquier país. Esto creó YouTube, redes sociales, tiendas en línea y todo lo que usas en internet hoy. ¡La web hizo que el conocimiento estuviera disponible para todos!

¿Ves el patrón?

Cada persona en esta historia vio un problema y buscó una solución. Ada imaginó que las máquinas podían hacer más que solo sumar. Turing descubrió los límites de lo posible. Las máquinas gigantes demostraron que funcionaba. Grace hizo que programar fuera más fácil. Y Tim conectó todo el mundo con la web.

La tecnología no apareció de golpe: fue un trabajo de equipo que tomó más de 150 años. Cada avance se construyó sobre el anterior. Y lo mejor es que la historia continúa: ¡tú puedes ser parte de la siguiente gran idea!

Partes de la computadora

Una computadora es como un equipo de trabajo donde cada parte tiene un papel importante. Aquí te explicamos qué hace cada una, cómo se inventó, qué problemas resolvió y cómo ha mejorado con el tiempo. Haz clic en cada tarjeta para descubrir la historia completa.

Monitor

Monitor

La pantalla: tu ventana a la computadora

¿Qué hace? El monitor muestra todo lo que pasa dentro de la computadora: textos, imágenes, videos y juegos. Sin él, no podrías ver nada de lo que hace tu computadora.

¿Cómo empezó? Las primeras computadoras no tenían pantallas. Los resultados salían impresos en papel o con lucecitas que parpadeaban. Después inventaron monitores que solo mostraban letras verdes o blancas sobre fondo negro, como en las películas viejas.

¿Cómo mejoró? Primero aparecieron los monitores a color, luego las pantallas planas (más delgadas), después las de alta definición (imágenes súper nítidas) y ahora hay pantallas táctiles que responden cuando las tocas con el dedo.

Teclado

Teclado

Tu forma de hablar con la computadora

¿Qué hace? El teclado te permite escribir palabras, números y comandos. Es tu forma principal de darle instrucciones a la computadora: escribir mensajes, programar, buscar en internet o jugar.

¿Cómo empezó? Los primeros teclados eran como máquinas de escribir conectadas a la computadora. Hacían mucho ruido y las teclas eran muy duras. Algunos teclados antiguos tenían que perforar tarjetas de papel en lugar de escribir en una pantalla.

¿Cómo mejoró? Ahora los teclados son más cómodos, silenciosos y tienen teclas especiales para funciones rápidas. Existen teclados inalámbricos (sin cables), teclados que se iluminan en la oscuridad y hasta teclados virtuales en las pantallas táctiles.

CPU

CPU (Procesador)

El cerebro que piensa y decide

¿Qué hace? La CPU (Unidad Central de Procesamiento) es el cerebro de la computadora. Lee las instrucciones de los programas y las ejecuta súper rápido: hace cálculos, toma decisiones y controla todas las demás partes.

¿Cómo empezó? Los primeros procesadores eran del tamaño de una habitación y solo podían hacer unas pocas operaciones por segundo. Eran lentos, se calentaban muchísimo y consumían mucha electricidad.

¿Cómo mejoró? Los científicos aprendieron a hacer procesadores cada vez más pequeños y poderosos. Hoy un procesador cabe en tu mano y puede hacer ¡miles de millones de operaciones por segundo! Por eso tu computadora puede correr juegos, videos y muchos programas al mismo tiempo.

Memoria RAM

Memoria RAM

La memoria de trabajo rápida

¿Qué hace? La RAM (Memoria de Acceso Aleatorio) guarda temporalmente la información que la computadora está usando en este momento. Cuando abres un juego o un programa, se carga en la RAM para que funcione rápido. Cuando apagas la computadora, la RAM se borra.

¿Cómo empezó? Las primeras computadoras tenían muy poca memoria RAM, a veces solo unos pocos kilobytes (¡menos que una foto de tu celular!). Esto significaba que solo podían correr programas muy simples.

¿Cómo mejoró? Ahora las computadoras tienen gigabytes de RAM (millones de veces más). Esto permite tener muchas ventanas abiertas, correr juegos con gráficos increíbles y trabajar con videos y fotos grandes sin que la computadora se ponga lenta.

Almacenamiento

Disco Duro

Donde viven tus archivos para siempre

¿Qué hace? El disco duro guarda toda tu información de forma permanente: fotos, videos, juegos, programas y el sistema operativo. A diferencia de la RAM, no se borra cuando apagas la computadora.

¿Cómo empezó? Los primeros discos duros eran enormes (del tamaño de un refrigerador) y guardaban muy poca información. Tenían discos que giraban como un tocadiscos y un brazo que leía y escribía datos. Eran lentos y hacían ruido.

¿Cómo mejoró? Ahora hay dos tipos: discos duros tradicionales (más baratos pero lentos) y SSD o discos de estado sólido (sin partes móviles, súper rápidos y silenciosos). Los SSD hacen que tu computadora encienda en segundos y los programas abran al instante. Además, ahora caben terabytes de información (¡miles de películas!).

Mouse

Mouse y Periféricos

Todas las formas de conectarte

¿Qué son? Los periféricos son todos los dispositivos que se conectan a la computadora para agregar funciones: mouse (para apuntar y hacer clic), bocinas (para escuchar), micrófono (para grabar tu voz), cámara (para videollamadas), impresora (para imprimir) y muchos más.

¿Cómo empezó? Las primeras computadoras no tenían mouse. Todo se hacía con teclado escribiendo comandos. El mouse se inventó en los años 60 y era una caja de madera con un botón. Revolucionó todo porque ahora podías señalar cosas en la pantalla en lugar de escribir comandos complicados.

¿Cómo mejoró? Ahora hay mouse inalámbricos, trackpads (como en las laptops), pantallas táctiles, controles de videojuegos, lápices digitales para dibujar, audífonos con micrófono para hablar con amigos y hasta dispositivos de realidad virtual. Cada periférico hace que la computadora sea más útil y divertida.

¿Cómo evolucionó programar?

Programar ha cambiado muchísimo desde sus inicios. Antes era súper complicado y solo lo podían hacer científicos. Ahora cualquier persona puede aprender. Aquí te contamos cómo fue ese cambio increíble.

Tarjetas perforadas

Años 1950-1960: Tarjetas perforadas

¿Cómo era el proceso? Los programadores escribían su código en papel primero. Luego, una persona especial (llamada "perforadora") hacía agujeros en tarjetas de cartón siguiendo el código. Cada agujero representaba una instrucción. Después llevaban una pila enorme de tarjetas a la computadora y las metían en orden. La computadora leía los agujeros y ejecutaba el programa.

¿Qué tan difícil era? ¡Súper difícil! Si cometías un error en una tarjeta, tenías que hacer una nueva tarjeta y volver a meter toda la pila. Si se te caían las tarjetas y se desordenaban, ¡tenías que ordenarlas todas otra vez! Un programa simple podía necesitar cientos de tarjetas.

¿Dónde se usaba? En universidades, laboratorios científicos y grandes empresas. Se usaba para calcular trayectorias de cohetes, hacer cálculos matemáticos complejos y procesar datos de censos (contar cuántas personas viven en un país).

🎬 Ver cómo era la experiencia real

Un día típico programando en 1960:

1. Llegas a la oficina a las 8am con tu código escrito a mano en papel.

2. Vas a la oficina de perforación y entregas tus hojas. La perforadora te dice "Listo en 2 horas".

3. A las 10am recoges tu pila de 200 tarjetas. Las numeras a mano por si se caen.

4. Reservaste tiempo de computadora para las 2pm. Esperas tu turno.

5. A las 2pm metes las tarjetas en la lectora. Toma 30 minutos leerlas todas.

6. Esperas. La computadora procesa. A las 5pm recibes los resultados impresos.

7. Hay un error en la línea 47. Mañana harás una nueva tarjeta y repetirás todo.

Resultado: Un programa simple te tomó 2 días completos.

💡 Videos recomendados: Busca en YouTube "IBM 1401 punch card" o "keypunch machine demonstration" para ver máquinas reales funcionando.

Terminal antigua

Años 1970-1980: Terminales de texto

¿Cómo era el proceso? Ahora los programadores podían escribir directamente en una pantalla usando un teclado. Veían letras verdes o blancas en un fondo negro. Escribían comandos como "RUN" para ejecutar el programa o "LIST" para ver el código. Ya no necesitaban tarjetas perforadas.

¿Qué tan difícil era? Todavía era difícil porque no había mouse ni ventanas bonitas. Todo era texto. Tenías que memorizar comandos especiales. Si querías cambiar algo, tenías que escribir el número de la línea y reescribirla completa. Pero era MUCHO más rápido que las tarjetas perforadas porque podías probar tu programa inmediatamente.

¿Dónde se usaba? En escuelas, oficinas y las primeras computadoras personales. La gente empezó a crear programas para llevar cuentas de dinero, hacer juegos simples (como el famoso juego de la serpiente), escribir documentos y guardar información de clientes.

🎬 Ver cómo era la experiencia real

Programando en una Commodore 64 (1982):

1. Enciendes la computadora. Ves una pantalla azul con texto blanco que dice "READY."

2. Escribes tu primer programa en BASIC:

10 PRINT "HOLA";
20 GOTO 10
30 RUN

3. Presionas RUN. La palabra "HOLA" se repite infinitamente llenando la pantalla.

4. Presionas RUN/STOP para detenerlo.

5. Quieres guardar tu programa. Conectas un cassette de audio, escribes SAVE "MIPROGRAM" y esperas 5 minutos mientras se graba con sonidos raros.

6. Al día siguiente, escribes LOAD "MIPROGRAM" y esperas otros 5 minutos. A veces falla y pierdes todo.

💡 Videos recomendados: Busca "Commodore 64 programming tutorial" o "Apple II BASIC games" para ver programas reales de esa época. Canal recomendado: "The 8-Bit Guy".

Personas aprendiendo

Años 2000-2010: Aprender jugando

¿Cómo es el proceso? Aparecieron programas especiales para enseñar a programar de forma divertida. En lugar de escribir código complicado, puedes arrastrar bloques de colores que representan instrucciones (como Scratch). Cada bloque dice cosas como "mover 10 pasos" o "si tocas el borde, rebotar". Los juntas como un rompecabezas y ves el resultado inmediatamente.

¿Qué tan difícil es? ¡Mucho más fácil! No necesitas memorizar comandos raros. Los bloques tienen nombres que entiendes. Si algo no funciona, solo mueves los bloques de lugar. Puedes crear juegos, animaciones e historias interactivas en minutos. Muchos niños aprenden a programar desde los 7 u 8 años.

¿Dónde se usa? En escuelas de todo el mundo, en casa con tutoriales de YouTube, en clubes de programación y en aplicaciones móviles. Los niños crean sus propios videojuegos, hacen que robots se muevan, programan drones y hasta crean arte digital animado.

🎬 Ver cómo era la experiencia real

Creando tu primer juego en Scratch (2007):

1. Abres Scratch en el navegador (gratis, sin instalar nada).

2. Ves un gato en el centro y bloques de colores a la izquierda.

3. Arrastras bloques para hacer un juego simple:

• "Cuando se presione bandera verde" (bloque amarillo)

• "Por siempre" (bloque naranja)

• "Mover 10 pasos" (bloque azul)

• "Si tocando borde, rebotar" (bloque azul)

4. Haces clic en la bandera verde. El gato se mueve y rebota en los bordes.

5. Agregas más bloques para cambiar colores, hacer sonidos, detectar clics.

6. En 30 minutos tienes tu primer juego funcionando.

💡 Videos recomendados: Busca "Scratch tutorial for beginners" o "kids coding with Scratch". También busca "Code.org Hour of Code" para ver actividades interactivas.

Desarrollo de apps

Hoy: Crear apps y juegos reales

¿Cómo es el proceso? Ahora tienes herramientas profesionales que te ayudan en cada paso. Escribes código en programas especiales (llamados "editores") que te muestran errores mientras escribes, te sugieren cómo completar palabras y te ayudan a organizar tu proyecto. Puedes usar "bibliotecas" (código que otros ya hicieron) para agregar funciones complejas sin empezar de cero.

¿Qué tan difícil es? Depende de lo que quieras hacer. Crear una app simple puede tomar días o semanas si ya sabes programar. Crear un juego complejo puede tomar meses o años. Pero lo increíble es que PUEDES hacerlo. Hay millones de tutoriales gratis en internet, comunidades donde puedes hacer preguntas y herramientas que hacen el trabajo pesado por ti.

¿Dónde se usa? ¡En todas partes! Adolescentes crean apps que se vuelven famosas (como Instagram, que empezó con un joven programador). Estudiantes hacen juegos y los venden en tiendas de apps. Programadores trabajan desde su casa creando sitios web, aplicaciones de salud, programas de música, sistemas para carros autónomos y hasta software para explorar el espacio. Las posibilidades son infinitas.

� Ver cómo es la experiencia real HOY

Programando con herramientas modernas (2024):

1. Abres VS Code (editor gratis y potente).

2. Creas un archivo nuevo y empiezas a escribir:

// Mientras escribes, el editor te ayuda
function saludar(nombre) {
  console.log("Hola " + nombre);
}

saludar("María");  // Resultado: Hola María

3. Si escribes mal algo, aparece una línea roja inmediatamente.

4. Presionas F5 y tu programa se ejecuta al instante.

5. ¿Tienes una duda? Le preguntas a ChatGPT o buscas en YouTube. Encuentras la respuesta en minutos.

6. Quieres hacer algo más complejo (como un juego)? Usas una biblioteca como Phaser o Unity que ya tiene todo el código difícil hecho.

7. En una semana puedes tener tu primer juego o app funcionando.

💡 Videos recomendados: Busca "VS Code for beginners", "first game tutorial", "teen programmers success stories". Canales recomendados: "Fireship", "Traversy Media", "freeCodeCamp".

Mensaje final

Aprender programación desde beburp no es una carrera para llegar rápido a ningún lado. Es construir curiosidad, aprender a resolver problemas y ganar confianza para crear cosas increíbles con alegría. ¡Disfruta el camino! 🚀

Volver al inicio