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

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

第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變量的存儲類別9.9案例學習

9.1概述

9.1.1引入函數(shù)的優(yōu)點

總的來講,由于C語言采用了函數(shù)模塊式的結(jié)構(gòu),因此容易實現(xiàn)結(jié)構(gòu)化程序設(shè)計。同時也使程序的層次結(jié)構(gòu)更加清晰,便于程序的編寫、閱讀、調(diào)試。具體來講,C語言程序引入函數(shù)有以下優(yōu)點:

(1)避免重復代碼的編寫,便于提高程序設(shè)計的效率。

程序員可以識別出程序其他部分重復的指令,將其編寫成函數(shù),并且在程序的各個部分根據(jù)需要調(diào)用該函數(shù),這樣可以極大地避免重復代碼的編寫。

【例9-1】函數(shù)引入實例。圖9.1例9-1運行結(jié)果

(2)層次清楚、結(jié)構(gòu)清晰,便于實現(xiàn)結(jié)構(gòu)化程序設(shè)計。

程序員可以將總的任務分解為功能上相對獨立的若干個子任務,將每一個子任務編寫為一個單獨的函數(shù),然后將它們集成于一個統(tǒng)一的程序中。每個函數(shù)完成并經(jīng)過完整測試后,可使其與程序的其他部分無縫耦合,且結(jié)構(gòu)非常清晰。

【例9-2】函數(shù)引入實例。圖9.2例9-2運行結(jié)果

(3)高效、快捷,便于程序的閱讀與調(diào)試及便于多人合作。

一旦一個函數(shù)完成并且經(jīng)過測試后就可以完成預定的工作。此函數(shù)也可以載入庫中并且可在完全不同的另段程序中被反復調(diào)用。這樣既能高效地進行各個功能的測試,同時也可以滿足多人同時編寫程序代碼,提高程序設(shè)計的效率。9.1.2函數(shù)的分類

在C語言中可從不同的角度對函數(shù)進行分類。

(1)從函數(shù)定義的角度看,函數(shù)可分為標準函數(shù)和用戶自定義函數(shù)兩種。

(2)?C語言的函數(shù)兼有其它語言中的函數(shù)和過程兩種功能,從這個角度看,又可把函數(shù)分為有返回值函數(shù)和無返回值函數(shù)兩種。

(3)從主調(diào)函數(shù)和被調(diào)函數(shù)之間數(shù)據(jù)傳送的角度看,函數(shù)又可分為無參函數(shù)和有參函數(shù)兩種。

(4)C語言提供了極為豐富的標準函數(shù),這些標準函數(shù)又可從功能角度作以下分類:①字符類型函數(shù):

②轉(zhuǎn)換函數(shù):

③目錄路徑函數(shù):

④診斷函數(shù):

⑤圖形函數(shù):

⑥輸入輸出函數(shù):

⑦接口函數(shù):

⑧字符串函數(shù):

⑨內(nèi)存管理函數(shù):

⑩數(shù)學函數(shù):

日期和時間函數(shù):用于日期、時間的轉(zhuǎn)換及操作。

進程控制函數(shù):用于進程的管理和控制。

其它函數(shù):

9.2自?定?義?函?數(shù)

函數(shù)定義的一般形式可表示如下:

數(shù)據(jù)類型函數(shù)名(參數(shù)1,參數(shù)2)

{

聲明部分;

執(zhí)行部分;

}

【例9-3】函數(shù)調(diào)用實例。圖9.3例9-3運行結(jié)果9.2.1無參函數(shù)的定義形式

無參函數(shù)指的是省略了形參的函數(shù),其定義形式為:

類型標識符函數(shù)名()

{

聲明部分

語句

}我們可以改寫一個函數(shù)定義:

01voidHello()

02{

03printf(“Hello,world\n”);

04}

Hello函數(shù)是一個無參函數(shù),當被其它函數(shù)調(diào)用時,輸出Helloworld字符串。9.2.2有參函數(shù)定義的一般形式

有參函數(shù)指的是帶有形式參數(shù)的函數(shù),其定義形式為:

類型標識符函數(shù)名(形式參數(shù)列表)

{

聲明部分

語句

}例如,定義一個函數(shù),用于求兩個數(shù)中的較大數(shù),代碼可寫為:

【例9-4】函數(shù)定義實例。圖9.4例9-4運行結(jié)果

【例9-5】以下敘述中正確的是()。

