Calcular o Determinante de uma Matriz em C

CBeginner
Pratique Agora

Introdução

Neste laboratório, você aprenderá a calcular o determinante de uma matriz quadrada em programação C. O laboratório cobre os seguintes passos: leitura da dimensão e elementos da matriz, utilização de um método recursivo ou de decomposição LU para calcular o determinante e impressão do resultado final. As instruções passo a passo guiam você através do processo de criação de um programa que pode lidar com matrizes quadradas de até 10x10, permitindo a entrada dinâmica dos elementos da matriz e a exibição do determinante calculado.

Ler Dimensão e Elementos (Matriz Quadrada)

Neste passo, você aprenderá a ler a dimensão e os elementos de uma matriz quadrada em programação C. Criaremos um programa que permite ao usuário inserir dinamicamente o tamanho da matriz e seus elementos.

Primeiro, vamos criar um novo arquivo C para nosso programa de determinante de matriz:

cd ~/project
nano matrix_determinant.c

Agora, adicione o seguinte código para ler a dimensão e os elementos da matriz:

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

#define MAX_SIZE 10

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

    // Ler a dimensão da matriz
    printf("Digite o tamanho da matriz quadrada (1-%d): ", MAX_SIZE);
    scanf("%d", &n);

    // Validar o tamanho da matriz
    if (n < 1 || n > MAX_SIZE) {
        printf("Tamanho da matriz inválido. Por favor, digite um tamanho entre 1 e %d.\n", MAX_SIZE);
        return 1;
    }

    // Ler os elementos da matriz
    printf("Digite os elementos da matriz:\n");
    for (i = 0; i < n; i++) {
        for (j = 0; j < n; j++) {
            printf("Digite o elemento [%d][%d]: ", i, j);
            scanf("%d", &matrix[i][j]);
        }
    }

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

    return 0;
}

Compile e execute o programa:

gcc matrix_determinant.c -o matrix_determinant
./matrix_determinant

Exemplo de saída:

Digite o tamanho da matriz quadrada (1-10): 3
Digite os elementos da matriz:
Digite o elemento [0][0]: 1
Digite o elemento [0][1]: 2
Digite o elemento [0][2]: 3
Digite o elemento [1][0]: 4
Digite o elemento [1][1]: 5
Digite o elemento [1][2]: 6
Digite o elemento [2][0]: 7
Digite o elemento [2][1]: 8
Digite o elemento [2][2]: 9

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

Vamos decompor o código:

  • Definimos um tamanho máximo de matriz de 10 para evitar alocação excessiva de memória.
  • O programa primeiro solicita ao usuário que insira o tamanho da matriz.
  • Ele valida a entrada para garantir que esteja dentro do intervalo permitido.
  • Em seguida, solicita ao usuário que digite cada elemento da matriz individualmente.
  • Finalmente, imprime a matriz inserida para verificar a entrada.

Usar um Método Recursivo ou de Decomposição LU

Neste passo, implementaremos um método recursivo para calcular o determinante de uma matriz. Modificaremos o programa anterior para incluir uma função de cálculo do determinante.

Atualize o arquivo matrix_determinant.c:

nano matrix_determinant.c

Substitua o conteúdo anterior pelo seguinte código:

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

#define MAX_SIZE 10

