[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: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> 解答太棒了,我也有此疑问,谢谢。
页:
[1]