A.構(gòu)成C程序的基本單位是函數(shù)

B.可以在一個函數(shù)中定義另一個函數(shù)

C.main()函數(shù)必須放在其它函數(shù)之前

D.所有被調(diào)用函數(shù)一定要放在調(diào)用函數(shù)之前

解析:C語言程序是由函數(shù)組成的,,因此,A選項是正確的??梢栽谝粋€函數(shù)中調(diào)用另一函數(shù),但在定義時,不能嵌套定義,故B選項是錯誤的。main()函數(shù)可放在其它函數(shù)之前,也可以放在其它函數(shù)之后,故C選項是錯誤的。被調(diào)函數(shù)可以放在調(diào)用函數(shù)之前,也可以放在調(diào)用函數(shù)之后,如果放在被調(diào)函數(shù)之后,前面一般要對函數(shù)聲明,故D選項是錯誤的。

9.3函數(shù)的參數(shù)與函數(shù)的值

9.3.1形式參數(shù)和實際參數(shù)

函數(shù)的形參和實參具有以下特點:

(1)形參變量只有在被調(diào)用時才分配臨時內(nèi)存單元,在調(diào)用結(jié)束時,立即釋放所分配的臨時存儲單元。因此,形參只有在函數(shù)內(nèi)部有效,函數(shù)調(diào)用結(jié)束返回主調(diào)函數(shù)后則不能再使用該形參變量。

(2)實參可以是常量、變量、表達式、函數(shù)等,無論實參是何種類型的量,在進行函數(shù)調(diào)用時,它們都必須具有確定的值,以便把這些值傳送給形參。因此應預先用賦值、輸入等辦法使實參獲得確定值。

(3)實參和形參在數(shù)量上、類型上、順序上應嚴格一致,否則會發(fā)生類型不匹配的錯誤。

(4)函數(shù)調(diào)用中發(fā)生的數(shù)據(jù)傳送是單向的,即只能把實參的值傳送給形參,而不能把形參的值反向地傳送給實參。因此在函數(shù)調(diào)用過程中,形參的值發(fā)生改變,而實參中的值不會變化。圖9.5形參與實參的傳遞原理【例9-6】形參與實參的傳遞。9.3.2函數(shù)的返回值

函數(shù)的返回值是指函數(shù)被調(diào)用之后,執(zhí)行函數(shù)體中的程序段所取得的并返回給主調(diào)函數(shù)的值。如調(diào)用正弦函數(shù)取得正弦值,調(diào)用max函數(shù)取得的最大數(shù)等。對函數(shù)的值(或稱函數(shù)返回值)需要強調(diào)以下方面:

(1)函數(shù)的值只能通過return語句返回主調(diào)函數(shù)。

return語句的一般形式為:

return表達式;

或者

return(表達式);

【例9-7】以下函數(shù)值的類型為()。解析:由于函數(shù)首部省略了數(shù)據(jù)類型,因此系統(tǒng)默認為int型,而在函數(shù)體內(nèi)由于返回的是變量s的值,而s的值定義為float,與int型不符,這種情況下以定義類型為準,即返回值為int型。

(2)如函數(shù)值為整型,在函數(shù)定義時可以省去類型說明。

(3)不返回函數(shù)值的函數(shù),可以明確定義為空類型,類型說明符為void。如例9-6中函數(shù)s并不向主函數(shù)返函數(shù)值,因此可定義為:一旦函數(shù)被定義為空類型后,就不能在主調(diào)函數(shù)中使用被調(diào)函數(shù)的函數(shù)值了。例如,在定義s為空類型后,在主函數(shù)中寫下述語句:

sum=s(n);

就是錯誤的。

為了增強程序的可讀性并減少出錯,凡不要求返回值的函數(shù)都應定義為空類型。9.3.3函數(shù)的調(diào)用

1.函數(shù)調(diào)用基本原理

調(diào)用函數(shù)時要提供函數(shù)的調(diào)用標識,然后即可從相應的位置開始執(zhí)行。當編譯器遇到這個標識時,就會將控制權(quán)交給函數(shù),然后執(zhí)行函數(shù)體。

2.函數(shù)調(diào)用的一般形式

在程序中是通過對函數(shù)的調(diào)用來執(zhí)行函數(shù)體的,其過程與其它語言的子程序調(diào)用完全相同。

C語言中,函數(shù)調(diào)用的一般形式為:

函數(shù)名(實際參數(shù)表)

