Café y Código
🎓 Módulo Práctico de IntegraciónVectores + Funciones por Referencia

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.

1

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:

// Sincronización por posición:(mismo índice = mismo estudiante)
Vector \ ColumnaÍndice [ 0 ]Índice [ 1 ]Índice [ 2 ]
vector<string> nombres"Ana""Carlos""Beatriz"
vector<float> notas6.54.25.8
EstudianteEstudiante 1Estudiante 2Estudiante 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 &:

void crear(vector<string>& nombres, vector<float>& notas)
↑ El símbolo & conecta la función con los vectores originales del main().
  • Modificación Real: Los .push_back() y .erase() alteran directamente la memoria del main().
  • Alto Rendimiento: No se duplican miles de registros en RAM al invocar las funciones.
  • Principio de Mínimo Privilegio:actualizar() solo recibe vector<float>& notas porque no necesita tocar los nombres.
2

Código Fuente Completo del Ejercicio

sistema_estudiantes_crud.cpp
CPP
1#include <iostream>
2#include <vector>
3#include <string>
4
5using namespace std;
6
7// 1. CREATE
8void crear(vector<string>& nombres, vector<float>& notas) {
9 string nombre;
10 float nota;
11 cout << "Ingrese nombre: ";
12 cin >> nombre;
13 cout << "Ingrese nota: ";
14 cin >> nota;
15
16 nombres.push_back(nombre);
17 notas.push_back(nota);
18 cout << "-> Guardado con exito.\n";
19}
20
21// 2. READ
22void leer(vector<string>& nombres, vector<float>& notas) {
23 cout << "\n--- LISTA DE PERSONAS ---\n";
24 for (int i = 0; i < nombres.size(); i++) {
25 cout << "[" << i << "] " << nombres[i] << " | Nota: " << notas[i] << "\n";
26 }
27}
28
29// 3. UPDATE
30void actualizar(vector<float>& notas) {
31 int indice;
32 cout << "Ingrese el numero (indice) para modificar la nota: ";
33 cin >> indice;
34 if (indice >= 0 && indice < notas.size()) {
35 cout << "Ingrese nueva nota: ";
36 cin >> notas[indice];
37 cout << "-> Nota actualizada.\n";
38 } else {
39 cout << "-> Indice incorrecto.\n";
40 }
41}
42
43// 4. DELETE
44void eliminar(vector<string>& nombres, vector<float>& notas) {
45 int indice;
46 cout << "Ingrese el numero (indice) a eliminar: ";
47 cin >> indice;
48 if (indice >= 0 && indice < nombres.size()) {
49 nombres.erase(nombres.begin() + indice);
50 notas.erase(notas.begin() + indice);
51 cout << "-> Eliminado con exito.\n";
52 } else {
53 cout << "-> Indice incorrecto.\n";
54 }
55}
56
57// 5. REPORTES
58void reportes(vector<string>& nombres, vector<float>& notas) {
59 if (nombres.empty()) {
60 cout << "-> No hay registros para generar reportes.\n";
61 return;
62 }
63
64 cout << "\n--- REPORTES ---\n";
65 cout << "- Total registrados: " << nombres.size() << "\n";
66 cout << "- Primer registro: " << nombres.front() << " (Nota: " << notas.front() << ")\n";
67 cout << "- Ultimo registro: " << nombres.back() << " (Nota: " << notas.back() << ")\n";
68
69 // Promedio usando un ciclo for
70 float suma = 0;
71 for (int i = 0; i < notas.size(); i++) {
72 suma += notas[i];
73 }
74
75 float promedio = suma / notas.size();
76 cout << "- Promedio del curso: " << promedio << "\n";
77}
78
79// ==========================================
80// MENÚ PRINCIPAL
81// ==========================================
82int main() {
83 vector<string> nombres;
84 vector<float> notas;
85 int opcion;
86
87 do {
88 cout << "\n--- MENU CRUD ---\n";
89 cout << "1. Agregar persona\n";
90 cout << "2. Ver lista\n";
91 cout << "3. Modificar nota\n";
92 cout << "4. Eliminar persona\n";
93 cout << "5. Ver reportes\n";
94 cout << "6. Salir\n";
95 cout << "Opcion: ";
96 cin >> opcion;
97
98 if (opcion == 1) {
99 crear(nombres, notas);
100 } else if (opcion == 2) {
101 leer(nombres, notas);
102 } else if (opcion == 3) {
103 actualizar(notas);
104 } else if (opcion == 4) {
105 eliminar(nombres, notas);
106 } else if (opcion == 5) {
107 reportes(nombres, notas);
108 } else if (opcion != 6) {
109 cout << "-> Opcion no valida.\n";
110 }
111
112 } while (opcion != 6);
113
114 return 0;
115}
3

Explicación Paso a Paso: Anatomía de cada Función

Paso 1 · Operación CREATE (Crear)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().

Entrada por Consola:cin >> nombre; cin >> nota;
Inserción al final:nombres.push_back(nombre); notas.push_back(nota);
Paso 2 · Operación READ (Leer / Listar)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]; }
Paso 3 · Operación UPDATE (Actualizar)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).

Reasignación directa:cin >> notas[indice];
Paso 4 · Operación DELETE (Eliminar)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);
Paso 5 · REPORTES Y ESTADÍSTICASvoid 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() y notas.front(): Obtiene el primer registro ingresado.
  • nombres.back() y notas.back(): Obtiene el último registro ingresado.
  • Cálculo del promedio: Acumula las notas en una variablesuma dentro de un ciclo for y divide por notas.size().
Paso 6 · MENÚ PRINCIPAL Y BUCLE DE CONTROLint main()

La función main() es el punto de entrada que orquesta todo el sistema:

  • Vectores Maestros: Declara vector<string> nombres; y vector<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 elija opcion == 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);
🧪 Laboratorio Interactivo

Simulador de Consola y Memoria en Vivo

🕹️ Elige una acción del Menú (main):

// Salida de Terminal (cout):
Bienvenido al Simulador del Sistema CRUD de Estudiantes en C++.
Selecciona una opción arriba para ejecutar las funciones.

🧠 Estado en Memoria RAM (std::vector)

Total: 0 elementos
Índice [i]vector<string> nombresvector<float> notasDirección Relativa
(Vectores vacíos. Utiliza "1. Crear" o "Cargar Demo" para añadir registros).
Primer Alumno--
Último Alumno--
Promedio Curso--
5

Cuestionario de Evaluación: Pon a prueba lo aprendido

🧠 TEST DE AUTOEVALUACIÓN

¿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.

6

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)

Ir al Módulo Gamer

1Herrería & Tienda RPG: Sistema CRUD y Catálogo de Armas

Arsenal RPG

Enunciado: 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.

