《C語(yǔ)言程序設(shè)計(jì)》課件4第9章_第1頁(yè)
《C語(yǔ)言程序設(shè)計(jì)》課件4第9章_第2頁(yè)
《C語(yǔ)言程序設(shè)計(jì)》課件4第9章_第3頁(yè)
《C語(yǔ)言程序設(shè)計(jì)》課件4第9章_第4頁(yè)
《C語(yǔ)言程序設(shè)計(jì)》課件4第9章_第5頁(yè)
已閱讀5頁(yè),還剩95頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論