Examen Práctico: Sistema CRUD de Estudiantes y Notas
En este módulo aprenderás a integrar dos de los pilares más importantes de la programación en C++:Vectores Dinámicos Paralelos (std::vector) yFunciones Modulares con Paso por Referencia (&). Analizaremos línea por línea un sistema real de gestión de estudiantes con notas (Create, Read, Update, Delete y Reportes Estadísticos), interactuaremos con un simulador visual de memoria RAM y terminal, y pondremos a prueba tus conocimientos con un cuestionario práctico interactivo.
Fundamentos: ¿Qué conceptos se aplican en este código?
1. Vectores Paralelos
En lugar de usar estructuras complejas, modelamos la información de cada alumno usando dos vectores sincronizados por el mismo índice i:
| Vector \ Columna | Índice [ 0 ] | Índice [ 1 ] | Índice [ 2 ] |
|---|---|---|---|
| vector<string> nombres | "Ana" | "Carlos" | "Beatriz" |
| vector<float> notas | 6.5 | 4.2 | 5.8 |
| Estudiante | Estudiante 1 | Estudiante 2 | Estudiante 3 |
nombres[i]guarda el texto con el nombre del alumno.notas[i]guarda el número decimal (float) con la calificación.- Regla de Oro: Toda inserción o eliminación debe aplicarse en ambos vectores en la misma posición para no desfasar los datos.
2. Paso por Referencia (&)
Por defecto, C++ pasa variables por valor (haciendo una copia completa que se destruye al terminar la función). Al añadir el símbolo &:
- Modificación Real: Los
.push_back()y.erase()alteran directamente la memoria delmain(). - Alto Rendimiento: No se duplican miles de registros en RAM al invocar las funciones.
- Principio de Mínimo Privilegio:
actualizar()solo recibevector<float>& notasporque no necesita tocar los nombres.
Código Fuente Completo del Ejercicio
Explicación Paso a Paso: Anatomía de cada Función
void crear(vector<string>& nombres, vector<float>& notas)Esta función solicita al usuario el nombre del alumno y su calificación por consola con cin, y los añade al final de sus respectivos vectores mediante .push_back().
cin >> nombre; cin >> nota;nombres.push_back(nombre); notas.push_back(nota);void leer(vector<string>& nombres, vector<float>& notas)Recorre los vectores mediante un ciclo for desde i = 0 hasta nombres.size() - 1, imprimiendo en pantalla el número de índice [i], el nombre y la nota asociada.
for (int i = 0; i < nombres.size(); i++) { cout << "[" << i << "] " << nombres[i] << " | Nota: " << notas[i]; }void actualizar(vector<float>& notas)Permite modificar la calificación de un estudiante existente indicando su posición numérica. Incorpora una validación de rango defensiva (indice >= 0 && indice < notas.size()) para evitar accesos a posiciones de memoria inválidas que harían caer el programa (segmentation fault).
cin >> notas[indice];void eliminar(vector<string>& nombres, vector<float>& notas)Elimina al estudiante y su calificación usando iteradores con el método .erase(). Como los arreglos son paralelos, se ejecuta:
nombres.erase(nombres.begin() + indice);notas.erase(notas.begin() + indice);void reportes(vector<string>& nombres, vector<float>& notas)Calcula estadísticas útiles del curso aplicando métodos nativos de std::vector y un acumulador:
nombres.empty(): Evita divisiones por cero comprobando si hay registros.nombres.size(): Retorna la cantidad total de alumnos matriculados.nombres.front()ynotas.front(): Obtiene el primer registro ingresado.nombres.back()ynotas.back(): Obtiene el último registro ingresado.- Cálculo del promedio: Acumula las notas en una variable
sumadentro de un ciclofory divide pornotas.size().
int main()La función main() es el punto de entrada que orquesta todo el sistema:
- Vectores Maestros: Declara
vector<string> nombres;yvector<float> notas;en su memoria local. - Bucle
do-while: Garantiza que el menú se dibuje en pantalla al menos una vez y siga corriendo en ciclo continuo hasta que el usuario elijaopcion == 6(Salir). - Despacho de Funciones: Mediante
if-else if, llama a la función correspondiente pasando los vectores por referencia (crear(nombres, notas), etc.). - Control de Errores: Si el usuario ingresa un número fuera de rango (ej. 9 o -1), ejecuta
else if (opcion != 6) { cout << "-> Opcion no valida.\n"; }.
do { ... cin >> opcion; if (opcion == 1) { crear(nombres, notas); } ... } while (opcion != 6);Simulador de Consola y Memoria en Vivo
🕹️ Elige una acción del Menú (main):
🧠 Estado en Memoria RAM (std::vector)
Total: 0 elementos| Índice [i] | vector<string> nombres | vector<float> notas | Dirección Relativa |
|---|---|---|---|
| (Vectores vacíos. Utiliza "1. Crear" o "Cargar Demo" para añadir registros). | |||
Cuestionario de Evaluación: Pon a prueba lo aprendido
¿Listo para validar tu comprensión técnica?
Responde 5 preguntas clave sobre paso por referencia (&), sincronización de índices paralelos y métodos esenciales de std::vector en una interfaz interactiva tipo examen.
10 Casos Prácticos Tipo Prueba: Vectores Paralelos & CRUD
Escenarios reales de examen universitario y técnico para ejercitar el modelado en memoria con funciones independientes.
¿Quieres resolver estos 10 casos en C++, Python, Java, C#, JS, PHP y PSeInt?
Disponible en la Zona Gamer con clave de revisión docente: 05092026 (o fecha actual DDMMAAAA)
1Herrería & Tienda RPG: Sistema CRUD y Catálogo de Armas
Arsenal RPGEnunciado: Crear un sistema de consola con Menú interactivo (1-7) que gestione armas legendarias y sus valores en monedas de oro en vectores paralelos. Debe permitir: 1) Guardar arma nueva, 2) Listar catálogo completo con índices, 3) Buscar arma por nombre, 4) Actualizar precio en oro por índice con validación de límites, 5) Eliminar arma de ambos vectores a la vez, 6) Reporte estadístico (arma más costosa y promedio de oro), y 7) Salir.
vector<string> armas | vector<float> preciosmenu(), guardarArma(), listarArmas(), buscarArma(), actualizarPrecio(), eliminarArma(), reportes()▶ Ver Solución C++ sugerida
2Raid Boss & Squad: Gestión de Escuadrón, Salud y Triaje Crítico
Salud SquadEnunciado: Administrar en la consola del Healer los nombres de héroes y salud HP (%) en vectores paralelos mediante un Menú interactivo. Debe permitir: 1) Guardar/Reclutar héroe con su HP inicial, 2) Listar escuadrón completo, 3) Buscar héroe por nombre, 4) Actualizar HP tras daño o curación, 5) Eliminar combatiente caído, 6) Reporte de Triaje Crítico (filtro de héroes con HP < 30.0% y héroe con mayor vida), y 7) Salir.
vector<string> heroes | vector<float> hpActualmenu(), guardarHeroe(), listarSquad(), buscarHeroe(), actualizarHP(), eliminarHeroe(), reporteTriaje()▶ Ver Solución C++ sugerida
3Gremio / Clan MMORPG: Registro de Miembros, DPS y Auditoría MVP
Métricas RaidEnunciado: Diseñar el software administrativo de un Clan MMORPG en consola con Menú principal y vectores de Gamertags y puntos de daño DPS. Debe permitir: 1) Guardar nuevo jugador con su DPS, 2) Listar clan completo, 3) Buscar miembro por Gamertag, 4) Actualizar DPS tras equipar ítems, 5) Eliminar miembro expulsado, 6) Reportes Estadísticos (DPS total acumulado, promedio del clan y Jugador MVP con mayor daño), y 7) Salir.
vector<string> miembros | vector<float> dpsPuntosmenu(), guardarMiembro(), listarClan(), buscarMiembro(), actualizarDPS(), eliminarMiembro(), reportesMVP()▶ Ver Solución C++ sugerida
4Hangar Sci-Fi: Control de Bahías, Naves y Asignación de Pilotos
Búsqueda HangarEnunciado: Crear el sistema del Hangar espacial con Menú interactivo y dos vectores paralelos: matrículas/IDs de naves y pilotos asignados. Debe permitir: 1) Guardar nave y piloto en una nueva bahía, 2) Listar estado general de todas las bahías, 3) Buscar nave por matrícula retornando la bahía y comandante, 4) Actualizar/Reasignar piloto, 5) Eliminar nave despegada, 6) Reportes de ocupación (total bahías activas), y 7) Salir.
vector<string> matriculas | vector<string> pilotosmenu(), guardarNave(), listarHangar(), buscarNave(), actualizarPiloto(), eliminarNave(), reportes()▶ Ver Solución C++ sugerida
5Alquimia & Forja Rúnica: Almacén de Ingredientes, Crafteo y Stock
CrafteoEnunciado: Administrar el laboratorio alquímico con Menú de consola y dos vectores: materiales mágicos y stock disponible. Debe permitir: 1) Guardar nuevo ingrediente descubierto, 2) Listar todos los reactivos y unidades, 3) Buscar material por nombre, 4) Actualizar/Consumir stock por crafteo (descuenta 1 unidad si stock > 0), 5) Eliminar material de la bolsa, 6) Reportes de recursos agotados (stock == 0) y total de materiales, y 7) Salir.
vector<string> materiales | vector<int> stockmenu(), guardarMaterial(), listarAlquimia(), buscarMaterial(), actualizarStock(), eliminarMaterial(), reporteAgotados()▶ Ver Solución C++ sugerida
6Torneo Arcade Global: Leaderboard, Clasificación y Tabla de Récords
LeaderboardEnunciado: Desarrollar el leaderboard arcade en consola con Menú de opciones y vectores de Gamertags y puntajes. Debe permitir: 1) Guardar nuevo récord de jugador, 2) Listar la tabla de competidores, 3) Buscar jugador por Gamertag, 4) Actualizar score si supera su marca personal, 5) Eliminar jugador descalificado, 6) Reportes de Clasificación (algoritmo de ordenamiento burbuja descendente sincronizado y puntaje máximo del torneo), y 7) Salir.
vector<string> gamertags | vector<int> puntajesmenu(), guardarPartida(), listarRanking(), buscarJugador(), actualizarScore(), eliminarJugador(), ordenarTopScores()▶ Ver Solución C++ sugerida
7Dungeon Crawler MMORPG: Servidor de Mazmorras, Salas y Partidas
Dungeons 3VEnunciado: Modelar un servidor de dungeons multijugador con Menú interactivo y tres vectores: número de sala, estado ("LIBRE" / "EN_COMBATE") y líder de party. Debe permitir: 1) Guardar nueva mazmorra habilitada, 2) Listar estado en tiempo real de todas las salas, 3) Buscar sala por número, 4) Actualizar estado y asignar party (Entrada a Mazmorra), 5) Eliminar sala dada de baja, 6) Reportes de servidor (% ocupación y parties activas), y 7) Salir.
vector<int> salas | vector<string> estados | vector<string> lideresPartymenu(), guardarSala(), listarSalas(), buscarSala(), actualizarEstado(), eliminarSala(), reportes()▶ Ver Solución C++ sugerida
8Supervivencia Post-Apocalíptica: Mochila Táctica, Municiones y Alertas HUD
Alerta HUDEnunciado: Diseñar la computadora de supervivencia táctica con Menú de opciones y dos vectores: suministros y unidades en inventario. Debe permitir: 1) Guardar nuevo recurso recolectado, 2) Listar inventario táctico completo, 3) Buscar suministro por nombre, 4) Actualizar unidades tras disparar o consumir raciones, 5) Eliminar ítem descartado, 6) Reportes de Alerta HUD (filtrar recursos con unidades < 5 y total de provisiones), y 7) Salir.
vector<string> suministros | vector<int> cantidadesmenu(), guardarRecurso(), listarMochila(), buscarRecurso(), actualizarUnidades(), eliminarRecurso(), reporteAlertasHUD()▶ Ver Solución C++ sugerida
9Domador de Criaturas RPG: Bestiario, Afinidades Elementales y Capturas
Bestiario 3VEnunciado: Construir el bestiario de un domador con Menú interactivo y tres vectores: nombres de criaturas, elemento afin y poder de combate CP. Debe permitir: 1) Guardar/Capturar nueva criatura, 2) Listar bestiario completo con estadísticas, 3) Buscar criatura por nombre, 4) Actualizar poder CP tras batalla, 5) Eliminar/Liberar criatura a su hábitat salvaje en los 3 vectores a la vez, 6) Reportes elementales (criatura con mayor CP y conteo por elemento), y 7) Salir.
vector<string> nombres | vector<string> elementos | vector<float> poderCPmenu(), guardarCriatura(), listarBestiario(), buscarCriatura(), actualizarPoderCP(), eliminarCriatura(), reporteMaxCP()▶ Ver Solución C++ sugerida
10Tienda Gacha & Pase de Batalla: Catálogo de Skins, Canjes y Auditoría
Economía GachaEnunciado: Diseñar el backend de la tienda de skins y pases con Menú interactivo y tres vectores: nombres de skins, stock disponible y costo en gemas. Debe permitir: 1) Guardar nueva skin de temporada, 2) Listar catálogo completo, 3) Buscar skin por nombre, 4) Actualizar precio o stock tras compra, 5) Eliminar skin retirada de la tienda, 6) Reportes económicos (recaudación potencial en gemas, skins agotadas y skin legendaria más cara), y 7) Salir.
vector<string> skins | vector<int> stockSkins | vector<float> costosGemasmenu(), guardarSkin(), listarTienda(), buscarSkin(), actualizarSkin(), eliminarSkin(), reporteRecaudacion()