Vectores: vector<string> armas | vector<float> precios
Operaciones: menu(), guardarArma(), listarArmas(), buscarArma(), actualizarPrecio(), eliminarArma(), reportes()
▶ Ver Solución C++ sugerida
caso1_herreria_rpg.cpp
CPP
1#include <iostream>
2#include <vector>
3#include <string>
4using namespace std;
5
6// 1. Guardar / Crear
7void guardarArma(vector<string>& armas, vector<float>& precios) {
8 string nom; float pre;
9 cout << "Nombre de arma a forjar: "; cin >> nom;
10 cout << "Precio en monedas de oro: "; cin >> pre;
11 armas.push_back(nom);
12 precios.push_back(pre);
13 cout << "-> ⚔️ Arma guardada con exito en el catalogo.\n";
14}
15
16// 2. Listar
17void listarArmas(const vector<string>& armas, const vector<float>& precios) {
18 cout << "\n=== 🛡️ ARSENAL Y TIENDA RPG ===\n";
19 if (armas.empty()) {
20 cout << "(Catalogo vacio. Forja tu primera arma).\n";
21 return;
22 }
23 for (size_t i = 0; i < armas.size(); i++) {
24 cout << "[" << i << "] " << armas[i] << " - " << precios[i] << " Monedas de Oro\n";
25 }
26}
27
28// 3. Buscar
29int buscarArma(const vector<string>& armas, const string& buscada) {
30 for (size_t i = 0; i < armas.size(); i++) {
31 if (armas[i] == buscada) {
32 return (int)i;
33 }
34 }
35 return -1;
36}
37
38// 4. Actualizar
39void actualizarPrecio(vector<float>& precios) {
40 int idx; float nuevoPre;
41 cout << "Indice de arma a modificar: "; cin >> idx;
42 if (idx >= 0 && idx < (int)precios.size()) {
43 cout << "Nuevo valor en oro: "; cin >> nuevoPre;
44 precios[idx] = nuevoPre;
45 cout << "-> 💰 Precio actualizado.\n";
46 } else {
47 cout << "-> ❌ Indice fuera de rango.\n";
48 }
49}
50
51// 5. Eliminar
52void eliminarArma(vector<string>& armas, vector<float>& precios) {
53 int idx;
54 cout << "Indice de arma a desmantelar: "; cin >> idx;
55 if (idx >= 0 && idx < (int)armas.size()) {
56 armas.erase(armas.begin() + idx);
57 precios.erase(precios.begin() + idx);
58 cout << "-> 💥 Arma desmantelada de ambos vectores.\n";
59 } else {
60 cout << "-> ❌ Indice invalido.\n";
61 }
62}
63
64// 6. Reportes
65void reporteEstadisticas(const vector<string>& armas, const vector<float>& precios) {
66 cout << "\n📊 === REPORTES DE LA HERRERIA ===\n";
67 if (armas.empty()) {
68 cout << "(Sin datos para reportes).\n";
69 return;
70 }
71 float suma = 0; int maxIdx = 0;
72 for (size_t i = 0; i < precios.size(); i++) {
73 suma += precios[i];
74 if (precios[i] > precios[maxIdx]) {
75 maxIdx = (int)i;
76 }
77 }
78 cout << "Total valor del arsenal: " << suma << " Oro\n";
79 cout << "Precio promedio: " << (suma / precios.size()) << " Oro\n";
80 cout << "👑 Arma Legendaria mas cara: " << armas[maxIdx] << " (" << precios[maxIdx] << " Oro)\n";
81}
82
83int main() {
84 vector<string> armas = {"Espada Runica", "Arco Elfico", "Daga Sombria"};
85 vector<float> precios = {250.0f, 180.5f, 95.0f};
86 int opcion = 0;
87
88 do {
89 cout << "\n=================================\n";
90 cout << " HERRERIA & TIENDA RPG (CRUD) \n";
91 cout << "=================================\n";
92 cout << "1. Guardar / Forjar Arma\n";
93 cout << "2. Listar Arsenal Completo\n";
94 cout << "3. Buscar Arma por Nombre\n";
95 cout << "4. Actualizar Precio en Oro\n";
96 cout << "5. Eliminar / Desmantelar Arma\n";
97 cout << "6. Reportes y Estadisticas\n";
98 cout << "7. Salir\n";
99 cout << "Seleccione una opcion (1-7): "; cin >> opcion;
100
101 if (opcion == 1) {
102 guardarArma(armas, precios);
103 } else if (opcion == 2) {
104 listarArmas(armas, precios);
105 } else if (opcion == 3) {
106 string buscada;
107 cout << "Ingrese nombre a buscar: "; cin >> buscada;
108 int pos = buscarArma(armas, buscada);
109 if (pos != -1) {
110 cout << "-> 🔍 Encontrada en posicion [" << pos << "] - Precio: " << precios[pos] << " Oro\n";
111 } else {
112 cout << "-> ❌ Arma no encontrada en la tienda.\n";
113 }
114 } else if (opcion == 4) {
115 actualizarPrecio(precios);
116 } else if (opcion == 5) {
117 eliminarArma(armas, precios);
118 } else if (opcion == 6) {
119 reporteEstadisticas(armas, precios);
120 } else if (opcion != 7) {
121 cout << "-> ⚠️ Opcion no valida.\n";
122 }
123 } while (opcion != 7);
124
125 cout << "-> Programa finalizado. ¡Hasta pronto, aventurero!\n";
126 return 0;
127}

2Raid Boss & Squad: Gestión de Escuadrón, Salud y Triaje Crítico

Salud Squad

Enunciado: 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.

Vectores: vector<string> heroes | vector<float> hpActual
Operaciones: menu(), guardarHeroe(), listarSquad(), buscarHeroe(), actualizarHP(), eliminarHeroe(), reporteTriaje()
▶ Ver Solución C++ sugerida
caso2_salud_squad.cpp
CPP
1#include <iostream>
2#include <vector>
3#include <string>
4using namespace std;
5
6// 1. Guardar / Crear
7void guardarHeroe(vector<string>& heroes, vector<float>& hp) {
8 string nom; float salud;
9 cout << "Nombre del heroe: "; cin >> nom;
10 cout << "Salud inicial (0-100%): "; cin >> salud;
11 heroes.push_back(nom);
12 hp.push_back(salud);
13 cout << "-> 🛡️ Heroe reclutado en la party.\n";
14}
15
16// 2. Listar
17void listarSquad(const vector<string>& heroes, const vector<float>& hp) {
18 cout << "\n=== ⚔️ ESCUADRON RAID BOSS ===\n";
19 if (heroes.empty()) {
20 cout << "(El escuadron no tiene combatientes activos).\n";
21 return;
22 }
23 for (size_t i = 0; i < heroes.size(); i++) {
24 cout << "[" << i << "] " << heroes[i] << " - Salud: " << hp[i] << "% HP\n";
25 }
26}
27
28// 3. Buscar
29int buscarHeroe(const vector<string>& heroes, const string& target) {
30 for (size_t i = 0; i < heroes.size(); i++) {
31 if (heroes[i] == target) {
32 return (int)i;
33 }
34 }
35 return -1;
36}
37
38// 4. Actualizar
39void actualizarHP(vector<float>& hp) {
40 int idx; float nuevoHP;
41 cout << "Indice de heroe a actualizar salud: "; cin >> idx;
42 if (idx >= 0 && idx < (int)hp.size()) {
43 cout << "Nuevo % de HP: "; cin >> nuevoHP;
44 hp[idx] = nuevoHP;
45 cout << "-> 🩸 Salud actualizada.\n";
46 } else {
47 cout << "-> ❌ Indice invalido.\n";
48 }
49}
50
51// 5. Eliminar
52void eliminarHeroe(vector<string>& heroes, vector<float>& hp) {
53 int idx;
54 cout << "Indice de heroe caido a retirar: "; cin >> idx;
55 if (idx >= 0 && idx < (int)heroes.size()) {
56 cout << "⚰️ " << heroes[idx] << " ha sido retirado del squad.\n";
57 heroes.erase(heroes.begin() + idx);
58 hp.erase(hp.begin() + idx);
59 cout << "-> ✨ Escuadron reorganizado.\n";
60 } else {
61 cout << "-> ❌ Indice invalido.\n";
62 }
63}
64
65// 6. Reportes
66void reporteTriajeCritico(const vector<string>& heroes, const vector<float>& hp) {
67 cout << "\n🚨 === REPORTE DE TRIAJE CRITICO (HP < 30%) ===\n";
68 if (heroes.empty()) {
69 cout << "(Sin miembros registrados).\n";
70 return;
71 }
72 int criticos = 0; int maxIdx = 0;
73 for (size_t i = 0; i < heroes.size(); i++) {
74 if (hp[i] < 30.0f) {
75 cout << "- 🩸 ¡ALERTA! " << heroes[i] << " (" << hp[i] << "% HP) ¡Curacion urgente!\n";
76 criticos++;
77 }
78 if (hp[i] > hp[maxIdx]) {
79 maxIdx = (int)i;
80 }
81 }
82 if (criticos == 0) {
83 cout << "-> ✅ Todos los miembros tienen salud estable (> 30%).\n";
84 }
85 cout << "🛡️ Heroe con mayor salud: " << heroes[maxIdx] << " (" << hp[maxIdx] << "% HP)\n";
86}
87
88int main() {
89 vector<string> heroes = {"Arthur", "Freya", "Loki"};
90 vector<float> hp = {85.0f, 22.5f, 14.0f};
91 int opcion = 0;
92
93 do {
94 cout << "\n=================================\n";
95 cout << " SQUAD RAID BOSS (CRUD) \n";
96 cout << "=================================\n";
97 cout << "1. Reclutar / Guardar Heroe\n";
98 cout << "2. Listar Escuadron Completo\n";
99 cout << "3. Buscar Heroe por Nombre\n";
100 cout << "4. Actualizar Salud (HP %)\n";
101 cout << "5. Eliminar Heroe Caido\n";
102 cout << "6. Reporte de Triaje Critico\n";
103 cout << "7. Salir\n";
104 cout << "Seleccione una opcion (1-7): "; cin >> opcion;
105
106 if (opcion == 1) {
107 guardarHeroe(heroes, hp);
108 } else if (opcion == 2) {
109 listarSquad(heroes, hp);
110 } else if (opcion == 3) {
111 string buscado;
112 cout << "Nombre del heroe a buscar: "; cin >> buscado;
113 int pos = buscarHeroe(heroes, buscado);
114 if (pos != -1) {
115 cout << "-> 🔍 Encontrado en posicion [" << pos << "] con " << hp[pos] << "% HP\n";
116 } else {
117 cout << "-> ❌ Heroe no encontrado en el squad.\n";
118 }
119 } else if (opcion == 4) {
120 actualizarHP(hp);
121 } else if (opcion == 5) {
122 eliminarHeroe(heroes, hp);
123 } else if (opcion == 6) {
124 reporteTriajeCritico(heroes, hp);
125 } else if (opcion != 7) {
126 cout << "-> ⚠️ Opcion no valida.\n";
127 }
128 } while (opcion != 7);
129
130 cout << "-> Sistema de escuadron cerrado.\n";
131 return 0;
132}

