B3 · Boss Final 3 — Sistema de Gestión Académico (Proyecto Integrador)
🧠 Teoría y conceptos
**Capítulo 3** · Proyecto Final **Duración:** 8 horas (en 2 sesiones de 4h) **Prerrequisitos:** TODOS los temas 3.1 a 3.8 **XP total:** 2 000 · **Insignia final:** 🏆 *Desarrollador Backend Junior*
🎯 Objetivo del Boss
Construir un sistema completo de gestión de alumnos que integre TODO lo aprendido en el Capítulo 3:
Arreglos 1D y 2D (calificaciones por materia)
Structs (alumno, materia, calificación)
Búsqueda (encontrar alumno por nombre o matrícula)
Ordenamiento (rankings, listados alfabéticos)
Archivos (persistencia entre sesiones)
Complejidad (decidir qué algoritmo usar)
Validación (entradas robustas)
El resultado debe ser un programa que un profesor real podría usar en su salón de clases.
1. Modelo de datos
struct Alumno {
string matricula; // único, ej. "A12345"
string nombre;
int edad;
int semestre;
float calificaciones[10]; // máximo 10 materias
int numMaterias; // cuántas tiene activas
bool activo;
};
struct Materia {
string clave; // ej. "MAT101"
string nombre; // "Cálculo I"
int creditos;
};
struct SistemaAcademico {
Alumno alumnos[100]; // máximo 100 alumnos
Materia materias[50]; // máximo 50 materias
int numAlumnos;
int numMaterias;
};
2. Funcionalidades obligatorias
A. Gestión de alumnos
Agregar alumno (con validación de matrícula única).
Eliminar alumno (marca como inactivo, libera espacio).
Modificar alumno (cambiar nombre, edad, etc.).
Buscar alumno por matrícula o nombre (búsqueda lineal o binaria si está ordenado).
B. Gestión de calificaciones
Capturar calificaciones de un alumno en una materia específica.
Calcular promedio por alumno.
Calcular promedio por materia.
Mostrar historial completo de un alumno (todas sus calificaciones).
C. Reportes
Lista completa de alumnos (ordenada por nombre o promedio).
Ranking de los 10 mejores promedios.
Lista de aprobados/reprobados por materia.
Estadísticas del grupo (promedio general, distribución de calificaciones).
D. Persistencia
Guardar todos los datos en un archivo sistema.dat (formato CSV o binario, tú decides).
Cargar automáticamente al iniciar el programa.
3. Interfaz de usuario
Menú basado en consola:
╔══════════════════════════════════════╗
║ SISTEMA DE GESTIÓN ACADÉMICO ║
╠══════════════════════════════════════╣
║ 1. Gestión de alumnos ║
║ 2. Gestión de calificaciones ║
║ 3. Reportes ║
║ 4. Guardar y salir ║
╚══════════════════════════════════════╝
Opción: _
📁 Estructura del proyecto
sistema-academico/
├── main.cpp # punto de entrada, menú
├── sistema.h # structs y declaraciones
├── sistema.cpp # implementación de funciones
├── alumnos.cpp # funciones de alumnos
├── calificaciones.cpp # funciones de calificaciones
├── reportes.cpp # funciones de reportes
├── archivos.cpp # lectura/escritura
├── utils.cpp # validaciones, helpers
└── sistema.dat # archivo de datos (generado al usar)
**No obligatorio** dividir en tantos archivos. Para empezar puedes tener todo en `main.cpp` y luego refactorizar.
Agregar alumno
bool agregarAlumno(SistemaAcademico& s, Alumno nuevo);
// 1. Verificar que la matrícula no exista
// 2. Verificar que haya espacio (< 100)
// 3. Validar campos (edad > 0, semestre entre 1 y 12, etc.)
// 4. Agregar al arreglo, incrementar numAlumnos
// 5. Retornar true si se agregó, false si hubo error
Capturar calificación
bool capturarCalificacion(SistemaAcademico& s, string matricula,
string claveMateria, float calificacion);
// 1. Buscar alumno por matrícula
// 2. Buscar materia por clave
// 3. Verificar que el alumno no tenga ya esa materia
// 4. Verificar que calificación esté en [0, 10]
// 5. Asignar y confirmar
Reporte: ranking
void rankingTop10(SistemaAcademico& s);
// 1. Copiar alumnos a un arreglo auxiliar
// 2. Ordenar por promedio descendente (usa sort() o insertion sort)
// 3. Imprimir los primeros 10
Persistencia
void guardar(SistemaAcademico& s);
// 1. Abrir sistema.dat en modo escritura binaria o CSV
// 2. Escribir numAlumnos, numMaterias
// 3. Escribir cada alumno y cada materia
// 4. Cerrar
void cargar(SistemaAcademico& s);
// 1. Abrir sistema.dat en modo lectura
// 2. Leer contadores
// 3. Leer alumnos y materias
// 4. Cerrar
🧪 6. Datos de prueba (para verificar tu sistema)
Incluye al inicio de tu main.cpp un bloque de "datos demo" que se cargan si el archivo no existe:
void cargarDatosDemo(SistemaAcademico& s) {
s.numAlumnos = 5;
s.alumnos[0] = {"A001", "Ana López", 20, 3, {8.5, 9.0, 7.5, 8.0, 0}, 4, true};
s.alumnos[1] = {"A002", "Luis García", 22, 5, {6.0, 7.5, 8.0, 7.0, 9.5}, 5, true};
s.alumnos[2] = {"A003", "Mara Ruiz", 19, 2, {5.8, 6.5, 0, 0, 0}, 2, true};
s.alumnos[3] = {"A004", "Pedro Sánchez", 21, 4, {9.5, 8.5, 9.0, 9.8, 8.7}, 5, true};
s.alumnos[4] = {"A005", "Sofía Torres", 20, 3, {7.0, 8.0, 6.5, 0, 0}, 3, true};
s.numMaterias = 5;
s.materias[0] = {"MAT101", "Cálculo I", 8};
s.materias[1] = {"FIS102", "Física I", 8};
s.materias[2] = {"PRG103", "Programación I", 6};
s.materias[3] = {"ING104", "Inglés I", 4};
s.materias[4] = {"MAT201", "Cálculo II", 8};
}
⚠️ Errores típicos
// 5 minutos de planeación > 5 horas de debugging
Solución: escribe el diseño primero (structs, funciones, flujo del menú) en papel o en comentarios antes de tocar el código.
Error 2: No separar entrada de lógica
// MAL: leer, validar, procesar y guardar todo en una función de 200 líneas
// BIEN: leer(), validar(), procesar(), guardar() — cada una hace una cosa
Error 3: Hardcodear tamaños máximos
Alumno alumnos[100]; // 100 es mágico
// BIEN:
const int MAX_ALUMNOS = 100; // con nombre
Error 4: No probar con datos "rotos"
// ¿Qué pasa si...?
// - El usuario ingresa una edad negativa?
// - Captura una calificación de 15?
// - Busca una matrícula que no existe?
// - El archivo sistema.dat está corrupto?
Solución: prueba cada caso borde. Tu programa no puede crashear NUNCA en producción.
Error 5: No hacer commit durante el desarrollo
# 5 horas sin commit
git commit -m "todo el sistema"
# Si algo se rompe, no puedes volver atrás
Solución: commit cada 30-60 minutos, con mensajes descriptivos. Los commits son tu máquina del tiempo.
📦 10. Entregables
Tu entrega debe incluir:
Código fuente completo (todos los .cpp y .h).
README.md con:
Cómo compilar (comando exacto)
Cómo ejecutar
Funcionalidades implementadas
Limitaciones conocidas
Capturas de pantalla o ejemplo de uso
Repositorio Git con al menos 5 commits descriptivos.
Archivo `sistema.dat` con datos de ejemplo (para que el profesor lo ejecute sin tener que capturar).
🎤 11. Presentación (5 min)
Prepárate para mostrar:
Compilación y ejecución en vivo.
Las 4 funcionalidades principales: agregar alumno, capturar calificación, generar reporte, guardar/cargar.
Un caso de bug que encontraste y cómo lo resolviste (con el debugger).
El historial de Git mostrando tu proceso.
Una mejora que te gustaría hacer con más tiempo.
🧠 12. Quest Final — Reflexión de Capítulo
En tu cuaderno, responde con honestidad:
¿Qué tema del Cap 3 me costó más? ¿Por qué?
¿En qué me sentí más fuerte? ¿Qué me hizo sentir así?
¿Cuándo fue la última vez que pedí ayuda a la IA y cuándo fue la última vez que resolví algo solo? ¿Cuál fue más satisfactoria?
Si tuviera que explicar este capítulo a un compañero que va empezando, ¿qué le diría que es lo más importante?
¿Qué del Cap 4 me da más curiosidad o miedo?
🎓 Lo que acabas de lograr
En este capítulo aprendiste:
✅ Arreglos 1D y 2D con sus recorridos y operaciones.
✅ Cadenas de caracteres y validación con regex.
✅ Búsqueda lineal y binaria, con análisis de complejidad.
✅ 3 algoritmos de ordenamiento + cuándo usar std::sort.
✅ Structs y persistencia en archivos.
✅ Debugging profesional y Git avanzado.
Ya puedes construir programas que:
Procesan datos reales (no solo ejemplos de 5 elementos).
Persisten entre ejecuciones.
Manejan errores sin crashear.
Son mantenibles (con Git, modularidad, documentación).
El próximo paso lógico:
Punteros y memoria dinámica (arreglos de tamaño variable, listas).
Estructuras de datos lineales (listas enlazadas, pilas, colas).
Algoritmos más complejos (recursión, divide y vencerás).
Eso es el Capítulo 4.
🔗 ¿Qué sigue?
Cap 4 — Estructuras de Datos Dinámicas y Algoritmos Avanzados. Pero antes de saltar, descansa. Terminar este Boss es un logro real. Te lo mereces.
*"El mejor programa no es el que tiene más features. Es el que resuelve un problema real sin caerse."*
\newpage
PARTE 4
Estructuras Dinámicas y Algoritmos Avanzados
70 horas · 8 temas + Boss 4
\newpage
🤖 IA como copiloto
**Objetivo:** usar la IA como **revisor**, no como generador.
Escenario: terminaste tu Boss 3. Antes de entregarlo, quieres que alguien lo revise.
Prompt sugerido:
"Tengo un sistema de gestión académico en C++ con 800 líneas. **No me lo reescribas.** Dame una lista de 5 cosas que podrían salir mal en producción: bugs potenciales, validaciones faltantes, casos borde no considerados. Para cada una, dame una pregunta que me ayude a verificar si yo ya lo manejé."
Lo que NO debes hacer:
Pedirle "optimiza mi código" sin saber qué.optimizar.
Aceptar sus 5 puntos sin verificarlos en tu propio código.
Lo que SÍ debes hacer:
Leer cada pregunta de la IA.
Buscar en tu código si la manejaste.
Anotar las que NO manejaste y arreglarlas.
Ritual de 3 min: si la IA te da puntos vagos ("podría haber bugs"), pídele ejemplos concretos con casos de entrada.
📝 Quest · Cuestionario — 📝 Quest — Reactivos para autoevaluación
Las siguientes preguntas te sirven para autoevaluarte después de leer el tema. Responde en tu cuaderno o mentalmente, y luego revisa las Respuestas modelo (disponibles en libre acceso, sin iniciar sesión).
Sección A · Opción múltiple
Elige la opción correcta (A, B, C o D). Las respuestas están en la sección Respuestas modelo.
- ¿Qué entidades tiene un sistema de gestión académico?
- Solo estudiantes
- Estudiantes, materias, profesores, calificaciones, inscripciones
- Solo notas
- Solo fechas
- ¿Cómo se calcula el promedio de un estudiante?
- Se cuentan las notas
- Suma de calificaciones / número de materias
- Solo la última
- La mayor
- Para encontrar al estudiante con mejor promedio:
- Burbuja
- Recorrer el vector y mantener el máximo
- Hash
- switch
- ¿Qué estructura es mejor para 30 estudiantes?
- Cada variable
- Vector/array de structs
- 30 ifs
- switch
- Para persistir el sistema académico:
- Variables globales
- Archivos de texto o binarios
- Comentarios
- Prints
Sección B · Preguntas abiertas
Desarrolla tu respuesta en al menos 3 líneas. Compara con la respuesta modelo después de escribir.
- Diseña las entidades y operaciones principales de un sistema de gestión académico.→ Escribe tu respuesta aquí (en tu cuaderno o mentalmente)…
- ¿Cómo calcularías el promedio ponderado de un estudiante (con créditos)?→ Escribe tu respuesta aquí (en tu cuaderno o mentalmente)…
- Diseña un algoritmo que encuentre al estudiante con mejor promedio de un grupo de 30.→ Escribe tu respuesta aquí (en tu cuaderno o mentalmente)…
🟢 Cuando termines, revisa las Respuestas modelo y compáralas con las tuyas. La mejor forma de aprender es discutir cada respuesta contigo mismo o con un compañero.