首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C 語言矩陣轉置:陣列索引錯誤與輸出邏輯修正

     編輯:程式設計綜合問答

原始程式碼問題分析

int a[2][3], b[3][2], i, j;

// 輸入 2x3 矩陣
for (i = 0; i < 2; i++) {
    for (j = 0; j < 3; j++)
        scanf("%d", &a[i][j]);
    printf("\n");
}

// 轉置存入 b[3][2]
for (i = 0; i < 3; i++) {
    for (j = 0; j < 2; j++) {
        b[i][j] = a[j][i];      // ✅ 正確:轉置邏輯
        printf("%2d", b[i][j]); // ❌ 原碼印 a[i][j] 導致越界/錯誤
    }
    printf("\n");
}

核心錯誤

原始碼在輸出迴圈中使用 printf("%2d", a[i][j]),但此時 i 範圍 0~2、j 範圍 0~1,而 a 宣告為 a[2][3],導致:

  • a[2][0], a[2][1] 存取越界 (第二維索引 2 超出 0~1)
  • 即使不越界,印的是原矩陣 a 而非轉置後的 b

修正版本

#include 
#include 

int main() {
    int a[2][3], b[3][2];
    int i, j;

    printf("請輸入 2x3 矩陣 (共 6 個整數):\n");
    for (i = 0; i < 2; i++) {
        for (j = 0; j < 3; j++) {
            if (scanf("%d", &a[i][j]) != 1) {
                fprintf(stderr, "輸入錯誤\n");
                return 1;
            }
        }
    }

    // 矩陣轉置:a[2][3] -> b[3][2]
    for (i = 0; i < 3; i++) {
        for (j = 0; j < 2; j++) {
            b[i][j] = a[j][i];
        }
    }

    printf("\n轉置後的 3x2 矩陣:\n");
    for (i = 0; i < 3; i++) {
        for (j = 0; j < 2; j++) {
            printf("%4d", b[i][j]);  // ✅ 印轉置結果 b
        }
        printf("\n");
    }

    system("pause");
    return 0;
}

矩陣轉置核心概念

  • 原矩陣維度 M x N,轉置後為 N x M。
  • 元素對應關係:b[i][j] = a[j][i] (行列互換)。
  • 方陣 (M=N) 可原地轉置 (in-place),非方陣需額外空間。

進階:動態記憶體分配版本

void transpose(int **src, int **dst, int rows, int cols) {
    for (int i = 0; i < cols; i++)
        for (int j = 0; j < rows; j++)
            dst[i][j] = src[j][i];
}

// 呼叫範例
int **a = malloc(rows * sizeof(int*));
for (int i=0;i

常見錯誤避雷指南

錯誤類型錯誤代碼正確寫法說明
索引順序反b[j][i] = a[i][j]b[i][j] = a[j][i]目標矩陣索引對應來源行列互換
迴圈邊界錯i<2, j<3 (轉置時)i<3, j<2轉置後維度互換,迴圈邊界要跟著換
輸出錯誤變數printf a[i][j]printf b[i][j]轉置結果存在 b,要印 b
方陣原地轉置雙重迴圈全交換只交換上三角j>i 避免重複交換回原狀
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved