|
发表于 2019-9-26 22:55:16
|
显示全部楼层
这是因为数组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;
-
- }
复制代码
|
|