乐知者 发表于 2019-9-23 22:59:25

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:}

鱼c哈密瓜 发表于 2019-9-23 22:59:26


应该和上面的答主说的一样,没有初始化系统自动从内存中赋一个不确定的值到数组中

自然 发表于 2019-9-25 13:11:06

str3初始化后是在第44行“str3 += str1 * str2;”运算,运算中用到了str3的初值,这让我想起了以前遇到的一个问题:有的时候变量初始化的值并不是“0”,而是“1”(有的大神说是和编译器有关,俺也不清楚,以后我就都直接赋初值为“0”了)这个问题可能也是这样,str3的初值可能并不是“0”,建议你可以在定义后直接打印出来看看。

乐知者 发表于 2019-9-26 21:43:51

自然 发表于 2019-9-25 13:11
str3初始化后是在第44行“str3 += str1 * str2;”运算,运算中用到了str3的初值,这让我想起了 ...

我试过了,我的输出是1,你的意思应该是str3的初值在运算中是在不断累积,进而加到了一个超过正确答案的数,但是为什么后面一列的39和56两个数是相同的呢?

易晓外 发表于 2019-9-26 22:55:16

这是因为数组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]
查看完整版本: C语言矩阵倒置——一个小问题