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

C語言二維數組行列遍歷錯誤修正:矩陣轉置與平均值計算

     編輯:C 語言問答

原始錯誤代碼

#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

最佳實踐總結

  1. 下標順序口訣:「行優先」—— 外層循環行 i,內層循環列 j,訪問 a[i][j]。
  2. 循環變量作用域最小化:C99 支持 for (int i=...),讓 i/j 僅在循環內可見,避免外洩。
  3. 避免魔術數字:用 const int ROWS=4 或 #define,修改維度只需改一處。
  4. 分離計算與存儲:平均值另存 rowAvg,不擴展原數組,防止越界。
  5. 格式字符串嚴格匹配類型:float/double → %f,int → %d,long long → %lld。

總結

本例暴露了初學者在二維數組遍歷順序、循環變量作用域、數組邊界、格式輸出等多個核心概念上的薄弱環節。通過系統性修正,程序現能正確計算並輸出每行平均分,代碼結構也更清晰、安全、易維護。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved