巨同升
摘要:采用傳統(tǒng)的“解釋法”講解c語(yǔ)言函數(shù)的編寫方法,不利于學(xué)習(xí)者的理解和掌握。采用“分解法”和“改寫法”,則可以比較好地解決傳統(tǒng)方法的不足,收到良好的教學(xué)效果。
關(guān)鍵詞:解釋法;分解法改寫法
中圖分類號(hào):G642 文獻(xiàn)標(biāo)識(shí)碼:A
文章編號(hào):1009-3044(2019)30-0110-03
1概述
在c語(yǔ)言中函數(shù)是程序的基本構(gòu)成要素,是編程時(shí)頻繁使用的程序單位,其重要性是不言而喻的。但是從教學(xué)效果方面來看,多數(shù)學(xué)生對(duì)于函數(shù)的理解掌握并不理想。有的學(xué)生雖然能夠用單獨(dú)的main函數(shù)完成程序,但是要分解為幾個(gè)函數(shù),就會(huì)感覺無從下手。
這其中有C語(yǔ)言自身特點(diǎn)的客觀原因,比如C語(yǔ)言的函數(shù)同時(shí)包含了大多數(shù)編程語(yǔ)言中子程序和函數(shù)這兩種程序單位的功能,在一定程度上提高了編寫函數(shù)的難度。另一方面也有來自教材和教學(xué)方法方面的原因。綜觀絕大多數(shù)C語(yǔ)言程序設(shè)計(jì)教材,在講述如何定義一個(gè)函數(shù)時(shí),往往都是采用“解釋法”。也就是直接將函數(shù)寫出來,然后再做分析解釋。至于這個(gè)函數(shù)是如何寫出來的、為什么這么寫,則鮮有分析說明。從而給學(xué)習(xí)者造成一種神秘、無章可循的感覺。
從講授者的角度,或許覺得這樣編寫函數(shù)是理所當(dāng)然的,無需更多的解釋,或者只可意會(huì),不可言傳。其實(shí)如何定義一個(gè)函數(shù)也是有其內(nèi)在規(guī)律的,甚至可以像數(shù)學(xué)公式那樣一步一步地推導(dǎo)出來。這就要求講授者能夠發(fā)現(xiàn)并歸納出其中的內(nèi)在規(guī)律并傳授給學(xué)生。學(xué)生一旦有了編寫函數(shù)的依據(jù),再來編寫函數(shù)也就不再感覺神秘、無章可循了。
下面就來介紹兩種行之有效的編寫函數(shù)的方法:分解法和改寫法。
2分解法
所謂分解法,就是首先將整個(gè)程序的功能用一個(gè)獨(dú)立main函數(shù)實(shí)現(xiàn),然后再將這個(gè)main函數(shù)分解為主調(diào)函數(shù)和被調(diào)函數(shù)。
為了便于理解,我們將無參函數(shù)和有參函數(shù)的定義和調(diào)用的方法分開來介紹。
2.1無參函數(shù)的定義和調(diào)用
例1.編寫程序,打印出如下圖形。
首先,我們編寫一個(gè)只有main函數(shù)的程序來實(shí)現(xiàn)上述功能。
我們發(fā)現(xiàn),在這個(gè)程序中打印三角形的程序段重復(fù)了兩次,但是也不方便將這兩段合并為一個(gè)新的循環(huán)。因此,為了提高編程效率,避免重復(fù),在本程序中可以將打印三角形的程序段單獨(dú)拿出來,定義為一個(gè)函數(shù),然后在主函數(shù)中調(diào)用它。
如何寫出打印三角形的函數(shù)呢?只需要用對(duì)應(yīng)的程序段,添加上return語(yǔ)句作為函數(shù)體,然后再添加函數(shù)頭就可以了。
此處的printstar是自定義函數(shù)的名字。函數(shù)名之前的void是函數(shù)的類型,void也稱為空值類型,表示該函數(shù)沒有返回值。當(dāng)函數(shù)體中的return之后直接跟分號(hào)時(shí),函數(shù)類型就應(yīng)該定義為void類型。return語(yǔ)句的功能,是返回到主調(diào)函數(shù)中繼續(xù)執(zhí)行。
由于這個(gè)函數(shù)運(yùn)行時(shí),不需要從主調(diào)函數(shù)中傳遞數(shù)據(jù),因此它是一個(gè)無參函數(shù),也就是函數(shù)名之后有一對(duì)空括號(hào)。
一旦定義好了用戶函數(shù),就可以像調(diào)用庫(kù)函數(shù)那樣調(diào)用它了。因?yàn)榍懊嬉呀?jīng)定義好了打印一個(gè)三角形的被調(diào)函數(shù),故可以在主函數(shù)中直接調(diào)用它。由于函數(shù)printstar沒有返回值,因此不能在表達(dá)式中調(diào)用它;而只能在函數(shù)調(diào)用之后添加分號(hào),使其成為一條語(yǔ)句,即printstar()。
在該程序中,求階乘的程序段重復(fù)了三次,但是觀察這三段程序,發(fā)現(xiàn)并不能簡(jiǎn)單地將它們合并為一個(gè)新的循環(huán)。
為了提高編程效率,避免重復(fù),在該程序中可以將求k的階乘的程序段單獨(dú)拿出來,定義為一個(gè)被調(diào)函數(shù),然后在主函數(shù)中調(diào)用它。
根據(jù)在例1中獲得的經(jīng)驗(yàn),構(gòu)造被調(diào)函數(shù)的方法是以相應(yīng)的程序段添加return語(yǔ)句作為函數(shù)體,然后再添加函數(shù)頭即可。按照這個(gè)方法,可以得到如下被調(diào)函數(shù)。
當(dāng)我們運(yùn)行該程序時(shí)可以發(fā)現(xiàn),主函數(shù)中變量k的值并不能傳遞給被調(diào)函數(shù)中的變量k,被調(diào)函數(shù)中變量p的值也不能傳遞給主函數(shù)中的變量p。這是因?yàn)榉彩窃诤瘮?shù)內(nèi)部定義的變量都是局部變量,而局部變量只有在定義它的函數(shù)中才是有效的。因此,這兩個(gè)函數(shù)中的變量k是兩個(gè)相互獨(dú)立、互不相關(guān)的變量;變量p也一樣。
那么,如何才能實(shí)現(xiàn)主調(diào)函數(shù)與被調(diào)函數(shù)之間的數(shù)據(jù)傳遞呢?為了解決這個(gè)問題,在C語(yǔ)言中提供了參數(shù)傳遞和返回值的機(jī)制。
一方面,將被調(diào)函數(shù)中用于接受數(shù)據(jù)的變量的定義,移到函數(shù)首部的括號(hào)中,稱為被調(diào)函數(shù)的形式參數(shù)(形參)。這種函數(shù)運(yùn)行時(shí),將通過形參從主調(diào)函數(shù)中傳遞數(shù)據(jù),故稱為有參函數(shù)。
另一方面,將被調(diào)函數(shù)中用來向主調(diào)函數(shù)傳遞數(shù)據(jù)的變量(或表達(dá)式)置于return之后,稱為被調(diào)函數(shù)的返回值。
函數(shù)名前邊的類型說明符,稱為函數(shù)的類型,通常與return之后變量(或表達(dá)式)的類型相一致。
一旦定義好了求階乘的被調(diào)函數(shù),就可以像調(diào)用庫(kù)函數(shù)那樣來調(diào)用它了。因此,我們很容易編寫出調(diào)用該函數(shù)求組合值的主函數(shù)。
3改寫法
除了采用上面的分解法編寫函數(shù)之外,也可以采用改寫法。所謂改寫法,就是首先編寫一個(gè)能夠?qū)崿F(xiàn)被調(diào)函數(shù)基本功能的main函數(shù),然后再將這個(gè)main函數(shù)改寫為被調(diào)函數(shù)。
例3.已知一個(gè)圓環(huán)的內(nèi)外半徑,要求編寫一個(gè)求圓面積的被調(diào)函數(shù),然后調(diào)用該函數(shù)求出圓環(huán)的面積。
然后再將上述主函數(shù)改寫為被調(diào)函數(shù)。改寫的方法就是將原程序中需要輸入的變量改為形參,將原程序中需要輸出的變量(或表達(dá)式)改為函數(shù)的返回值。從而得到如下被調(diào)函數(shù)。