鱼C论坛

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

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

[复制链接]
发表于 2019-9-23 22:59:25 | 显示全部楼层 |阅读模式
3鱼币
  1. [code]#include <stdio.h>

  2. int main()
  3. {
  4.         int M, P, N, i, j, k;
  5.         int row;
  6.        
  7.         printf("请输入第一个矩阵的尺寸(M * P):");
  8.         scanf("%d * %d", &M, &P);
  9.         int str1[M][P];
  10.        
  11.         printf("请输入第二个矩阵的尺寸(P * N):");
  12.         scanf("%d * %d", &P, &N);
  13.         int str2[P][N];
  14.        
  15.         int str3[M][N];
  16.        
  17.         //初始化存放乘积的二维数组
  18.         //val函数不支持直接初始化操作
  19.         for(i = 0; i < M; i++)
  20.         {
  21.                 for(j = 0; j < N; j++)
  22.                         str3[i][j] = 0;
  23.         }                                                                                            //我的问题是这一块为什么要对数组str3进行初始化为0的操作
  24.        
  25.         printf("请输入第一个矩阵的值:\n");
  26.         for(i = 0; i < M; i++)
  27.         {
  28.                 for(j = 0; j < P; j++)
  29.                         scanf("%d", &str1[i][j]);
  30.         }
  31.        
  32.         printf("请输入第二个矩阵的值:\n");
  33.         for(i = 0; i < P; i++)
  34.         {
  35.                 for(j = 0; j < N; j++)
  36.                         scanf("%d", &str2[i][j]);
  37.         }

  38.         for(i = 0; i < M; i++)
  39.         {
  40.                 for(j = 0; j < N; j++)
  41.                         for(k = 0; k < P; k++)
  42.                                 str3[i][j] += str1[i][k] * str2[k][j];
  43.         }
  44.        
  45.         row = M > P ? M : P;
  46.        
  47.         printf("结果是:\n");
  48.         for(i = 0; i < row; i++)
  49.         {
  50.                 //打印str1
  51.                 printf("|  ");
  52.                 for(j = 0; j < P; j++)
  53.                 {
  54.                         if(i < M)
  55.                         {
  56.                                 printf("\b%d ", str1[i][j]);  
  57.                                 printf("|");
  58.                         }
  59.                        
  60.                         else
  61.                                 printf("\b\b\b     ");
  62.                 }
  63.                
  64.                 //打印*
  65.                 if(i == row/2)         //?
  66.                         printf(" * ");
  67.                 else
  68.                         printf("   ");
  69.                
  70.                 //打印str2
  71.                 printf("|  ");
  72.                 for(j = 0; j < N; j++)
  73.                 {
  74.                         if(i < P)
  75.                         {
  76.                                 printf("\b%d ", str2[i][j]);
  77.                                 printf("|");
  78.                         }
  79.                        
  80.                         else
  81.                                 printf("\b\b\b    ");
  82.                  }
  83.                  
  84.                  //打印=
  85.                  if(i == row / 2)
  86.                          printf(" = ");
  87.                  else
  88.                          printf("   ");
  89.                           
  90.                  
  91.                  //打印str3
  92.                  printf("|  ");
  93.                  for(j = 0; j < N; j++)
  94.                  {
  95.                          if(i < M)
  96.                          {
  97.                                  printf("\b%d ", str3[i][j]);
  98.                                  printf("|");
  99.                          }
  100.                          
  101.                          else
  102.                                  printf("\b\b\b     ");
  103.                   }
  104.                
  105.                 printf("\n");
  106.         }
  107.        
  108.         return 0;       
  109.        
  110. }
复制代码

正确的输出结果 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
应该和上面的答主说的一样,没有初始化系统自动从内存中赋一个不确定的值到数组中

最佳答案

查看完整内容

