🟥 1.
Bibliotecas incluidas
#include <iostream>
#include <vector>
#include <string>
#include <unordered_map>
#include <algorithm>
#include <limits>
¿Qué es esto y por qué se usa?
Son librerías estándar de C++, cada una tiene un papel crucial en tu programa:
Librería Para qué sirve Por qué es necesaria
Entrada y salida por consola Sin esto, no puedes interactuar con el
<iostream>
(cin, cout) usuario
Arreglos dinámicos (listas Ideal para guardar todos los reportes sin
<vector>
expandibles) límites
<string> Manejo de texto Todo tu programa trabaja con texto
Para traducir M → MANTENIMIENTO y
<unordered_map> Diccionarios tipo clave-valor
generar estadísticas
Funciones útiles como Lo usamos para pasar texto a mayúsculas
<algorithm>
transform() fácilmente
Para limpiar el buffer del
<limits> Evita errores al mezclar cin y getline
teclado
Conclusión:
Cada una es necesaria, y juntas forman la base para construir un sistema robusto y
eficiente.
🟥 2. Función upper() – Convertir todo a mayúsculas
string upper(const string &s) {
string r = s;
transform([Link](), [Link](), [Link](), ::toupper);
return r;
}
¿Qué hace?
Convierte un texto cualquiera en MAYÚSCULAS.
¿Por qué existe?
• Evita errores por minúsculas o combinaciones raras.
• Asegura que si el usuario escribe “m”, “M”, “mantenimiento”, todo se procesa
igual.
• Mejora la estabilidad del programa.
¿Por qué se usa transform?
Es la forma óptima y correcta de recorrer un string y modificarlo caracter por caracter.
🟥 3. Mapas para traducir abreviaciones
unordered_map<string, string> fallaCompleta = {
{"M", "MANTENIMIENTO"},
{"E", "ELECTRICA"},
{"C", "CALIBRACION"},
{"A", "AJUSTE"},
{"O", "OTROS"}
};
¿Qué es esto realmente?
Un unordered_map es parecido a un diccionario en Python.
Funciona con una lógica de tabla hash interna que vuelve las búsquedas muy rápidas
(O(1)).
¿Para qué sirve aquí?
Para que el usuario escriba solo una letra (M/E/C/A/O) y el programa convierta eso en:
MANTENIMIENTO, ELECTRICA, CALIBRACION, AJUSTE, OTROS
¿Por qué es importante?
• Reduce el error del usuario.
• Hace más fácil llenar el reporte.
• Mantiene estandarización.
🟥 4. Estructura del reporte
struct Reporte {
string fecha_reporte;
string servicio;
string equipo;
string marca;
string modelo;
string serial;
string fecha_entrada;
string tipo_falla;
string descripcion;
string repuestos;
string observaciones;
bool operativo;
string tecnico;
};
¿Qué es un struct?
Es un "contenedor" o "caja" que agrupa datos relacionados.
¿Por qué es perfecto aquí?
Un reporte real en electromedicina tiene campos definidos, y un struct permite
representarlo con la misma estructura mental.
¿Ventajas?
• Claridad en el código.
• Organización.
• Fácil mantenimiento.
• No hay riesgo de mezclar campos.
🟥 5. Base de datos en memoria
vector<Reporte> reportes;
¿Por qué un vector?
Porque:
• Crece automáticamente.
• Es veloz accediendo por índice.
• Mantiene el orden en que se registraron los reportes.
• Permite recorrerlos secuencialmente para estadísticas.
¿Alternativas?
• list: pero no se necesita.
• deque: tampoco aporta ventajas aquí.
El vector es lo correcto.
🟥 6. Función para limpiar el buffer
void limpiar() {
[Link](numeric_limits<streamsize>::max(), '\n');
}
¿Para qué sirve?
Soluciona el clásico problema:
cin >> variable;
deja un salto de línea pendiente
y getline() lo lee accidentalmente vacío.
Aquí se elimina toda la basura del buffer.
🟥 7. Función auxiliar input()
string input(const string &msg) {
cout << msg;
string s;
getline(cin, s);
return s;
}
¿Para qué existe esta función?
Para evitar escribir muchas veces:
cout << "Mensaje: ";
getline(cin, variable);
Reduce código repetido → mejora la mantenibilidad.
🟥 8. Función ingresarReporte()
Esta es la función más importante del sistema.
Voy a explicarte cada fragmento:
➤ Encabezado y estética
cout << "\n==============================\n";
cout << " REPORTE DE FALLA\n";
cout << "==============================\n";
No es obligatorio, pero es buena práctica:
• Mejora legibilidad.
• Separa visualmente secciones.
➤ Entrada de datos pura
Cada línea:
cout << "Fecha del reporte... ";
getline(cin, r.fecha_reporte);
Hace:
• Solicita información.
• La captura en la variable correspondiente del struct.
➤ Bloque especial del tipo de falla
Este es más inteligente:
string tf;
cout << "Tipo de falla [M/E/C/A/O]: ";
getline(cin, tf);
tf = upper(tf);
if ([Link](tf))
r.tipo_falla = fallaCompleta[tf];
else
r.tipo_falla = "OTROS";
¿Qué hace este bloque?
• Convierte la letra a mayúsculas.
• La busca en el diccionario.
• Traduce el código a texto completo.
• Si no coincide → asigna “OTROS”.
¿Por qué es tan útil?
Reduce errores y homogeniza los datos.
➤ Estado operativo/inoperativo
string estado;
cout << "Estado del equipo [O = Operativo / I = Inoperativo]: ";
getline(cin, estado);
estado = upper(estado);
[Link] = (estado == "O");
¿Qué hace exactamente?
• Si el usuario escribe “O”, el bool queda true.
• Si escribe “I”, queda false.
¿Por qué usar un bool?
• Es más eficiente
• Facilita cálculos e iteraciones
• Evita validaciones repetitivas
🟥 9. Generación de estadísticas
Esta función procesa todos los reportes y calcula resúmenes.
Se usan tres mapas:
unordered_map<string,int> freqServicio;
unordered_map<string,int> freqFalla;
unordered_map<string,int> freqTecnico;
¿Para qué sirven?
Para contar:
• cuántas veces aparece cada servicio
• qué tipo de falla fue más común
• qué técnico registró más
Es el equivalente a hacer una tabla dinámica.
Recorrido principal
for (auto &r : reportes)
Dentro:
• Se incrementan los contadores.
• Se actualiza el conteo de operativos / inoperativos.
• Se comparan fechas para determinar el rango.
Cálculo del elemento más repetido
Este bloque:
auto maxCount = [](unordered_map<string,int> &m) { ... };
Es una lambda function, una función anónima localizada.
¿Por qué usarla aquí?
• Reduce código repetido
• Hace elegante la extracción del máximo
🟥 10. Función main()
Representa el flujo general:
while (true) {
ingresarReporte();
pedir R/E
si R → continuar
si E → salir del ciclo
}
generarEstadisticas();
¿Qué significa esto?
• El usuario puede registrar reportes ilimitados.
• Solo cuando elige E se generan estadísticas.
• El programa termina ordenadamente.
Este es un ciclo controlado por usuario, ideal en un programa de consola.