C语言基础 入门学习(八)

二维数组知识及相关问题

二维数组的初始化

    int arr[2][2]={{1,2},{3,4}};
	int brr[2][2]={1,2,3,4};
	int crr[][2] = {1,2,3,4,5};//列不能省略   1 2       3  4    5  0
	int drr[2][2]={};//0
	int err[2][2]={1};//1 0 0 
//	int frr[2][3]=arr;//error

二位数组的地址

	printf("%d\n",brr);//272    首地址
	printf("%d\n",brr+1);//284   加一行
	printf("%d\n",brr[0]+1);//276  *(brr+0)+1   加一列
	printf("%d\n",*(brr)+1);//276   

指针访问二维数组的元素

printf("%d\n",brr);//首地址
printf("%d\n",brr+1);//加一行   第二行首地址
printf("%d\n",*brr+1);//加一列  第一行第二个地址
printf("%d\n",*(brr+1));&[1][0] 
printf("%d\n",*(brr+1)+2);&[1][2]
printf("%d\n",&brr[1][2]);
printf("%d\n",*(*(brr+1)+2));[1][2]
printf("%d\n",*(brr[1]+2))[1][2]

打印二位数组的show函数

void Show(int brr[2][3],int row, int col)
{	
	for(int i = 0;i < 2;i++)
	{	
		for(int j = 0; j < 2 ;j++)
			{
				printf("%d ",brr[i][j]);
			}
		printf("\n");
}
    void Show2(int *brr ,int row, int col)
{
	for(int i = 0; i < row; i++)
	{
		for(int j = 0; j < col ;j++)
		{
			printf("%2d ",brr[i*col+j])
		}
	printf("\n");
	}
}

//上三角矩阵

void Fun(int (*brr)[Row])
{
	int count = 1;
	for(int i = 0;i < ROW;i++)
	{ 
		for(int j = 0;j < ROW;j++)
		{
			if(j>=i)
			{
				brr[i][j]=count++;
			}

		}
	}
}

/对称矩阵

void Fun2(int (*brr)[Row])
{
	srand(time(0));//time .h 随机种子
	int count = 1;
	for(int i = 0;i < ROW;i++)
	{ 
		for(int j = 0;j < ROW;j++)
		{
			if(j > i)
			{
				brr[i][j] = rand()%10+1;
			}
			else if(i == j)
			{
				brr[i][j] = 0;
			}
			else
			{
				brr[j][i] = brr[i][j];// stdilb.h  [0,10)
			}
		}
	}
}



int *brr[3]//指针数组    int (*brr)[列]//数组指针  等价于 二维数组
	int *brr[3]//指针数针

杨辉三角

void Fun(int (*arr)[ROW])//杨辉三角
{
	for(int i = 0;i < ROW;i++)
	{
		for(int j = 0;j <= i;j++)
	{
		if(i == j||j == 0)
			{
				arr[i][i] = 1;
				arr[i][0] = 1;
			}
			arr[i][j] = arr[i-1][j-1] + arr[i-1][j];
		}
	}
}

魔方阵
1、将1放在第一行中间一列;
2、从2开始直到n×n止各数依次按下列规则存放;每一个数存放的行比前一个数的行数减1,列数加1;
3、如果上一个数的行数为1,则下一个数的行数为n(指最下一行);例如1在第一行,则2应放在最下一行,列数同样加1;
4、当上一个数的列数为n时,下一个数的列数应为1,行数减去1。例如2在第3行最后一列,则3应放在第二行第一列;
5、如果按上面规则确定的位置上已有数,或上一个数是第一行第n列时,则把下一个数放在上一个数的下面。例如按上面的规定,4应该放在第1行第2列,但该位置已经被占据,所以4就放在3的下面;

void Magic_Aquare(int (*arr)[ROW])
{
	int count = 1;
	int i = 0;
	int j = (ROW+1)/2;
	arr[i][j] = count++;//先将1付给第一行的最中间的元素
	while(count <= ROW*ROW)
	{
		if(i == 0 )判定如果在第一行就返回最后一行
		{
			i = ROW-1;
		}
		else
		{
			i = i-1;
		}
		if(j == ROW - 1)//如果在最后一列就返回第一行
		{
			j = 0;
		}
		else
		{
			j = j+1;
		}

		if(arr[i][j] !=0)
		{
			arr[i+1][j] = count++;//将数字按照规则赋值
		}
		else if(arr[i][j] == 0)
		{
			arr[i][j] = count++;
		}
	}
}

猜你喜欢

转载自blog.csdn.net/zhangfei5354/article/details/83753253