C语言矩阵倒置——一个小问题
#include <stdio.h>int main()
{
int M, P, N, i, j, k;
int row;
printf("请输入第一个矩阵的尺寸(M * P):");
scanf("%d * %d", &M, &P);
int str1;
printf("请输入第二个矩阵的尺寸(P * N):");
scanf("%d * %d", &P, &N);
int str2;
int str3;
//初始化存放乘积的二维数组
//val函数不支持直接初始化操作
for(i = 0; i < M; i++)
{
for(j = 0; j < N; j++)
str3 = 0;
} //我的问题是这一块为什么要对数组str3进行初始化为0的操作
printf("请输入第一个矩阵的值:\n");
for(i = 0; i < M; i++)
{
for(j = 0; j < P; j++)
scanf("%d", &str1);
}
printf("请输入第二个矩阵的值:\n");
for(i = 0; i < P; i++)
{
for(j = 0; j < N; j++)
scanf("%d", &str2);
}
for(i = 0; i < M; i++)
{
for(j = 0; j < N; j++)
for(k = 0; k < P; k++)
str3 += str1 * str2;
}
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);
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);
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);
printf("|");
}
else
printf("\b\b\b ");
}
printf("\n");
}
return 0;
}
正确的输出结果
把str3数组的初始化步骤注删掉后的不正确结果:
求问为什么要把str3数组进行初始化呢,在后面矩阵相乘的时候会把新值赋给str3啊,那么在开头初始化为0有什么意义呢?
但是不初始化为0就会发生最终答案错误或者出现垃圾值的情况{:10_272:}
大佬求解答啊{:10_250:}
最后简单一句,我就是想知道为啥需要把str3初始化{:10_254:}
应该和上面的答主说的一样,没有初始化系统自动从内存中赋一个不确定的值到数组中 str3初始化后是在第44行“str3 += str1 * str2;”运算,运算中用到了str3的初值,这让我想起了以前遇到的一个问题:有的时候变量初始化的值并不是“0”,而是“1”(有的大神说是和编译器有关,俺也不清楚,以后我就都直接赋初值为“0”了)这个问题可能也是这样,str3的初值可能并不是“0”,建议你可以在定义后直接打印出来看看。 自然 发表于 2019-9-25 13:11
str3初始化后是在第44行“str3 += str1 * str2;”运算,运算中用到了str3的初值,这让我想起了 ...
我试过了,我的输出是1,你的意思应该是str3的初值在运算中是在不断累积,进而加到了一个超过正确答案的数,但是为什么后面一列的39和56两个数是相同的呢? 这是因为数组str3没有初始化,系统自主给数组初始一个值,因此不可以贸然使用没有赋初值的变量,因为你不知道它具体的值是多少,至于为什么39和56是正确的,你可以不赋初值给数组str3,直接在程序中打印看看就知道为什么了。(附上程序截图,可以看出str3=0,str3=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;
printf("请输入第二个矩阵的尺寸(P * N):");
scanf("%d * %d", &P, &N);
int str2;
int str3;
//初始化存放乘积的二维数组
/* //val函数不支持直接初始化操作
for(i = 0; i < M; i++)
{
for(j = 0; j < N; j++)
str3 = 0;
} //我的问题是这一块为什么要对数组str3进行初始化为0的操作
*/
for(i = 0; i < M; i++)
{
for(j = 0; j < N; j++)
printf("%d ",str3);
printf("\n") ;
}
printf("请输入第一个矩阵的值:\n");
for(i = 0; i < M; i++)
{
for(j = 0; j < P; j++)
scanf("%d", &str1);
}
printf("请输入第二个矩阵的值:\n");
for(i = 0; i < P; i++)
{
for(j = 0; j < N; j++)
scanf("%d", &str2);
}
for(i = 0; i < M; i++)
{
for(j = 0; j < N; j++)
for(k = 0; k < P; k++)
str3 += str1 * str2;
}
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);
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);
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);
printf("|");
}
else
printf("\b\b\b ");
}
printf("\n");
}
return 0;
}
页:
[1]