C语言 将m*n矩阵转置(行列互换)为n*m的矩阵

看了保证懂

首先,我们分析:
这个问题无非就是把m乘n的值赋值给n乘m,然后再输出不是么?
那我们假设m=3,n=2那就是三行两列,把它转换为2*3,那也就是两行三列。
方便理解我们可以定义两个数组a[3][2],b[2][3]。

a[3][2]里有六个元素分别为:a[0][0] ,a[0][1], a[1][0], a[1][1], a[2][0], a[2][1]
b[2][3]里有六个元素分别为:b[0][0] ,b[0][1] ,b[0][2] ,b[1][0] ,b[1][1] ,b[1][2]
首先我们要对二维数组a[3][2]进行输入才可以进行转换,不然没有值,换个寂寞。那我们就先来编写输入值的代码:

(提示:手机用户可以左划代码部分查看注释)

#include "stdio.h"
#define M 3							//对M进行一个宏定义为3
#define N 2							//同理对N进行宏定义为2
void main(){
    
    						//程序的开始
	int a[M][N],b[N][M],i,j;		//分别定义a,b两个数组并且定义两个整型变量i,j
	printf("对该矩阵进行输入:");		//打印输出“对该矩阵进行输入:”
	for(i=0;i<M;i++){
    
    				//外循环 i值控制数组的行
		for(j=0;j<N;j++){
    
    			//内循环 j值控制数组的列
			scanf("%d",&a[i][j]);	//以十进制形式对数组进行赋值
		}							//内循环结束
	}								//外循环结束

这里我的main函数的结束花括号没有打,因为程序还没有编写完成,所以让我们来继续编写
赋值完了,让我们以3*2的矩阵形式输出来给我们看看,那我们继续编写:

	for(i=0;i<M;i++){
    
    				//外循环 i值控制数组的行
		for(j=0;j<N;j++){
    
    			//内循环 j值控制数组的列
			printf("%3d",a[i][j]);	//打印输出长度为3以十进制形式的数组
		}							//内循环结束
		printf("\n");				//换行
	}								//外循环结束

好,写到这里我们完成了一半,下面就是重点,转换部分:

	printf("转换成2*3的为:\n");		//为了看的更清楚打印输出这句话
	for(i=0;i<N;i++){
    
    				//外循环2次i值分别是0 1
		for(j=0;j<M;j++){
    
    			//内循环3次j值分别是0 1 2
			b[i][j]=a[j][i];		//这里将数组a的值赋值给b
		}							//内循环结束
	}								//外循环结束

到现在我们已经完成了转换,相信有些同学可能有些迷惑,没关系,我后面来解释,最后让我们输出一下,这个程序就算是完成了,让我们来看一下:

	for(i=0;i<N;i++){
    
    				//外循环2次i值分别是0 1
		for(j=0;j<M;j++){
    
    			//内循环3次j值分别是0 1 2
			printf("%3d",b[i][j]);	//打印输出长度为3以十进制形式的数组
		}							//内循环结束
	printf("\n");					//换行
	}								//外循环结束
}									//main函数结束

细致讲解

这里我们主要讲解一下转换部分,为了方便理解,我用一张表格来把两个数组的下标对应出来

b a
00 00
01 10
02 20
10 01
11 11
12 21

大家可以逐一对应一下可以发现,a的值完全赋值给了b,这个地方需要大家仔细观察,多加理解。

全部代码

#include "stdio.h"
#define M 3
#define N 2
void main(){
    
    
	int a[M][N],b[N][M],i,j;

	printf("对该矩阵进行输入:");
	for(i=0;i<M;i++){
    
    
		for(j=0;j<N;j++){
    
    
			scanf("%d",&a[i][j]);
		}
	}
	for(i=0;i<M;i++){
    
    
		for(j=0;j<N;j++){
    
    
			printf("%3d",a[i][j]);
		}
		printf("\n");
	}
	printf("转换成2*3的为:\n");
	for(i=0;i<N;i++){
    
    
		for(j=0;j<M;j++){
    
    
			b[i][j]=a[j][i];
		}
	}	
	for(i=0;i<N;i++){
    
    
		for(j=0;j<M;j++){
    
    
			printf("%3d",b[i][j]);
		}
	printf("\n");
	}	
}

代码放在这里有,同学们可以参考一下,最好自己看一遍,自己打一遍对照着我的程序,但不要完全抄。还是那句话,一遍没看懂,别担心。再看一遍,记得我得启蒙老师说过一句话:编程经不起同学们思考。加油!

猜你喜欢

转载自blog.csdn.net/weixin_52278438/article/details/111569245