这是因为数组str3没有初始化,系统自主给数组初始一个值,因此不可以贸然使用没有赋初值的变量,因为你不知道它具体的值是多少,至于为什么39和56是正确的,你可以不赋初值给数组str3,直接在程序中打印看看就知道为什么了。(附上程序截图,可以看出str3[0][1]=0,str3[1][1]=0;其他不等于0,因此只有39,56正确)#include <stdio.h>
int main()
{
int M, P, N, i, j, k;
int row;
printf("请输入第一个矩阵的尺寸(M * P):");
scanf("%d * %d", &M, &P);
int str1[M][P];
printf("请输入第二个矩阵的尺寸(P * N):");
scanf("%d * %d", &P, &N);
int str2[P][N];
int str3[M][N];
//初始化存放乘积的二维数组
/* //val函数不支持直接初始化操作
for(i = 0; i < M; i++)
{
for(j = 0; j < N; j++)
str3[i][j] = 0;
} //我的问题是这一块为什么要对数组str3进行初始化为0的操作
*/
for(i = 0; i < M; i++)
{
for(j = 0; j < N; j++)
printf("%d ",str3[i][j]);
printf("\n") ;
}
printf("请输入第一个矩阵的值:\n");
for(i = 0; i < M; i++)
{
for(j = 0; j < P; j++)
scanf("%d", &str1[i][j]);
}
printf("请输入第二个矩阵的值:\n");
for(i = 0; i < P; i++)
{
for(j = 0; j < N; j++)
scanf("%d", &str2[i][j]);
}
for(i = 0; i < M; i++)
{
for(j = 0; j < N; j++)
for(k = 0; k < P; k++)
str3[i][j] += str1[i][k] * str2[k][j];
}
row = M > P ? M : P;
printf("结果是:\n");
for(i = 0; i < row; i++)
{
//打印str1
printf("| ");
for(j = 0; j < P; j++)
{
if(i < M)
{
printf("\b%d ", str1[i][j]);
printf("|");
}
else
printf("\b\b\b ");
}
//打印*
if(i == row/2) //?
printf(" * ");
else
printf(" ");
//打印str2
printf("| ");
for(j = 0; j < N; j++)
{
if(i < P)
{
printf("\b%d ", str2[i][j]);
printf("|");
}
else
printf("\b\b\b ");
}
//打印=
if(i == row / 2)
printf(" = ");
else
printf(" ");
//打印str3
printf("| ");
for(j = 0; j < N; j++)
{
if(i < M)
{
printf("\b%d ", str3[i][j]);
printf("|");
}
else
printf("\b\b\b ");
}
printf("\n");
}
return 0;
}
|