将一个三行四列的矩阵转置后变成四行三列的矩阵。

这个问题我打算用二维数组。

首先,我打算随机生成一个数组,并定义一个函数绘制它

void printAnArray(int arr[ROW][COL]){
        for(int i=0;i<ROW;i++){
        for(int j=0;j<COL;j++){
            printf("%4d",arr[i][j]); //%4d tab制表

        }
         printf("\n");
    }
}

怎么实现转置,认清实质:把每一行的元素赋给对应列!

void convertion(int arr[ROW][COL],int arr2[COL][ROW]){
       for(int i=0;i<COL;i++){
        for(int j=0;j<ROW;j++){
            arr2[i][j]=arr[j][i]; //有理解难度!

        }

    }
for(int i=0;i<COL;i++){
        for(int j=0;j<ROW;j++){
             printf("%4d",arr2[i][j]);

        }
          printf("\n");
    }
}


综上,

# include <stdio.h>
# include <stdlib.h>
#include <time.h>
#define ROW 3
#define COL 4
void printAnArray(int arr[ROW][COL]){
        for(int i=0;i<ROW;i++){
        for(int j=0;j<COL;j++){
            printf("%4d",arr[i][j]);

        }
         printf("\n");
    }
}
void convertion(int arr[ROW][COL],int arr2[COL][ROW]){
       for(int i=0;i<COL;i++){
        for(int j=0;j<ROW;j++){
            arr2[i][j]=arr[j][i];

        }

    }
for(int i=0;i<COL;i++){
        for(int j=0;j<ROW;j++){
             printf("%4d",arr2[i][j]);

        }
          printf("\n");
    }
}


int main(){
    int array_a[ROW][COL]={};
    int array_b[COL][ROW]={};
    srand(time(0));
    for(int i=0;i<ROW;i++){
        for(int j=0;j<COL;j++){
            array_a[i][j]=rand()%100;

        }
    }
    printf("Before converted:\n");
    printAnArray(array_a);
    printf("After convertion:\n");
    convertion(array_a,array_b);
    return 0;
}

书上还提供了一个思考题:如果行数、列数相等,能否只用一个数组实现?

我觉得,不用操作数组,更改打印的思路:

原来是横着打印,现在竖着打印就行。即原来按列走,现在按行走。

int main(){
    
       for(int i=0;i<ROW;i++){
        for(int j=0;j<ROW;j++){
            arr[i][j]=rand()%100;

        }
    }
    printAnArray(arr);
    printf("After operation:\n");
    for(int i =0 ;i<ROW;i++){
        for(int j =0;j<ROW;j++){
            printf("%4d",arr[j][i]);
        }
        printf("\n");
    }
    return 0;
}