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