3Gremio / Clan MMORPG: Registro de Miembros, DPS y Auditoría MVP

Métricas Raid

Enunciado: 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.

Vectores: vector<string> miembros | vector<float> dpsPuntos
Operaciones: menu(), guardarMiembro(), listarClan(), buscarMiembro(), actualizarDPS(), eliminarMiembro(), reportesMVP()
▶ Ver Solución C++ sugerida
caso3_dps_clan.cpp
CPP
1#include <iostream>
2#include <vector>
3#include <string>
4using namespace std;
5
6// 1. Guardar / Crear
7void guardarMiembro(vector<string>& clan, vector<float>& dps) {
8 string tag; float d;
9 cout << "Gamertag del miembro: "; cin >> tag;
10 cout << "DPS de combate: "; cin >> d;
11 clan.push_back(tag);
12 dps.push_back(d);
13 cout << "-> 👑 Miembro reclutado en el clan.\n";
14}
15
16// 2. Listar
17void listarClan(const vector<string>& clan, const vector<float>& dps) {
18 cout << "\n=== 🛡️ MIEMBROS DEL CLAN Y DPS ===\n";
19 if (clan.empty()) {
20 cout << "(Clan sin miembros registrados).\n";
21 return;
22 }
23 for (size_t i = 0; i < clan.size(); i++) {
24 cout << "[" << i << "] " << clan[i] << " - " << dps[i] << " DPS\n";
25 }
26}
27
28// 3. Buscar
29int buscarMiembro(const vector<string>& clan, const string& tag) {
30 for (size_t i = 0; i < clan.size(); i++) {
31 if (clan[i] == tag) {
32 return (int)i;
33 }
34 }
35 return -1;
36}
37
38// 4. Actualizar
39void actualizarDPS(vector<float>& dps) {
40 int idx; float nuevoDPS;
41 cout << "Indice a actualizar: "; cin >> idx;
42 if (idx >= 0 && idx < (int)dps.size()) {
43 cout << "Nuevo DPS: "; cin >> nuevoDPS;
44 dps[idx] = nuevoDPS;
45 cout << "-> 💥 DPS actualizado.\n";
46 } else {
47 cout << "-> ❌ Indice invalido.\n";
48 }
49}
50
51// 5. Eliminar
52void eliminarMiembro(vector<string>& clan, vector<float>& dps) {
53 int idx;
54 cout << "Indice a expulsar: "; cin >> idx;
55 if (idx >= 0 && idx < (int)clan.size()) {
56 cout << "❌ " << clan[idx] << " expulsado del clan.\n";
57 clan.erase(clan.begin() + idx);
58 dps.erase(dps.begin() + idx);
59 cout << "-> ✨ Lista de clan actualizada.\n";
60 } else {
61 cout << "-> ❌ Indice invalido.\n";
62 }
63}
64
65// 6. Reportes
66void reportesDPS_MVP(const vector<string>& clan, const vector<float>& dps) {
67 cout << "\n📊 === ESTADISTICAS Y AUDITORIA DPS ===\n";
68 if (clan.empty()) {
69 cout << "(Sin datos para reportes).\n";
70 return;
71 }
72 float total = 0; int maxIdx = 0;
73 for (size_t i = 0; i < dps.size(); i++) {
74 total += dps[i];
75 if (dps[i] > dps[maxIdx]) {
76 maxIdx = (int)i;
77 }
78 }
79 cout << "💥 DPS Total del Clan: " << total << "\n";
80 cout << "📈 DPS Promedio: " << (total / dps.size()) << "\n";
81 cout << "👑 MVP del Clan: " << clan[maxIdx] << " (" << dps[maxIdx] << " DPS)\n";
82}
83
84int main() {
85 vector<string> clan = {"Valkyrie", "ShadowSniper", "Berserker"};
86 vector<float> dps = {14200.0f, 18950.0f, 11500.0f};
87 int opcion = 0;
88
89 do {
90 cout << "\n=================================\n";
91 cout << " GREMIO / CLAN MMORPG (CRUD) \n";
92 cout << "=================================\n";
93 cout << "1. Reclutar / Guardar Miembro\n";
94 cout << "2. Listar Clan y DPS\n";
95 cout << "3. Buscar Miembro por Gamertag\n";
96 cout << "4. Actualizar DPS\n";
97 cout << "5. Expulsar / Eliminar Miembro\n";
98 cout << "6. Reportes DPS y MVP\n";
99 cout << "7. Salir\n";
100 cout << "Seleccione una opcion (1-7): "; cin >> opcion;
101
102 if (opcion == 1) {
103 guardarMiembro(clan, dps);
104 } else if (opcion == 2) {
105 listarClan(clan, dps);
106 } else if (opcion == 3) {
107 string tag;
108 cout << "Gamertag a buscar: "; cin >> tag;
109 int pos = buscarMiembro(clan, tag);
110 if (pos != -1) {
111 cout << "-> 🔍 Miembro encontrado en posicion [" << pos << "] con " << dps[pos] << " DPS\n";
112 } else {
113 cout << "-> ❌ Miembro no encontrado.\n";
114 }
115 } else if (opcion == 4) {
116 actualizarDPS(dps);
117 } else if (opcion == 5) {
118 eliminarMiembro(clan, dps);
119 } else if (opcion == 6) {
120 reportesDPS_MVP(clan, dps);
121 } else if (opcion != 7) {
122 cout << "-> ⚠️ Opcion no valida.\n";
123 }
124 } while (opcion != 7);
125
126 cout << "-> Sistema de clan cerrado.\n";
127 return 0;
128}

4Hangar Sci-Fi: Control de Bahías, Naves y Asignación de Pilotos

Búsqueda Hangar

Enunciado: 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.

