C 語言以其模組化設計聞名,函數與陣列是構建程式架構的兩大基石。雖然無法像經典教科書那般面面俱到,但透過淺顯易懂的方式切入,對初學者建立正確觀念仍大有裨益。
幾乎所有 C 教材都專門開闢章節講解函數,可見其重要性。當初學者嘗試撰寫百行以上的程式時,往往會被數不清的變數與錯綜複雜的邏輯搞得暈頭轉向。此時,將大型程式拆解為多個獨立的功能模組(函數)便成了必然選擇。C 語言中的所有函數都是平行關係,彼此獨立定義,不允許巢狀定義,這種設計讓程式結構更清晰,不僅方便開發者維護,也利於團隊協作與程式碼閱讀。
形式參數 是定義函數時括號內的變數名稱;實際參數 是呼叫函數時傳入的具體值(可為常數、變數或運算式)。兩者類型必須相容,且在被呼叫函數中必須明確宣告形式參數的型態。
#include <stdio.h>
int print_add(int x, int y); // 函數原型宣告
int main() {
int a, b, c;
scanf("%d%d", &a, &b);
c = print_add(a, b); // a、b 為實際參數
printf("the add is :%d", c);
return 0;
}
int print_add(int x, int y) { // x、y 為形式參數
int z = x + y;
return z;
}
掌握參數傳遞機制,是撰寫可重用、可維護程式碼的基礎。
陣列是一組擁有相同名稱與資料型態的儲存單元。引用特定元素時,需指定陣列名稱與索引值(從 0 開始)。
int c[3] = {1, 2, 3}; // 宣告同時初始化
for (int i = 0; i <= 2; i++)
printf("%5d", c[i]);
電腦依據元素型態與個數配置記憶體。初始化值個數不得超過陣列大小。字元陣列常用於儲存字串。
透過前置處理器指令 #define SIZE 3 定義符號常數,修改陣列大小只需更改一處,極大提升程式彈性與可維護性。注意:巨集定義不屬於 C 語言本身,結尾不加分號,慣例以大寫命名以區別於變數。
冒泡排序透過相鄰元素兩兩比較、交換,將較大(或較小)元素逐步「浮」至陣列末端。以下為完整範例:
#include <stdio.h>
#define SIZE 10
int main() {
int a[SIZE] = {2,6,4,8,10,12,89,68,45,37};
int i, pass, hold;
printf("Data items in original order\n");
for (i = 0; i <= SIZE-1; i++) printf("%4d", a[i]);
for (pass = 1; pass <= SIZE-1; pass++)
for (i = 0; i <= SIZE-2; i++)
if (a[i] > a[i+1]) {
hold = a[i];
a[i] = a[i+1];
a[i+1] = hold;
}
printf("\nData items in ascending order\n");
for (i = 0; i <= SIZE-1; i++) printf("%4d", a[i]);
printf("\n");
return 0;
}
二維陣列擁有兩個下標:第一個代表列,第二個代表行,切勿顛倒。宣告時可初始化,若某列初始值不足,剩餘元素自動補零。編譯器需要知道第二個下標(行數)以計算記憶體位移,第一個下標可省略。
經典的魔方陣生成演算法(如下)展示了二維陣列的強大應用:
#define N 5
void setmagic(int [][N]);
void outmagic(int [][N]);
int main() {
int s[N][N] = {0};
setmagic(s);
outmagic(s);
return 0;
}
void setmagic(int s[][N]) {
int i = 0, j = N / 2, k = 1;
s[i][j] = k++;
while (k <= N*N) {
int tryi = i - 1, tryj = j - 1;
if (tryi == -1) tryi += N;
if (tryj == -1) tryj += N;
if (s[tryi][tryj] != 0 || (tryi == -1 && tryj == -1))
i = i + 1;
else { i = tryi; j = tryj; }
s[i][j] = k++;
}
}
void outmagic(int s[][N]) {
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) printf("%4d", s[i][j]);
printf("\n");
}
}
執行結果將輸出一個 5×5 的魔方陣,每行、每列、對角線總和皆相同。
函數與陣列是 C 語言程式設計的核心支柱。建議初學者配合經典教材(如譚浩強《C 語言程式設計》或 Deitel《C How to Program》)系統學習,並多動手實作。若有疑問歡迎來信交流:ck0243@sina.com。