指针与多维数组练习

例题一:

矩阵相乘

首先,如果你没学过线代的话,这边建议你去B站把宋浩的矩阵运算学了再来看题

如果有个矩阵A和一个矩阵B,当A的列数和B的行数相同时,生成一个新矩阵C,且C是通过矩阵乘法得来的

A[3][2]={3,-1,0,3,1,0}

B[2][4]={1,0,1,-1,0,2,1,0}

输出C矩阵

代码实现:

#define _CRT_SECURE_NO_WARNINGS 1
#include 
#include 
#define M 3
#define S 2
#define N 4
void Print(int(* C)[N])
{
	for (int i = 0; i < M; i++)
	{
		for (int j = 0; j < N; j++)
		{
			printf("%d ", *(*(C + i) + j));
		}
		printf("\n");
	}
}
int main()
{
	int A[M][S] = { {3,-1},{0,3},{1,0} };
	int B[S][N] = { {1,0,1,-1},{0,2,1,0} };
	int C[M][N] = { 0 };
	int(*p)[N] = C;
	//实现矩阵乘法
	for (int i = 0; i < M; i++)//控制C的行
	{
		for (int j = 0; j < N; j++)//控制C的列
		{
			int sum = 0;//计算
			for (int k = 0; k < S; k++)//利用A和B的一个行一个列相同来实现给C赋值
			{
				sum += (*(*(A + i) + k)) * (*(*(B + k) + j));
				//这里需要仔细理解,最内层使用来行的,外层是用来控制列的
				//即A+i--行,将其解引用可以找到行,*(A+i)+k--可以实现一行中向右找列
				//B+k--列,将其解引用后可以找到列,*(B+k)+j--可以实现一列中向下找行
			}
			*(*(p+i) + j) = sum;//*(p[i]+j)=sum
		}

	}
	p = NULL;
	//打印
	Print(C);
	/*for (int i = 0; i < M; i++)
	{
		for (int j = 0; j < N; j++)
		{
			printf("%-3d ", C[i][j]);
		}
		printf("\n");
	}*/
	return 0;
}

例题二:

Z字编排

完成如图排序

指针与多维数组练习_第1张图片

这题关键就在于找规律!!!

以8*8为例:

#define _CRT_SECURE_NO_WARNINGS 1
#include 
#include 
#define M 8
Print(int(*arr)[M])
{
	for (int i = 0; i < M; i++)
	{
		for (int j = 0; j < M; j++)
		{
			printf("%5d ", *(*(arr + i) + j));
		}
		printf("\n");
	}
}
int main()
{
	int arr1[M][M] = { 0 };
	int arr2[M][M] = { 0 };
	int(*pi)[M] = arr1;
	//第一步:初始化矩阵
	int m = 0;
	for (int i = 0; i < M; i++)
	{
		for (int j = 0; j < M; j++)
		{
			//arr[i][j]=m++;
			*(*(pi + i) + j) = m++;
		}
	}
	//第二步:打印原始数组
	Print(arr1);
	//第三步:Z字编排
	int i = 0; 
	int j = 0;//用来确定arr2
	for (int x = 0; x < M; x++)
	{
		for (int y = 0; y < M; y++)
		{
			*(*(arr2 + i) + j) = *(*(arr1 + x) + y);//赋值
			//判断
			//用来找arr2的位置
			if ((i == 0 && j % 2 == 0) || (i == 7 && j % 2 == 0))
			{
				j++;
				continue;//注意:这里要直接退出本次循环了
			}
			if ((i % 2 != 0 && j == 0) || (i % 2 != 0 && j == 7))
			{
				i++;
				continue;//注意:这里要直接退出本次循环了

			}
			if ((i + j) % 2 == 0)
			{
				i--;
				j++;
			}
			if ((i + j) % 2 != 0)
			{
				i++;
				j--;
			}
		}
	}
	//第四步:打印排好的数组
	Print(arr2);
	return 0;
}

假如我现在要求M可以为其他数呢?

代码如下:

#define _CRT_SECURE_NO_WARNINGS 1
#include 
#include 
#define M 10
Print(int(*arr)[M])
{
	for (int i = 0; i < M; i++)
	{
		for (int j = 0; j < M; j++)
		{
			printf("%5d ", *(*(arr + i) + j));
		}
		printf("\n");
	}
}
int main()
{
	int arr1[M][M] = { 0 };
	int arr2[M][M] = { 0 };
	int(*pi)[M] = arr1;
	//第一步:初始化矩阵
	int m = 0;
	for (int i = 0; i < M; i++)
	{
		for (int j = 0; j < M; j++)
		{
			//arr[i][j]=m++;
			*(*(pi + i) + j) = m++;
		}
	}
	//第二步:打印原始数组
	Print(arr1);
	//第三步:Z字编排
	int i = 0;
	int j = 0;//用来确定arr2
	for (int x = 0; x < M; x++)
	{
		for (int y = 0; y < M; y++)
		{
			*(*(arr2 + i) + j) = *(*(arr1 + x) + y);//赋值
			//判断
			//用来找arr2的位置
			if ((i == 0 && j % 2 == 0) || (i == M - 1 && j % 2 == 0))
			{
				j++;
				continue;
			}
			if ((j == 0 && i % 2 != 0) || (j == M - 1 && i % 2 != 0))
			{
				i++;
				continue;
			}
			if ((i + j) % 2 == 0)
			{
				i--;
				j++;
			}
			if ((i + j) % 2 != 0)
			{
				i++;
				j--;
			}
		}
	}
	//第四步:打印排好的数组
	printf("排好的如下:\n");
	Print(arr2);
	return 0;
}

结果:假设我输入10

指针与多维数组练习_第2张图片

最后,祝福各位学习天天进步!!!

你可能感兴趣的:(算法,人工智能)