Vectores: vector<string> matriculas | vector<string> pilotos
Operaciones: menu(), guardarNave(), listarHangar(), buscarNave(), actualizarPiloto(), eliminarNave(), reportes()
▶ Ver Solución C++ sugerida
caso4_hangar_scifi.cpp
CPP
1#include <iostream>
2#include <vector>
3#include <string>
4using namespace std;
5
6// 1. Guardar / Crear
7void guardarNave(vector<string>& mat, vector<string>& pil) {
8 string m, p;
9 cout << "Matricula de nave: "; cin >> m;
10 cout << "Piloto comandante: "; cin >> p;
11 mat.push_back(m);
12 pil.push_back(p);
13 cout << "-> 🚀 Nave acoplada en la bahia [" << mat.size() - 1 << "].\n";
14}
15
16// 2. Listar
17void listarHangar(const vector<string>& mat, const vector<string>& pil) {
18 cout << "\n=== 🚀 HANGAR DE NAVES ESTELARES ===\n";
19 if (mat.empty()) {
20 cout << "(Hangar vacio. Ninguna nave acoplada).\n";
21 return;
22 }
23 for (size_t i = 0; i < mat.size(); i++) {
24 cout << "[Bahia " << i << "] Matricula: " << mat[i] << " | Piloto: " << pil[i] << "\n";
25 }
26}
27
28// 3. Buscar
29int buscarNave(const vector<string>& mat, const string& buscada) {
30 for (size_t i = 0; i < mat.size(); i++) {
31 if (mat[i] == buscada) {
32 return (int)i;
33 }
34 }
35 return -1;
36}
37
38// 4. Actualizar
39void actualizarPiloto(vector<string>& pil) {
40 int idx; string nuevoPil;
41 cout << "Indice de bahia a reasignar piloto: "; cin >> idx;
42 if (idx >= 0 && idx < (int)pil.size()) {
43 cout << "Nuevo piloto asignado: "; cin >> nuevoPil;
44 pil[idx] = nuevoPil;
45 cout << "-> 👨‍🚀 Piloto reasignado con exito.\n";
46 } else {
47 cout << "-> ❌ Bahía invalida.\n";
48 }
49}
50
51// 5. Eliminar
52void eliminarNave(vector<string>& mat, vector<string>& pil) {
53 int idx;
54 cout << "Indice de bahia a autorizar despegue: "; cin >> idx;
55 if (idx >= 0 && idx < (int)mat.size()) {
56 cout << "🚀 Nave " << mat[idx] << " despegando. Bahia liberada.\n";
57 mat.erase(mat.begin() + idx);
58 pil.erase(pil.begin() + idx);
59 cout << "-> ✨ Registro de bahia actualizado.\n";
60 } else {
61 cout << "-> ❌ Indice invalido.\n";
62 }
63}
64
65// 6. Reportes
66void reportesOcupacion(const vector<string>& mat, const vector<string>& pil) {
67 cout << "\n📊 === REPORTE DE OCUPACION DEL HANGAR ===\n";
68 cout << "Total naves acopladas: " << mat.size() << "\n";
69 if (!mat.empty()) {
70 cout << "Primera nave acoplada: " << mat.front() << " (Piloto: " << pil.front() << ")\n";
71 cout << "Ultima nave acoplada: " << mat.back() << " (Piloto: " << pil.back() << ")\n";
72 }
73}
74
75int main() {
76 vector<string> mat = {"NX-01", "X-WING-7", "MILLENNIUM"};
77 vector<string> pil = {"Archer", "Luke", "Han Solo"};
78 int opcion = 0;
79
80 do {
81 cout << "\n=================================\n";
82 cout << " HANGAR ESPACIAL SCI-FI (CRUD) \n";
83 cout << "=================================\n";
84 cout << "1. Guardar / Acoplar Nave\n";
85 cout << "2. Listar Bahias del Hangar\n";
86 cout << "3. Buscar Nave por Matricula\n";
87 cout << "4. Reasignar / Actualizar Piloto\n";
88 cout << "5. Despegar / Eliminar Nave\n";
89 cout << "6. Reporte de Ocupacion\n";
90 cout << "7. Salir\n";
91 cout << "Seleccione una opcion (1-7): "; cin >> opcion;
92
93 if (opcion == 1) {
94 guardarNave(mat, pil);
95 } else if (opcion == 2) {
96 listarHangar(mat, pil);
97 } else if (opcion == 3) {
98 string buscada;
99 cout << "Matricula a buscar: "; cin >> buscada;
100 int pos = buscarNave(mat, buscada);
101 if (pos != -1) {
102 cout << "-> 🔍 Localizada en Bahia [" << pos << "] | Piloto: " << pil[pos] << "\n";
103 } else {
104 cout << "-> ❌ Nave no encontrada en el hangar.\n";
105 }
106 } else if (opcion == 4) {
107 actualizarPiloto(pil);
108 } else if (opcion == 5) {
109 eliminarNave(mat, pil);
110 } else if (opcion == 6) {
111 reportesOcupacion(mat, pil);
112 } else if (opcion != 7) {
113 cout << "-> ⚠️ Opcion no valida.\n";
114 }
115 } while (opcion != 7);
116
117 cout << "-> Sistema de hangar cerrado.\n";
118 return 0;
119}

5Alquimia & Forja Rúnica: Almacén de Ingredientes, Crafteo y Stock

Crafteo

Enunciado: 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.

Vectores: vector<string> materiales | vector<int> stock
Operaciones: menu(), guardarMaterial(), listarAlquimia(), buscarMaterial(), actualizarStock(), eliminarMaterial(), reporteAgotados()
▶ Ver Solución C++ sugerida
caso5_crafteo_alquimia.cpp
CPP
1#include <iostream>
2#include <vector>
3#include <string>
4using namespace std;
5
6// 1. Guardar / Crear
7void guardarMaterial(vector<string>& mats, vector<int>& stock) {
8 string m; int cant;
9 cout << "Nombre del material: "; cin >> m;
10 cout << "Unidades iniciales: "; cin >> cant;
11 mats.push_back(m);
12 stock.push_back(cant);
13 cout << "-> ✨ Ingrediente guardado en la bolsa de alquimia.\n";
14}
15
16// 2. Listar
17void listarAlquimia(const vector<string>& mats, const vector<int>& stock) {
18 cout << "\n=== 🧪 LABORATORIO DE ALQUIMIA & CRAFTEO ===\n";
19 if (mats.empty()) {
20 cout << "(Bolsa de alquimia vacia).\n";
21 return;
22 }
23 for (size_t i = 0; i < mats.size(); i++) {
24 cout << "[" << i << "] " << mats[i] << " - Stock: " << stock[i] << " unidades\n";
25 }
26}
27
28// 3. Buscar
29int buscarMaterial(const vector<string>& mats, const string& buscado) {
30 for (size_t i = 0; i < mats.size(); i++) {
31 if (mats[i] == buscado) {
32 return (int)i;
33 }
34 }
35 return -1;
36}
37
38// 4. Actualizar
39void actualizarStock(vector<int>& stock) {
40 int idx; int nuevaCant;
41 cout << "Indice de material a modificar: "; cin >> idx;
42 if (idx >= 0 && idx < (int)stock.size()) {
43 cout << "Nuevo stock disponible: "; cin >> nuevaCant;
44 stock[idx] = nuevaCant;
45 cout << "-> 📦 Stock actualizado.\n";
46 } else {
47 cout << "-> ❌ Indice invalido.\n";
48 }
49}
50
51// 5. Eliminar
52void eliminarMaterial(vector<string>& mats, vector<int>& stock) {
53 int idx;
54 cout << "Indice a eliminar del laboratorio: "; cin >> idx;
55 if (idx >= 0 && idx < (int)mats.size()) {
56 cout << "🗑️ " << mats[idx] << " descartado de la bolsa.\n";
57 mats.erase(mats.begin() + idx);
58 stock.erase(stock.begin() + idx);
59 cout << "-> ✨ Bolsa reorganizada.\n";
60 } else {
61 cout << "-> ❌ Indice invalido.\n";
62 }
63}
64
65// 6. Reportes y Crafteo
66void craftearItem(vector<string>& mats, vector<int>& stock) {
67 string buscado;
68 cout << "Material a consumir en la pocion/crafteo: "; cin >> buscado;
69 int pos = buscarMaterial(mats, buscado);
70 if (pos != -1) {
71 if (stock[pos] > 0) {
72 stock[pos]--;
73 cout << "-> 🔮 ¡Crafteo exitoso! Se uso 1x " << mats[pos] << ". Quedan: " << stock[pos] << " u.\n";
74 } else {
75 cout << "-> ⚠️ Sin stock suficiente de " << mats[pos] << " para crafteo.\n";
76 }
77 } else {
78 cout << "-> ❌ Material no encontrado en el laboratorio.\n";
79 }
80}
81
82int main() {
83 vector<string> mats = {"Mithril", "Polvo_Hada", "Escama_Dragon"};
84 vector<int> stk = {3, 0, 5};
85 int opcion = 0;
86
87 do {
88 cout << "\n=================================\n";
89 cout << " ALQUIMIA & CRAFTEO RPG (CRUD) \n";
90 cout << "=================================\n";
91 cout << "1. Guardar / Recoger Material\n";
92 cout << "2. Listar Bolsa de Alquimia\n";
93 cout << "3. Buscar Material por Nombre\n";
94 cout << "4. Actualizar Stock Manual\n";
95 cout << "5. Descartar / Eliminar Material\n";
96 cout << "6. Craftear Pocion (Consumir Stock)\n";
97 cout << "7. Salir\n";
98 cout << "Seleccione una opcion (1-7): "; cin >> opcion;
99
100 if (opcion == 1) {
101 guardarMaterial(mats, stk);
102 } else if (opcion == 2) {
103 listarAlquimia(mats, stk);
104 } else if (opcion == 3) {
105 string buscado;
106 cout << "Material a buscar: "; cin >> buscado;
107 int pos = buscarMaterial(mats, buscado);
108 if (pos != -1) {
109 cout << "-> 🔍 Encontrado en posicion [" << pos << "] | Stock: " << stk[pos] << " u.\n";
110 } else {
111 cout << "-> ❌ Ingrediente no encontrado.\n";
112 }
113 } else if (opcion == 4) {
114 actualizarStock(stk);
115 } else if (opcion == 5) {
116 eliminarMaterial(mats, stk);
117 } else if (opcion == 6) {
118 craftearItem(mats, stk);
119 } else if (opcion != 7) {
120 cout << "-> ⚠️ Opcion no valida.\n";
121 }
122 } while (opcion != 7);
123
124 cout << "-> Laboratorio de alquimia cerrado.\n";
125 return 0;
126}

