🛠️ 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!