Calcular el determinante de una matriz en C

CCBeginner
Practicar Ahora

💡 Este tutorial está traducido por IA desde la versión en inglés. Para ver la versión original, puedes hacer clic aquí

Introducción

En este laboratorio, aprenderás cómo calcular el determinante de una matriz cuadrada en programación C. El laboratorio cubre los siguientes pasos: leer la dimensión y los elementos de la matriz, utilizar un método recursivo o de descomposición LU para calcular el determinante y mostrar el resultado final. Las instrucciones paso a paso te guían a través del proceso de crear un programa que puede manejar matrices cuadradas de hasta 10x10, lo que te permite ingresar los elementos de la matriz de forma dinámica y mostrar el determinante calculado.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL c(("C")) -.-> c/ControlFlowGroup(["Control Flow"]) c(("C")) -.-> c/CompoundTypesGroup(["Compound Types"]) c(("C")) -.-> c/FunctionsGroup(["Functions"]) c(("C")) -.-> c/UserInteractionGroup(["User Interaction"]) c/ControlFlowGroup -.-> c/for_loop("For Loop") c/CompoundTypesGroup -.-> c/arrays("Arrays") c/FunctionsGroup -.-> c/recursion("Recursion") c/UserInteractionGroup -.-> c/user_input("User Input") c/UserInteractionGroup -.-> c/output("Output") subgraph Lab Skills c/for_loop -.-> lab-435157{{"Calcular el determinante de una matriz en C"}} c/arrays -.-> lab-435157{{"Calcular el determinante de una matriz en C"}} c/recursion -.-> lab-435157{{"Calcular el determinante de una matriz en C"}} c/user_input -.-> lab-435157{{"Calcular el determinante de una matriz en C"}} c/output -.-> lab-435157{{"Calcular el determinante de una matriz en C"}} end

Leer la dimensión y los elementos (Matriz cuadrada)

En este paso, aprenderás cómo leer la dimensión y los elementos de una matriz cuadrada en programación C. Crearemos un programa que permita a los usuarios ingresar dinámicamente el tamaño de la matriz y sus elementos.

Primero, creemos un nuevo archivo C para nuestro programa de cálculo del determinante de la matriz:

cd ~/project
nano matrix_determinant.c

Ahora, agreguemos el siguiente código para leer la dimensión y los elementos de la matriz:

#include <stdio.h>
#include <stdlib.h>

#define MAX_SIZE 10

int main() {
    int n, i, j;
    int matrix[MAX_SIZE][MAX_SIZE];

    // Leer la dimensión de la matriz
    printf("Ingrese el tamaño de la matriz cuadrada (1-%d): ", MAX_SIZE);
    scanf("%d", &n);

    // Validar el tamaño de la matriz
    if (n < 1 || n > MAX_SIZE) {
        printf("Tamaño de matriz no válido. Por favor, ingrese un tamaño entre 1 y %d.\n", MAX_SIZE);
        return 1;
    }

    // Leer los elementos de la matriz
    printf("Ingrese los elementos de la matriz:\n");
    for (i = 0; i < n; i++) {
        for (j = 0; j < n; j++) {
            printf("Ingrese el elemento [%d][%d]: ", i, j);
            scanf("%d", &matrix[i][j]);
        }
    }

    // Imprimir la matriz para verificar la entrada
    printf("\nMatriz ingresada:\n");
    for (i = 0; i < n; i++) {
        for (j = 0; j < n; j++) {
            printf("%d ", matrix[i][j]);
        }
        printf("\n");
    }

    return 0;
}

Compila y ejecuta el programa:

gcc matrix_determinant.c -o matrix_determinant
./matrix_determinant

Ejemplo de salida:

Ingrese el tamaño de la matriz cuadrada (1-10): 3
Ingrese los elementos de la matriz:
Ingrese el elemento [0][0]: 1
Ingrese el elemento [0][1]: 2
Ingrese el elemento [0][2]: 3
Ingrese el elemento [1][0]: 4
Ingrese el elemento [1][1]: 5
Ingrese el elemento [1][2]: 6
Ingrese el elemento [2][0]: 7
Ingrese el elemento [2][1]: 8
Ingrese el elemento [2][2]: 9

Matriz ingresada:
1 2 3
4 5 6
7 8 9

