人類在處理一些複雜的問題時,通常會采用分而治之的策略,把一個大的問題分成若幹小的子問題來解決。麵對一個複雜的問題,在程序設計過程中通常采用類似的方法,將原問題分解成若幹個易於求解的小問題,每一個小問題都用一個功能獨立的程序模塊來處理。這些功能獨立的模塊,在C語言中通過函數來實現。函數是C語言程序的基本模塊,通過對函數模塊的調用實現特定的功能,實際開發的程序往往由多個函數組成。
C語言使用函數具有兩個主要優點。第一,提高代碼的重用性,避免重複編寫不必要的代碼。例如在程序中需要多次使用某種特定的功能,隻需要編寫一個函數即可,程序需要的時候可以調用該函數,避免了大量的重複的代碼段,提高了程序的開發效率。第二,符合模塊化設計的思想,使程序的層次結構清晰,便於程序的編寫、閱讀、調試。例如,假設想編寫一個實現以下功能的程序:
[例81]讀入一個幼兒園兒童的身高,求出此幼兒園兒童的平均身高。
#include
#defineSIZE50
voidmain()
{
floatlist[SIZE];
read(list,SIZE);
average(list,SIZE);
}
其中read函數、average函數的實現細節需要你自己編寫。
在C語言中,可以從多個角度對函數進行分類。從函數定義的角度看,函數可分為庫函數和用戶自定義函數兩種。
(1)庫函數:是係統自身提供的函數,用戶不必定義就可以直接調用,調用時隻需在程序前麵包含有該函數原型的頭文件,如printf、scanf、getchar、putchar等函數均屬此類。C語言提供了極為豐富的庫函數,有字符類型分類函數、轉換類函數、目錄路徑類函數、診斷類函數、圖形類函數、輸入輸出類函數、接口類函數、字符串類函數、內存管理類函數、數學類函數、日期和時間類函數等。
(2)用戶自定義函數:由用戶編寫的函數。用戶自定義函數,除了在程序中定義函數本身,還要在主調函數模塊中對該被調函數進行必要的類型說明,才能使用。
另外根據函數是否有返回值,C語言的函數分為有返回值函數和無返回值函數兩種。
(1)有返回值函數:此類函數被調用執行完後將會返回一個執行結果(稱為函數返回值),如abs函數即屬於此類函數。如果用戶自己定義的需要有返回函數值的函數,則必須在函數定義和函數說明中明確返回值的類型。
(2)無返回值函數:此類函數調用執行完成後不返回函數值。由於函數無須返回值,用戶在定義此類函數時可指定它的返回值為“空類型”,空類型的說明符為“void”。
函數一般需先定義,然後才能被調用。函數的定義有兩種方式:無參函數和有參函數。
1.無參函數的定義形式
類型標識符函數名()
{說明部分
語句
……
}
其中的類型標識符和函數名稱為函數頭部。類型標識符用來說明此函數的返回值類型,該類型標識符與前麵介紹的各種說明符相同,函數的返回值類型默認是int型(當函數的返回值類型為int型時,類型標識符“int”可以省略)。函數名是由用戶自定義的標識符,為了提高程序的可讀性,建議將函數命名為一個見名知意的名字來反映該函數的功能。函數名後要有一個空括號,其中無參數,但括號不可省略。