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

C 語言 4×4 矩陣行列對角線求和:變數未初始化、索引計算錯誤修正

     編輯:程式設計疑難解答

原代碼三大 Bug

  1. 累加變數未初始化:r1,r2,r3,r4,c1,c2,c3,c4,d1,d2 含隨機垃圾值,+= 結果不可預測。
  2. 欄位索引計算錯誤:c3、c4 迴圈仍用 i=0; i<16; i+=4,導致重複累加第 0、4、8、12 欄。
  3. 對角線索引邏輯錯誤:d1 迴圈內 i+=1 破壞外層 i+=4,d2 起始索引、步長、邊界皆錯。

正確索引映射(行優先,0-based)

位置索引公式範例 (4×4)
第 r 列 (0~3)base = r*4, 索引 base .. base+3列 1: 4,5,6,7
第 c 欄 (0~3)索引 c, c+4, c+8, c+12欄 2: 2,6,10,14
主對角線索引 0, 5, 10, 15 (即 i*5)a[0],a[5],a[10],a[15]
副對角線索引 3, 6, 9, 12 (即 3 + i*3)a[3],a[6],a[9],a[12]

修正代碼(C99,含初始化、正確索引、輸出格式)

#include <stdio.h>
#define N 16
int main() {
    int a[N] = {0};
    int r[4] = {0}, c[4] = {0}, d1 = 0, d2 = 0;
    printf("Enter 16 numbers (1-16 any order):\n");
    for (int i = 0; i < N; ++i) {
        if (scanf("%d", &a[i]) != 1) return 1;
    }
    // 輸出矩陣 & 計算列和
    for (int rIdx = 0; rIdx < 4; ++rIdx) {
        for (int cIdx = 0; cIdx < 4; ++cIdx) {
            int idx = rIdx * 4 + cIdx;
            printf("%3d", a[idx]);
            r[rIdx] += a[idx];
            c[cIdx] += a[idx];
            if (rIdx == cIdx) d1 += a[idx];           // 主對角線
            if (rIdx + cIdx == 3) d2 += a[idx];       // 副對角線
        }
        printf("\n");
    }
    printf("Row sums:   %3d %3d %3d %3d\n", r[0], r[1], r[2], r[3]);
    printf("Col sums:   %3d %3d %3d %3d\n", c[0], c[1], c[2], c[3]);
    printf("Diag sums:  %3d %3d\n", d1, d2);
    return 0;
}

關鍵修正點

  • 陣列/變數定義即初始化(= {0}),消除未定義行為。
  • 單一雙層迴圈同時完成列印、列和、欄和、對角線和,索引計算統一、無重複、無遺漏。
  • 對角線判斷用幾何關係:r==c (主)、r+c==N-1 (副),比手算索引公式更不易出錯。
  • 輸出格式 %3d 對齊,視覺清晰。

進階:任意 N×N 矩陣泛化

void print_sums(int *a, int n) {
    vector<int> r(n,0), c(n,0); int d1=0,d2=0;
    for(int i=0;i

總結: 原代碼核心問題是**未初始化**與**索引計算硬編碼錯誤**。改用雙層迴圈統一索引邏輯、定義即初始化、幾何關係判斷對角線,代碼行數減少、正確性大增、易於泛化。

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