Ejercicio 05 — Lee una matriz 3x4 e imprime su transpuesta

Dificultad: amarillo · Módulo 06 (Matrices (arrays 2D))

Enunciado

Lee una matriz 3x4 e imprime su transpuesta (4x3).

Diagrama de flujo

Diagrama de flujo del ejercicio 05

Cómo se resuelve

Transponer una matriz es “girarla” sobre su diagonal: lo que era una fila pasa a ser una columna y viceversa. Si la original m es de 3×4, la transpuesta t es de 4×3. Toda la operación cabe en una línea dentro del doble bucle:

t[j][i] = m[i][j];   // los índices van intercambiados

El elemento que estaba en la fila i, columna j de la original acaba en la fila j, columna i de la transpuesta. Es el mismo valor colocado en la posición espejo.

La trampa principal es olvidar que la matriz destino tiene las dimensiones invertidas. Por eso se declara int t[COLS][FILAS] y no int t[FILAS][COLS]: si le das el tamaño de la original, cuando m no es cuadrada te sales de los límites del array y corrompes memoria. Fíjate también en que al imprimir t recorres primero sus COLS filas y luego sus FILAS columnas: las dimensiones de t son las de m al revés, y hay que respetarlo en cada bucle que la toque. Un truco para no perderte: en un array 2D en C, el primer índice siempre cuenta filas y el segundo columnas, sea cual sea el nombre de la matriz.

Para practicar — cópialo en Dev-C++

Pega este esqueleto y completa los TODO. Es la mejor forma de aprender: inténtalo antes de mirar la solución.

/*
 * Curso de C — Modulo 06: Matrices (arrays 2D)
 * Ejercicio 05 — PRACTICA (rellena los TODO)
 * Enunciado: Lee una matriz 3x4 e imprime su transpuesta (4x3).
 * Dificultad: amarillo
 * Compilar: gcc -std=c11 -Wall ej05_practica.c -o ej05 && ./ej05
 */
 
#include <stdio.h>
 
#define FILAS 3
#define COLS  4
 
int main(void) {
    int m[FILAS][COLS];
    // TODO 1: declara la matriz transpuesta t con dimensiones COLS x FILAS
    //         (las dimensiones estan invertidas respecto a m)
 
    // TODO 2: leer la matriz m (FILAS x COLS) con doble bucle y scanf
 
    // TODO 3: calcular la transpuesta con un doble bucle:
    //         t[j][i] = m[i][j]
    //         Pista: el bucle recorre i de 0 a FILAS y j de 0 a COLS,
    //         pero asigna con los indices al reves en t
 
    // TODO 4: imprimir t, que tiene COLS filas y FILAS columnas
    //         (bucle exterior de 0 a COLS, interior de 0 a FILAS)
 
    return 0;
}

Solución — cópiala y ejecútala

/*
 * Curso de C — Modulo 06: Matrices (arrays 2D)
 * Ejercicio 05 — MODELO (resuelto)
 * Enunciado: Lee una matriz 3x4 e imprime su transpuesta (4x3).
 * Dificultad: amarillo
 * Compilar: gcc -std=c11 -Wall ej05_modelo.c -o ej05 && ./ej05
 */
 
#include <stdio.h>
 
#define FILAS 3
#define COLS  4
 
int main(void) {
    int m[FILAS][COLS];
    int t[COLS][FILAS];   // transpuesta: dimensiones invertidas
 
    // Leer la matriz original
    printf("Introduce la matriz %dx%d:\n", FILAS, COLS);
    for (int i = 0; i < FILAS; i++)
        for (int j = 0; j < COLS; j++)
            scanf("%d", &m[i][j]);
 
    // Calcular la transpuesta: t[j][i] = m[i][j]
    for (int i = 0; i < FILAS; i++)
        for (int j = 0; j < COLS; j++)
            t[j][i] = m[i][j];
 
    // Imprimir la transpuesta (es COLS x FILAS)
    printf("\nTranspuesta (%dx%d):\n", COLS, FILAS);
    for (int i = 0; i < COLS; i++) {
        for (int j = 0; j < FILAS; j++)
            printf("%4d", t[i][j]);
        printf("\n");
    }
 
    return 0;
}

Cómo usarlo

Dev-C++ (Windows): Archivo → Nuevo → Código fuente, pega el código y pulsa F11 (compilar y ejecutar). Si ves los acentos raros en la consola, escribe chcp 65001 y vuelve a ejecutar.

Conexiones