3.函數(shù)調(diào)用的方式

在C語言中,可以用以下幾種方式調(diào)用函數(shù):

(1)函數(shù)表達式:函數(shù)作為表達式中的一項出現(xiàn)在表達式中,以函數(shù)返回值參與表達式的運算。這種方式要求函數(shù)是有返回值的。

例如:z=max(x,y)是一個賦值表達式,把max的返回值賦予變量z。

(2)函數(shù)語句:函數(shù)調(diào)用的一般形式加上分號即構(gòu)成函數(shù)語句。

例如:printf("%d",a);和scanf("%d",&b);?都是以函數(shù)語句的方式調(diào)用函數(shù)。

(3)函數(shù)實參:函數(shù)作為另一個函數(shù)調(diào)用的實際參數(shù)出現(xiàn)。這種情況是把該函數(shù)的返回值作為實參進行傳送,因此要求該函數(shù)必須是有返回值的。

例如:printf("%d",max(x,y));?即是把max調(diào)用的返回值又作為printf函數(shù)的實參來使用的。在函數(shù)調(diào)用中還應該注意的一個問題是求值順序的問題。所謂求值順序,是指對實參表中各量是自左至右使用,還是自右至左使用。對此,各系統(tǒng)的規(guī)定不一定相同。

【例9-8】函數(shù)調(diào)用實例。

4.被調(diào)用函數(shù)的聲明和函數(shù)原型

在主調(diào)函數(shù)中調(diào)用某函數(shù)之前應對該被調(diào)函數(shù)進行說明(聲明),這與使用變量之前要先進行變量說明是一樣的。在主調(diào)函數(shù)中對被調(diào)函數(shù)作說明的目的是使編譯系統(tǒng)知道被調(diào)函數(shù)返回值的類型,以便在主調(diào)函數(shù)中按此種類型對返回值作相應的處理。

函數(shù)聲明的一般形式為:

類型說明符被調(diào)函數(shù)名(類型形參,類型形參,…);

或可以表示為:

類型說明符被調(diào)函數(shù)名(類型,類型,…);

9.4函數(shù)的嵌套調(diào)用

9.4.1函數(shù)嵌套調(diào)用的原理

C程序中的函數(shù)定義是互相獨立的,函數(shù)和函數(shù)之間沒有從屬關(guān)系,即一個函數(shù)內(nèi)不允許包含另一個函數(shù)的定義。C語言不能嵌套定義,但可以嵌套調(diào)用,即在一方函數(shù)調(diào)用另一方函數(shù)的同時,又調(diào)用了第三方函數(shù),其關(guān)系如圖9.6所示。圖9.6函數(shù)嵌套調(diào)用原理9.4.2函數(shù)嵌套調(diào)用實例

【例9-9】函數(shù)嵌套調(diào)用示例。圖9.7例9-9運行結(jié)果

【例9-10】階乘求和,計算s=1!+2!+3!+…+n!。

9.5函數(shù)的遞歸調(diào)用

9.5.1函數(shù)遞歸調(diào)用原理

一個函數(shù)在它的函數(shù)體內(nèi)調(diào)用其自身稱為遞歸調(diào)用,這種函數(shù)稱為遞歸函數(shù)。C語言允許函數(shù)的遞歸調(diào)用。在遞歸調(diào)用中,主調(diào)函數(shù)又是被調(diào)函數(shù)。執(zhí)行遞歸函數(shù)將反復調(diào)用其自身,每調(diào)用一次就進入新的一層。

例如,有函數(shù)f如下:

(1)直接遞歸調(diào)用:一個函數(shù)可直接調(diào)用該函數(shù)本身的情況稱為直接遞歸調(diào)用。例如:

(2)間接遞歸調(diào)用:一個函數(shù)可間接地調(diào)用該函數(shù)本身的情況稱為間接遞歸調(diào)用。例如:9.5.2函數(shù)遞歸調(diào)用實例

【例9-11】函數(shù)遞歸調(diào)用的簡單例子。圖9.8例9-11運行結(jié)果

【例9-12】用遞歸法計算n!。

用遞歸法計算n!可用下述公式表示:

n!=1

(n=0,1)

n×(n-1)! (n>1)按公式可編程如下:

【例9-13】Hanoi塔問題。

