Gestión de Memoria Dinámica y Matrices en C++: Punteros, Arreglos y Ordenamiento

Informática y Telecomunicaciones5,48 KB

Gestión de memoria dinámica y matrices en C++

A continuación se presentan fragmentos de código en C++ que ilustran el uso de punteros, la reserva y liberación de memoria dinámica con new y delete, el manejo de matrices y el ordenamiento de arreglos de caracteres.

1. Punteros y reserva de memoria dinámica

int* p = new int; // Reserva memoria para un entero

*p = 10; // Asigna un valor

delete p;

int* arr = new int[10]; // Reserva espacio para 10 enteros

arr[0] = 5;

delete[] arr;

2. Impresión de una fila de una matriz

La función impriFila recorre de forma recursiva los elementos de una fila:

void imprimirFila(int* p, int columnas, int restantes) {
    if (restantes == 0) return;
    cout << *p << "\t";
    imprimirFila(p + 1, columnas, restantes - 1);
}

3. Impresión recursiva de una matriz

void imprimirMatriz(int* p, int filas, int columnas, int filaActual = 0) {
    if (filaActual == filas) return;
    imprimirFila(p + filaActual * columnas, columnas, columnas);
    cout << endl;
    imprimirMatriz(p, filas, columnas, filaActual + 1);
}

4. Matriz dinámica de punteros

int** mat = new int*[filas]; // Reserva memoria para las filas

for (int i = 0; i < filas; i++) {
    mat[i] = new int[columnas]; // Reserva columnas para cada fila
}

for (int i = 0; i < filas; i++) {
    delete[] mat[i];
}

delete[] mat;

5. Programa principal de ejemplo

int main() {
    int filas = 3, columnas = 4;
    int matriz[3][4];
    imprimirMatriz(&matriz[0][0], filas, columnas);
    return 0;
}

6. Conceptos clave de punteros

  • Declaración: int* p; declara un puntero.
  • Asignación: p = &x; guarda la dirección de memoria de x.
  • Acceso y modificación: *p permite acceder o modificar el valor almacenado.
  • Aritmética de punteros: p++ mueve el puntero al siguiente elemento.
  • Acceso por desplazamiento: *(p + i) accede al valor situado i posiciones adelante.
  • Acceso a matrices: *(*(m + i) + j) equivale a m[i][j].

7. Llenado de una matriz de caracteres

La función llenarMatriz genera caracteres aleatorios en tres categorías: minúsculas, mayúsculas y números, guardándolos en arreglos auxiliares para su posterior ordenamiento.

void llenarMatriz(char m[8][8], char min[], int &cMin, char may[], int &cMay, char num[], int &cNum) {
    cMin = cMay = cNum = 0;
    for (int i = 0; i < 8; i++) {
        for (int j = 0; j < 8; j++) {
            int tipo = rand() % 3;
            if (tipo == 0) {
                m[i][j] = 'a' + rand() % 26;
                min[cMin++] = m[i][j];
            } else if (tipo == 1) {
                m[i][j] = 'A' + rand() % 26;
                may[cMay++] = m[i][j];
            } else {
                m[i][j] = '0' + rand() % 10;
                num[cNum++] = m[i][j];
            }
        }
    }
}

8. Mostrar la matriz de caracteres

void mostrarMatriz(char m[8][8]) {
    for (int i = 0; i < 8; i++) {
        for (int j = 0; j < 8; j++)
            cout << m[i][j] << " ";
        cout << endl;
    }
}

9. Algoritmos de ordenamiento

Ordenamiento ascendente:

void ordenAsc(char v[], int n) {
    for (int i = 0; i < n - 1; i++)
        for (int j = i + 1; j < n; j++)
            if (v[i] > v[j]) swap(v[i], v[j]);
}

Ordenamiento descendente:

void ordenDesc(char v[], int n) {
    for (int i = 0; i < n - 1; i++)
        for (int j = i + 1; j < n; j++)
            if (v[i] < v[j]) swap(v[i], v[j]);
}

10. Llenado ordenado de la matriz

void llenarOrdenado(char m[8][8], char min[], int cMin, char may[], int cMay, char num[], int cNum) {
    // Completar la matriz con los caracteres ya ordenados
    mostrarMatriz(m);
}

11. Programa principal completo

int main() {
    srand(time(0));
    char m[8][8], min[64], may[64], num[64];
    int cMin, cMay, cNum;
    llenarMatriz(m, min, cMin, may, cMay, num, cNum);
    mostrarMatriz(m);
    ordenAsc(min, cMin);
    ordenDesc(may, cMay);
    ordenAsc(num, cNum);
    llenarOrdenado(m, min, cMin, may, cMay, num, cNum);
    mostrarMatriz(m);
    return 0;
}

Descargar

PDF Word HTML