鱼C论坛

 找回密码
 立即注册
查看: 1797|回复: 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
#include <stdio.h>

char jzcf(int n, int m, int k, char arrA[n][m], char arrB[m][k]);
char jzcf(int n, int m, int k, char arrA[n][m], char arrB[m][k]) //矩阵乘法
{
int i, j;
int arrC[n][k];
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[i][x]*arrB[x][j];
                         arrC[i][j] = result;
                          }
                             }
         }
return arrC[n][k];
}

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

return 0;
}
最佳答案
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)[m] = (int (*)[m]) p                                               ;
        int (* arrB)[k] = (int (*)[k]) q                                               ;
        int (* arrC)[k] = (int (*)[k]) r                                               ;

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

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

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

D:\[00.Exerciese.2022]\C>
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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)[m] = (int (*)[m]) p                                               ;
        int (* arrB)[k] = (int (*)[k]) q                                               ;
        int (* arrC)[k] = (int (*)[k]) r                                               ;

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

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

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

D:\[00.Exerciese.2022]\C>
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-11 23:31:23 From FishC Mobile | 显示全部楼层
解答太棒了,我也有此疑问,谢谢。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-10-8 01:22

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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