Desafio C

Transposta de uma matriz passada como parâmetro

Enunciado

Implemente uma função que receba uma matriz de inteiros com linhas e colunas e preencha uma segunda matriz com a transposta. A função deve ter a assinatura void transposta(int linhas, int colunas, int original[linhas][colunas], int resultado[colunas][linhas]). No main, declare uma matriz 2x3, chame a função e imprima a transposta (3x2).

Requisitos

  • A função transposta deve copiar cada elemento original[i][j] para resultado[j][i].
  • A matriz original deve ser 2x3 e a transposta 3x2.
  • Imprimir a matriz transposta no formato de linhas e colunas, com espaços entre os números.

Código inicial

#include <stdio.h>

// Implemente a função transposta
void transposta(int linhas, int colunas, int original[linhas][colunas], int resultado[colunas][linhas]) {
    // Seu código aqui
}

int main(void) {
    // Declare as matrizes e chame a função
    return 0;
}

Saída esperada

1 4 
2 5 
3 6
Ver dica

Use dois laços aninhados: para cada i de 0 a linhas-1 e j de 0 a colunas-1, faça resultado[j][i] = original[i][j].

Mostrar solução
#include <stdio.h>

// Calcula a transposta de uma matriz
// original: matriz de entrada com dimensões linhas x colunas
// resultado: matriz de saída com dimensões colunas x linhas
void transposta(int linhas, int colunas, int original[linhas][colunas], int resultado[colunas][linhas]) {
    for (int i = 0; i < linhas; i++) {
        for (int j = 0; j < colunas; j++) {
            resultado[j][i] = original[i][j]; // Troca linha por coluna
        }
    }
}

int main(void) {
    // Matriz original 2x3
    int original[2][3] = {
        {1, 2, 3},
        {4, 5, 6}
    };
    // Matriz transposta 3x2 (inicializada com zeros por segurança)
    int resultado[3][2] = {0};

    // Chama a função passando as dimensões e as matrizes
    transposta(2, 3, original, resultado);

    // Imprime a matriz transposta
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 2; j++) {
            printf("%d ", resultado[i][j]);
        }
        printf("\n");
    }

    return 0;
}

Passo a passo

  1. A função transposta recebe linhas e colunas da matriz original, a matriz original e a matriz resultado (com dimensões invertidas).
  2. O laço externo percorre as linhas da original (i de 0 a linhas-1).
  3. O laço interno percorre as colunas da original (j de 0 a colunas-1).
  4. A atribuição resultado[j][i] = original[i][j] copia o elemento trocando os índices, efetivamente transpondo.
  5. Na main, declaramos original 2x3 com valores de 1 a 6 e resultado 3x2 inicializada com zero.
  6. Chamamos transposta(2, 3, original, resultado).
  7. Imprimimos a matriz resultado com dois laços, formatando com espaço após cada número.

Por que funciona

A transposição troca linhas por colunas. Como as matrizes são passadas como parâmetros com dimensões explícitas, a função sabe os limites corretos. A sintaxe int original[linhas][colunas] usa arrays variáveis (VLA), disponíveis em C99 e posteriores.

Erros comuns

  • Inverter as dimensões na declaração da função: se declarar int resultado[linhas][colunas], o acesso resultado[j][i] pode ultrapassar limites. O correto é int resultado[colunas][linhas].
  • Não inicializar a matriz resultado: embora todos os elementos sejam preenchidos, inicializar com {0} evita lixo se houver erro.
  • Esquecer de passar as dimensões: a função precisa saber linhas e colunas para os laços.
  • Usar índices fixos: se a função for escrita para 2x3, não serve para outras dimensões. A solução genérica é mais reutilizável.

Outra forma de resolver

Poderia fazer a transposição in-place para matrizes quadradas, mas para matrizes retangulares é necessário uma segunda matriz. Também poderia usar ponteiros para ponteiros, mas arrays bidimensionais com VLAs são mais simples.

Saída esperada

1 4 
2 5 
3 6