6Torneo Arcade Global: Leaderboard, Clasificación y Tabla de Récords

Leaderboard

Enunciado: 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.

Vectores: vector<string> gamertags | vector<int> puntajes
Operaciones: menu(), guardarPartida(), listarRanking(), buscarJugador(), actualizarScore(), eliminarJugador(), ordenarTopScores()
▶ Ver Solución C++ sugerida
caso6_ranking_arcade.cpp
CPP
1#include <iostream>
2#include <vector>
3#include <string>
4#include <algorithm>
5using namespace std;
6
7// 1. Guardar / Crear
8void guardarPartida(vector<string>& tags, vector<int>& scores) {
9 string t; int s;
10 cout << "Gamertag del jugador: "; cin >> t;
11 cout << "Puntaje alcanzado: "; cin >> s;
12 tags.push_back(t);
13 scores.push_back(s);
14 cout << "-> 🕹️ Record guardado en la maquina arcade.\n";
15}
16
17// 2. Listar
18void listarRanking(const vector<string>& tags, const vector<int>& scores) {
19 cout << "\n=== 🏆 TABLA DE CLASIFICACION ARCADE ===\n";
20 if (tags.empty()) {
21 cout << "(Sin records registrados en la maquina).\n";
22 return;
23 }
24 for (size_t i = 0; i < tags.size(); i++) {
25 cout << "#" << (i + 1) << " " << tags[i] << " - " << scores[i] << " PTS\n";
26 }
27}
28
29// 3. Buscar
30int buscarJugador(const vector<string>& tags, const string& target) {
31 for (size_t i = 0; i < tags.size(); i++) {
32 if (tags[i] == target) {
33 return (int)i;
34 }
35 }
36 return -1;
37}
38
39// 4. Actualizar
40void actualizarPuntaje(vector<int>& scores) {
41 int idx; int nuevoScore;
42 cout << "Indice de jugador a actualizar score: "; cin >> idx;
43 if (idx >= 0 && idx < (int)scores.size()) {
44 cout << "Nuevo puntaje: "; cin >> nuevoScore;
45 scores[idx] = nuevoScore;
46 cout << "-> 🌟 Score actualizado con exito.\n";
47 } else {
48 cout << "-> ❌ Indice invalido.\n";
49 }
50}
51
52// 5. Eliminar
53void eliminarJugador(vector<string>& tags, vector<int>& scores) {
54 int idx;
55 cout << "Indice de jugador descalificado a retirar: "; cin >> idx;
56 if (idx >= 0 && idx < (int)tags.size()) {
57 cout << "❌ " << tags[idx] << " retirado del torneo.\n";
58 tags.erase(tags.begin() + idx);
59 scores.erase(scores.begin() + idx);
60 cout << "-> ✨ Tabla reorganizada.\n";
61 } else {
62 cout << "-> ❌ Indice invalido.\n";
63 }
64}
65
66// 6. Ordenar y Reportes
67void ordenarRanking(vector<string>& tags, vector<int>& scores) {
68 if (scores.empty()) {
69 cout << "(Sin partidas para ordenar).\n";
70 return;
71 }
72 for (size_t i = 0; i < scores.size(); i++) {
73 for (size_t j = 0; j + 1 < scores.size() - i; j++) {
74 if (scores[j] < scores[j + 1]) {
75 swap(scores[j], scores[j + 1]);
76 swap(tags[j], tags[j + 1]); // Sincronia de memoria paralela
77 }
78 }
79 }
80 cout << "-> 👑 Leaderboard ordenado de mayor a menor.\n";
81 cout << "🏆 Campeon del Torneo: " << tags[0] << " con " << scores[0] << " PTS\n";
82}
83
84int main() {
85 vector<string> tags = {"Viper_99", "NeonKnight", "CyberGhost"};
86 vector<int> scores = {4500, 6200, 9950};
87 int opcion = 0;
88
89 do {
90 cout << "\n=================================\n";
91 cout << " TORNEO ARCADE GLOBAL (CRUD) \n";
92 cout << "=================================\n";
93 cout << "1. Guardar / Registrar Partida\n";
94 cout << "2. Listar Leaderboard Actual\n";
95 cout << "3. Buscar Jugador por Gamertag\n";
96 cout << "4. Actualizar Puntaje por Indice\n";
97 cout << "5. Descalificar / Eliminar Jugador\n";
98 cout << "6. Ordenar Leaderboard y Ver MVP\n";
99 cout << "7. Salir\n";
100 cout << "Seleccione una opcion (1-7): "; cin >> opcion;
101
102 if (opcion == 1) {
103 guardarPartida(tags, scores);
104 } else if (opcion == 2) {
105 listarRanking(tags, scores);
106 } else if (opcion == 3) {
107 string target;
108 cout << "Gamertag a buscar: "; cin >> target;
109 int pos = buscarJugador(tags, target);
110 if (pos != -1) {
111 cout << "-> 🔍 Jugador encontrado en posicion [" << pos << "] con " << scores[pos] << " PTS\n";
112 } else {
113 cout << "-> ❌ Gamertag no encontrado en el torneo.\n";
114 }
115 } else if (opcion == 4) {
116 actualizarPuntaje(scores);
117 } else if (opcion == 5) {
118 eliminarJugador(tags, scores);
119 } else if (opcion == 6) {
120 ordenarRanking(tags, scores);
121 listarRanking(tags, scores);
122 } else if (opcion != 7) {
123 cout << "-> ⚠️ Opcion no valida.\n";
124 }
125 } while (opcion != 7);
126
127 cout << "-> Maquina arcade en reposo.\n";
128 return 0;
129}

