Calcular a Transposta de uma Matriz em C

CBeginner
Pratique Agora

Introdução

Neste laboratório, aprenderá a calcular a transposta de uma matriz em C. O laboratório cobre os seguintes passos:

Ler Dimensões e Elementos: Aprenderá a ler as dimensões (linhas e colunas) de uma matriz e preenchê-la com valores introduzidos pelo utilizador. Este passo estabelece a base para o processo de transposição da matriz.

Trocar Linhas e Colunas: O núcleo da transposição da matriz envolve a troca das linhas e colunas da matriz original para criar a matriz transposta.

Imprimir a Matriz Transposta: Finalmente, aprenderá a exibir a matriz transposta, permitindo verificar a correção do processo de transposição.

No final deste laboratório, terá um conhecimento sólido da transposição de matrizes e a capacidade de a implementar na programação em C.

Ler Dimensões e Elementos

Neste passo, aprenderá a ler as dimensões e os elementos de uma matriz num programa C para transposição de matrizes. Criaremos um programa que permite aos utilizadores introduzir o número de linhas e colunas e, em seguida, preencher a matriz com valores.

Primeiro, crie um novo ficheiro C para o nosso programa de transposição de matrizes:

cd ~/project
nano matrix_transpose.c

Agora, adicione o seguinte código para ler as dimensões e os elementos da matriz:

#include <stdio.h>

#define MAX_ROWS 100
#define MAX_COLS 100

int main() {
    int rows, cols;
    int matrix[MAX_ROWS][MAX_COLS];

    // Ler as dimensões da matriz
    printf("Introduza o número de linhas: ");
    scanf("%d", &rows);

    printf("Introduza o número de colunas: ");
    scanf("%d", &cols);

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

    // Imprimir a matriz original
    printf("\nMatriz Original:\n");
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            printf("%d ", matrix[i][j]);
        }
        printf("\n");
    }

    return 0;
}

Compile e execute o programa:

gcc matrix_transpose.c -o matrix_transpose
./matrix_transpose

Exemplo de saída:

Introduza o número de linhas: 3
Introduza o número de colunas: 3
Introduza os elementos da matriz:
Introduza o elemento [0][0]: 1
Introduza o elemento [0][1]: 2
Introduza o elemento [0][2]: 3
Introduza o elemento [1][0]: 4
Introduza o elemento [1][1]: 5
Introduza o elemento [1][2]: 6
Introduza o elemento [2][0]: 7
Introduza o elemento [2][1]: 8
Introduza o elemento [2][2]: 9

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

Vamos decompor as partes principais do código:

  • Definimos o tamanho máximo da matriz usando MAX_ROWS e MAX_COLS
  • scanf() é usado para ler a entrada do utilizador para linhas, colunas e elementos da matriz
  • Loops aninhados são usados para introduzir e exibir os elementos da matriz
  • O programa valida a entrada dentro do tamanho máximo permitido da matriz

Trocar Linhas e Colunas

Neste passo, aprenderá a transpor uma matriz trocando suas linhas e colunas. Modificaremos o programa anterior para criar uma matriz transposta.

Abra o ficheiro existente matrix_transpose.c:

cd ~/project
nano matrix_transpose.c

Substitua o código anterior pela seguinte implementação:

#include <stdio.h>

#define MAX_ROWS 100
#define MAX_COLS 100

int main() {
    int rows, cols;
    int matrix[MAX_ROWS][MAX_COLS];
    int transposed[MAX_COLS][MAX_ROWS];

    // Ler as dimensões da matriz
    printf("Introduza o número de linhas: ");
    scanf("%d", &rows);

    printf("Introduza o número de colunas: ");
    scanf("%d", &cols);

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

    // Transpor a matriz
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            transposed[j][i] = matrix[i][j];
        }
    }

    // Imprimir a matriz original
    printf("\nMatriz Original:\n");
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            printf("%d ", matrix[i][j]);
        }
        printf("\n");
    }

    // Imprimir a matriz transposta
    printf("\nMatriz Transposta:\n");
    for (int i = 0; i < cols; i++) {
        for (int j = 0; j < rows; j++) {
            printf("%d ", transposed[i][j]);
        }
        printf("\n");
    }

    return 0;
}

Compile e execute o programa:

