#include <stdio.h>
void main() {
int i, j;
float sum = 0;
float s[4][4] = {{71,81,54,72},{73,74,75,76},{76,78,79,75}}; // 只有 3 行數據
for(i=0; i<4; i++) {
for(j=0; j<4; j++) {
sum = sum + s[j][i]; // 下標顛倒:按列累加而非按行
}
s[j][4] = sum/3; // j 循環結束後 j=4,越界;且列索引 4 超出定義寬度 4
}
for(i=0; i<4; i++) {
printf("pingjun=%d\n", s[j][4]); // j 未更新,格式符 %d 不匹配 float
}
}
| 錯誤點 | 現象 | 原因 | 修正 |
|---|---|---|---|
| 數組初始化行數不足 | 第 4 行全 0 | 只提供 3 行初始化器,C 規定剩餘元素自動初始化為 0 | 補全第 4 行數據或改為 [3][4] |
| 雙層循環下標顛倒 | 統計的是「列和」而非「行和」 | s[j][i] 以列為主序遍歷 | 改為 s[i][j] 按行累加 |
| 內層循環變量外洩 | s[j][4] 寫入越界內存 | 內層 for(j...) 結束後 j==4,外層繼續用此值 | 用獨立變量記錄列索引,或在內層循環內完成賦值 |
| 數組越界訪問 | 未定義行為,可能崩潰 | 數組定義 [4][4],合法列索引 0-3,[4] 越界 | 擴大數組至 [4][5] 存平均值,或用單獨數組 |
| 輸出格式符錯誤 | 打印亂碼 | %d 對應 int,實際是 float | 改用 %f 或 %.2f |
#include <stdio.h>
int main() {
const int ROWS = 4, COLS = 4;
float s[ROWS][COLS] = {
{71, 81, 54, 72},
{73, 74, 75, 76},
{76, 78, 79, 75},
{80, 82, 84, 86} // 補全第 4 行
};
float rowAvg[ROWS];
// 1. 計算每行平均值
for (int i = 0; i < ROWS; i++) {
float sum = 0;
for (int j = 0; j < COLS; j++) {
sum += s[i][j]; // 正確:按行累加
}
rowAvg[i] = sum / COLS; // 存入獨立數組
}
// 2. 輸出結果
for (int i = 0; i < ROWS; i++) {
printf("第 %d 行平均分 = %.2f\n", i+1, rowAvg[i]);
}
return 0;
}
第 1 行平均分 = 69.50
第 2 行平均分 = 74.50
第 3 行平均分 = 77.00
第 4 行平均分 = 83.00
i,內層循環列 j,訪問 a[i][j]。for (int i=...),讓 i/j 僅在循環內可見,避免外洩。const int ROWS=4 或 #define,修改維度只需改一處。rowAvg,不擴展原數組,防止越界。float/double → %f,int → %d,long long → %lld。本例暴露了初學者在二維數組遍歷順序、循環變量作用域、數組邊界、格式輸出等多個核心概念上的薄弱環節。通過系統性修正,程序現能正確計算並輸出每行平均分,代碼結構也更清晰、安全、易維護。