胚芽鞘 发表于 2022-10-11 15:53:24

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

题目如下,计算两个矩阵的乘法。n*m阶的矩阵A乘以m*k阶的矩阵B得到的矩阵C 是n*k阶的,且C = A*B + A*B + …… +A*B(C表示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
#include <stdio.h>

char jzcf(int n, int m, int k, char arrA, char arrB);
char jzcf(int n, int m, int k, char arrA, char arrB) //矩阵乘法
{
int i, j;
int arrC;
for (i=0;i<n;i++)
         {
                     int result;
            for(j = 0; j<k;j++)
                    {
                               result = 0;
                               for(int x = 0;x < m;x++)
                       {
                       result = result + arrA*arrB;
                       arrC = result;
                          }
                           }
         }
return arrC;
}

int main()
{
          int n, m, k;//各行各列
            int a, b;//计数用
          printf("输入\n");
            scanf("%d%d%d", &n, &m, &k);
          char arrA, arrB, arrC;
          for(a = 0;a<n;a++)
            {               
                for(b = 0; b<m; b ++)
                {
                    scanf("%d",&arrA);
                }
      }
            for(a = 0;a<m;a++)
            {               
                for(b = 0; b<k; b ++)
                  {
                    scanf("%d",&arrB);
                    }
      }
      arrC = jzcf(n, m, k, arrA, arrB);
      for(a = 0;a<k;a++)//打印
            {               
                for(b = 0; b<n; b ++)
                {
                    printf("%d ",arrC);
                  }
          printf("\n");
      }

return 0;
}

jackz007 发表于 2022-10-11 17:16:42

本帖最后由 jackz007 于 2022-10-11 17:28 编辑

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

void jzcf(int n , int m , int k , int p[] , int q[] , int r[])
{
      int i , j , x , result                                                         ;
      int (* arrA) = (int (*)) p                                             ;
      int (* arrB) = (int (*)) q                                             ;
      int (* arrC) = (int (*)) r                                             ;

      for(i = 0 ; i < n ; i ++) {
                for(j = 0 ; j < k ; j ++) {
                        result = 0 ;
                        for(x = 0 ; x < m ; x ++) {
                              result = result + arrA * arrB            ;
                              arrC = result                                    ;
                        }
                }
      }
}

int main()
{
      int n, m, k;//各行各列
      int a, b;//计数用
      printf("输入 n m k : ")                                                      ;
      scanf("%d%d%d", &n, &m, &k)                                                    ;
      int arrA , arrB , arrC                                       ;
      int * p = arrA , * q = arrB , * r = arrC                              ;
      printf("输入 arrA[%d][%d]\n" , n , m)                                          ;
      for(a = 0 ; a < n ; a ++) for(b = 0 ; b < m ; b ++) scanf("%d" , & arrA) ;
      printf("输入 arrB[%d][%d]\n" , m , k)                                          ;
      for(a = 0 ; a < m ; a ++) for(b = 0 ; b < k ; b ++) scanf("%d" , & arrB) ;
      jzcf(n , m , k , p , q , r)                                                    ;
      for(a = 0 ; a < n ; a ++) {                                                      // 循环范围有误
                printf("%d" , arrC)                                              ;
                for(b = 1 ; b < k ; b ++) printf(" , %d", arrC)                  ; // 循环范围有误
                printf("\n")                                                         ;
      }
}
      编译、运行实况:
D:\\C>g++ -o x x.c

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

D:\\C>

howzyao 发表于 2022-10-11 23:31:23

解答太棒了,我也有此疑问,谢谢。
页: [1]
查看完整版本: [C]矩阵乘法的函数,运行不对,不知道哪里错了