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

C語言函式參數傳遞與二維陣列:魔方陣驗證程式除錯實錄

     編輯:C 語言問答

問題背景

使用者撰寫程式驗證 5×5 矩陣是否為魔方陣(各行、各列、兩條對角線總和相等),遭遇兩大問題:

  1. 自訂函式 check 無法正確呼叫
  2. 編譯警告 C4715: not all control paths return a value

核心問題分析與修正

問題一:函式原型宣告與定義不一致

// 原始錯誤宣告
int check();

// 正確宣告:二維陣列參數必須指定第二維大小
int check(int score[][5]);  // 或 int check(int (*score)[5]);

原因:C 語言中,陣列作為函式參數會退化為指標。二維陣列 int [5][5] 傳遞時實際類型為 int (*)[5](指向含 5 個 int 陣列的指標),編譯器需要知道「每一列有多少個元素」才能正確計算位址偏移。

問題二:控制路徑缺少回傳值

// 原始有缺陷的 check 函式
int check(int score[][5]) {
    // ... 計算邏輯 ...
    for(i = 0; i < 5; i++) {
        if(sum[i] == s[i] && s[i] == sum1 && sum1 == sum2)
            return 1;
        else
            return 0;  // 第一輪就會 return,根本不會檢查完 5 列!
    }
    // 若迴圈不執行(理論上不會),這裡缺少 return
}

雙重錯誤:

  1. 邏輯錯誤:else return 0 導致只檢查第 0 列就結束。應移除 else,檢查完所有列後再統一回傳。
  2. 路徑缺失:若 for 迴圈不進入(極端情況),函式結束時無 return,觸發 C4715 警告。

修正後的 check 函式

int check(int score[][5]) {
    int i, j;
    int row_sum[5] = {0};   // 各行總和
    int col_sum[5] = {0};   // 各列總和
    int diag1 = 0, diag2 = 0;

    // 計算行、列總和
    for (i = 0; i < 5; i++) {
        for (j = 0; j < 5; j++) {
            row_sum[i] += score[i][j];
            col_sum[j] += score[i][j];
        }
    }

    // 計算對角線總和
    for (i = 0; i < 5; i++) {
        diag1 += score[i][i];         // 主對角線
        diag2 += score[i][4 - i];     // 副對角線
    }

    // 驗證所有行、列、對角線總和是否相等
    int target = row_sum[0];
    for (i = 0; i < 5; i++) {
        if (row_sum[i] != target || col_sum[i] != target)
            return 0;
    }
    if (diag1 != target || diag2 != target)
        return 0;

    return 1;  // 所有檢查通過
}

完整可執行程式碼

#include <stdio.h>

int check(int score[][5]);

int main() {
    int flag;
    int score[5][5] = {
        {17, 24, 1,  8, 15},
        {23, 5,  7, 14, 16},
        {4,  6,  13, 20, 22},
        {10, 12, 19, 21, 3},
        {11, 18, 25, 2,  9}
    };
    int i, j;

    flag = check(score);

    if (flag) {
        printf("此為魔方陣,矩陣內容:\n");
        for (i = 0; i < 5; i++) {
            for (j = 0; j < 5; j++)
                printf("%4d", score[i][j]);
            printf("\n");
        }
    } else {
        printf("非魔方陣\n");
    }
    return 0;
}

// check 函式定義同上...

執行結果

此為魔方陣,矩陣內容:
  17  24   1   8  15
  23   5   7  14  16
   4   6  13  20  22
  10  12  19  21   3
  11  18  25   2   9

關鍵知識點總結

知識點說明
二維陣列參數必須指定第二維大小:int arr[][COLS] 或 int (*arr)[COLS]
C4715 警告函式有非 void 回傳類型,但存在不回傳值的執行路徑
魔方陣定義N×N 矩陣,各行、各列、兩條對角線數字之和皆相等
陣列初始化靜態初始化確保資料正確,避免輸入錯誤

延伸練習

  • 修改程式支援任意 N×N 階魔方陣驗證(動態配置記憶體)
  • 實作魔方陣生成演算法(如暹羅法 Siamese method 適用於奇數階)
  • 加入「可重複數字」檢查,嚴格驗證是否為標準魔方陣(1 到 N² 各出現一次)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved