首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C語言動態二維陣列實現矩陣乘法計算器

     編輯:關於C語言

需求分析

編寫程式模擬矩陣乘法:輸入一個 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;
}

記憶體管理關鍵點

  1. 分級釋放:先釋放每行 free((*arr)[i]),再釋放行指標陣列 free(*arr)。
  2. 置空防野指標:釋放後將指標設為 NULL,避免重複釋放或誤用。
  3. 錯誤檢查:實際專案中應檢查 malloc 返回值,分配失敗時優雅退出。

擴展建議

  • 支援非方陣相乘(m×n × n×p → m×p)
  • 加入矩陣轉置、行列式計算功能
  • 使用 calloc 替代 malloc+memset 簡化代碼
  • 封裝為結構體 Matrix {int** data; int rows, cols;} 提高可維護性
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved