




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第9章函數(shù)9.1概述9.2自定義函數(shù)9.3函數(shù)的參數(shù)與函數(shù)的值9.4函數(shù)的嵌套調(diào)用9.5函數(shù)的遞歸調(diào)用9.6數(shù)組作為函數(shù)參數(shù)9.7局部變量和全局變量9.8變量的存儲(chǔ)類別9.9案例學(xué)習(xí)
9.1概述
9.1.1引入函數(shù)的優(yōu)點(diǎn)
總的來(lái)講,由于C語(yǔ)言采用了函數(shù)模塊式的結(jié)構(gòu),因此容易實(shí)現(xiàn)結(jié)構(gòu)化程序設(shè)計(jì)。同時(shí)也使程序的層次結(jié)構(gòu)更加清晰,便于程序的編寫(xiě)、閱讀、調(diào)試。具體來(lái)講,C語(yǔ)言程序引入函數(shù)有以下優(yōu)點(diǎn):
(1)避免重復(fù)代碼的編寫(xiě),便于提高程序設(shè)計(jì)的效率。
程序員可以識(shí)別出程序其他部分重復(fù)的指令,將其編寫(xiě)成函數(shù),并且在程序的各個(gè)部分根據(jù)需要調(diào)用該函數(shù),這樣可以極大地避免重復(fù)代碼的編寫(xiě)。
【例9-1】函數(shù)引入實(shí)例。圖9.1例9-1運(yùn)行結(jié)果
(2)層次清楚、結(jié)構(gòu)清晰,便于實(shí)現(xiàn)結(jié)構(gòu)化程序設(shè)計(jì)。
程序員可以將總的任務(wù)分解為功能上相對(duì)獨(dú)立的若干個(gè)子任務(wù),將每一個(gè)子任務(wù)編寫(xiě)為一個(gè)單獨(dú)的函數(shù),然后將它們集成于一個(gè)統(tǒng)一的程序中。每個(gè)函數(shù)完成并經(jīng)過(guò)完整測(cè)試后,可使其與程序的其他部分無(wú)縫耦合,且結(jié)構(gòu)非常清晰。
【例9-2】函數(shù)引入實(shí)例。圖9.2例9-2運(yùn)行結(jié)果
(3)高效、快捷,便于程序的閱讀與調(diào)試及便于多人合作。
一旦一個(gè)函數(shù)完成并且經(jīng)過(guò)測(cè)試后就可以完成預(yù)定的工作。此函數(shù)也可以載入庫(kù)中并且可在完全不同的另段程序中被反復(fù)調(diào)用。這樣既能高效地進(jìn)行各個(gè)功能的測(cè)試,同時(shí)也可以滿足多人同時(shí)編寫(xiě)程序代碼,提高程序設(shè)計(jì)的效率。9.1.2函數(shù)的分類
在C語(yǔ)言中可從不同的角度對(duì)函數(shù)進(jìn)行分類。
(1)從函數(shù)定義的角度看,函數(shù)可分為標(biāo)準(zhǔn)函數(shù)和用戶自定義函數(shù)兩種。
(2)?C語(yǔ)言的函數(shù)兼有其它語(yǔ)言中的函數(shù)和過(guò)程兩種功能,從這個(gè)角度看,又可把函數(shù)分為有返回值函數(shù)和無(wú)返回值函數(shù)兩種。
(3)從主調(diào)函數(shù)和被調(diào)函數(shù)之間數(shù)據(jù)傳送的角度看,函數(shù)又可分為無(wú)參函數(shù)和有參函數(shù)兩種。
(4)C語(yǔ)言提供了極為豐富的標(biāo)準(zhǔn)函數(shù),這些標(biāo)準(zhǔn)函數(shù)又可從功能角度作以下分類:①字符類型函數(shù):
②轉(zhuǎn)換函數(shù):
③目錄路徑函數(shù):
④診斷函數(shù):
⑤圖形函數(shù):
⑥輸入輸出函數(shù):
⑦接口函數(shù):
⑧字符串函數(shù):
⑨內(nèi)存管理函數(shù):
⑩數(shù)學(xué)函數(shù):
日期和時(shí)間函數(shù):用于日期、時(shí)間的轉(zhuǎn)換及操作。
進(jìn)程控制函數(shù):用于進(jìn)程的管理和控制。
其它函數(shù):
9.2自?定?義?函?數(shù)
函數(shù)定義的一般形式可表示如下:
數(shù)據(jù)類型函數(shù)名(參數(shù)1,參數(shù)2)
{
聲明部分;
執(zhí)行部分;
}
【例9-3】函數(shù)調(diào)用實(shí)例。圖9.3例9-3運(yùn)行結(jié)果9.2.1無(wú)參函數(shù)的定義形式
無(wú)參函數(shù)指的是省略了形參的函數(shù),其定義形式為:
類型標(biāo)識(shí)符函數(shù)名()
{
聲明部分
語(yǔ)句
}我們可以改寫(xiě)一個(gè)函數(shù)定義:
01voidHello()
02{
03printf(“Hello,world\n”);
04}
Hello函數(shù)是一個(gè)無(wú)參函數(shù),當(dāng)被其它函數(shù)調(diào)用時(shí),輸出Helloworld字符串。9.2.2有參函數(shù)定義的一般形式
有參函數(shù)指的是帶有形式參數(shù)的函數(shù),其定義形式為:
類型標(biāo)識(shí)符函數(shù)名(形式參數(shù)列表)
{
聲明部分
語(yǔ)句
}例如,定義一個(gè)函數(shù),用于求兩個(gè)數(shù)中的較大數(shù),代碼可寫(xiě)為:
【例9-4】函數(shù)定義實(shí)例。圖9.4例9-4運(yùn)行結(jié)果
【例9-5】以下敘述中正確的是()。
A.構(gòu)成C程序的基本單位是函數(shù)
B.可以在一個(gè)函數(shù)中定義另一個(gè)函數(shù)
C.main()函數(shù)必須放在其它函數(shù)之前
D.所有被調(diào)用函數(shù)一定要放在調(diào)用函數(shù)之前
解析:C語(yǔ)言程序是由函數(shù)組成的,,因此,A選項(xiàng)是正確的??梢栽谝粋€(gè)函數(shù)中調(diào)用另一函數(shù),但在定義時(shí),不能嵌套定義,故B選項(xiàng)是錯(cuò)誤的。main()函數(shù)可放在其它函數(shù)之前,也可以放在其它函數(shù)之后,故C選項(xiàng)是錯(cuò)誤的。被調(diào)函數(shù)可以放在調(diào)用函數(shù)之前,也可以放在調(diào)用函數(shù)之后,如果放在被調(diào)函數(shù)之后,前面一般要對(duì)函數(shù)聲明,故D選項(xiàng)是錯(cuò)誤的。
9.3函數(shù)的參數(shù)與函數(shù)的值
9.3.1形式參數(shù)和實(shí)際參數(shù)
函數(shù)的形參和實(shí)參具有以下特點(diǎn):
(1)形參變量只有在被調(diào)用時(shí)才分配臨時(shí)內(nèi)存單元,在調(diào)用結(jié)束時(shí),立即釋放所分配的臨時(shí)存儲(chǔ)單元。因此,形參只有在函數(shù)內(nèi)部有效,函數(shù)調(diào)用結(jié)束返回主調(diào)函數(shù)后則不能再使用該形參變量。
(2)實(shí)參可以是常量、變量、表達(dá)式、函數(shù)等,無(wú)論實(shí)參是何種類型的量,在進(jìn)行函數(shù)調(diào)用時(shí),它們都必須具有確定的值,以便把這些值傳送給形參。因此應(yīng)預(yù)先用賦值、輸入等辦法使實(shí)參獲得確定值。
(3)實(shí)參和形參在數(shù)量上、類型上、順序上應(yīng)嚴(yán)格一致,否則會(huì)發(fā)生類型不匹配的錯(cuò)誤。
(4)函數(shù)調(diào)用中發(fā)生的數(shù)據(jù)傳送是單向的,即只能把實(shí)參的值傳送給形參,而不能把形參的值反向地傳送給實(shí)參。因此在函數(shù)調(diào)用過(guò)程中,形參的值發(fā)生改變,而實(shí)參中的值不會(huì)變化。圖9.5形參與實(shí)參的傳遞原理【例9-6】形參與實(shí)參的傳遞。9.3.2函數(shù)的返回值
函數(shù)的返回值是指函數(shù)被調(diào)用之后,執(zhí)行函數(shù)體中的程序段所取得的并返回給主調(diào)函數(shù)的值。如調(diào)用正弦函數(shù)取得正弦值,調(diào)用max函數(shù)取得的最大數(shù)等。對(duì)函數(shù)的值(或稱函數(shù)返回值)需要強(qiáng)調(diào)以下方面:
(1)函數(shù)的值只能通過(guò)return語(yǔ)句返回主調(diào)函數(shù)。
return語(yǔ)句的一般形式為:
return表達(dá)式;
或者
return(表達(dá)式);
【例9-7】以下函數(shù)值的類型為()。解析:由于函數(shù)首部省略了數(shù)據(jù)類型,因此系統(tǒng)默認(rèn)為int型,而在函數(shù)體內(nèi)由于返回的是變量s的值,而s的值定義為float,與int型不符,這種情況下以定義類型為準(zhǔn),即返回值為int型。
(2)如函數(shù)值為整型,在函數(shù)定義時(shí)可以省去類型說(shuō)明。
(3)不返回函數(shù)值的函數(shù),可以明確定義為空類型,類型說(shuō)明符為void。如例9-6中函數(shù)s并不向主函數(shù)返函數(shù)值,因此可定義為:一旦函數(shù)被定義為空類型后,就不能在主調(diào)函數(shù)中使用被調(diào)函數(shù)的函數(shù)值了。例如,在定義s為空類型后,在主函數(shù)中寫(xiě)下述語(yǔ)句:
sum=s(n);
就是錯(cuò)誤的。
為了增強(qiáng)程序的可讀性并減少出錯(cuò),凡不要求返回值的函數(shù)都應(yīng)定義為空類型。9.3.3函數(shù)的調(diào)用
1.函數(shù)調(diào)用基本原理
調(diào)用函數(shù)時(shí)要提供函數(shù)的調(diào)用標(biāo)識(shí),然后即可從相應(yīng)的位置開(kāi)始執(zhí)行。當(dāng)編譯器遇到這個(gè)標(biāo)識(shí)時(shí),就會(huì)將控制權(quán)交給函數(shù),然后執(zhí)行函數(shù)體。
2.函數(shù)調(diào)用的一般形式
在程序中是通過(guò)對(duì)函數(shù)的調(diào)用來(lái)執(zhí)行函數(shù)體的,其過(guò)程與其它語(yǔ)言的子程序調(diào)用完全相同。
C語(yǔ)言中,函數(shù)調(diào)用的一般形式為:
函數(shù)名(實(shí)際參數(shù)表)
3.函數(shù)調(diào)用的方式
在C語(yǔ)言中,可以用以下幾種方式調(diào)用函數(shù):
(1)函數(shù)表達(dá)式:函數(shù)作為表達(dá)式中的一項(xiàng)出現(xiàn)在表達(dá)式中,以函數(shù)返回值參與表達(dá)式的運(yùn)算。這種方式要求函數(shù)是有返回值的。
例如:z=max(x,y)是一個(gè)賦值表達(dá)式,把max的返回值賦予變量z。
(2)函數(shù)語(yǔ)句:函數(shù)調(diào)用的一般形式加上分號(hào)即構(gòu)成函數(shù)語(yǔ)句。
例如:printf("%d",a);和scanf("%d",&b);?都是以函數(shù)語(yǔ)句的方式調(diào)用函數(shù)。
(3)函數(shù)實(shí)參:函數(shù)作為另一個(gè)函數(shù)調(diào)用的實(shí)際參數(shù)出現(xiàn)。這種情況是把該函數(shù)的返回值作為實(shí)參進(jìn)行傳送,因此要求該函數(shù)必須是有返回值的。
例如:printf("%d",max(x,y));?即是把max調(diào)用的返回值又作為printf函數(shù)的實(shí)參來(lái)使用的。在函數(shù)調(diào)用中還應(yīng)該注意的一個(gè)問(wèn)題是求值順序的問(wèn)題。所謂求值順序,是指對(duì)實(shí)參表中各量是自左至右使用,還是自右至左使用。對(duì)此,各系統(tǒng)的規(guī)定不一定相同。
【例9-8】函數(shù)調(diào)用實(shí)例。
4.被調(diào)用函數(shù)的聲明和函數(shù)原型
在主調(diào)函數(shù)中調(diào)用某函數(shù)之前應(yīng)對(duì)該被調(diào)函數(shù)進(jìn)行說(shuō)明(聲明),這與使用變量之前要先進(jìn)行變量說(shuō)明是一樣的。在主調(diào)函數(shù)中對(duì)被調(diào)函數(shù)作說(shuō)明的目的是使編譯系統(tǒng)知道被調(diào)函數(shù)返回值的類型,以便在主調(diào)函數(shù)中按此種類型對(duì)返回值作相應(yīng)的處理。
函數(shù)聲明的一般形式為:
類型說(shuō)明符被調(diào)函數(shù)名(類型形參,類型形參,…);
或可以表示為:
類型說(shuō)明符被調(diào)函數(shù)名(類型,類型,…);
9.4函數(shù)的嵌套調(diào)用
9.4.1函數(shù)嵌套調(diào)用的原理
C程序中的函數(shù)定義是互相獨(dú)立的,函數(shù)和函數(shù)之間沒(méi)有從屬關(guān)系,即一個(gè)函數(shù)內(nèi)不允許包含另一個(gè)函數(shù)的定義。C語(yǔ)言不能嵌套定義,但可以嵌套調(diào)用,即在一方函數(shù)調(diào)用另一方函數(shù)的同時(shí),又調(diào)用了第三方函數(shù),其關(guān)系如圖9.6所示。圖9.6函數(shù)嵌套調(diào)用原理9.4.2函數(shù)嵌套調(diào)用實(shí)例
【例9-9】函數(shù)嵌套調(diào)用示例。圖9.7例9-9運(yùn)行結(jié)果
【例9-10】階乘求和,計(jì)算s=1!+2!+3!+…+n!。
9.5函數(shù)的遞歸調(diào)用
9.5.1函數(shù)遞歸調(diào)用原理
一個(gè)函數(shù)在它的函數(shù)體內(nèi)調(diào)用其自身稱為遞歸調(diào)用,這種函數(shù)稱為遞歸函數(shù)。C語(yǔ)言允許函數(shù)的遞歸調(diào)用。在遞歸調(diào)用中,主調(diào)函數(shù)又是被調(diào)函數(shù)。執(zhí)行遞歸函數(shù)將反復(fù)調(diào)用其自身,每調(diào)用一次就進(jìn)入新的一層。
例如,有函數(shù)f如下:
(1)直接遞歸調(diào)用:一個(gè)函數(shù)可直接調(diào)用該函數(shù)本身的情況稱為直接遞歸調(diào)用。例如:
(2)間接遞歸調(diào)用:一個(gè)函數(shù)可間接地調(diào)用該函數(shù)本身的情況稱為間接遞歸調(diào)用。例如:9.5.2函數(shù)遞歸調(diào)用實(shí)例
【例9-11】函數(shù)遞歸調(diào)用的簡(jiǎn)單例子。圖9.8例9-11運(yùn)行結(jié)果
【例9-12】用遞歸法計(jì)算n!。
用遞歸法計(jì)算n!可用下述公式表示:
n!=1
(n=0,1)
n×(n-1)! (n>1)按公式可編程如下:
【例9-13】Hanoi塔問(wèn)題。
一塊板上有三根針A,B,C。A針上套有64個(gè)大小不等的圓盤,大的在下,小的在上?,F(xiàn)要把這64個(gè)圓盤從A針移動(dòng)C針上,每次只能移動(dòng)一個(gè)圓盤,移動(dòng)可以借助B針進(jìn)行。但在任何時(shí)候,任何針上的圓盤都必須保持大盤在下,小盤在上。求移動(dòng)的步驟。本題算法分析如下:設(shè)A上有n個(gè)盤子。
如果n=1,則將圓盤從A直接移動(dòng)到C。
如果n=2,則
(1)將A上的n-1(等于1)個(gè)圓盤移到B上;
(2)將A上的一個(gè)圓盤移到C上;
(3)將B上的n-1(等于1)個(gè)圓盤移到C上。如果n=3,則
(1)將A上的n-1(等于2,令其為n‘)個(gè)圓盤移到B上(借助于C),步驟如下:
①將A上的n’-1(等于1)個(gè)圓盤移到C上;
②將A上的一個(gè)圓盤移到B上;
③將C上的n'-1(等于1)個(gè)圓盤移到B上。
(2)將A上的一個(gè)圓盤移到上C上;
(3)將B上的n-1(等于2,令其為n‘)個(gè)圓盤移到C上(借助A),步驟如下:
①將B上的n’-1(等于1)個(gè)圓盤移到A上;
②將B上的一個(gè)盤子移到C上;
③將A上的n‘-1(等于1)個(gè)圓盤移到C上。
到此,完成了三個(gè)圓盤的移動(dòng)過(guò)程。從上面分析可以看出,當(dāng)n≥2時(shí),移動(dòng)的過(guò)程可分解為三個(gè)步驟:
第一步:把A上的n-1個(gè)圓盤移到B上;
第二步:把A上的一個(gè)圓盤移到C上;
第三步:把B上的n-1個(gè)圓盤移到C上,其中第一步和第三步是一樣的。當(dāng)n=3時(shí),第一步和第三步又分解為類似的三步,即把n'-1個(gè)圓盤從一個(gè)針移到另一個(gè)針上,這里的n'=n-1。顯然這是一個(gè)遞歸過(guò)程,因此代碼可編寫(xiě)如下:圖9.9例9-13運(yùn)行結(jié)果
9.6數(shù)組作為函數(shù)參數(shù)
9.6.1數(shù)組元素作函數(shù)實(shí)參
數(shù)組元素就是下標(biāo)變量,它與普通變量并無(wú)區(qū)別。因此它作為函數(shù)實(shí)參使用與普通變量是完全相同的,在發(fā)生函數(shù)調(diào)用時(shí),把作為實(shí)參的數(shù)組元素的值傳送給形參,實(shí)現(xiàn)單向的值傳送。
【例9-14】判斷一個(gè)整數(shù)數(shù)組中各元素的值,若大于0則輸出該值,若小于等于0則輸出0值。編程如下:9.6.2數(shù)組名作為函數(shù)參數(shù)
用數(shù)組名作函數(shù)參數(shù)與用數(shù)組元素作實(shí)參有幾點(diǎn)不同。
(1)用數(shù)組元素作實(shí)參時(shí),只要數(shù)組類型和函數(shù)的形參變量的類型一致,那么作為下標(biāo)變量的數(shù)組元素的類型也和函數(shù)形參變量的類型是一致的。
(2)在普通變量或下標(biāo)變量作函數(shù)參數(shù)時(shí),形參變量和實(shí)參變量是由編譯系統(tǒng)分配的兩個(gè)不同的內(nèi)存單元。圖9.10函數(shù)值傳遞原理
【例9-15】數(shù)組a中存放了一個(gè)學(xué)生5門課程的成績(jī),求平均成績(jī)。
【例9-16】判斷一個(gè)整數(shù)數(shù)組中各元素的值,若小于0則置為0。
【例9-17】把例9-16修改如下:
(3)在函數(shù)形參表中,允許不給出形參數(shù)組的長(zhǎng)度,或用一個(gè)變量來(lái)表示數(shù)組元素的個(gè)數(shù)。
例如,可以寫(xiě)為:
voidnzp(inta[])
或?qū)憺椋?/p>
voidnzp(inta[],intn)
【例9-18】將例9-16修改如下:
(4)多維數(shù)組也可以作為函數(shù)的參數(shù)。在函數(shù)定義時(shí)對(duì)形參數(shù)組可以指定每一維的長(zhǎng)度,也可省去第一維的長(zhǎng)度。因此,以下寫(xiě)法都是合法的。
intMA(inta[3][10])
或
intMA(inta[][10])
9.7局部變量和全局變量
9.7.1局部變量
局部變量也稱為內(nèi)部變量。局部變量是在函數(shù)內(nèi)作定義說(shuō)明的,其作用域僅限于函數(shù)內(nèi),離開(kāi)該函數(shù)后再使用這種變量是非法的。例如:
【例9-19】變量的作用域。9.7.2全局變量
全局變量也稱為外部變量,它是在函數(shù)外部定義的變量。它不屬于任何一個(gè)函數(shù),它屬于一個(gè)源程序文件,其作用域是從定義開(kāi)始到程序結(jié)束為止。例如:
【例9-20】輸入長(zhǎng)方體的長(zhǎng)寬高l,w,h。求其體積及三個(gè)面的面積。
解析:長(zhǎng)寬高分別用變量l,w,h來(lái)表示,體積及三個(gè)面分別用v,s1,s2,s3
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 天津一汽-用戶投訴與危機(jī)處理培訓(xùn)
- 高鐵血紅蛋白血癥的健康宣教
- 培訓(xùn)總監(jiān)年度總結(jié)
- 侵襲性牙周炎的健康宣教
- 新生兒心肌炎的健康宣教
- 支持人培訓(xùn)課件
- 廣西壯族自治區(qū)貴港市覃塘區(qū)2024屆中考沖刺卷數(shù)學(xué)試題含解析
- 知識(shí)產(chǎn)權(quán)月報(bào)
- 2025外墻保溫合同外墻保溫合同范本
- 空姐禮儀素質(zhì)培訓(xùn)
- 銀行案件防控課件
- 2025年江蘇省安全員B證考試題庫(kù)附答案
- 科級(jí)試用期滿工作總結(jié)(4篇)
- 歷史-安徽省蚌埠市2025屆高三年級(jí)第二次教學(xué)質(zhì)量檢查考試(蚌埠二模)試題和答案
- 2025年浙江省金華市中考一模數(shù)學(xué)模擬試題(含答案)
- 2024年國(guó)家發(fā)展和改革委員會(huì)直屬單位招聘考試真題
- 《中國(guó)古代神話》課件
- 供應(yīng)商考核管理制度
- 酒店動(dòng)火作業(yè)安全制度
- 電纜故障知識(shí)培訓(xùn)課件
評(píng)論
0/150
提交評(píng)論