应该和上面的答主说的一样,没有初始化系统自动从内存中赋一个不确定的值到数组中
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-9-23 22:59:26 | 显示全部楼层    本楼为最佳答案   
qq_pic_merged_1569511033996.jpg
应该和上面的答主说的一样,没有初始化系统自动从内存中赋一个不确定的值到数组中
小甲鱼最新课程 -> https://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”,建议你可以在定义后直接打印出来看看。
小甲鱼最新课程 -> https://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两个数是相同的呢?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-9-26 22:55:16 | 显示全部楼层
这是因为数组str3没有初始化,系统自主给数组初始一个值,因此不可以贸然使用没有赋初值的变量,因为你不知道它具体的值是多少,至于为什么39和56是正确的,你可以不赋初值给数组str3,直接在程序中打印看看就知道为什么了。(附上程序截图,可以看出str3[0][1]=0,str3[1][1]=0;其他不等于0,因此只有39,56正确)
  1. #include <stdio.h>

  2. int main()
  3. {
  4.         int M, P, N, i, j, k;
  5.         int row;
  6.         
  7.         printf("请输入第一个矩阵的尺寸(M * P):");
  8.         scanf("%d * %d", &M, &P);
  9.         int str1[M][P];
  10.         
  11.         printf("请输入第二个矩阵的尺寸(P * N):");
  12.         scanf("%d * %d", &P, &N);
  13.         int str2[P][N];
  14.         
  15.         int str3[M][N];
  16.         
  17.         //初始化存放乘积的二维数组
  18.   /*     //val函数不支持直接初始化操作
  19.         for(i = 0; i < M; i++)
  20.         {
  21.                 for(j = 0; j < N; j++)
  22.                         str3[i][j] = 0;
  23.         }                                                                                            //我的问题是这一块为什么要对数组str3进行初始化为0的操作
  24.     */   
  25.     for(i = 0; i < M; i++)
  26.         {
  27.                 for(j = 0; j < N; j++)
  28.                         printf("%d ",str3[i][j]);
  29.                                 printf("\n") ;
  30.         }
  31.    
  32.         printf("请输入第一个矩阵的值:\n");
  33.         for(i = 0; i < M; i++)
  34.         {
  35.                 for(j = 0; j < P; j++)
  36.                         scanf("%d", &str1[i][j]);
  37.         }
  38.         
  39.         printf("请输入第二个矩阵的值:\n");
  40.         for(i = 0; i < P; i++)
  41.         {
  42.                 for(j = 0; j < N; j++)
  43.                         scanf("%d", &str2[i][j]);
  44.         }

  45.         for(i = 0; i < M; i++)
  46.         {
  47.                 for(j = 0; j < N; j++)
  48.                         for(k = 0; k < P; k++)
  49.                                 str3[i][j] += str1[i][k] * str2[k][j];
  50.         }
  51.         
  52.         row = M > P ? M : P;
  53.         
  54.         printf("结果是:\n");
  55.         for(i = 0; i < row; i++)
  56.         {
  57.                 //打印str1
  58.                 printf("|  ");
  59.                 for(j = 0; j < P; j++)
  60.                 {
  61.                         if(i < M)
  62.                         {
  63.                                 printf("\b%d ", str1[i][j]);  
  64.                                 printf("|");
  65.                         }
  66.                         
  67.                         else
  68.                                 printf("\b\b\b     ");
  69.                 }
  70.                
  71.                 //打印*
  72.                 if(i == row/2)         //?
  73.                         printf(" * ");
  74.                 else
  75.                         printf("   ");
  76.                
  77.                 //打印str2
  78.                 printf("|  ");
  79.                 for(j = 0; j < N; j++)
  80.                 {
  81.                         if(i < P)
  82.                         {
  83.                                 printf("\b%d ", str2[i][j]);
  84.                                 printf("|");
  85.                         }
  86.                         
  87.                         else
  88.                                 printf("\b\b\b    ");
  89.                  }
  90.                  
  91.                  //打印=
  92.                  if(i == row / 2)
  93.                          printf(" = ");
  94.                  else
  95.                          printf("   ");
  96.                           
  97.                  
  98.                  //打印str3
  99.                  printf("|  ");
  100.                  for(j = 0; j < N; j++)
  101.                  {
  102.                          if(i < M)
  103.                          {
  104.                                  printf("\b%d ", str3[i][j]);
  105.                                  printf("|");
  106.                          }
  107.                         
  108.                          else
  109.                                  printf("\b\b\b     ");
  110.                   }
  111.                
  112.                 printf("\n");
  113.         }
  114.         
  115.         return 0;        
  116.         
  117. }
复制代码

1.png
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-14 20:15

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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