編寫程式模擬矩陣乘法:輸入一個 m×n 矩陣 A 與一個 n×m 矩陣 B,輸出 m×m 結果矩陣 C。矩陣維度運行時確定,必須使用動態記憶體分配。
矩陣 C 的第 i 行第 j 列元素:
C[i][j] = Σ (A[i][k] × B[k][j]) ,k=0..n-1
即 A 第 i 行與 B 第 j 列對應元素乘積之和。
dynamic_arr(int*** arr, int rows, int cols):分配二維陣列並歸零input_arr(int*** arr, int rows, int cols):讀取用戶輸入並顯示矩陣free_arr(int*** arr, int rows):釋放二維陣列記憶體product_matrix(int m, int n):協調整個乘法流程void dynamic_arr(int*** arr, int m, int n) {
int i;
*arr = (int**)malloc(sizeof(int*) * m); // 分配行指標陣列
for (i = 0; i < m; i++) {
(*arr)[i] = (int*)malloc(sizeof(int) * n); // 每行分配列空間
memset((*arr)[i], 0, sizeof(int) * n); // 歸零初始化
}
}
使用三級指標 int*** 使函數能修改主調函數的二級指標變數。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void product_matrix(int m, int n);
void dynamic_arr(int*** arr, int m, int n);
void input_arr(int*** arr, int m, int n);
void free_arr(int*** arr, int x);
int main() {
int m, n;
printf("請輸入 m, n(以逗號分隔):\n");
scanf("%d,%d", &m, &n);
product_matrix(m, n);
return 0;
}
void product_matrix(int m, int n) {
int i, x, y, sum;
int **arr_a, **arr_b, **arr_res;
input_arr(&arr_a, m, n); // 讀取 m×n 矩陣 A
input_arr(&arr_b, n, m); // 讀取 n×m 矩陣 B
dynamic_arr(&arr_res, m, m); // 分配 m×m 結果矩陣
printf("矩陣相乘結果為:\n");
for (x = 0; x < m; x++) {
for (y = 0; y < m; y++) {
sum = 0;
for (i = 0; i < n; i++) {
sum += arr_a[x][i] * arr_b[i][y];
}
arr_res[x][y] = sum;
printf("%5d", arr_res[x][y]);
}
printf("\n");
}
free_arr(&arr_a, m);
free_arr(&arr_b, n);
free_arr(&arr_res, m);
}
void dynamic_arr(int*** arr, int m, int n) {
int i;
*arr = (int**)malloc(sizeof(int*) * m);
for (i = 0; i < m; i++) {
(*arr)[i] = (int*)malloc(sizeof(int) * n);
memset((*arr)[i], 0, sizeof(int) * n);
}
}
void input_arr(int*** arr, int m, int n) {
int i, j;
dynamic_arr(arr, m, n);
printf("請輸入 %d 個整數(按行優先):\n", m * n);
for (i = 0; i < m; i++) {
for (j = 0; j < n; j++) {
scanf("%d", &(*arr)[i][j]);
}
}
printf("輸入的矩陣:\n");
for (i = 0; i < m; i++) {
for (j = 0; j < n; j++) {
printf("%5d", (*arr)[i][j]);
}
printf("\n");
}
printf("\n");
}
void free_arr(int*** arr, int x) {
int i;
for (i = 0; i < x; i++) {
free((*arr)[i]);
(*arr)[i] = NULL;
}
free(*arr);
*arr = NULL;
}
free((*arr)[i]),再釋放行指標陣列 free(*arr)。NULL,避免重複釋放或誤用。malloc 返回值,分配失敗時優雅退出。calloc 替代 malloc+memset 簡化代碼Matrix {int** data; int rows, cols;} 提高可維護性