鱼C论坛

 找回密码
 立即注册
查看: 2255|回复: 2

[已解决][C]矩阵乘法的函数,运行不对,不知道哪里错了

[复制链接]
发表于 2022-10-11 15:53:24 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
题目如下,计算两个矩阵的乘法。n*m阶的矩阵A乘以m*k阶的矩阵B得到的矩阵C 是n*k阶的,且C[i][j] = A[i][0]*B[0][j] + A[i][1]*B[1][j] + …… +A[i][m-1]*B[m-1][j](C[i][j]表示C矩阵中第i行第j列元素)。
要求
将矩阵的乘法封装为函数
输入
第一行为n, m, k,表示A矩阵是n行m列,B矩阵是m行k列,n, m, k均小于100
然后先后输入A和B两个矩阵,A矩阵n行m列,B矩阵m行k列,矩阵中每个元素的绝对值不会大于1000。
输出
输出矩阵C,一共n行,每行k个整数,整数之间以一个空格分开。
代码如下,不知道为什么运行不了QAQ
  1. #include <stdio.h>

  2. char jzcf(int n, int m, int k, char arrA[n][m], char arrB[m][k]);
  3. char jzcf(int n, int m, int k, char arrA[n][m], char arrB[m][k]) //矩阵乘法
  4. {
  5. int i, j;
  6. int arrC[n][k];
  7. for (i=0;i<n;i++)
  8.          {
  9.                      int result;
  10.               for(j = 0; j<k;j++)
  11.                       {
  12.                                result = 0;
  13.                                for(int x = 0;x < m;x++)
  14.                          {
  15.                          result = result + arrA[i][x]*arrB[x][j];
  16.                          arrC[i][j] = result;
  17.                           }
  18.                              }
  19.          }
  20. return arrC[n][k];
  21. }

  22. int main()
  23. {
  24.             int n, m, k;//各行各列
  25.             int a, b;//计数用
  26.             printf("输入\n");
  27.             scanf("%d%d%d", &n, &m, &k);
  28.             char arrA[n][m], arrB[m][k], arrC[n][k];
  29.             for(a = 0;a<n;a++)
  30.             {               
  31.                   for(b = 0; b<m; b ++)
  32.                   {
  33.                       scanf("%d",&arrA[a][b]);
  34.                     }
  35.         }
  36.             for(a = 0;a<m;a++)
  37.             {               
  38.                   for(b = 0; b<k; b ++)
  39.                   {
  40.                       scanf("%d",&arrB[a][b]);
  41.                     }
  42.         }
  43.         arrC[n][k] = jzcf(n, m, k, arrA[n][m], arrB[m][k]);
  44.         for(a = 0;a<k;a++)  //打印
  45.             {               
  46.                   for(b = 0; b<n; b ++)
  47.                   {
  48.                       printf("%d ",arrC[a][b]);
  49.                   }
  50.               printf("\n");
  51.         }

  52. return 0;
  53. }
复制代码
最佳答案
2022-10-11 17:16:42
本帖最后由 jackz007 于 2022-10-11 17:28 编辑

        这个代码涉及到向函数中传递二维不定长数组,这是不允许的(编译通不过),必须按照一维数组传入,按二维数组进行访问。
  1. #include <stdio.h>

  2. void jzcf(int n , int m , int k , int p[] , int q[] , int r[])
  3. {
  4.         int i , j , x , result                                                         ;
  5.         int (* arrA)[m] = (int (*)[m]) p                                               ;
  6.         int (* arrB)[k] = (int (*)[k]) q                                               ;
  7.         int (* arrC)[k] = (int (*)[k]) r                                               ;

  8.         for(i = 0 ; i < n ; i ++) {
  9.                 for(j = 0 ; j < k ; j ++) {
  10.                         result = 0 ;
  11.                         for(x = 0 ; x < m ; x ++) {
  12.                                 result = result + arrA[i][x] * arrB[x][j]              ;
  13.                                 arrC[i][j] = result                                    ;
  14.                         }
  15.                 }
  16.         }
  17. }

  18. int main()
  19. {
  20.         int n, m, k;//各行各列
  21.         int a, b;//计数用
  22.         printf("输入 n m k : ")                                                        ;
  23.         scanf("%d%d%d", &n, &m, &k)                                                    ;
  24.         int arrA[n][m] , arrB[m][k] , arrC[n][k]                                       ;
  25.         int * p = arrA[0] , * q = arrB[0] , * r = arrC[0]                              ;
  26.         printf("输入 arrA[%d][%d]\n" , n , m)                                          ;
  27.         for(a = 0 ; a < n ; a ++) for(b = 0 ; b < m ; b ++) scanf("%d" , & arrA[a][b]) ;
  28.         printf("输入 arrB[%d][%d]\n" , m , k)                                          ;
  29.         for(a = 0 ; a < m ; a ++) for(b = 0 ; b < k ; b ++) scanf("%d" , & arrB[a][b]) ;
  30.         jzcf(n , m , k , p , q , r)                                                    ;
  31.         for(a = 0 ; a < n ; a ++) {                                                      // 循环范围有误
  32.                 printf("%d" , arrC[a][0])                                              ;
  33.                 for(b = 1 ; b < k ; b ++) printf(" , %d", arrC[a][b])                  ; // 循环范围有误
  34.                 printf("\n")                                                           ;
  35.         }
  36. }
复制代码

        编译、运行实况:
  1. D:\[00.Exerciese.2022]\C>g++ -o x x.c

  2. D:\[00.Exerciese.2022]\C>x
  3. 输入 n m k : 2 3 4
  4. 输入 arrA[2][3]
  5. 1 2 3
  6. 4 5 6
  7. 输入 arrB[3][4]
  8. 1 2 3 4
  9. 5 6 7 8
  10. 9 10 11 12
  11. 38 , 44 , 50 , 56
  12. 83 , 98 , 113 , 128

  13. D:\[00.Exerciese.2022]\C>
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-10-11 17:16:42 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2022-10-11 17:28 编辑

        这个代码涉及到向函数中传递二维不定长数组,这是不允许的(编译通不过),必须按照一维数组传入,按二维数组进行访问。
  1. #include <stdio.h>

  2. void jzcf(int n , int m , int k , int p[] , int q[] , int r[])
  3. {
  4.         int i , j , x , result                                                         ;
  5.         int (* arrA)[m] = (int (*)[m]) p                                               ;
  6.         int (* arrB)[k] = (int (*)[k]) q                                               ;
  7.         int (* arrC)[k] = (int (*)[k]) r                                               ;

  8.         for(i = 0 ; i < n ; i ++) {
  9.                 for(j = 0 ; j < k ; j ++) {
  10.                         result = 0 ;
  11.                         for(x = 0 ; x < m ; x ++) {
  12.                                 result = result + arrA[i][x] * arrB[x][j]              ;
  13.                                 arrC[i][j] = result                                    ;
  14.                         }
  15.                 }
  16.         }
  17. }

  18. int main()
  19. {
  20.         int n, m, k;//各行各列
  21.         int a, b;//计数用
  22.         printf("输入 n m k : ")                                                        ;
  23.         scanf("%d%d%d", &n, &m, &k)                                                    ;
  24.         int arrA[n][m] , arrB[m][k] , arrC[n][k]                                       ;
  25.         int * p = arrA[0] , * q = arrB[0] , * r = arrC[0]                              ;
  26.         printf("输入 arrA[%d][%d]\n" , n , m)                                          ;
  27.         for(a = 0 ; a < n ; a ++) for(b = 0 ; b < m ; b ++) scanf("%d" , & arrA[a][b]) ;
  28.         printf("输入 arrB[%d][%d]\n" , m , k)                                          ;
  29.         for(a = 0 ; a < m ; a ++) for(b = 0 ; b < k ; b ++) scanf("%d" , & arrB[a][b]) ;
  30.         jzcf(n , m , k , p , q , r)                                                    ;
  31.         for(a = 0 ; a < n ; a ++) {                                                      // 循环范围有误
  32.                 printf("%d" , arrC[a][0])                                              ;
  33.                 for(b = 1 ; b < k ; b ++) printf(" , %d", arrC[a][b])                  ; // 循环范围有误
  34.                 printf("\n")                                                           ;
  35.         }
  36. }
复制代码

        编译、运行实况:
  1. D:\[00.Exerciese.2022]\C>g++ -o x x.c

  2. D:\[00.Exerciese.2022]\C>x
  3. 输入 n m k : 2 3 4
  4. 输入 arrA[2][3]
  5. 1 2 3
  6. 4 5 6
  7. 输入 arrB[3][4]
  8. 1 2 3 4
  9. 5 6 7 8
  10. 9 10 11 12
  11. 38 , 44 , 50 , 56
  12. 83 , 98 , 113 , 128

  13. D:\[00.Exerciese.2022]\C>
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-11 23:31:23 From FishC Mobile | 显示全部楼层
解答太棒了,我也有此疑问,谢谢。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-23 18:14

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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