一塊板上有三根針A,B,C。A針上套有64個大小不等的圓盤,大的在下,小的在上。現(xiàn)要把這64個圓盤從A針移動C針上,每次只能移動一個圓盤,移動可以借助B針進行。但在任何時候,任何針上的圓盤都必須保持大盤在下,小盤在上。求移動的步驟。本題算法分析如下:設(shè)A上有n個盤子。

如果n=1,則將圓盤從A直接移動到C。

如果n=2,則

(1)將A上的n-1(等于1)個圓盤移到B上;

(2)將A上的一個圓盤移到C上;

(3)將B上的n-1(等于1)個圓盤移到C上。如果n=3,則

(1)將A上的n-1(等于2,令其為n‘)個圓盤移到B上(借助于C),步驟如下:

①將A上的n’-1(等于1)個圓盤移到C上;

②將A上的一個圓盤移到B上;

③將C上的n'-1(等于1)個圓盤移到B上。

(2)將A上的一個圓盤移到上C上;

(3)將B上的n-1(等于2,令其為n‘)個圓盤移到C上(借助A),步驟如下:

①將B上的n’-1(等于1)個圓盤移到A上;

②將B上的一個盤子移到C上;

③將A上的n‘-1(等于1)個圓盤移到C上。

到此,完成了三個圓盤的移動過程。從上面分析可以看出,當n≥2時,移動的過程可分解為三個步驟:

第一步:把A上的n-1個圓盤移到B上;

第二步:把A上的一個圓盤移到C上;

第三步:把B上的n-1個圓盤移到C上,其中第一步和第三步是一樣的。當n=3時,第一步和第三步又分解為類似的三步,即把n'-1個圓盤從一個針移到另一個針上,這里的n'=n-1。顯然這是一個遞歸過程,因此代碼可編寫如下:圖9.9例9-13運行結(jié)果

9.6數(shù)組作為函數(shù)參數(shù)

9.6.1數(shù)組元素作函數(shù)實參

數(shù)組元素就是下標變量,它與普通變量并無區(qū)別。因此它作為函數(shù)實參使用與普通變量是完全相同的,在發(fā)生函數(shù)調(diào)用時,把作為實參的數(shù)組元素的值傳送給形參,實現(xiàn)單向的值傳送。

【例9-14】判斷一個整數(shù)數(shù)組中各元素的值,若大于0則輸出該值,若小于等于0則輸出0值。編程如下:9.6.2數(shù)組名作為函數(shù)參數(shù)

用數(shù)組名作函數(shù)參數(shù)與用數(shù)組元素作實參有幾點不同。

(1)用數(shù)組元素作實參時,只要數(shù)組類型和函數(shù)的形參變量的類型一致,那么作為下標變量的數(shù)組元素的類型也和函數(shù)形參變量的類型是一致的。

(2)在普通變量或下標變量作函數(shù)參數(shù)時,形參變量和實參變量是由編譯系統(tǒng)分配的兩個不同的內(nèi)存單元。圖9.10函數(shù)值傳遞原理

【例9-15】數(shù)組a中存放了一個學生5門課程的成績,求平均成績。

【例9-16】判斷一個整數(shù)數(shù)組中各元素的值,若小于0則置為0。

【例9-17】把例9-16修改如下:

(3)在函數(shù)形參表中,允許不給出形參數(shù)組的長度,或用一個變量來表示數(shù)組元素的個數(shù)。

例如,可以寫為:

voidnzp(inta[])

或?qū)憺椋?/p>

voidnzp(inta[],intn)

【例9-18】將例9-16修改如下:

(4)多維數(shù)組也可以作為函數(shù)的參數(shù)。在函數(shù)定義時對形參數(shù)組可以指定每一維的長度,也可省去第一維的長度。因此,以下寫法都是合法的。

intMA(inta[3][10])

intMA(inta[][10])

9.7局部變量和全局變量

9.7.1局部變量

局部變量也稱為內(nèi)部變量。局部變量是在函數(shù)內(nèi)作定義說明的,其作用域僅限于函數(shù)內(nèi),離開該函數(shù)后再使用這種變量是非法的。例如:

【例9-19】變量的作用域。9.7.2全局變量

全局變量也稱為外部變量,它是在函數(shù)外部定義的變量。它不屬于任何一個函數(shù),它屬于一個源程序文件,其作用域是從定義開始到程序結(jié)束為止。例如:

【例9-20】輸入長方體的長寬高l,w,h。求其體積及三個面的面積。

解析:長寬高分別用變量l,w,h來表示,體積及三個面分別用v,s1,s2,s3

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論