C语言-二维数组

1.初始化(可以省略行,不可以省略列

int arr[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};

C语言-二维数组_第1张图片

 int arr[3][4]={1,2,3,4,5,6,7};

 int arr[3][4]={ {1,2},{3,4},{4,5} };

 二维数组在内存中是连续存放的;一行内部连续,跨行也是连续的。

C语言-二维数组_第2张图片

C语言-二维数组_第3张图片也解释了为什么列不能省略,要知道从哪开始放第二行,而行数可以省略,只要把这样元素放完即可。

**数组为什么要开大一点

C语言-二维数组_第4张图片

 如右图所示就算是越界访问了

C语言-二维数组_第5张图片

 

 例一:矩阵转置

 C语言-二维数组_第6张图片

 对角线数字不改变 观察对角线上方数字 行标小于列标

#include 
int main()
{
	int a[][3] = 
	{
		8,1,6,3,5,7,4,9,2
	};
	for(int i=0;i<3;i++){
		for(int j=1+i;j<3;j++){
		//交换a[i][j] a[j][i]
		int t=a[i][j];
		a[i][j]=a[j][i];
		a[j][i]=t;	
		}
	}
		for(int i=0;i<3;i++ ){
			for(int j=0;j<3;j++){
				printf("%d ",a[i][j]);
			}
			printf("\n");
		}
	return 0;
}

例二:将3*3的矩阵顺时针旋转90度输出

C语言-二维数组_第7张图片

 思路参考csdn搜到的想法

//F:旋转矩阵
#include 
int main()
{
	int a[4][4],b[4][4];

	for(int i=0;i<3;i++){
		for(int j=0;j<3;j++){
			scanf("%d",&a[i][j]);
		}	
	}
	//交换1 3行
	for(int i=0;i<3;i++){
		int t=a[0][i];
		a[0][i]=a[2][i];
		a[2][i]=t;
		}
	//再矩阵转置
		for(int i=0;i<3;i++){
			for(int j=0;j<3;j++){
			int t=a[i][j];
			a[i][j]=b[j][i];
			b[j][i]=t;
			}
		}
	for(int j=0;j<3;j++){
		for(int i=0;i<3;i++){
			printf("%d ",b[j][i]);
		}
		printf("\n");
	}
		return 0;
	}
	

例三:按回型路线遍历二维数组

     

C语言-二维数组_第8张图片

    C语言-二维数组_第9张图片       C语言-二维数组_第10张图片

 方法一:C语言-二维数组_第11张图片

          按圈填数,一圈4条边(用j来表示)

一定要注意边界!!!

上边:从左到右, 第i行,   列数j从i到n-i,输出a[i][j]

右边:从上到下,第n-i+1列,行数j从i到n-i,输出a[j][n-i]

下边:从右到左,第n-i+1行,列数j从n-i+1到i+1,输出a[n-i+1][j]

左边:从下到上,第i列,行数j从n-i+1到i+1,输出a[j][i]

#include 
int main()
{
	int n,a[15][15];
	scanf("%d",&n);
	for(int i=1;i<=n;i++){//圈数和输入的n有关,奇数情况还漏掉了一个最中心的元素
		for(int j=1;j<=n;j++){
			scanf("%d",&a[i][j]);
		}	
	}
	for(int i=1;i<=n/2;i++){
		//最上边
		for(int j=i;j<=n-i;j++){
			printf("%d\n",a[i][j]);
		}
		//最右边
		for(int j=i;j<=n-i;j++){
			printf("%d\n",a[j][n-i+1]);
		}
		//最下边
		for(int j=n-i+1;j>=i+1;j--){
			printf("%d\n",a[n-i+1][j]);
		}
		//最左边
		for(int j=n-i+1;j>=i+1;j--){
			printf("%d\n",a[j][i]);
		}
	}
	if(n%2==1){//奇数情况
		printf("%d",a[n/2+1][n/2+1]);
	}
	return 0;
}

方法二:模拟行走路线,填充,走到边界处就拐弯

intd[x]={0,1(行数加一),0,-1};//行偏移(右下左上)

intd[y]={1,0,-1,0}//列偏移

起始位置:x=1,y=1(第一行第一列开始),方向参数m=0

周期为4,m=m+1

何时拐弯?

看到0就拐弯,访问过的数全部变成0

C语言-二维数组_第12张图片

                

你可能感兴趣的:(C语言,c语言)