二维数组练习

二维数组元素行列交换

起始二维数组ar[2][3]:
1 2 3
4 5 6
目标二维数组br[3][2]:
1 4
2 5
3 6

#include<stdio.h>
#include<assert.h>

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

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

void Exchange(int(*ar)[3], int(*br)[2], int n, int m)
{
	for (int i = 0; i < m; ++i)
	{
		for (int j = 0; j < n; ++j)
		{
			br[i][j] = ar[j][i];
		}
	}
}

int main()
{
	const int n = 2, m = 3;
	int ar[n][m] = { 1,2,3,4,5,6 };
	int br[m][n] = {};

	Exchange(ar, br, n, m);
	Print_Ar(ar, m, n);
	printf("\n");
	Print_Br(br, n, m);

	return 0;
}

杨辉三角

定义一个10*10的二维数组,用来存放杨辉三角。
输入杨辉三角的行数,计算杨辉三角并存放在二维数组中,最后输出二维数组。

#include<stdio.h>
#include<assert.h>

void Print_Ar(int(*br)[10], int n)
{
	for (int i = 0; i < n; ++i)
	{
		for (int j = 0; j < n; ++j)
		{
			if (0 == br[i][j])
			{
				printf("	");
			}
			else
			{
				printf("%4d", br[i][j]);
			}
		}
		printf("\n");
	}
}

void Pascal_Triangle(int(*br)[10], int n, int k)
{
	if (k < 1 || k > 10)
	{
		printf("error!");
	}
	else
	{
		for (int i = 0; i < k; ++i)
		{
			br[i][0] = 1;
			br[i][i] = 1;
			for (int j = 1; j < i; ++j)
			{
				br[i][j] = br[i - 1][j - 1] + br[i - 1][j];
			}
		}
	}
}

int main()
{
	const int n = 10;
	int ar[n][n] = {};
	int x1 = 1;
	int x2 = 5;
	int x3 = 10;

	Pascal_Triangle(ar, n, x1);
	Print_Ar(ar, n);
	Pascal_Triangle(ar, n, x2);
	Print_Ar(ar, n);
	Pascal_Triangle(ar, n, x3);
	Print_Ar(ar, n);

	return 0;
}

二维数组查询数据(分块查询)

二维数组为有序数组。
从二维数组中第一个一维数组进行判断,目标数据是否在数组中。
如果在,则在数组中进行下一步查找;如果不在,则判断下一个一维数组。

#include<stdio.h>
#include<assert.h>

void Find(int(*br)[4], int row, int col, int k)
{
	int tag = 0;
	for (int j = 0; j < col; ++j)
	{
		if (k == br[row][j])
		{
			printf("%d的位置是[%d,%d]\n", k, row, j);
			tag = 1;
		}
	}
	if (!tag)
	{
		printf("%d not find!\n", k);
	}
}

void Partitioned(int(*br)[4], int row, int col, int k)
{
	int num = -1;
	for (int i = 0; i < row; ++i)
	{
		if (br[i][0] <= k && k <= br[i][col - 1])
		{
			num = i;
		}
	}
	if (-1 == num)
	{
		printf("%d not find!\n", k);
	}
	else
	{
		Find(br, num, col, k);
	}
}

int main()
{
	int ar[3][4] = {
		{12,23,34,45},
		{56,67,78,89},
		{91,93,96,99}
	};
	int k1 = 1;
	int k2 = 12;
	int k3 = 67;
	int k4 = 99;
	int k5 = 100;

	Partitioned(ar, 3, 4, k1);
	Partitioned(ar, 3, 4, k2);
	Partitioned(ar, 3, 4, k3);
	Partitioned(ar, 3, 4, k4);
	Partitioned(ar, 3, 4, k5);

	return 0;
}

二维数组查询数据(二分查找)

数组在内存中存储位置相邻(如上图),所以使指针指向二维数组中第一个数组的第一个元素的首地址,指针移动就能依次读出二维数组每个数,相当于将二维数组合并成一个一维数组,然后用指针再进行一维数组的二分查找。
如果找到了,输出此时目标的数据,将数据对二维数组中一维数组的元素个数进行整数除法求行坐标;将数据对二维数组中一维数组的元素个数进行取余求列坐标。

#include<stdio.h>
#include<assert.h>

void Print(int num, int k)
{
	if (-1 == num)
	{
		printf("%d not find!\n", k);
	}
	else
	{
		int row = num / 4;
		int col = num % 4;
		printf("%d的位置是[%d,%d]\n", k, row, col);
	}
}

void Partitioned(int(*br)[4], int row, int col, int k)
{
	int num = -1;
	int sum = row * col;
	int left = 0;
	int right = sum;
	while (left <= right && -1 == num)
	{
		int mid = (left + right) / 2;
		if (k == br[0][mid])
		{
			num = mid;
		}
		else if(k < br[0][mid])
		{
			right = mid - 1;
		}
		else
		{
			left = mid + 1;
		}
	}
	Print(num,k);
}

int main()
{
	int ar[3][4] = {
		{12,23,34,45},
		{56,67,78,89},
		{91,93,96,99}
	};
	int k1 = 1;
	int k2 = 12;
	int k3 = 67;
	int k4 = 99;
	int k5 = 100;

	Partitioned(ar, 3, 4, k1);
	Partitioned(ar, 3, 4, k2);
	Partitioned(ar, 3, 4, k3);
	Partitioned(ar, 3, 4, k4);
	Partitioned(ar, 3, 4, k5);

	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值