gcc matrix_transpose.c -o matrix_transpose
./matrix_transpose

Exemplo de saída:

Introduza o número de linhas: 3
Introduza o número de colunas: 3
Introduza os elementos da matriz:
Introduza o elemento [0][0]: 1
Introduza o elemento [0][1]: 2
Introduza o elemento [0][2]: 3
Introduza o elemento [1][0]: 4
Introduza o elemento [1][1]: 5
Introduza o elemento [1][2]: 6
Introduza o elemento [2][0]: 7
Introduza o elemento [2][1]: 8
Introduza o elemento [2][2]: 9

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

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

Pontos chave sobre a transposição de matrizes:

  • Criamos uma nova matriz transposed com dimensões trocadas.
  • A transposição é feita trocando as linhas e colunas.
  • transposed[j][i] = matrix[i][j] é a transformação chave.
  • As dimensões das matrizes original e transposta são invertidas.

Imprimir a Matriz Transposta

Neste passo final, aprenderá a formatar e imprimir a matriz transposta com melhor legibilidade e tratamento de erros. Melhoraremos o programa anterior para tornar a saída mais profissional.

Abra o ficheiro matrix_transpose.c:

cd ~/project
nano matrix_transpose.c

Substitua o código anterior pela seguinte implementação melhorada:

#include <stdio.h>

#define MAX_ROWS 100
#define MAX_COLS 100

void printMatrix(int matrix[MAX_ROWS][MAX_COLS], int rows, int cols, const char* title) {
    printf("%s:\n", title);
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            printf("%4d ", matrix[i][j]);
        }
        printf("\n");
    }
    printf("\n");
}

int main() {
    int rows, cols;
    int matrix[MAX_ROWS][MAX_COLS];
    int transposed[MAX_COLS][MAX_ROWS];

    // Validação de entrada
    do {
        printf("Introduza o número de linhas (1-%d): ", MAX_ROWS);
        scanf("%d", &rows);
    } while (rows <= 0 || rows > MAX_ROWS);

    do {
        printf("Introduza o número de colunas (1-%d): ", MAX_COLS);
        scanf("%d", &cols);
    } while (cols <= 0 || cols > MAX_COLS);

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

    // Transpor a matriz
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            transposed[j][i] = matrix[i][j];
        }
    }

    // Imprimir matrizes com saída formatada
    printMatrix(matrix, rows, cols, "Matriz Original");
    printMatrix(transposed, cols, rows, "Matriz Transposta");

    return 0;
}

Compile e execute o programa:

gcc matrix_transpose.c -o matrix_transpose
./matrix_transpose

Exemplo de saída:

Introduza o número de linhas (1-100): 3
Introduza o número de colunas (1-100): 3
Introduza os elementos da matriz:
Introduza o elemento [0][0]: 1
Introduza o elemento [0][1]: 2
Introduza o elemento [0][2]: 3
Introduza o elemento [1][0]: 4
Introduza o elemento [1][1]: 5
Introduza o elemento [1][2]: 6
Introduza o elemento [2][0]: 7
Introduza o elemento [2][1]: 8
Introduza o elemento [2][2]: 9

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

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

Melhorias chave nesta versão:

  • Adição de validação de entrada para as dimensões da matriz.
  • Criação de uma função printMatrix() separada para melhor organização do código.
  • Melhoria da impressão da matriz com formatação alinhada usando %4d.
  • Adição de títulos à saída da matriz para maior clareza.
  • Lidar com tamanhos de matriz diferentes de forma mais robusta.

Resumo

Neste laboratório, aprenderá a ler as dimensões e elementos de uma matriz, trocar linhas e colunas e imprimir a matriz transposta num programa em C. Primeiro, o programa solicita ao utilizador que introduza o número de linhas e colunas e, em seguida, permite que o utilizador introduza os elementos da matriz. A matriz original é então apresentada. Em seguida, o programa troca as linhas e colunas para calcular a transposta da matriz e, finalmente, a matriz transposta é impressa.

Os pontos principais de aprendizagem neste laboratório incluem o uso de scanf() para ler a entrada do utilizador, a implementação de loops aninhados para introduzir e apresentar os elementos da matriz e a realização da operação de transposição trocando linhas e colunas. O programa também demonstra o uso de printf() para apresentar as matrizes original e transposta.