7Dungeon Crawler MMORPG: Servidor de Mazmorras, Salas y Partidas

Dungeons 3V

Enunciado: 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.

Vectores: vector<int> salas | vector<string> estados | vector<string> lideresParty
Operaciones: menu(), guardarSala(), listarSalas(), buscarSala(), actualizarEstado(), eliminarSala(), reportes()
▶ Ver Solución C++ sugerida
caso7_dungeons_mmorpg.cpp
CPP
1#include <iostream>
2#include <vector>
3#include <string>
4using namespace std;
5
6// 1. Guardar / Crear
7void guardarSala(vector<int>& salas, vector<string>& estados, vector<string>& lideres) {
8 int s;
9 cout << "Numero de mazmorra a habilitar: "; cin >> s;
10 salas.push_back(s);
11 estados.push_back("LIBRE");
12 lideres.push_back("-");
13 cout << "-> 🏰 Mazmorra [" << s << "] habilitada en el servidor.\n";
14}
15
16// 2. Listar
17void listarSalas(const vector<int>& salas, const vector<string>& estados, const vector<string>& lideres) {
18 cout << "\n=== 🏰 SERVIDOR DE DUNGEONS & RAIDS ===\n";
19 if (salas.empty()) {
20 cout << "(Sin mazmorras activas en el servidor).\n";
21 return;
22 }
23 for (size_t i = 0; i < salas.size(); i++) {
24 cout << "[Sala " << salas[i] << "] Estado: " << estados[i] << " | Lider: " << lideres[i] << "\n";
25 }
26}
27
28// 3. Buscar
29int buscarSala(const vector<int>& salas, int numSala) {
30 for (size_t i = 0; i < salas.size(); i++) {
31 if (salas[i] == numSala) {
32 return (int)i;
33 }
34 }
35 return -1;
36}
37
38// 4. Actualizar / Entrar
39void entrarSala(const vector<int>& salas, vector<string>& estados, vector<string>& lideres) {
40 int s; string lid;
41 cout << "Numero de sala a ingresar: "; cin >> s;
42 int pos = buscarSala(salas, s);
43 if (pos != -1) {
44 if (estados[pos] == "LIBRE") {
45 cout << "Nombre de lider / Clan de la Party: "; cin >> lid;
46 estados[pos] = "EN_COMBATE";
47 lideres[pos] = lid;
48 cout << "-> ⚔️ ¡Combate iniciado en Sala " << s << "! Lider: " << lid << "\n";
49 } else {
50 cout << "-> ⚠️ La sala " << s << " ya esta ocupada en combate.\n";
51 }
52 } else {
53 cout << "-> ❌ Numero de sala no existe.\n";
54 }
55}
56
57// 5. Eliminar
58void eliminarSala(vector<int>& salas, vector<string>& estados, vector<string>& lideres) {
59 int idx;
60 cout << "Indice de sala a retirar del servidor: "; cin >> idx;
61 if (idx >= 0 && idx < (int)salas.size()) {
62 cout << "💥 Mazmorra [" << salas[idx] << "] dada de baja.\n";
63 salas.erase(salas.begin() + idx);
64 estados.erase(estados.begin() + idx);
65 lideres.erase(lideres.begin() + idx);
66 cout << "-> ✨ Lista de salas actualizada.\n";
67 } else {
68 cout << "-> ❌ Indice invalido.\n";
69 }
70}
71
72// 6. Reportes
73void reporteSalas(const vector<int>& salas, const vector<string>& estados, const vector<string>& lideres) {
74 cout << "\n📊 === REPORTE DE OCUPACION DE DUNGEONS ===\n";
75 int libres = 0; int enCombate = 0;
76 for (size_t i = 0; i < salas.size(); i++) {
77 if (estados[i] == "LIBRE") {
78 libres++;
79 } else {
80 enCombate++;
81 }
82 }
83 cout << "Total Mazmorras: " << salas.size() << " | Libres: " << libres << " | En Combate: " << enCombate << "\n";
84}
85
86int main() {
87 vector<int> salas = {101, 102, 103};
88 vector<string> estados = {"LIBRE", "EN_COMBATE", "LIBRE"};
89 vector<string> lideres = {"-", "LordVoldemort", "-"};
90 int opcion = 0;
91
92 do {
93 cout << "\n=================================\n";
94 cout << " SERVIDOR DE MAZMORRAS (CRUD) \n";
95 cout << "=================================\n";
96 cout << "1. Guardar / Habilitar Mazmorra\n";
97 cout << "2. Listar Estado de Mazmorras\n";
98 cout << "3. Buscar Mazmorra por Numero\n";
99 cout << "4. Ingresar Party (Asignar Combate)\n";
100 cout << "5. Eliminar / Dar de Baja Sala\n";
101 cout << "6. Reporte de Ocupacion\n";
102 cout << "7. Salir\n";
103 cout << "Seleccione una opcion (1-7): "; cin >> opcion;
104
105 if (opcion == 1) {
106 guardarSala(salas, estados, lideres);
107 } else if (opcion == 2) {
108 listarSalas(salas, estados, lideres);
109 } else if (opcion == 3) {
110 int num;
111 cout << "Numero de sala a buscar: "; cin >> num;
112 int pos = buscarSala(salas, num);
113 if (pos != -1) {
114 cout << "-> 🔍 Localizada en indice [" << pos << "] | Estado: " << estados[pos] << " | Lider: " << lideres[pos] << "\n";
115 } else {
116 cout << "-> ❌ Sala no encontrada.\n";
117 }
118 } else if (opcion == 4) {
119 entrarSala(salas, estados, lideres);
120 } else if (opcion == 5) {
121 eliminarSala(salas, estados, lideres);
122 } else if (opcion == 6) {
123 reporteSalas(salas, estados, lideres);
124 } else if (opcion != 7) {
125 cout << "-> ⚠️ Opcion no valida.\n";
126 }
127 } while (opcion != 7);
128
129 cout << "-> Servidor de mazmorras desconectado.\n";
130 return 0;
131}

8Supervivencia Post-Apocalíptica: Mochila Táctica, Municiones y Alertas HUD

Alerta HUD

Enunciado: 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.

