《高等學校計算機類課程應用型人才培養規劃教材:C語言程序設計》由“入門篇、初級篇、中級篇、提高篇、綜合篇”5部分組成:入門篇是《高等學校計算機類課程應用型人才培養規劃教材:C語言程序設計》的先導部分,讓讀者了解計算的機器、高級語言、C語言的歷史和特點等;初級篇是讓讀者掌握簡單問題的C語言編程,學會把C語言和已有的知識和想法建立關聯,對于簡單問題能由想法寫出代碼;中級篇是讓讀者掌握復雜問題的C語言編程,學會通過算法解決問題,對于復雜的問題能由想法獲得算法,再由算法寫出代碼;提高篇是讓讀者掌握如何寫出高質量的代碼,前面各篇立足于能編出代碼解決問題即可,本篇則讓讀者學會編寫高質量的代碼,在C語言編程上產生由量到質的提升;綜合篇是讓讀者掌握應用領域編程及實用工具的開發過程。《高等學校計算機類課程應用型人才培養規劃教材:C語言程序設計》中以星號(*)開頭的節為知識點的詳細講解,供讀者編程實踐時參考。
書摘/試閱
通過上面的程序我們發現,一個變量的作用范圍有大有小,從大到小依次為:多個代碼文件,本代碼文件,函數,函數中的語句(即從該變量定義語句之后到包含它的最小的復合語句結束)。我們通常把定義在函數外的變量稱為全局變量,而把其他變量稱為局部變量。
大家要注意,變量除了具有作用范圍(即生存的空間),還有生命周期(即生存時間的各個階段)。一個變量(前面加static的變量除外,如static char a;)從代碼的運行進入其作用范圍時出生,直到代碼的運行跑出其作用范圍時消亡。我們知道代碼是可以循環運行的,因此在程序運行時一個變量可能會不斷出生和消亡(對應的是變量的存儲空間不斷被分配和釋放)。全局變量以及定義時加static的變量(局部變量也可以加static),其生命周期為程序的整個運行期間(即變量所分配的存儲空間在程序的整個運行期間都不釋放)。
因此,我們在編寫程序時,要盡量讓每個變量定義在合適的范圍。這樣,同名的變量也不會相互沖突。雖然我們可以讓每個變量的作用范圍都是最大(即多個代碼文件),但這樣的程序即使能完成需要的功能但卻不是一個好的程序。實際上,我們把每個變量的定義限制在合適的范圍,就減少了程序各段代碼之間的耦合,程序的可維護性也就更好。
6.1.2服務的概念與函數的使用
我們可以讓整個程序只有main函數而沒有其他任何一個函數,這樣的程序一樣能夠完成功能,但結構卻不好。代碼之間和社會一樣可以有分工合作,在C語言中是通過函數實現的。一個函數為一個程序片斷,它通過約定好的接ISl為其他代碼提供服務。例如,我們的main可以非常簡單,但在main中我們卻調用了多個其他的函數。這樣程序就按照其功能分為了多個模塊,各模塊之間相互獨立,而又可以通過調用實現合作。在C語言中,每個函數都是平等的,一個函數可以為各個函數提供服務。
通過使用函數,我們的程序不僅在內部之間有明確的分工(這樣的代碼可讀性更好,也更容易維護),而且我們還可以把自己的函數輸出供別的程序使用。
那么,如何識別程序中的函數呢?我們編寫的是一個完成信息處理的程序,即對問題的輸入進行處理后產生問題的輸出。在其信息處理中,一定會包含若干個具有單一功能的信息處理模塊:它們完成單一的數據處理,不僅在本程序中包含,將來也能供以后的程序或別人的程序所使用,這就是函數。因此,你要做的就是找出這些單一的功能模塊,把它們從你的代碼中獨立出來,變成一個個的函數。這樣,我們的代碼就成為一個由若干單一數據處理模塊構成的積木結構,而積木的頂層就是main函數。這些積木之間是服務的關系,每個積木都可能調用其他積木實現自己的功能,正如術業有專攻一樣。
以3.1.3節判斷一個數是否為素數的第1個程序為例。在該程序中,對一個數進行處理獲得是否為素數的功能可以獨立出來作為一個函數,供main函數調用,前者只判斷素數,其他的功能則留給別的函數去做(如與用戶的交互)。