鱼C论坛

 找回密码
 立即注册
查看: 3109|回复: 4

[已解决]C语言矩阵倒置——一个小问题

[复制链接]
发表于 2019-9-23 22:59:25 | 显示全部楼层 |阅读模式
3鱼币
[code]#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的操作
        
        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;        
        
 } 
正确的输出结果 2019-09-23 (3).png
把str3数组的初始化步骤注删掉后的不正确结果: 2019-09-23 (4).png

求问为什么要把str3数组进行初始化呢,在后面矩阵相乘的时候会把新值赋给str3啊,那么在开头初始化为0有什么意义呢?
但是不初始化为0就会发生最终答案错误或者出现垃圾值的情况

大佬求解答啊

最后简单一句,我就是想知道为啥需要把str3初始化
最佳答案
2019-9-23 22:59:26
qq_pic_merged_1569511033996.jpg
应该和上面的答主说的一样,没有初始化系统自动从内存中赋一个不确定的值到数组中

最佳答案

查看完整内容

应该和上面的答主说的一样,没有初始化系统自动从内存中赋一个不确定的值到数组中
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-9-23 22:59:26 | 显示全部楼层    本楼为最佳答案   
qq_pic_merged_1569511033996.jpg
应该和上面的答主说的一样,没有初始化系统自动从内存中赋一个不确定的值到数组中
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-9-25 13:11:06 | 显示全部楼层
str3初始化后是在第44行“str3[i][j] += str1[i][k] * str2[k][j];”运算,运算中用到了str3的初值,这让我想起了以前遇到的一个问题:有的时候变量初始化的值并不是“0”,而是“1”(有的大神说是和编译器有关,俺也不清楚,以后我就都直接赋初值为“0”了)这个问题可能也是这样,str3的初值可能并不是“0”,建议你可以在定义后直接打印出来看看。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-9-26 21:43:51 | 显示全部楼层
自然 发表于 2019-9-25 13:11
str3初始化后是在第44行“str3[j] += str1[k] * str2[k][j];”运算,运算中用到了str3的初值,这让我想起了 ...

我试过了,我的输出是1,你的意思应该是str3的初值在运算中是在不断累积,进而加到了一个超过正确答案的数,但是为什么后面一列的39和56两个数是相同的呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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;        
        
 } 
1.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-12 22:06

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表