Vectores: vector<string> suministros | vector<int> cantidades
Operaciones: menu(), guardarRecurso(), listarMochila(), buscarRecurso(), actualizarUnidades(), eliminarRecurso(), reporteAlertasHUD()
▶ Ver Solución C++ sugerida
caso8_supervivencia_hud.cpp
CPP
1#include <iostream>
2#include <vector>
3#include <string>
4using namespace std;
5
6// 1. Guardar / Crear
7void guardarRecurso(vector<string>& sum, vector<int>& cant) {
8 string r; int c;
9 cout << "Nombre del suministro: "; cin >> r;
10 cout << "Unidades encontradas: "; cin >> c;
11 sum.push_back(r);
12 cant.push_back(c);
13 cout << "-> 🎒 Recurso guardado en la mochila tactica.\n";
14}
15
16// 2. Listar
17void listarMochila(const vector<string>& sum, const vector<int>& cant) {
18 cout << "\n=== 🎒 INVENTARIO TACTICO DE SUPERVIVENCIA ===\n";
19 if (sum.empty()) {
20 cout << "(Mochila vacia. Busca provisiones en la zona).\n";
21 return;
22 }
23 for (size_t i = 0; i < sum.size(); i++) {
24 cout << "[" << i << "] " << sum[i] << " - " << cant[i] << " unidades\n";
25 }
26}
27
28// 3. Buscar
29int buscarRecurso(const vector<string>& sum, const string& target) {
30 for (size_t i = 0; i < sum.size(); i++) {
31 if (sum[i] == target) {
32 return (int)i;
33 }
34 }
35 return -1;
36}
37
38// 4. Actualizar
39void actualizarCantidad(vector<int>& cant) {
40 int idx; int nuevaCant;
41 cout << "Indice de suministro a modificar: "; cin >> idx;
42 if (idx >= 0 && idx < (int)cant.size()) {
43 cout << "Nueva cantidad disponible: "; cin >> nuevaCant;
44 cant[idx] = nuevaCant;
45 cout << "-> 📦 Cantidad actualizada.\n";
46 } else {
47 cout << "-> ❌ Indice invalido.\n";
48 }
49}
50
51// 5. Eliminar
52void eliminarRecurso(vector<string>& sum, vector<int>& cant) {
53 int idx;
54 cout << "Indice de item a descartar: "; cin >> idx;
55 if (idx >= 0 && idx < (int)sum.size()) {
56 cout << "🗑️ " << sum[idx] << " descartado de la mochila.\n";
57 sum.erase(sum.begin() + idx);
58 cant.erase(cant.begin() + idx);
59 cout << "-> ✨ Espacio liberado en la mochila.\n";
60 } else {
61 cout << "-> ❌ Indice invalido.\n";
62 }
63}
64
65// 6. Reportes y Alerta HUD
66void alertaRecursosCriticos(const vector<string>& sum, const vector<int>& cant, int minVal) {
67 cout << "\n⚠️ === ALERTA HUD: SUMINISTROS CRITICOS (< " << minVal << " u.) ===\n";
68 int criticos = 0;
69 for (size_t i = 0; i < sum.size(); i++) {
70 if (cant[i] < minVal) {
71 cout << "- 🔻 " << sum[i] << " (" << cant[i] << " unidades restantes ¡Peligro!)\n";
72 criticos++;
73 }
74 }
75 if (criticos == 0) {
76 cout << "-> ✅ Todos los suministros estan sobre el nivel seguro.\n";
77 }
78}
79
80int main() {
81 vector<string> sum = {"Balas_5.56mm", "Botiquines", "Granadas_IEM"};
82 vector<int> cant = {2, 14, 3};
83 int opcion = 0;
84
85 do {
86 cout << "\n=================================\n";
87 cout << " MOCHILA DE SUPERVIVENCIA (CRUD)\n";
88 cout << "=================================\n";
89 cout << "1. Guardar / Recoger Suministro\n";
90 cout << "2. Listar Mochila Tactica\n";
91 cout << "3. Buscar Suministro por Nombre\n";
92 cout << "4. Actualizar Cantidad por Indice\n";
93 cout << "5. Descartar / Eliminar Item\n";
94 cout << "6. Alerta HUD (Recursos Criticos)\n";
95 cout << "7. Salir\n";
96 cout << "Seleccione una opcion (1-7): "; cin >> opcion;
97
98 if (opcion == 1) {
99 guardarRecurso(sum, cant);
100 } else if (opcion == 2) {
101 listarMochila(sum, cant);
102 } else if (opcion == 3) {
103 string target;
104 cout << "Nombre del item a buscar: "; cin >> target;
105 int pos = buscarRecurso(sum, target);
106 if (pos != -1) {
107 cout << "-> 🔍 Localizado en posicion [" << pos << "] | Cantidad: " << cant[pos] << " u.\n";
108 } else {
109 cout << "-> ❌ Suministro no encontrado en la mochila.\n";
110 }
111 } else if (opcion == 4) {
112 actualizarCantidad(cant);
113 } else if (opcion == 5) {
114 eliminarRecurso(sum, cant);
115 } else if (opcion == 6) {
116 alertaRecursosCriticos(sum, cant, 5);
117 } else if (opcion != 7) {
118 cout << "-> ⚠️ Opcion no valida.\n";
119 }
120 } while (opcion != 7);
121
122 cout << "-> Mochila asegurada.\n";
123 return 0;
124}

9Domador de Criaturas RPG: Bestiario, Afinidades Elementales y Capturas

Bestiario 3V

Enunciado: 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.

Vectores: vector<string> nombres | vector<string> elementos | vector<float> poderCP
Operaciones: menu(), guardarCriatura(), listarBestiario(), buscarCriatura(), actualizarPoderCP(), eliminarCriatura(), reporteMaxCP()
▶ Ver Solución C++ sugerida
caso9_bestiario_rpg.cpp
CPP
1#include <iostream>
2#include <vector>
3#include <string>
4using namespace std;
5
6// 1. Guardar / Crear
7void guardarCriatura(vector<string>& nom, vector<string>& ele, vector<float>& cp) {
8 string n, e; float p;
9 cout << "Nombre de especie: "; cin >> n;
10 cout << "Elemento afin: "; cin >> e;
11 cout << "Poder de combate CP: "; cin >> p;
12 nom.push_back(n);
13 ele.push_back(e);
14 cp.push_back(p);
15 cout << "-> 🍃 Criatura capturada y registrada en el bestiario.\n";
16}
17
18// 2. Listar
19void listarBestiario(const vector<string>& nom, const vector<string>& ele, const vector<float>& cp) {
20 cout << "\n=== 🐾 BESTIARIO DEL DOMADOR ===\n";
21 if (nom.empty()) {
22 cout << "(Bestiario vacio. Explora la region para capturar criaturas).\n";
23 return;
24 }
25 for (size_t i = 0; i < nom.size(); i++) {
26 cout << "[" << i << "] " << nom[i] << " [" << ele[i] << "] - CP: " << cp[i] << "\n";
27 }
28}
29
30// 3. Buscar
31int buscarCriatura(const vector<string>& nom, const string& target) {
32 for (size_t i = 0; i < nom.size(); i++) {
33 if (nom[i] == target) {
34 return (int)i;
35 }
36 }
37 return -1;
38}
39
40// 4. Actualizar
41void actualizarPoder(vector<float>& cp) {
42 int idx; float nuevoCP;
43 cout << "Indice de criatura a entrenar: "; cin >> idx;
44 if (idx >= 0 && idx < (int)cp.size()) {
45 cout << "Nuevo CP de combate: "; cin >> nuevoCP;
46 cp[idx] = nuevoCP;
47 cout << "-> ⚡ CP aumentado con exito tras el entrenamiento.\n";
48 } else {
49 cout << "-> ❌ Indice invalido.\n";
50 }
51}
52
53// 5. Eliminar
54void liberarCriatura(vector<string>& nom, vector<string>& ele, vector<float>& cp) {
55 int idx;
56 cout << "Indice de criatura a liberar a la naturaleza: "; cin >> idx;
57 if (idx >= 0 && idx < (int)nom.size()) {
58 cout << "🍃 " << nom[idx] << " [" << ele[idx] << "] liberada al bosque.\n";
59 nom.erase(nom.begin() + idx);
60 ele.erase(ele.begin() + idx);
61 cp.erase(cp.begin() + idx);
62 cout << "-> ✨ Bestiario actualizado.\n";
63 } else {
64 cout << "-> ❌ Indice invalido.\n";
65 }
66}
67
68// 6. Reportes
69void reporteMaxCP(const vector<string>& nom, const vector<string>& ele, const vector<float>& cp) {
70 cout << "\n👑 === CRIATURA LEGENDARIA MVP (MAYOR CP) ===\n";
71 if (nom.empty()) {
72 cout << "(Sin criaturas en el bestiario).\n";
73 return;
74 }
75 int maxIdx = 0;
76 for (size_t i = 0; i < cp.size(); i++) {
77 if (cp[i] > cp[maxIdx]) {
78 maxIdx = (int)i;
79 }
80 }
81 cout << "Criatura Legendaria: " << nom[maxIdx] << " [" << ele[maxIdx] << "] con " << cp[maxIdx] << " CP\n";
82}
83
84int main() {
85 vector<string> nom = {"Ignisaur", "Aquafox", "Thundercat"};
86 vector<string> ele = {"FUEGO", "AGUA", "RAYO"};
87 vector<float> cp = {1250.0f, 890.0f, 1540.0f};
88 int opcion = 0;
89
90 do {
91 cout << "\n=================================\n";
92 cout << " BESTIARIO DEL DOMADOR (CRUD) \n";
93 cout << "=================================\n";
94 cout << "1. Guardar / Capturar Criatura\n";
95 cout << "2. Listar Bestiario Completo\n";
96 cout << "3. Buscar Criatura por Nombre\n";
97 cout << "4. Entrenar / Aumentar CP\n";
98 cout << "5. Liberar Criatura a la Naturaleza\n";
99 cout << "6. Reporte Criatura con Mayor CP\n";
100 cout << "7. Salir\n";
101 cout << "Seleccione una opcion (1-7): "; cin >> opcion;
102
103 if (opcion == 1) {
104 guardarCriatura(nom, ele, cp);
105 } else if (opcion == 2) {
106 listarBestiario(nom, ele, cp);
107 } else if (opcion == 3) {
108 string target;
109 cout << "Nombre de especie a buscar: "; cin >> target;
110 int pos = buscarCriatura(nom, target);
111 if (pos != -1) {
112 cout << "-> 🔍 Localizada en posicion [" << pos << "] [" << ele[pos] << "] con " << cp[pos] << " CP\n";
113 } else {
114 cout << "-> ❌ Criatura no avistada en el bestiario.\n";
115 }
116 } else if (opcion == 4) {
117 actualizarPoder(cp);
118 } else if (opcion == 5) {
119 liberarCriatura(nom, ele, cp);
120 } else if (opcion == 6) {
121 reporteMaxCP(nom, ele, cp);
122 } else if (opcion != 7) {
123 cout << "-> ⚠️ Opcion no valida.\n";
124 }
125 } while (opcion != 7);
126
127 cout << "-> Bestiario cerrado.\n";
128 return 0;
129}

