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] (行列互換)。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 避免重複交換回原狀 |