4.7矩阵的转置运算

 Q:编写一个函数实现对该矩阵的转置。

#include<iostream>
#include<cstdio>
using namespace std;

void InputMatrix(int (*a)[4],int n,int m) {
	for(int i=0;i<n;i++)
		for(int j=0;j<m;j++)
			printf("%d",*(a+i)+j);
}

void OutputMatrix(int (*b)[4],int n,int m) {
	for(int i=0;i<n;i++) {
		for(int j=0;j<m;j++)
			printf("%d",*(*(b+i)+j));
		printf("
");
	}
		
}

void MatrixTranspose(int (*a)[4],int *(b)[3]) {
	for(int i=0;i<4;i++) {
		for(int j=0;j<3;j++)
			b[i][j]=a[j][i];
	}
		
}
	
int main()
{
	int a[3][4],b[4][3];
	cout<<"input 3X4 matrix"<<endl;
	InputMatrix(a,3,4);
	MatrixTranspose(a,b);
	cout<<"the Transposex Matrix is"<<endl;
	OutputMatrix(b,4,3);
	getchar();
	return 0;
}

上述有点问题。

总结:

对于上述的函数参数中,形参都包含了一个指向二维数组的指针变量,例如 int (*a)[4]、int (*b)[4],因为此处的被调函数要对主函数中定义的二维数组进行修改,因此不能像4.6中介绍那样用 int *a 或者 int a[]的形式作为形参。

对于一个二维数组a[m][n],数组名a代表指向二维数组第一行的指针(地址),a+1则指向二维数组第2行的指针。因此a+i指的是指向二维数组的第i+1 行的指针。它并不指向一个整型变量,而是指向一个整形的一位数组。

因此作为二维数组指针的传递,实参可以是数组名,但是形参一定是如 (*a)[n] 的形式。其中,n表示该二维数组每行的元素个数,即列数。所以,int (*a)[4]表示:指向一个包含4个元素的一维数组。

下面是比较简单的实现方法。

#include <stdio.h>
#define MAX 100
int main()
{
int m, n;
int i, j;
int a[MAX][MAX];

// 输入n阶矩阵

scanf("%d", &n);
for(i = 0; i < n; i++)
{
      for(j = 0; j < n; j++)
     scanf("%d", &a[i][j]);
}

// 输出装置后的矩阵

for(i = 0; i < n; i++)
{
for(j = 0 ; j < n;  j++)
    {
printf("%d", a[j][i]);
if(j == n - 1) printf("
");
else printf(" ");
    }
}
return 0;
}

  

拥抱明天! 不给自己做枷锁去限制自己。 别让时代的悲哀,成为你人生的悲哀。
原文地址:https://www.cnblogs.com/dd2hm/p/6750216.html