10Tienda Gacha & Pase de Batalla: Catálogo de Skins, Canjes y Auditoría

Economía Gacha

Enunciado: 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.

Vectores: vector<string> skins | vector<int> stockSkins | vector<float> costosGemas
Operaciones: menu(), guardarSkin(), listarTienda(), buscarSkin(), actualizarSkin(), eliminarSkin(), reporteRecaudacion()
▶ Ver Solución C++ sugerida
caso10_gacha_skins.cpp
CPP
1#include <iostream>
2#include <vector>
3#include <string>
4using namespace std;
5
6// 1. Guardar / Crear
7void guardarSkin(vector<string>& skins, vector<int>& stock, vector<float>& costos) {
8 string s; int stk; float c;
9 cout << "Nombre de skin: "; cin >> s;
10 cout << "Stock inicial disponible: "; cin >> stk;
11 cout << "Costo en gemas: "; cin >> c;
12 skins.push_back(s);
13 stock.push_back(stk);
14 costos.push_back(c);
15 cout << "-> 🎟️ Skin agregada a la tienda de temporada.\n";
16}
17
18// 2. Listar
19void listarTienda(const vector<string>& skins, const vector<int>& stock, const vector<float>& costos) {
20 cout << "\n=== 🎟️ TIENDA GACHA & PASE DE BATALLA ===\n";
21 if (skins.empty()) {
22 cout << "(Catalogo vacio. No hay skins disponibles).\n";
23 return;
24 }
25 for (size_t i = 0; i < skins.size(); i++) {
26 cout << "[" << i << "] " << skins[i] << " - Stock: " << stock[i] << " disp. - " << costos[i] << " Gemas\n";
27 }
28}
29
30// 3. Buscar
31int buscarSkin(const vector<string>& skins, const string& target) {
32 for (size_t i = 0; i < skins.size(); i++) {
33 if (skins[i] == target) {
34 return (int)i;
35 }
36 }
37 return -1;
38}
39
40// 4. Actualizar
41void actualizarStock(vector<int>& stock) {
42 int idx; int nuevoStock;
43 cout << "Indice de skin a modificar stock: "; cin >> idx;
44 if (idx >= 0 && idx < (int)stock.size()) {
45 cout << "Nuevo stock disponible: "; cin >> nuevoStock;
46 stock[idx] = nuevoStock;
47 cout << "-> 📦 Stock actualizado.\n";
48 } else {
49 cout << "-> ❌ Indice invalido.\n";
50 }
51}
52
53// 5. Eliminar
54void eliminarSkin(vector<string>& skins, vector<int>& stock, vector<float>& costos) {
55 int idx;
56 cout << "Indice de skin a retirar de la tienda: "; cin >> idx;
57 if (idx >= 0 && idx < (int)skins.size()) {
58 cout << "🗑️ " << skins[idx] << " retirada de la rotacion.\n";
59 skins.erase(skins.begin() + idx);
60 stock.erase(stock.begin() + idx);
61 costos.erase(costos.begin() + idx);
62 cout << "-> ✨ Catalogo actualizado.\n";
63 } else {
64 cout << "-> ❌ Indice invalido.\n";
65 }
66}
67
68// 6. Canjear y Reportes
69void canjearSkin(vector<string>& skins, vector<int>& stock, const vector<float>& costos) {
70 string skin; int cant;
71 cout << "Nombre de skin a canjear: "; cin >> skin;
72 int pos = buscarSkin(skins, skin);
73 if (pos != -1) {
74 cout << "Cantidad a comprar: "; cin >> cant;
75 if (stock[pos] >= cant && cant > 0) {
76 stock[pos] -= cant;
77 float totalGemas = cant * costos[pos];
78 cout << "-> ✨ ¡Canje exitoso! Pagaste " << totalGemas << " Gemas por " << cant << "x " << skins[pos] << ".\n";
79 cout << " Stock restante en tienda: " << stock[pos] << " u.\n";
80 } else {
81 cout << "-> ❌ Stock insuficiente (solo quedan " << stock[pos] << " u.).\n";
82 }
83 } else {
84 cout << "-> ❌ Skin no encontrada en la tienda.\n";
85 }
86}
87
88int main() {
89 vector<string> skins = {"Cyber_Samurai", "Neon_Valkyrie", "Mecha_Dragon"};
90 vector<int> stock = {10, 2, 5};
91 vector<float> costos = {1200.0f, 2500.0f, 5000.0f};
92 int opcion = 0;
93
94 do {
95 cout << "\n=================================\n";
96 cout << " TIENDA GACHA & SKINS (CRUD) \n";
97 cout << "=================================\n";
98 cout << "1. Guardar / Añadir Skin al Pase\n";
99 cout << "2. Listar Tienda y Precios\n";
100 cout << "3. Buscar Skin por Nombre\n";
101 cout << "4. Actualizar Stock Disponible\n";
102 cout << "5. Retirar / Eliminar Skin\n";
103 cout << "6. Canjear Skin con Gemas\n";
104 cout << "7. Salir\n";
105 cout << "Seleccione una opcion (1-7): "; cin >> opcion;
106
107 if (opcion == 1) {
108 guardarSkin(skins, stock, costos);
109 } else if (opcion == 2) {
110 listarTienda(skins, stock, costos);
111 } else if (opcion == 3) {
112 string target;
113 cout << "Nombre de skin a buscar: "; cin >> target;
114 int pos = buscarSkin(skins, target);
115 if (pos != -1) {
116 cout << "-> 🔍 Localizada en posicion [" << pos << "] | Costo: " << costos[pos] << " Gemas | Stock: " << stock[pos] << " u.\n";
117 } else {
118 cout << "-> ❌ Skin no encontrada.\n";
119 }
120 } else if (opcion == 4) {
121 actualizarStock(stock);
122 } else if (opcion == 5) {
123 eliminarSkin(skins, stock, costos);
124 } else if (opcion == 6) {
125 canjearSkin(skins, stock, costos);
126 } else if (opcion != 7) {
127 cout << "-> ⚠️ Opcion no valida.\n";
128 }
129 } while (opcion != 7);
130
131 cout << "-> Tienda gacha cerrada.\n";
132 return 0;
133}

Dato curioso: C++ apareció en 1985; Bjarne Stroustrup en Bell Labs. Wikipedia

Ko-fi
Donaciones
Apoyá cafeycodigo con un café en Ko-fi. Colaboradores: insignia, muro y zona exclusiva.