如图,二维数组的方阵转换程序,请问它是怎么把二维数组转换成一维数组的,请详细解释一下,谢谢!

如题所述

你说的是矩阵转换吧,先说转一维这个方法

我先给你讲一下原理:

二维数组可以看成一位数组的集合,比如x[3][3],就可以看做,三个x[3]的集合

这种可以看成军训时站队,第一行第一列就x[0][0],那么第二行第一列,就是x[1][0];

如果我直接进行编号 我放弃二维数组的编号,第一行数完我接着数,第二行第一列,就变成x[3]也就是第四个。

我先给你看个比较容易理解的

int i,j,k=0;
for(i=0;i<N;i++)
for(j=0;j<M;j++)
b[k++]=a[i][j];//两次循环把所有的数按顺序赋值到一维数组b里面,矩阵转置要改变位置

就以小键盘为例,行列转换,753不动,19,48,26,互换,最后就变成了741,852,963,

我给你加一下代码注释:

#include<stdio.h>
int at(int a[],int n)
{
    int i,j,t;
    for(i=0; i<n; i++)
        for(j=i+1; j<n; j++)
        {
            t=a[i*n+j];//把a[1](8)的值给了t
            a[i*n+j]=a[j*n+i];//把a[3](4)给了a[1],a[1]变成了4
            a[j*n+i]=t;//8赋值给a[3],经过第一次转换,第一行变成了7,4,9,第二行变成了8,5,6
        }/*
            看不懂代码就用笨办法把数值带进去走一遍
            这个代码一共要进行6次循环,其中三次都是多余
            真正实现了转置的只有48,19,26三次。
            所以你有兴趣可以继续学习快速转置。
        
        */
}
int main(void)
{
    int x[3][3]= {7,8,9,4,5,6,1,2,3},i,j;
    at(x,3);
    for(i=0; i<3; i++)
    {
        for(j=0; j<3; j++)
        {
            printf("%d ",x[i][j]);
        }
        printf("\n");
    }
    return 0;
}

而且你截图里的部分代码出现了错误,我已帮你改正

追问

谢谢,你回答的太全面了,而且解释得很棒!

温馨提示:答案为网友推荐,仅供参考
相似回答