魔方陣(Magic Square)是經典算法練習:N×N 矩陣填入 1..N²,使每行、每列、兩條對角線和相等。本文實現奇數階魔方陣的經典「暹羅法」(Siamese method),並詳述 Linux 下 GCC 編譯、警告選項、GDB 調試全流程。
N²。
#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;
}
gcc -Wall -g magic.c -o magic
-Wall:開啟所有常見警告(未初始化變量、格式串不匹配、隱式聲明等),必加。-g:嵌入DWARF 調試信息,讓 GDB 能映射源碼行號、變量名、調用棧。調試必加。-o magic:指定輸出可執行文件名,否則預設 a.out。# 開發階段:嚴格警告視為錯誤
gcc -Wall -Wextra -Werror -g -O0 magic.c -o magic
# 發布階段:優化 + 保留符號表(可選)
gcc -O2 -g magic.c -o magic
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 # 退出
for(i = 1; i <= m; i+ COLOR: #0000cc">+) → i++(原文 HTML 殘留導致語法錯誤)。for(j = 1; j <= m: j++) → j++(冒號應為分號)。system("clear") 需 #include <stdlib.h>。[31][31] 防越界。輸入: 3 輸出: 8 1 6 3 5 7 4 9 2 行和/列和/對角線和 = 15 ✓
奇數階魔方陣的暹羅法邏輯清晰、無需回溯、時間空間均 O(N²),是算法入門佳例。配合 gcc -Wall -g 編譯與 GDB 調試,能快速定位邊界條件、索引越界、邏輯分支錯誤。掌握「編譯警告全開 + 調試信息全保留 + 單步跟蹤驗證」這套 Linux C 開發基本功,比任何 IDE 自動補全都更能提升代碼質量。