輸入 n (1≤n≤6) 及 n×n 矩陣,判斷是否為上三角矩陣 (主對角線以下元素皆為 0)。原始代碼存在**陣列下標越界、迴圈邏輯反向、輸出重複**三大問題。
int a[6][6];
for(i=1; i<=n; i++) { // ❌ 1-based 索引,n=6 時 a[6][6] 越界 (合法 0~5)
for(j=1; j<=n; j++) scanf("%d", &a[i][j]);
}
for(i=1; i<=n; i++) {
for(j=n; j>=i; j--) { // ❌ 條件錯誤:應檢查 j < i (主對角線以下)
if (a[i][j] = 0) { // ❌ 單一等號 = 賦值,非比較 ==
printf("NO"); break;
} else printf("YES"); // ❌ 每個元素都輸出一次,應整體判斷後單一輸出
}
}
#include
#include
int main() {
int n, i, j;
int a[6][6] = {0}; // 初始化為 0
printf("Input n: ");
if (scanf("%d", &n) != 1 || n < 1 || n > 6) {
printf("Invalid n\n");
return 1;
}
printf("Input array:\n");
// ✅ 0-based 索引
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
scanf("%d", &a[i][j]);
}
}
// ✅ 判斷邏輯:主對角線以下 (行 > 列) 必須為 0
bool isUpper = true;
for (i = 0; i < n; i++) {
for (j = 0; j < i; j++) { // j < i 即主對角線以下
if (a[i][j] != 0) { // ✅ 使用 != 比較
isUpper = false;
break;
}
}
if (!isUpper) break;
}
// ✅ 單一輸出
printf("%s\n", isUpper ? "YES" : "NO");
return 0;
}
| 問題 | 原寫法 | 修正 | 影響 |
|---|---|---|---|
| 陣列下標 | 1-based (1~n) | 0-based (0~n-1) | 避免越界未定義行為 |
| 判斷區域 | j >= i (含對角線及以上) | j < i (嚴格主對角線以下) | 符合上三角矩陣定義 |
| 比較運算子 | `=` (賦值) | `!=` (不等於) | 邏輯正確性 |
| 輸出控制 | 迴圈內每次輸出 | 旗標法,迴圈後單一輸出 | 輸出格式正確 |
| 布林型別 | 無 | stdbool.h + bool | 語意清晰、可攜性佳 |
Input n: 3
Input array:
1 2 3
0 4 5
0 0 6
Output: YES
Input n: 3
Input array:
1 2 3
4 5 6
7 8 9
Output: NO (a[1][0]=4 ≠ 0)
int **a = malloc(n * sizeof(int*));
for (i = 0; i < n; i++) a[i] = calloc(n, sizeof(int));
// ... 判斷邏輯相同 ...
for (i = 0; i < n; i++) free(a[i]);
free(a);
C 語言矩陣題核心陷阱:**0-based 索引、正確判斷區域、賦值 vs 比較、單一輸出**。養成「先寫邊界、再寫邏輯、最後驗證輸出」習慣,即可避開 90% 陣列操作錯誤。