編寫程序模擬矩陣乘法,一個m*n的矩陣,乘以一個 n*m 的矩陣, 並且輸出結果。
一個m行n列的矩陣與一個n行p列的矩陣可以相乘,得到的結果是一個m行p列的矩陣。
其中乘積矩陣的第i行第j列位置上的數,為第一個矩陣第i行上的n個數與第二個矩陣第j列上的n個數對應相乘後所得的n個乘積之和。
(1)需申請動態二維數組存儲兩個參與運算的矩陣以及一個結果矩陣;
(2)手動輸入兩個參與運算的矩陣;
(3)調用函數實習矩陣乘法的計算 並輸出結果;
(4)釋放動態數組占用的內存。
(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 }