Analicemos el código:

  • Definimos un tamaño máximo de matriz de 10 para evitar una asignación excesiva de memoria.
  • El programa primero solicita al usuario que ingrese el tamaño de la matriz.
  • Valida la entrada para asegurarse de que esté dentro del rango permitido.
  • Luego, solicita al usuario que ingrese cada elemento de la matriz individualmente.
  • Finalmente, imprime la matriz ingresada para verificar la entrada.

Utilizar un método recursivo o de descomposición LU

En este paso, implementaremos un método recursivo para calcular el determinante de una matriz. Modificaremos el programa anterior para incluir una función de cálculo del determinante.

Actualiza el archivo matrix_determinant.c:

nano matrix_determinant.c

Reemplaza el contenido anterior con el siguiente código:

#include <stdio.h>
#include <stdlib.h>

#define MAX_SIZE 10

// Función para calcular el determinante de forma recursiva
int determinant(int matrix[MAX_SIZE][MAX_SIZE], int n) {
    int det = 0;
    int submatrix[MAX_SIZE][MAX_SIZE];

    // Caso base para una matriz 1x1
    if (n == 1) {
        return matrix[0][0];
    }

    // Caso base para una matriz 2x2
    if (n == 2) {
        return matrix[0][0] * matrix[1][1] - matrix[0][1] * matrix[1][0];
    }

    // Caso recursivo para matrices más grandes
    int sign = 1;
    for (int k = 0; k < n; k++) {
        // Crear la submatriz
        int subi = 0;
        for (int i = 1; i < n; i++) {
            int subj = 0;
            for (int j = 0; j < n; j++) {
                if (j == k) continue;
                submatrix[subi][subj] = matrix[i][j];
                subj++;
            }
            subi++;
        }

        // Cálculo recursivo
        det += sign * matrix[0][k] * determinant(submatrix, n - 1);
        sign = -sign;
    }

    return det;
}

int main() {
    int n, i, j;
    int matrix[MAX_SIZE][MAX_SIZE];

    // Leer la dimensión de la matriz
    printf("Ingrese el tamaño de la matriz cuadrada (1-%d): ", MAX_SIZE);
    scanf("%d", &n);

    // Validar el tamaño de la matriz
    if (n < 1 || n > MAX_SIZE) {
        printf("Tamaño de matriz no válido. Por favor, ingrese un tamaño entre 1 y %d.\n", MAX_SIZE);
        return 1;
    }

    // Leer los elementos de la matriz
    printf("Ingrese los elementos de la matriz:\n");
    for (i = 0; i < n; i++) {
        for (j = 0; j < n; j++) {
            printf("Ingrese el elemento [%d][%d]: ", i, j);
            scanf("%d", &matrix[i][j]);
        }
    }

    // Calcular e imprimir el determinante
    int det = determinant(matrix, n);
    printf("\nDeterminante de la matriz: %d\n", det);

    return 0;
}

Compila y ejecuta el programa:

gcc matrix_determinant.c -o matrix_determinant
./matrix_determinant

Ejemplo de salida:

Ingrese el tamaño de la matriz cuadrada (1-10): 3
Ingrese los elementos de la matriz:
Ingrese el elemento [0][0]: 1
Ingrese el elemento [0][1]: 2
Ingrese el elemento [0][2]: 3
Ingrese el elemento [1][0]: 4
Ingrese el elemento [1][1]: 5
Ingrese el elemento [1][2]: 6
Ingrese el elemento [2][0]: 7
Ingrese el elemento [2][1]: 8
Ingrese el elemento [2][2]: 9

Determinante de la matriz: 0

Puntos clave sobre el cálculo recursivo del determinante:

  • La función determinant() utiliza un enfoque recursivo para calcular el determinante de la matriz.
  • Para matrices 1x1 y 2x2, tenemos casos base con cálculos directos.
  • Para matrices más grandes, utilizamos el método de expansión por cofactores a lo largo de la primera fila.
  • La función crea submatrices y calcula recursivamente sus determinantes.

Imprimir el determinante

En este último paso, mejoraremos nuestro programa de cálculo del determinante de una matriz agregando una salida más detallada y manejo de errores para mejorar la experiencia del usuario.

Actualiza el archivo matrix_determinant.c:

nano matrix_determinant.c

Reemplaza el contenido anterior con el siguiente código mejorado:

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

#define MAX_SIZE 10

