|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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;
}
本帖最后由 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>
|
|