例题一:
矩阵相乘
首先,如果你没学过线代的话,这边建议你去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 <stdio.h>
#include <string.h>
#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字编排
完成如图排序
这题关键就在于找规律!!!
以8*8为例:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#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 <stdio.h>
#include <string.h>
#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
最后,祝福各位学习天天进步!!!