// Função para calcular o determinante recursivamente
int determinant(int matrix[MAX_SIZE][MAX_SIZE], int n) {
    int det = 0;
    int submatrix[MAX_SIZE][MAX_SIZE];

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

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

    // Caso recursivo para matrizes maiores
    int sign = 1;
    for (int k = 0; k < n; k++) {
        // Criar 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];

    // Ler a dimensão da matriz
    printf("Digite o tamanho da matriz quadrada (1-%d): ", MAX_SIZE);
    scanf("%d", &n);

    // Validar o tamanho da matriz
    if (n < 1 || n > MAX_SIZE) {
        printf("Tamanho da matriz inválido. Por favor, digite um tamanho entre 1 e %d.\n", MAX_SIZE);
        return 1;
    }

    // Ler os elementos da matriz
    printf("Digite os elementos da matriz:\n");
    for (i = 0; i < n; i++) {
        for (j = 0; j < n; j++) {
            printf("Digite o elemento [%d][%d]: ", i, j);
            scanf("%d", &matrix[i][j]);
        }
    }

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

    return 0;
}

Compile e execute o programa:

gcc matrix_determinant.c -o matrix_determinant
./matrix_determinant

Exemplo de saída:

Digite o tamanho da matriz quadrada (1-10): 3
Digite os elementos da matriz:
Digite o elemento [0][0]: 1
Digite o elemento [0][1]: 2
Digite o elemento [0][2]: 3
Digite o elemento [1][0]: 4
Digite o elemento [1][1]: 5
Digite o elemento [1][2]: 6
Digite o elemento [2][0]: 7
Digite o elemento [2][1]: 8
Digite o elemento [2][2]: 9

Determinante da matriz: 0

Pontos-chave sobre o cálculo recursivo do determinante:

  • A função determinant() utiliza uma abordagem recursiva para calcular o determinante da matriz.
  • Para matrizes 1x1 e 2x2, temos casos base com cálculos diretos.
  • Para matrizes maiores, usamos o método de expansão de cofatores ao longo da primeira linha.
  • A função cria submatrizes e calcula recursivamente seus determinantes.

Imprimir o Determinante

Neste passo final, melhoraremos nosso programa de determinante de matriz adicionando saída mais detalhada e tratamento de erros para aprimorar a experiência do usuário.

Atualize o arquivo matrix_determinant.c:

nano matrix_determinant.c

Substitua o conteúdo anterior pelo seguinte código aprimorado:

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

#define MAX_SIZE 10

// Função para calcular o determinante recursivamente
int determinant(int matrix[MAX_SIZE][MAX_SIZE], int n) {
    int det = 0;
    int submatrix[MAX_SIZE][MAX_SIZE];

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

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

    // Caso recursivo para matrizes maiores
    int sign = 1;
    for (int k = 0; k < n; k++) {
        // Criar 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;
}

// Função para imprimir a matriz com formatação
void print_matrix(int matrix[MAX_SIZE][MAX_SIZE], int n) {
    printf("\nMatriz:\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) {
        // Ler a dimensão da matriz
        printf("Digite o tamanho da matriz quadrada (1-%d): ", MAX_SIZE);
        if (scanf("%d", &n) != 1) {
            printf("Entrada inválida. Por favor, digite um número.\n");
            while (getchar() != '\n'); // Limpar o buffer de entrada
            continue;
        }

        // Validar o tamanho da matriz
        if (n < 1 || n > MAX_SIZE) {
            printf("Tamanho da matriz inválido. Por favor, digite um tamanho entre 1 e %d.\n", MAX_SIZE);
            continue;
        }

        valid_input = true;
    }

    // Ler os elementos da matriz
    printf("Digite os elementos da matriz:\n");
    for (i = 0; i < n; i++) {
        for (j = 0; j < n; j++) {
            printf("Digite o elemento [%d][%d]: ", i, j);
            while (scanf("%d", &matrix[i][j]) != 1) {
                printf("Entrada inválida. Por favor, digite um inteiro para o elemento [%d][%d]: ", i, j);
                while (getchar() != '\n'); // Limpar o buffer de entrada
            }
        }
    }

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

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

    // Saída formatada do determinante
    printf("\n--- Cálculo do Determinante ---\n");
    printf("Dimensão da Matriz: %d x %d\n", n, n);
    printf("Determinante: %d\n", det);

    return 0;
}

Compile e execute o programa:

gcc matrix_determinant.c -o matrix_determinant
./matrix_determinant

Exemplo de saída:

Digite o tamanho da matriz quadrada (1-10): 3
Digite os elementos da matriz:
Digite o elemento [0][0]: 1
Digite o elemento [0][1]: 2
Digite o elemento [0][2]: 3
Digite o elemento [1][0]: 4
Digite o elemento [1][1]: 5
Digite o elemento [1][2]: 6
Digite o elemento [2][0]: 7
Digite o elemento [2][1]: 8
Digite o elemento [2][2]: 9

Matriz:
    1     2     3
    4     5     6
    7     8     9

--- Cálculo do Determinante ---
Dimensão da Matriz: 3 x 3
Determinante: 0

Melhorias-chave:

  • Adição de validação de entrada para lidar com entradas inválidas.
  • Criação de uma função separada para imprimir a matriz com melhor formatação.
  • Saída aprimorada para mostrar a dimensão da matriz e o determinante claramente.
  • Tratamento de erros aprimorado para entradas do usuário.

Resumo

Neste laboratório, você aprendeu como ler a dimensão e os elementos de uma matriz quadrada em programação C. Você criou um programa que permite aos usuários inserir dinamicamente o tamanho da matriz e seus elementos. O programa valida o tamanho da matriz e, em seguida, solicita ao usuário que insira os elementos da matriz. Finalmente, imprime a matriz inserida para verificar a entrada.

Os próximos passos deste laboratório abordarão como usar um método recursivo ou de decomposição LU para calcular o determinante da matriz de entrada e como imprimir o determinante.