需求
编写程序模拟矩阵乘法,一个m*n的矩阵,乘以一个 n*m 的矩阵, 并且输出结果。
STEP 1 矩阵乘法的计算
一个m行n列的矩阵与一个n行p列的矩阵可以相乘,得到的结果是一个m行p列的矩阵。
其中乘积矩阵的第i行第j列位置上的数,为第一个矩阵第i行上的n个数与第二个矩阵第j列上的n个数对应相乘后所得的n个乘积之和。
STEP 2 编程思路
(1)需申请动态二维数组存储两个参与运算的矩阵以及一个结果矩阵;
(2)手动输入两个参与运算的矩阵;
(3)调用函数实习矩阵乘法的计算 并输出结果;
(4)释放动态数组占用的内存。
STEP 3 要点整理
(1)参与运算的矩阵为手动输入数据,无法预先知道二维数组的大小,所以需申请动态数组;
(2)因为m*n矩阵和n*m矩阵不一定是方阵(即行数和列数相等),因此在申请动态数组时需要定义两个参数,分别控制行、列的长度,否则运行时会出现数组越界的报错。
-----------------------------------------华丽丽的分割线---------------------------------代码君要出场了-----------------------------------
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4
5 void product_matrix(int m, int n); 6 void dynamic_arr(int*** arr, int m, int n); 7 void input_arr(int*** arr, int m, int n); 8 void free_arr(int*** arr, int x); 9
10 int main() 11 { 12 int m, n; 13
14 printf("请输入m,n:\n"); 15 scanf("%d,%d", &m, &n); 16 product_matrix(m, n); 17
18 return 0; 19 } 20
21 void product_matrix(int m, int n) 22 { 23 int i, x, y, sum; 24 int** arr_a; 25 int** arr_b; 26 int** arr_res; 27
28 input_arr(&arr_a, m, n); 29 input_arr(&arr_b, n, m); 30 dynamic_arr(&arr_res, m, m); 31
32 printf("矩阵相乘的结果为:\n"); 33 for(x = 0; x < m; x++) 34 { 35 for(y = 0; y < m; y++) 36 { 37 sum = 0; 38 for(i = 0; i < n; i++) 39 { 40 sum = sum + arr_a[x][i] * arr_b[i][y]; 41 } 42 arr_res[x][y] = sum; 43 printf("%5d", arr_res[x][y]); 44 } 45 printf("\n"); 46 } 47
48 free_arr(&arr_a, m); 49 free_arr(&arr_b, n); 50 free_arr(&arr_res, m); 51 } 52
53 void dynamic_arr(int*** arr, int m, int n) //申请动态数组
54 { 55 int i; 56 *arr = (int **)malloc(sizeof(int *) * m); 57
58 for(i = 0; i < m; i++) 59 { 60 (*arr)[i] = (int *)malloc(sizeof(int) * n); 61 memset((*arr)[i], 0, sizeof(int) * n); 62 } 63 } 64
65 void input_arr(int*** arr, int m, int n) //输入数组
66 { 67 int i, j; 68
69 dynamic_arr(arr, m, n); 70
71 printf("请输入%d个整数:\n", m * n); 72 for(i = 0; i < m; i++) 73 { 74 for(j = 0; j < n; j++) 75 scanf("%d", &(*arr)[i][j]); 76 } 77
78 printf("输出数组:\n"); 79 for(i = 0; i < m; i++) 80 { 81 for(j = 0; j < n; j++) 82 printf("%5d", (*arr)[i][j]); 83 printf("\n"); 84 } 85 printf("\n"); 86 } 87
88 void free_arr(int*** arr, int x) //释放占用的内存
89 { 90 int i; 91
92 for(i = 0; i < x; i++) 93 { 94 free((*arr)[i]); 95 (*arr)[i] = 0; 96 } 97
98 free(*arr); 99 *arr = 0; 100 }
欢迎转载,请备注原始连接http://www.cnblogs.com/liuliuliu/p/3757714.html,并注明转载。
作者bibibi_liuliu,联系方式395985239@qq.com