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
transpostadeve copiar cada elementooriginal[i][j]pararesultado[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
- A função
transpostarecebelinhasecolunasda matriz original, a matrizoriginale a matrizresultado(com dimensões invertidas). - O laço externo percorre as linhas da original (
ide 0 alinhas-1). - O laço interno percorre as colunas da original (
jde 0 acolunas-1). - A atribuição
resultado[j][i] = original[i][j]copia o elemento trocando os índices, efetivamente transpondo. - Na
main, declaramosoriginal2x3 com valores de 1 a 6 eresultado3x2 inicializada com zero. - Chamamos
transposta(2, 3, original, resultado). - Imprimimos a matriz
resultadocom 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 acessoresultado[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
linhasecolunaspara 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