这是小甲鱼第25课的作业,要求输入两个矩阵,计算矩阵相乘的运算结果,并以合适的格式打印出来
矩阵相乘计算器
难点:
矩阵相乘的循环嵌套
如何输出横向的打印结果→借鉴之前的logo打印方式,横向组合,按行打印
小技巧
这里我将每个矩阵的打印代码写成了函数,与答案相比更加简洁。
// 输入维数 输入矩阵 矩阵计算函数 打印函数
// 矩阵1:M×P
// 矩阵2:P×N
#include
void printMat(int *p, int mat_rows, int mat_cols, int n)
{
int ii = 0;
if (n < mat_rows)
{
printf("|"); //one space
for (ii = 0; ii < mat_cols; ii++)
{
printf(" %2d ", *(p+ii));
}
printf("|");
}
else
{
printf(" "); //one space
for (ii = 0; ii < mat_cols; ii++)
{
printf(" ");
}
printf(" ");
}
}
int main(void)
{
// 确定矩阵维数
int M, P, N;
printf("请输入矩阵1的尺寸(M*P): ");
scanf("%d*%d", &M, &P);
printf("请输入矩阵2的尺寸(P*N): ");
scanf("%d*%d", &P, &N);
// 定义空矩阵
int mat_a[M][P];
int mat_b[P][N];
int mat_c[M][N]; // 初始化 可变数组需要手动初始化
int i = 0, j = 0;
for (i = 0; i < M; i++)
{
for (j = 0; j < N; j++)
{
mat_c[i][j] = 0;
}
}
// 录入矩阵数据 使用i,j分层循环
printf("请输入矩阵1: \n");
for (i = 0; i < M; i++)
{
for (j = 0; j < P; j++)
{
scanf("%d", &mat_a[i][j]);
}
}
printf("请输入矩阵2: \n");
for (i = 0; i < P; i++)
{
for (j = 0; j < N; j++)
{
scanf("%d", &mat_b[i][j]);
}
}
// 分析矩阵计算的循环嵌套
// 矩阵C有M*N个元素,最两分别为M和N
for (i = 0; i < M; i++)
{
for (j = 0; j < N; j++)
{
int sum = 0;
// 每个元素需要求和得到结果,又是一层循环
for (int k = 0; k < P; k++)
{
sum += mat_a[i][k] * mat_b[k][j];
}
mat_c[i][j] = sum;
}
}
// 按行打印结果 按行组装
// M和P指定行数,取两者的较大值
int row = M > P ? M : P;
for (int n = 0; n < row; n++)
{
// mat_a
printMat(&mat_a[n][0], M, P, n);
// print *
if (n == row / 2)
printf(" * ");
else
printf(" ");
// mat_b
printMat(&mat_b[n][0], P, N, n);
// print =
if (n == row / 2)
printf(" = ");
else
printf(" ");
// mat_c
printMat(&mat_c[n][0], M, N, n);
printf("\n");
}
return 0;
}