// Función para calcular el determinante de forma recursiva
int determinant(int matrix[MAX_SIZE][MAX_SIZE], int n) {
    int det = 0;
    int submatrix[MAX_SIZE][MAX_SIZE];

    // Caso base para una matriz 1x1
    if (n == 1) {
        return matrix[0][0];
    }

    // Caso base para una matriz 2x2
    if (n == 2) {
        return matrix[0][0] * matrix[1][1] - matrix[0][1] * matrix[1][0];
    }

    // Caso recursivo para matrices más grandes
    int sign = 1;
    for (int k = 0; k < n; k++) {
        // Crear la submatriz
        int subi = 0;
        for (int i = 1; i < n; i++) {
            int subj = 0;
            for (int j = 0; j < n; j++) {
                if (j == k) continue;
                submatrix[subi][subj] = matrix[i][j];
                subj++;
            }
            subi++;
        }

        // Cálculo recursivo
        det += sign * matrix[0][k] * determinant(submatrix, n - 1);
        sign = -sign;
    }

    return det;
}

// Función para imprimir la matriz con formato
void print_matrix(int matrix[MAX_SIZE][MAX_SIZE], int n) {
    printf("\nMatrix:\n");
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            printf("%5d ", matrix[i][j]);
        }
        printf("\n");
    }
}

int main() {
    int n, i, j;
    int matrix[MAX_SIZE][MAX_SIZE];
    bool valid_input = false;

    while (!valid_input) {
        // Leer la dimensión de la matriz
        printf("Ingrese el tamaño de la matriz cuadrada (1-%d): ", MAX_SIZE);
        if (scanf("%d", &n)!= 1) {
            printf("Entrada no válida. Por favor, ingrese un número.\n");
            while (getchar()!= '\n'); // Limpiar el buffer de entrada
            continue;
        }

        // Validar el tamaño de la matriz
        if (n < 1 || n > MAX_SIZE) {
            printf("Tamaño de matriz no válido. Por favor, ingrese un tamaño entre 1 y %d.\n", MAX_SIZE);
            continue;
        }

        valid_input = true;
    }

    // Leer los elementos de la matriz
    printf("Ingrese los elementos de la matriz:\n");
    for (i = 0; i < n; i++) {
        for (j = 0; j < n; j++) {
            printf("Ingrese el elemento [%d][%d]: ", i, j);
            while (scanf("%d", &matrix[i][j])!= 1) {
                printf("Entrada no válida. Por favor, ingrese un número entero para el elemento [%d][%d]: ", i, j);
                while (getchar()!= '\n'); // Limpiar el buffer de entrada
            }
        }
    }

    // Imprimir la matriz de entrada
    print_matrix(matrix, n);

    // Calcular e imprimir el determinante
    int det = determinant(matrix, n);

    // Salida formateada del determinante
    printf("\n--- Cálculo del Determinante ---\n");
    printf("Dimensión de la Matriz: %d x %d\n", n, n);
    printf("Determinante: %d\n", det);

    return 0;
}

Compila y ejecuta el programa:

gcc matrix_determinant.c -o matrix_determinant
./matrix_determinant

Ejemplo de salida:

Ingrese el tamaño de la matriz cuadrada (1-10): 3
Ingrese los elementos de la matriz:
Ingrese el elemento [0][0]: 1
Ingrese el elemento [0][1]: 2
Ingrese el elemento [0][2]: 3
Ingrese el elemento [1][0]: 4
Ingrese el elemento [1][1]: 5
Ingrese el elemento [1][2]: 6
Ingrese el elemento [2][0]: 7
Ingrese el elemento [2][1]: 8
Ingrese el elemento [2][2]: 9

Matrix:
    1     2     3
    4     5     6
    7     8     9

--- Cálculo del Determinante ---
Dimensión de la Matriz: 3 x 3
Determinante: 0

Mejoras clave:

  • Se agregó validación de entrada para manejar entradas no válidas.
  • Se creó una función separada para imprimir la matriz con un mejor formato.
  • Se mejoró la salida para mostrar claramente la dimensión de la matriz y el determinante.
  • Se mejoró el manejo de errores para las entradas del usuario.

Resumen

En este laboratorio, aprendiste cómo leer la dimensión y los elementos de una matriz cuadrada en programación C. Creaste un programa que permite a los usuarios ingresar dinámicamente el tamaño de la matriz y sus elementos. El programa valida el tamaño de la matriz y luego solicita al usuario que ingrese los elementos de la matriz. Finalmente, imprime la matriz ingresada para verificar la entrada.

Los siguientes pasos en este laboratorio cubrirán cómo utilizar un método recursivo o de descomposición LU para calcular el determinante de la matriz de entrada y cómo imprimir el determinante.