Implementación de un Sistema de Gestión Escolar usando std::vector en C++

El uso de la biblioteca de plantillas estándar (STL) en C++ facilita la administración de colecciones de datos dinámicas. En este artículo, exploraremos cómo desarrollar un sistema de gestión de estudiantes utilizando el contenedor std::vector, permitiendo realizar operaciones fundamentales como la inserción, búsqueda, actualización y eliminación de registros.

Estructura de Datos y Prototipso

Para representar a un estudiante, definimos una estructura que agrupa los atributos básicos. A diferencia de los arreglos estáticos, el uso de std::vector nos permite manejar una cantidad variable de registros sin preocuparnos por la gestión manual de la memoria.

#include <iostream>
#include <vector>
#include <string>

using namespace std;

struct Estudiante {
    int id;
    string nombre;
    int edad;
    string aula;
};

// Constante para el inicio de la numeración de matrículas
const int BASE_ID = 1000;

// Funciones del sistema
void mostrarMenuPrincipal();
void agregarEstudiante(vector<Estudiante>& lista, int& contador);
void buscarEstudiante(const vector<Estudiante>& lista);
void modificarEstudiante(vector<Estudiante>& lista);
void eliminarEstudiante(vector<Estudiante>& lista);

Lógica de Búsqueda y Filtrado

La búsqueda es una de las funciones más críticas. Implementamos un submanú que permite filtrar por diferentes criterios, utilizando iteradores para recorrer el contenedor de forma segura.

void buscarEstudiante(const vector<Estudiante>& lista) {
    int opcion;
    cout << "\n--- Criterio de Búsqueda ---" << endl;
    cout << "1. Por ID\n2. Por Nombre\n3. Por Aula\n4. Volver" << endl;
    cin >> opcion;

    bool encontrado = false;
    if (opcion == 1) {
        int idBusqueda;
        cout << "Ingrese ID: "; cin >> idBusqueda;
        for (const auto& est : lista) {
            if (est.id == idBusqueda) {
                cout << "Nombre: " << est.nombre << " | Aula: " << est.aula << endl;
                encontrado = true;
            }
        }
    } else if (opcion == 2) {
        string nombreBusqueda;
        cout << "Ingrese nombre: "; cin >> nombreBusqueda;
        for (const auto& est : lista) {
            if (est.nombre.find(nombreBusqueda) != string::npos) {
                cout << "ID: " << est.id << " | Nombre: " << est.nombre << endl;
                encontrado = true;
            }
        }
    }

    if (!encontrado && opcion != 4) cout << "No se hallaron coincidencias." << endl;
}

Gestión de Registros: Inserción y Eliminación

Para la inserción, utilizamos push_back, lo cual añade el objeto al final del vector. Para la eliminación, localizamos la posición mediante un índice y utilizamos el método erase junto con el iterador begin().

void agregarEstudiante(vector<Estudiante>& lista, int& contador) {
    Estudiante nuevo;
    cout << "Nombre del alumno: "; cin >> nuevo.nombre;
    cout << "Edad: "; cin >> nuevo.edad;
    cout << "Aula: "; cin >> nuevo.aula;
    
    nuevo.id = BASE_ID + contador;
    lista.push_back(nuevo);
    
    cout << "Registro exitoso. ID asignado: " << nuevo.id << endl;
    contador++;
}

void eliminarEstudiante(vector<Estudiante>& lista) {
    int idEliminar;
    cout << "Ingrese el ID a eliminar: ";
    cin >> idEliminar;
    
    for (auto it = lista.begin(); it != lista.end(); ++it) {
        if (it->id == idEliminar) {
            lista.erase(it);
            cout << "Registro eliminado correctamente." << endl;
            return;
        }
    }
    cout << "Error: ID no encontrado." << endl;
}

Control de Flujo Principal

El programa se mantiene activo mediante un bucle while, procesando las solicitudes del usuario hasta que se selecciona la opción de salida. El paso por referencia (&) de la base de datos de estudiantes asegura que los cambios persistan durante la ejecución del programa.

int main() {
    vector<Estudiante> baseDeDatos;
    int contadorGlobal = 0;
    int seleccion;

    while (true) {
        mostrarMenuPrincipal();
        cin >> seleccion;

        if (seleccion == 5) break;

        switch (seleccion) {
            case 1: agregarEstudiante(baseDeDatos, contadorGlobal); break;
            case 2: buscarEstudiante(baseDeDatos); break;
            case 3: modificarEstudiante(baseDeDatos); break;
            case 4: eliminarEstudiante(baseDeDatos); break;
            default: cout << "Opción inválida." << endl;
        }
        system("pause"); // Dependiente del SO
        system("cls");   // Limpiar consola
    }

    return 0;
}

void mostrarMenuPrincipal() {
    cout << "=== SISTEMA DE GESTIÓN ACADÉMICA ===" << endl;
    cout << "1. Registrar Estudiante" << endl;
    cout << "2. Consultar Información" << endl;
    cout << "3. Actualizar Datos" << endl;
    cout << "4. Dar de Baja" << endl;
    cout << "5. Salir" << endl;
    cout << "Seleccione una opción: ";
}

Etiquetas: C++ STL vector CRUD estructuras de datos

Publicado el 8-5 16:01