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

Linux C 編程:奇數階魔方陣生成算法與 GCC 編譯調試全流程

     編輯:關於C語言

魔方陣(Magic Square)是經典算法練習:N×N 矩陣填入 1..N²,使每行、每列、兩條對角線和相等。本文實現奇數階魔方陣的經典「暹羅法」(Siamese method),並詳述 Linux 下 GCC 編譯、警告選項、GDB 調試全流程。

算法核心:暹羅法(針對奇數 N)

  1. 將 1 放在第一行中間列。
  2. 下一個數嘗試放在「右上」方格(行-1,列+1)。
  3. 越界環狀處理:行 < 1 → 移至最後一行;列 > N → 移至第一列。
  4. 目標格已佔 → 改為「下移兩行、左移一列」(即原位置正下方兩格)。
  5. 重複至填滿 N²。

完整代碼:magic.c


#include 
#include 

int main() {
    int a[31][31]; // 支援最大 30 階
    int m, n, i, j, p = 0;

    // 輸入驗證:非零奇數且 ≤ 30
    while (p == 0) {
        system("clear");
        printf("請輸入不大於 30 的奇數: ");
        if (scanf("%d", &m) != 1) { while(getchar()!='\n'); continue; }
        if (m != 0 && m <= 30 && m % 2 != 0) break;
    }

    // 初始化歸零
    for (i = 1; i <= m; ++i)
        for (j = 1; j <= m; ++j)
            a[i][j] = 0;

    // 暹羅法核心
    i = 1; j = m / 2 + 1; // 第一行中間(1-based)
    a[i][j] = 1;

    for (n = 2; n <= m * m; ++n) {
        int ni = i - 1, nj = j + 1; // 右上

        // 邊界環狀
        if (ni < 1 && nj > m) { ni += 2; nj -= 1; } // 右上角特殊:下兩行、左一列
        else {
            if (ni < 1) ni = m;
            if (nj > m) nj = 1;
        }

        // 衝突處理
        if (a[ni][nj] == 0) {
            i = ni; j = nj;
        } else {
            i += 2; j -= 1; // 原位置下兩行、左一列
        }
        a[i][j] = n;
    }

    // 輸出
    system("clear");
    printf("這個數的魔方陣是:\n");
    for (i = 1; i <= m; ++i) {
        for (j = 1; j <= m; ++j)
            printf("%4d", a[i][j]);
        putchar('\n');
    }
    return 0;
}

Linux GCC 編譯與調試指南

1. 基礎編譯

gcc -Wall -g magic.c -o magic
  • -Wall:開啟所有常見警告(未初始化變量、格式串不匹配、隱式聲明等),必加。
  • -g:嵌入DWARF 調試信息,讓 GDB 能映射源碼行號、變量名、調用棧。調試必加。
  • -o magic:指定輸出可執行文件名,否則預設 a.out。

2. 進階警告與優化

# 開發階段:嚴格警告視為錯誤
gcc -Wall -Wextra -Werror -g -O0 magic.c -o magic

# 發布階段:優化 + 保留符號表(可選)
gcc -O2 -g magic.c -o magic

3. GDB 基本調試流程


gdb ./magic
(gdb) break main          # 在 main 入口斷點
(gdb) run                 # 運行程序
(gdb) n / next            # 單步執行(不進函數)
(gdb) s / step            # 單步進入函數
(gdb) p m                 # 打印變量 m
(gdb) p a[1][1]           # 打印矩陣元素
(gdb) watch a[5][5]       # 監視變量變化
(gdb) bt                  # 查看調用棧
(gdb) q                   # 退出

4. 常見編譯錯誤修正(原代碼問題)

  • for(i = 1; i <= m; i+ COLOR: #0000cc">+) → i++(原文 HTML 殘留導致語法錯誤)。
  • for(j = 1; j <= m: j++) → j++(冒號應為分號)。
  • system("clear") 需 #include <stdlib.h>。
  • 陣列下標從 1 起,C 慣用 0 起,但算法邏輯 1-based 較清晰,保留即可,注意分配 [31][31] 防越界。

算法驗證:3 階魔方陣

輸入: 3
輸出:
   8   1   6
   3   5   7
   4   9   2
行和/列和/對角線和 = 15 ✓

總結

奇數階魔方陣的暹羅法邏輯清晰、無需回溯、時間空間均 O(N²),是算法入門佳例。配合 gcc -Wall -g 編譯與 GDB 調試,能快速定位邊界條件、索引越界、邏輯分支錯誤。掌握「編譯警告全開 + 調試信息全保留 + 單步跟蹤驗證」這套 Linux C 開發基本功,比任何 IDE 自動補全都更能提升代碼質量。

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