二维数组的输入、输出、转置

这里我将在二维数组中的一些基本操作进行一次整理:

编码思路:

1.inputTwoArry 输入函数 用于二维数组的初始化。(也就是赋值)

    实现:给函数中传入要初始化数组的地址,行列大小。(int a[][N],int m,int n) 注意 二维数组做参数需要确定列数。

2.outputTwoArry1 输出函数 用于二维数组打印输出。(一般实现方法,需要先确定二维数组的列数 a[][N])

    实现:类似输入函数与其参数相同。也用了两层循环将数组中每一个元素打印输出。用a[i][j]的方式获取元素并输出。

3.outoutTwoArr2 输出函数 也是用于二维数组的打印输出。(以指针的方式打印输出,不需要传入指定的列数。便于转置后输出)

    实现:传参发生变化,将数组参数改为了指针。增强了函数的灵活性。用此函数即可以输出原数组也可以输出转置后的数组。

[首先需要理解一下,二维数组其实际意义上就是一维数组的集合。如 a[m][n] 是一个m行n列的数组。可以看做是一个二维数组内存储了 m个 一维数组,而这个一维数组a[m]中的每一个元素空间里面存储的又是 一个长度为n的一维数组。或者可以将 a[i] 看做是该行元素的数组名。即此二维数组中的第一个数组是a[0][n],第二个数组是a[1][n],a[0]、a[1]就是相应数组的数组名。]

(在我看来能够理解以上所述,会对理解二维数组有很大的帮助。甚至其他的多维数组都可以这样理解,然后化繁从简的去使用数组。其实所有的多维数组都是由一维数组,组合得来的!)

   其实遍历二维数组都是一行一行遍历。从a[0]~a[m-1],遍历第一行时就是从a[0][0]~a[0][n-1]。所以只要知道了数组的大小是m*n也可以指针的方式(*p)来一个个遍历数组元素。也就变成了用一层循环输出m*n个元素。只要确定传入的m为行,n为列。在输出时用n的值来确定换行即可,达到与上一个输出函数一样的输出效果。另外注意在调用时,第一个参数应该传入给数组的首地址

即outTwoArr2(a[0],m,n);//此处a[0][0]和a[0]传入的地址值相同。所以均可使用。

4.reverse 函数 用于二维数组的转置。函数声明为:void Reverse(int a[][N],int b[][M],int m,int n);

a[][N]为原数组,b[][M]用于储存转置数组的元素。m,n用于确定数组的大小,即数组元素的个数。

我在写完这个函数后,在函数输出时发现无法使用outTwoArr1对转置后的数组进行输出,因为outTwoArr1函数,在传参时用的是二维数组,要先确定列数。而原始二数组转置后 数组行列数发生了变化,无法对转置后的数组输出。所以才想到outTwoArr2 以指针的形式输出。这样在传参时无需确定列数,那么也就是只要确定了数组大小,传参正确。原始数组和转置后的数组都能用outTwoArr2函数输出。

编码实现:

#include <stdio.h>
const int M=3;
const int N=4;
//二维数组输入
void inputTwoArry(int a[][N],int m,int n);
//输出 限定数组大小
void outputTwoArry1(int a[][N],int m,int n);
//输出 不限数组大小
void outputTwoArry2(int *a,int m,int n);
//转置
void Reverse(int a[][N],int b[][M],int m,int n);
int main(int argc, char* argv[])
{
	int arr[M][N];//原数组
	int brr[N][M];//转置后的数组

	printf("请输一个3*4二维数组的元素值:\n");
	inputTwoArry(arr,M,N);
	printf("output this array:\n");
        outputTwoArry1(arr,M,N);
	//也可使用
	//outputTwoArry2(arr[0],M,N);
	
	printf("\noutput this array reverse:\n");
	Reverse(arr,brr,M,N);
        outputTwoArry2(brr[0],N,M);
	//outputTwoArry1(brr,M,N);
	

	return 0;
}
//输入
void inputTwoArry(int a[][N],int m,int n)
{
	for(int i=0;i<m;i++)
	{
		for(int j=0;j<n;j++)
		{
			scanf("%d",&a[i][j]);
		}
	}
}
//输出
void outputTwoArry1(int a[][N],int m,int n)
{
	for(int i=0;i<m;i++)
	{
		for(int j=0;j<n;j++)
		{
			printf("%4d",a[i][j]);
		}
		printf("\n");
	}
}
//输出 不限数组大小  
void outputTwoArry2(int *a,int m,int n)
{
	int* p=a;
	for(int i=0;i<m*n;p++,i++)
	{
		printf("%4d",*p);
		if((i+1)%n==0)
		{
			printf("\n");
		}
	}
}
//转置
void Reverse(int a[][N],int b[][M],int m,int n)
{
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<m;j++)
		{
			b[i][j]=a[j][i];
		}
	}
}

运行结果:

  • 8
    点赞
  • 53
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值