第五章函數(shù)C語(yǔ)言_第1頁(yè)
第五章函數(shù)C語(yǔ)言_第2頁(yè)
第五章函數(shù)C語(yǔ)言_第3頁(yè)
第五章函數(shù)C語(yǔ)言_第4頁(yè)
第五章函數(shù)C語(yǔ)言_第5頁(yè)
已閱讀5頁(yè),還剩85頁(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)介

1、C C 程程 序序 設(shè)設(shè) 計(jì)計(jì)一個(gè)程序應(yīng)當(dāng)是輕盈的、靈活的,它的子程一個(gè)程序應(yīng)當(dāng)是輕盈的、靈活的,它的子程序就像一串珍珠一樣連接著。它的精神和意序就像一串珍珠一樣連接著。它的精神和意圖應(yīng)該貫穿始終。在程序中,內(nèi)容既不應(yīng)太圖應(yīng)該貫穿始終。在程序中,內(nèi)容既不應(yīng)太多,也不應(yīng)太少;既不應(yīng)該有不需要的循環(huán)多,也不應(yīng)太少;既不應(yīng)該有不需要的循環(huán)結(jié)構(gòu),也不該有冗余的變量;既不缺乏結(jié)構(gòu)結(jié)構(gòu),也不該有冗余的變量;既不缺乏結(jié)構(gòu)性,又不過(guò)分僵化。性,又不過(guò)分僵化。 - Geoffrey James- Geoffrey James的的編程之道編程之道 模塊化程序設(shè)計(jì)模塊化程序設(shè)計(jì)第第5章章 函數(shù)函數(shù)E5.1 函數(shù)的定

2、義函數(shù)的定義 5.2 函數(shù)的調(diào)用函數(shù)的調(diào)用 5.3 函數(shù)的聲明函數(shù)的聲明 5.4 函數(shù)參數(shù)的傳值函數(shù)參數(shù)的傳值 5.5 嵌套調(diào)用和嵌套調(diào)用和遞歸調(diào)用遞歸調(diào)用 5.6 變量的使用范圍和存儲(chǔ)類別變量的使用范圍和存儲(chǔ)類別一個(gè)一個(gè)C C程序可由一個(gè)主函數(shù)和若干個(gè)其他程序可由一個(gè)主函數(shù)和若干個(gè)其他函數(shù)(子函數(shù))構(gòu)成。函數(shù)(子函數(shù))構(gòu)成。由主函數(shù)調(diào)用其他由主函數(shù)調(diào)用其他函數(shù)函數(shù), , 其他函數(shù)也可以互相調(diào)用其他函數(shù)也可以互相調(diào)用, , 但不能但不能調(diào)用主函數(shù)。調(diào)用主函數(shù)。函數(shù)分類函數(shù)分類從用戶角度從用戶角度 標(biāo)準(zhǔn)函數(shù)(庫(kù)函數(shù)):由系統(tǒng)提供標(biāo)準(zhǔn)函數(shù)(庫(kù)函數(shù)):由系統(tǒng)提供 用戶自定義函數(shù)用戶自定義函數(shù)從函數(shù)形

3、式從函數(shù)形式無(wú)參函數(shù)無(wú)參函數(shù) 有參函數(shù)有參函數(shù)函數(shù)原型函數(shù)原型int abs(int _X)1、函數(shù)功能、函數(shù)功能求絕對(duì)值求絕對(duì)值2、函數(shù)參數(shù)的數(shù)目、類型、順序、函數(shù)參數(shù)的數(shù)目、類型、順序、意義意義1個(gè)個(gè)int類型的參數(shù),表示對(duì)此參數(shù)類型的參數(shù),表示對(duì)此參數(shù)求絕對(duì)值求絕對(duì)值3、函數(shù)返回值類型、意義、函數(shù)返回值類型、意義int類型的返回值,表示取絕對(duì)值類型的返回值,表示取絕對(duì)值之后的結(jié)果之后的結(jié)果4、使用時(shí)所需要包含的頭文件、使用時(shí)所需要包含的頭文件math.h有一道數(shù)學(xué)題目:有三個(gè)未知數(shù)有一道數(shù)學(xué)題目:有三個(gè)未知數(shù)a,b,c,其中其中c = f(a,b) = a+b; 函數(shù)定義的一般形式函數(shù)定

4、義的一般形式函數(shù)類型,即:函數(shù)值(或者稱函數(shù)類型,即:函數(shù)值(或者稱為函數(shù)的因變量)的類型。為函數(shù)的因變量)的類型。缺省表示缺省表示int型型,無(wú)返回值無(wú)返回值void函數(shù)類型函數(shù)類型 函數(shù)名函數(shù)名(類型類型1 形式參數(shù)形式參數(shù)1, 類型類型2 形式參數(shù)形式參數(shù)2,.)說(shuō)明部分說(shuō)明部分語(yǔ)句部分語(yǔ)句部分函數(shù)首部或函數(shù)頭函數(shù)首部或函數(shù)頭函數(shù)體函數(shù)體int f(int a, int b)int s; s = a + b; return s;用合法標(biāo)識(shí)符命名,用合法標(biāo)識(shí)符命名,最好見(jiàn)名知意最好見(jiàn)名知意簡(jiǎn)稱形參,指函數(shù)中的自變量,是從函數(shù)外部向函數(shù)簡(jiǎn)稱形參,指函數(shù)中的自變量,是從函數(shù)外部向函數(shù)內(nèi)部運(yùn)送值

5、的數(shù)據(jù)通道??筛鶕?jù)需要有內(nèi)部運(yùn)送值的數(shù)據(jù)通道??筛鶕?jù)需要有0 0到多個(gè)。定義到多個(gè)。定義時(shí)每個(gè)形參都應(yīng)指出各自的類型。時(shí)每個(gè)形參都應(yīng)指出各自的類型。 變量說(shuō)明部分主要是定義運(yùn)算所需要的變量。因?yàn)檫@變量說(shuō)明部分主要是定義運(yùn)算所需要的變量。因?yàn)檫@些變量在函數(shù)內(nèi)部定義,又稱為局部變量。只在函數(shù)些變量在函數(shù)內(nèi)部定義,又稱為局部變量。只在函數(shù)內(nèi)部使用有效,不能在函數(shù)外部使用。內(nèi)部使用有效,不能在函數(shù)外部使用。語(yǔ)句部分主要是利用已定義的變量進(jìn)行運(yùn)算,得到結(jié)果。語(yǔ)句部分主要是利用已定義的變量進(jìn)行運(yùn)算,得到結(jié)果。函數(shù)最終需要得到一個(gè)結(jié)果時(shí),末尾會(huì)寫函數(shù)最終需要得到一個(gè)結(jié)果時(shí),末尾會(huì)寫return return

6、 語(yǔ)句。語(yǔ)句。否則可以不寫返回語(yǔ)句,此時(shí)函數(shù)類型應(yīng)寫為否則可以不寫返回語(yǔ)句,此時(shí)函數(shù)類型應(yīng)寫為voidvoid。returnreturn是從函數(shù)內(nèi)部向外部傳送值的數(shù)據(jù)通道是從函數(shù)內(nèi)部向外部傳送值的數(shù)據(jù)通道1. 1. 一個(gè)函數(shù)中可有多個(gè)一個(gè)函數(shù)中可有多個(gè)returnreturn語(yǔ)句。語(yǔ)句。2. return2. return語(yǔ)句后面可以是變量、常量、表達(dá)式,可以用小語(yǔ)句后面可以是變量、常量、表達(dá)式,可以用小括號(hào)將它括起來(lái)。括號(hào)將它括起來(lái)。3. 3. 若無(wú)若無(wú)returnreturn語(yǔ)句,遇語(yǔ)句,遇“”時(shí),程序自動(dòng)返回調(diào)用函數(shù)時(shí),程序自動(dòng)返回調(diào)用函數(shù)4. 4. 函數(shù)類型最好與函數(shù)類型最好與retu

7、rnreturn語(yǔ)句返回的值類型保持一致。若語(yǔ)句返回的值類型保持一致。若不一致,函數(shù)結(jié)果以函數(shù)類型為準(zhǔn),由不一致,函數(shù)結(jié)果以函數(shù)類型為準(zhǔn),由C C編譯系統(tǒng)自動(dòng)完成編譯系統(tǒng)自動(dòng)完成類型轉(zhuǎn)換。類型轉(zhuǎn)換?!纠?.1】用用C程序函數(shù)實(shí)現(xiàn)數(shù)學(xué)函數(shù)程序函數(shù)實(shí)現(xiàn)數(shù)學(xué)函數(shù)f的功能。的功能。 將數(shù)學(xué)函數(shù)將數(shù)學(xué)函數(shù)f (a , b)對(duì)應(yīng)寫為對(duì)應(yīng)寫為C程序函數(shù):程序函數(shù):int f(int a, int b) /*定義函數(shù)定義函數(shù)f, 形式參數(shù)形式參數(shù)a,b為整型為整型*/ /*函數(shù)函數(shù)f的開始的開始*/ int s; /*聲明部分聲明部分,定義本函數(shù)中用到的變量定義本函數(shù)中用到的變量s*/s = a + b;

8、/*語(yǔ)句部分,運(yùn)算求和結(jié)果放入語(yǔ)句部分,運(yùn)算求和結(jié)果放入s中中*/ return s; /*將將s的值返回給函數(shù)的值返回給函數(shù)f,即,即: f(a,b) = s; */ /*函數(shù)函數(shù)f的結(jié)束的結(jié)束找找我是否有錯(cuò)?找找我是否有錯(cuò)?int f(int a, b) int s; s = a + b; return s;int f(int a, int b) int s; s = a + b; return s;error找找我是否有錯(cuò)?找找我是否有錯(cuò)?int f(int a, int b); int s; s = a + b; return s;int f(int a, int b) int s;

9、s = a + b; return s;error找找我是否有錯(cuò)?找找我是否有錯(cuò)?int f(int a, int b) int s; s = a + b; returns;int f(int a, int b) int s; s = a + b; return s;error找找我是否有錯(cuò)?找找我是否有錯(cuò)?int f(int a, int b) int s; s = a + b; return(s);int f(int a, int b) return a+b;rightright找找我是否有錯(cuò)?找找我是否有錯(cuò)?int f(float a, float b) float s; s = a +

10、 b; return s;warning找找我是否有錯(cuò)?找找我是否有錯(cuò)?int f(int a, int b) if(ab) return a;else return b;right良好的習(xí)慣:加上函數(shù)注釋良好的習(xí)慣:加上函數(shù)注釋/ /* * 函數(shù)功能:實(shí)現(xiàn)函數(shù)功能:實(shí)現(xiàn)功能功能 函數(shù)參數(shù):參數(shù)函數(shù)參數(shù):參數(shù)1, 1, 表示表示 參數(shù)參數(shù)2, 2, 表示表示 函數(shù)返回值:函數(shù)返回值: * */ /返回值類型返回值類型 函數(shù)名函數(shù)名( (類型類型1 形式參數(shù)形式參數(shù)1, 類型類型2 形式參數(shù)形式參數(shù)2,.) ) 說(shuō)明部分說(shuō)明部分 語(yǔ)句部分語(yǔ)句部分 第第5章章 函數(shù)函數(shù) 5.1 函數(shù)的定義函數(shù)的定

11、義E5.2 函數(shù)的調(diào)用函數(shù)的調(diào)用 5.3 函數(shù)的聲明函數(shù)的聲明 5.4 函數(shù)參數(shù)的傳值函數(shù)參數(shù)的傳值 5.5 嵌套調(diào)用和嵌套調(diào)用和遞歸調(diào)用遞歸調(diào)用 5.6 變量的使用范圍和存儲(chǔ)類別變量的使用范圍和存儲(chǔ)類別函數(shù)定義完畢,需要使用一下,驗(yàn)證函數(shù)定義是否函數(shù)定義完畢,需要使用一下,驗(yàn)證函數(shù)定義是否正確。正確。使用數(shù)學(xué)函數(shù)使用數(shù)學(xué)函數(shù)f的過(guò)程示例:假設(shè)有的過(guò)程示例:假設(shè)有a=3; b = 5; 將將a和和b的值代入函數(shù)的值代入函數(shù)f,求得:,求得: c = f(a, b) = f(3,5) = 3 + 5 = 8。使用使用C程序的函數(shù),稱為函數(shù)調(diào)用。程序的函數(shù),稱為函數(shù)調(diào)用。函數(shù)調(diào)用的格式為:函數(shù)調(diào)用

12、的格式為:函數(shù)名函數(shù)名(實(shí)際參數(shù)實(shí)際參數(shù)1, 實(shí)際參數(shù)實(shí)際參數(shù)2,. ); 實(shí)際參數(shù)簡(jiǎn)稱實(shí)參,可以是常量、變量、表達(dá)式,實(shí)際參數(shù)簡(jiǎn)稱實(shí)參,可以是常量、變量、表達(dá)式,實(shí)參的個(gè)數(shù)、類型應(yīng)該跟形參一一對(duì)應(yīng)匹配。實(shí)參實(shí)參的個(gè)數(shù)、類型應(yīng)該跟形參一一對(duì)應(yīng)匹配。實(shí)參主要用于給形參一一對(duì)應(yīng)傳送數(shù)據(jù)。主要用于給形參一一對(duì)應(yīng)傳送數(shù)據(jù)。f(3,5) 就是函數(shù)就是函數(shù)調(diào)用,其中調(diào)用,其中3和和5就是函數(shù)的兩個(gè)整型實(shí)參,它們用就是函數(shù)的兩個(gè)整型實(shí)參,它們用于給于給a,b賦值。賦值。在主函數(shù)中使用在主函數(shù)中使用f函數(shù):函數(shù):int main( ) /* 主函數(shù)主函數(shù)*/ int c; /* 定義存放結(jié)果的變量定義存放結(jié)果

13、的變量*/ c = f (3, 5); /*調(diào)用函數(shù)調(diào)用函數(shù)f, 將得到的值賦給將得到的值賦給c*/ printf (“c = %dn”,c); /*輸出輸出c的值的值 */ return 0;標(biāo)記了執(zhí)行順序的完整程序如下:標(biāo)記了執(zhí)行順序的完整程序如下:#include int f(int a, int b) /* 定義函數(shù)定義函數(shù)f */ int s; s = a + b; return s; int main( ) /* 定義主函數(shù)定義主函數(shù) */ int c; c = f(3,5); /* 調(diào)用函數(shù)調(diào)用函數(shù)f */printf (c = %dn,c); return 0;56789101

14、234121314給形參分配內(nèi)存給形參分配內(nèi)存實(shí)參傳值給形參實(shí)參傳值給形參11將結(jié)果傳回給函數(shù)將結(jié)果傳回給函數(shù)f(3,5) = s;撤銷形參的內(nèi)存撤銷形參的內(nèi)存使用函數(shù)調(diào)用的形式使用函數(shù)調(diào)用的形式(1)函數(shù)調(diào)用作為一條語(yǔ)句;)函數(shù)調(diào)用作為一條語(yǔ)句;(2)函數(shù)有明確的返回值時(shí),函數(shù)調(diào)用可以當(dāng))函數(shù)有明確的返回值時(shí),函數(shù)調(diào)用可以當(dāng)做普通變量使用,作為表達(dá)式的一部分。做普通變量使用,作為表達(dá)式的一部分。(3)函數(shù)有明確的返回值時(shí),函數(shù)調(diào)用可以作)函數(shù)有明確的返回值時(shí),函數(shù)調(diào)用可以作為其他函數(shù)的實(shí)參。為其他函數(shù)的實(shí)參?!纠?.2】編寫函數(shù)實(shí)現(xiàn)打印以下圖形的功能。編寫函數(shù)實(shí)現(xiàn)打印以下圖形的功能。若函數(shù)

15、不需要從外界獲取值,可以不寫參數(shù)。函數(shù)若函數(shù)不需要從外界獲取值,可以不寫參數(shù)。函數(shù)本身不需要一個(gè)計(jì)算結(jié)果,將函數(shù)類型設(shè)為本身不需要一個(gè)計(jì)算結(jié)果,將函數(shù)類型設(shè)為voidvoid類類型,函數(shù)結(jié)尾不需要寫型,函數(shù)結(jié)尾不需要寫returnreturn語(yǔ)句。語(yǔ)句。調(diào)用這類函數(shù)時(shí),直接將調(diào)用加上分號(hào),作為調(diào)用這類函數(shù)時(shí),直接將調(diào)用加上分號(hào),作為一條語(yǔ)句。若將其作為表達(dá)式的一部分,例如:一條語(yǔ)句。若將其作為表達(dá)式的一部分,例如:int a = printStar( ); int a = printStar( ); 程序出錯(cuò)。程序出錯(cuò)。修改函數(shù),將其功能擴(kuò)展為可輸出修改函數(shù),將其功能擴(kuò)展為可輸出n行此圖形行此

16、圖形用這種格式,可以嗎?用這種格式,可以嗎?實(shí)參和形參個(gè)數(shù)不一致,嚴(yán)格的編譯實(shí)參和形參個(gè)數(shù)不一致,嚴(yán)格的編譯器會(huì)報(bào)錯(cuò),器會(huì)報(bào)錯(cuò),VC6.0VC6.0可以執(zhí)行,但無(wú)輸可以執(zhí)行,但無(wú)輸出結(jié)果。出結(jié)果。也正確,但不通用,每次需要輸出不也正確,但不通用,每次需要輸出不同行的圖形時(shí)都要修改函數(shù)。同行的圖形時(shí)都要修改函數(shù)。【例例5.3】定義定義pow函數(shù),實(shí)現(xiàn)求函數(shù),實(shí)現(xiàn)求xy的功能。只考慮的功能。只考慮x和和y均為正整數(shù)的情況。均為正整數(shù)的情況。 調(diào)用函數(shù)調(diào)用函數(shù)powpow作為了作為了printfprintf函函數(shù)中用于輸出的第數(shù)中用于輸出的第3 3個(gè)參數(shù)。個(gè)參數(shù)。可以去掉參數(shù)嗎?可以去掉參數(shù)嗎?若需

17、要計(jì)算用戶從鍵盤輸入的若需要計(jì)算用戶從鍵盤輸入的x和和y的冪次方,的冪次方,如何修改程序?如何修改程序?將變量將變量a a和和b b作為實(shí)參,它們的值作為實(shí)參,它們的值由用戶從鍵盤輸入由用戶從鍵盤輸入注意:不要寫成注意:不要寫成 pow(int a, int b)【例例5.4】定義定義bigger函數(shù),實(shí)現(xiàn)求兩個(gè)整數(shù)中較大函數(shù),實(shí)現(xiàn)求兩個(gè)整數(shù)中較大值的功能。利用此函數(shù)求三個(gè)整數(shù)中的較大值。值的功能。利用此函數(shù)求三個(gè)整數(shù)中的較大值。 函數(shù)調(diào)用時(shí),形參若是變量,只寫變量名,不寫變函數(shù)調(diào)用時(shí),形參若是變量,只寫變量名,不寫變量的類型。例如:將量的類型。例如:將bigger(x,y)寫為寫為bigge

18、r(int x, int y)是錯(cuò)誤的。實(shí)參是錯(cuò)誤的。實(shí)參x和和y在函數(shù)在函數(shù)調(diào)用前已經(jīng)有定義了,不能在此處再定義。調(diào)用前已經(jīng)有定義了,不能在此處再定義。bigger(bigger(x,y),z)作為了賦值表達(dá)式作為了賦值表達(dá)式max = bigger(bigger(x,y),z)的一部分,即:函數(shù)調(diào)用可以的一部分,即:函數(shù)調(diào)用可以作為表達(dá)式的一部分。作為表達(dá)式的一部分。第第5章章 函數(shù)函數(shù) 5.1 函數(shù)的定義函數(shù)的定義 5.2 函數(shù)的調(diào)用函數(shù)的調(diào)用E5.3 函數(shù)的聲明函數(shù)的聲明 5.4 函數(shù)參數(shù)的傳值函數(shù)參數(shù)的傳值 5.5 嵌套調(diào)用和嵌套調(diào)用和遞歸調(diào)用遞歸調(diào)用 5.6 變量的使用范圍和存儲(chǔ)類

19、別變量的使用范圍和存儲(chǔ)類別將例題將例題5-1程序中自定義函數(shù)程序中自定義函數(shù)f和和main函數(shù)的位置互函數(shù)的位置互換,執(zhí)行程序,觀察實(shí)驗(yàn)結(jié)果。換,執(zhí)行程序,觀察實(shí)驗(yàn)結(jié)果。 在程序運(yùn)行前的編譯階段,要進(jìn)行語(yǔ)法檢錯(cuò)。程序編譯的順序在程序運(yùn)行前的編譯階段,要進(jìn)行語(yǔ)法檢錯(cuò)。程序編譯的順序是按照代碼書寫的先后順序來(lái)順次編譯的。當(dāng)編譯到函數(shù)調(diào)用是按照代碼書寫的先后順序來(lái)順次編譯的。當(dāng)編譯到函數(shù)調(diào)用語(yǔ)句時(shí),由于還未編譯到函數(shù)定義的部分,因此語(yǔ)句時(shí),由于還未編譯到函數(shù)定義的部分,因此C編譯系統(tǒng)不編譯系統(tǒng)不知道后面是否有此函數(shù)的定義,也不知道此函數(shù)調(diào)用格式是否知道后面是否有此函數(shù)的定義,也不知道此函數(shù)調(diào)用格式是

20、否正確,所以正確,所以C編譯系統(tǒng)會(huì)提示找不到函數(shù)。為了解決這個(gè)問(wèn)題,編譯系統(tǒng)會(huì)提示找不到函數(shù)。為了解決這個(gè)問(wèn)題,可以在函數(shù)調(diào)用前面加上函數(shù)聲明??梢栽诤瘮?shù)調(diào)用前面加上函數(shù)聲明。函數(shù)聲明:函數(shù)的使用說(shuō)明書函數(shù)聲明:函數(shù)的使用說(shuō)明書函數(shù)聲明由函數(shù)首部加上分號(hào)組成。函數(shù)聲明由函數(shù)首部加上分號(hào)組成。例如:例如:函數(shù)函數(shù)f的函數(shù)聲明為:的函數(shù)聲明為:int f(int a, int b); 也可以將參數(shù)名省略:也可以將參數(shù)名省略:int f(int , int); 。說(shuō)明:說(shuō)明:(1)加上形參名的格式更清楚些。)加上形參名的格式更清楚些。(2)若函數(shù)定義在函數(shù)調(diào)用前面,則不需要添加函數(shù))若函數(shù)定義在函數(shù)

21、調(diào)用前面,則不需要添加函數(shù)聲明。聲明?!纠?.5】函數(shù)聲明的使用。函數(shù)聲明的使用。第第5章章 函數(shù)函數(shù) 5.1 函數(shù)的定義函數(shù)的定義 5.2 函數(shù)的調(diào)用函數(shù)的調(diào)用 5.3 函數(shù)的聲明函數(shù)的聲明E5.4 函數(shù)參數(shù)的傳值函數(shù)參數(shù)的傳值 5.5 嵌套調(diào)用和嵌套調(diào)用和遞歸調(diào)用遞歸調(diào)用 5.6 變量的使用范圍和存儲(chǔ)類別變量的使用范圍和存儲(chǔ)類別一、單向值傳遞一、單向值傳遞【例例5.6】寫一個(gè)函數(shù)實(shí)現(xiàn)兩個(gè)整數(shù)的交換,測(cè)試寫一個(gè)函數(shù)實(shí)現(xiàn)兩個(gè)整數(shù)的交換,測(cè)試 main swap05xyab50c050當(dāng)基本類型的常量或變量作函數(shù)的實(shí)參時(shí),形參當(dāng)基本類型的常量或變量作函數(shù)的實(shí)參時(shí),形參與實(shí)參占用不同的內(nèi)存空間(

22、可同名)。從實(shí)參與實(shí)參占用不同的內(nèi)存空間(可同名)。從實(shí)參到形參的數(shù)據(jù)傳遞是單向的。即:形參值的改變到形參的數(shù)據(jù)傳遞是單向的。即:形參值的改變不會(huì)影響到實(shí)參,這稱為不會(huì)影響到實(shí)參,這稱為“單向值傳遞單向值傳遞”。 二、雙向地址傳遞二、雙向地址傳遞當(dāng)?shù)刂烦A炕虻刂纷兞浚ɡ纾簲?shù)組名)作當(dāng)?shù)刂烦A炕虻刂纷兞浚ɡ纾簲?shù)組名)作函數(shù)的實(shí)參時(shí),從實(shí)參到形參傳遞的是地函數(shù)的實(shí)參時(shí),從實(shí)參到形參傳遞的是地址,形參與實(shí)參使用相同的內(nèi)存空間。形參址,形參與實(shí)參使用相同的內(nèi)存空間。形參值的改變會(huì)影響到實(shí)參,這種傳遞也稱為值的改變會(huì)影響到實(shí)參,這種傳遞也稱為“雙雙向地址傳遞向地址傳遞”。例例 如:如:void Bu

23、bbleSort( int a10) / 對(duì)數(shù)組對(duì)數(shù)組a的元素按冒泡法排序的元素按冒泡法排序int main( ) int b10 = 7,1,4,2,9,0,8,5,-3,2; BubbleSort(b); / b是數(shù)組名,進(jìn)行地址傳遞是數(shù)組名,進(jìn)行地址傳遞形參形參a a不另外分配內(nèi)存,它就使用不另外分配內(nèi)存,它就使用b b數(shù)組的內(nèi)存,數(shù)組的內(nèi)存,可將可將a a,b b看成同一個(gè)數(shù)組,對(duì)看成同一個(gè)數(shù)組,對(duì)a a排序,即是對(duì)排序,即是對(duì)b b排序,所以調(diào)用函數(shù)排序,所以調(diào)用函數(shù)BubbleSortBubbleSort后,數(shù)組后,數(shù)組b b內(nèi)的內(nèi)的元素已排好序。還可寫為:元素已排好序。還可寫為:

24、void BubbleSort( int a ) 【例例5.7】有一個(gè)已按由小到大的順序排列的有一個(gè)已按由小到大的順序排列的整型數(shù)組,從鍵盤輸入一個(gè)整數(shù),按照數(shù)組整型數(shù)組,從鍵盤輸入一個(gè)整數(shù),按照數(shù)組原來(lái)的排列規(guī)律將此數(shù)插入到數(shù)組中。寫一原來(lái)的排列規(guī)律將此數(shù)插入到數(shù)組中。寫一個(gè)函數(shù)個(gè)函數(shù)insertNumber實(shí)現(xiàn)此功能,并測(cè)試。實(shí)現(xiàn)此功能,并測(cè)試。思思 路:路:1. 若若num大于或者等于大于或者等于a8,例如:,例如:num 是是 99,那么直接將,那么直接將num存入存入arr9中即可。中即可。2. 否則,例如:否則,例如:num是是20,先查找,先查找num應(yīng)應(yīng)該放在數(shù)組中哪個(gè)位置。再

25、將此位置及后面該放在數(shù)組中哪個(gè)位置。再將此位置及后面的數(shù)據(jù)依次后移,最后將的數(shù)據(jù)依次后移,最后將num存入此位置中。存入此位置中。 查找位置:查找位置: 在將在將num放入放入a3之前,先將之前,先將a8、a7、. 、a4、a3依次后移。依次后移。 將將num賦值給賦值給a3。 第第5章章 函數(shù)函數(shù) 5.1 函數(shù)的定義函數(shù)的定義 5.2 函數(shù)的調(diào)用函數(shù)的調(diào)用 5.3 函數(shù)的聲明函數(shù)的聲明 5.4 函數(shù)參數(shù)的傳值函數(shù)參數(shù)的傳值E5.5 嵌套調(diào)用和嵌套調(diào)用和遞歸調(diào)用遞歸調(diào)用 5.6 變量的使用范圍和存儲(chǔ)類別變量的使用范圍和存儲(chǔ)類別一、嵌套調(diào)用一、嵌套調(diào)用 一個(gè)函數(shù)調(diào)用另一個(gè)函數(shù),另一個(gè)函數(shù)又調(diào)一個(gè)

26、函數(shù)調(diào)用另一個(gè)函數(shù),另一個(gè)函數(shù)又調(diào)用其他函數(shù),稱為函數(shù)的嵌套調(diào)用。用其他函數(shù),稱為函數(shù)的嵌套調(diào)用。C規(guī)定規(guī)定函函數(shù)定義不可嵌套,但可以嵌套調(diào)用函數(shù)。數(shù)定義不可嵌套,但可以嵌套調(diào)用函數(shù)?!纠?.8】編寫程序計(jì)算編寫程序計(jì)算 s=1!+2!+3!+.+n!調(diào)用調(diào)用調(diào)用調(diào)用嵌套調(diào)用嵌套調(diào)用二、遞歸調(diào)用二、遞歸調(diào)用一個(gè)函數(shù)直接調(diào)用自己本身或者通過(guò)調(diào)用其一個(gè)函數(shù)直接調(diào)用自己本身或者通過(guò)調(diào)用其他函數(shù)來(lái)間接地調(diào)用自己,稱為遞歸函數(shù)。他函數(shù)來(lái)間接地調(diào)用自己,稱為遞歸函數(shù)。【例例5.9】遞歸問(wèn)題:有遞歸問(wèn)題:有5個(gè)人坐在一起,問(wèn)第個(gè)人坐在一起,問(wèn)第5個(gè)人個(gè)人多少歲?他說(shuō)比第多少歲?他說(shuō)比第4個(gè)人大個(gè)人大5歲。

27、問(wèn)第歲。問(wèn)第4個(gè)人歲數(shù),個(gè)人歲數(shù),他說(shuō)比第他說(shuō)比第3個(gè)人大個(gè)人大5歲。問(wèn)第歲。問(wèn)第3個(gè)人,又說(shuō)比第個(gè)人,又說(shuō)比第2個(gè)人個(gè)人大大5歲。問(wèn)第歲。問(wèn)第2個(gè)人,說(shuō)比第個(gè)人,說(shuō)比第1個(gè)人大個(gè)人大5歲。最后問(wèn)第歲。最后問(wèn)第1個(gè)人,他說(shuō)他個(gè)人,他說(shuō)他10歲。請(qǐng)問(wèn)第歲。請(qǐng)問(wèn)第5個(gè)人多大?個(gè)人多大?根據(jù)題目中給出的年齡關(guān)系,列出計(jì)算第根據(jù)題目中給出的年齡關(guān)系,列出計(jì)算第n個(gè)人年個(gè)人年齡的數(shù)學(xué)公式:齡的數(shù)學(xué)公式:根據(jù)數(shù)學(xué)公式,寫出對(duì)應(yīng)的根據(jù)數(shù)學(xué)公式,寫出對(duì)應(yīng)的C函數(shù)如下:函數(shù)如下:int age(int n) if (n = 1) /* 遞歸結(jié)束條件成立,結(jié)束遞歸遞歸結(jié)束條件成立,結(jié)束遞歸 */return 10

28、; else /* 遞歸結(jié)束條件不成立,繼續(xù)進(jìn)行遞歸調(diào)用遞歸結(jié)束條件不成立,繼續(xù)進(jìn)行遞歸調(diào)用 */return age( n - 1)+5; 或者:或者:int age(int n) if (n 1) /* 遞歸結(jié)束條件不成立,繼續(xù)進(jìn)行遞歸調(diào)用遞歸結(jié)束條件不成立,繼續(xù)進(jìn)行遞歸調(diào)用 */ return age( n - 1)+5; else /* 遞歸結(jié)束條件成立,結(jié)束遞歸調(diào)用遞歸結(jié)束條件成立,結(jié)束遞歸調(diào)用 */ return 10; 年齡的遞歸運(yùn)算過(guò)程年齡的遞歸運(yùn)算過(guò)程【例例5.10】用遞歸調(diào)用求用遞歸調(diào)用求n的階乘。的階乘。第第5章章 函數(shù)函數(shù) 5.1 函數(shù)的定義函數(shù)的定義 5.2 函數(shù)的調(diào)

29、用函數(shù)的調(diào)用 5.3 函數(shù)的聲明函數(shù)的聲明 5.4 函數(shù)參數(shù)的傳值函數(shù)參數(shù)的傳值 5.5 嵌套調(diào)用和嵌套調(diào)用和遞歸調(diào)用遞歸調(diào)用E 5.6 變量的使用范圍和存儲(chǔ)類別變量的使用范圍和存儲(chǔ)類別一、局部變量與全局變量一、局部變量與全局變量 局部變量(也稱為內(nèi)部變量):局部變量(也稱為內(nèi)部變量):在函數(shù)內(nèi)部定義,在函數(shù)內(nèi)部定義,有效使用范圍是從定義處開始,到本函數(shù)結(jié)束為止。有效使用范圍是從定義處開始,到本函數(shù)結(jié)束為止。全局變量(也稱為外部變量)全局變量(也稱為外部變量):在函數(shù)外部定義,不:在函數(shù)外部定義,不作特殊聲明的情況下,有效使用范圍是從定義處開作特殊聲明的情況下,有效使用范圍是從定義處開始,到所

30、在源文件末尾為止。始,到所在源文件末尾為止。例例 如:如:兩個(gè)兩個(gè)n不是同一個(gè)不是同一個(gè)變量,可以同名變量,可以同名【例例5.11】局部變量的有效區(qū)域。局部變量的有效區(qū)域。局部變量局部變量a和和b的有效范圍的有效范圍超出此范圍使超出此范圍使用它們會(huì)出錯(cuò)用它們會(huì)出錯(cuò)【例例5.12】全局變量的有效區(qū)域。全局變量的有效區(qū)域。全局變量全局變量a和和b定定義函數(shù)外部,有義函數(shù)外部,有效范圍從定義處效范圍從定義處開始,到所在源開始,到所在源文件結(jié)束為止。文件結(jié)束為止。 【例例5.13】不同函數(shù)中的同名局部變量。不同函數(shù)中的同名局部變量。fun中中a和和b的的有效范圍有效范圍 main中中a和和b的有效范圍

31、的有效范圍 【例例5.14】局部變量和全局變量同名。局部變量和全局變量同名。局部變量局部變量a和和b的有的有效范圍效范圍 全部變量全部變量a和和b的有的有效范圍效范圍 二、變量的存儲(chǔ)類別二、變量的存儲(chǔ)類別 一個(gè)變量完整的定義中除了變量的數(shù)據(jù)類型之外,一個(gè)變量完整的定義中除了變量的數(shù)據(jù)類型之外,還應(yīng)加上存儲(chǔ)類型的限制。格式如下:還應(yīng)加上存儲(chǔ)類型的限制。格式如下: 存儲(chǔ)類型存儲(chǔ)類型 數(shù)據(jù)類型數(shù)據(jù)類型 變量名變量名;C語(yǔ)言中,變量的存儲(chǔ)類型可以分為四類:語(yǔ)言中,變量的存儲(chǔ)類型可以分為四類:auto(自動(dòng)型)、(自動(dòng)型)、static(靜態(tài)型)、(靜態(tài)型)、register(寄存器(寄存器型)、型)、

32、extern(外部型)。(外部型)。不同類型的變量的生命周期(指的是在程序運(yùn)行過(guò)不同類型的變量的生命周期(指的是在程序運(yùn)行過(guò)程中,變量從創(chuàng)建到撤銷的一段時(shí)間)不同。程中,變量從創(chuàng)建到撤銷的一段時(shí)間)不同。1、auto類型的局部變量類型的局部變量函數(shù)形參和局部變量函數(shù)形參和局部變量,不加任何修飾時(shí),默,不加任何修飾時(shí),默認(rèn)為認(rèn)為auto類型的局部變量。這類變量類型的局部變量。這類變量生命周生命周期與其所在的函數(shù)期與其所在的函數(shù)代碼塊代碼塊共存亡共存亡。即:函數(shù)。即:函數(shù)調(diào)用開始時(shí)給變量分配動(dòng)態(tài)內(nèi)存空間。函數(shù)調(diào)用開始時(shí)給變量分配動(dòng)態(tài)內(nèi)存空間。函數(shù)結(jié)束時(shí),釋放內(nèi)存,變量的生命周期終止。結(jié)束時(shí),釋放內(nèi)

33、存,變量的生命周期終止。生命周期與有效范圍一致。生命周期與有效范圍一致。【例例5.15】局部變量的生命周期。局部變量的生命周期。2、static類型的局部變量、全局變量類型的局部變量、全局變量static修飾的全局變量和局部變量修飾的全局變量和局部變量分別稱為靜態(tài)全分別稱為靜態(tài)全局變量和靜態(tài)局部變量。局變量和靜態(tài)局部變量。這類變量生命周期與程這類變量生命周期與程序共存亡。序共存亡。在程序開始執(zhí)行前給它們分配內(nèi)存,在程序開始執(zhí)行前給它們分配內(nèi)存,程序執(zhí)行完畢時(shí)釋放內(nèi)存。在程序執(zhí)行過(guò)程中它程序執(zhí)行完畢時(shí)釋放內(nèi)存。在程序執(zhí)行過(guò)程中它們占據(jù)固定的存儲(chǔ)空間。生命周期是到整個(gè)程序們占據(jù)固定的存儲(chǔ)空間。生命

34、周期是到整個(gè)程序結(jié)束,有效范圍是到所在的源文件結(jié)束。結(jié)束,有效范圍是到所在的源文件結(jié)束?!纠?.16】靜態(tài)局部變量的生命周期。靜態(tài)局部變量的生命周期。3、全局變量、全局變量普通的全局變量存放在內(nèi)存中的靜態(tài)存普通的全局變量存放在內(nèi)存中的靜態(tài)存儲(chǔ)區(qū),生命周期到整個(gè)程序結(jié)束。它的儲(chǔ)區(qū),生命周期到整個(gè)程序結(jié)束。它的有效范圍可以通過(guò)將其聲明為有效范圍可以通過(guò)將其聲明為extern類類型擴(kuò)展到整個(gè)程序結(jié)束。型擴(kuò)展到整個(gè)程序結(jié)束。【例例5.17】全局變量的生命周期和有效區(qū)域。全局變量的生命周期和有效區(qū)域。同一個(gè)項(xiàng)目中有兩個(gè)源文件同一個(gè)項(xiàng)目中有兩個(gè)源文件test1.c、test2.c。運(yùn)行運(yùn)行test2.c

35、文件,出錯(cuò)。雖然全局變文件,出錯(cuò)。雖然全局變量量A的生命期是整個(gè)程序,在整個(gè)程的生命期是整個(gè)程序,在整個(gè)程序中都占有內(nèi)存,但是它的有效區(qū)域序中都占有內(nèi)存,但是它的有效區(qū)域是是test1.c文件,在文件,在test2.c文件中不能文件中不能使用使用test1.c文件。文件。4、extern類型的全局變量類型的全局變量extern類型的全局變量存放在內(nèi)存中類型的全局變量存放在內(nèi)存中的靜態(tài)存儲(chǔ)區(qū),生命周期到整個(gè)程序結(jié)的靜態(tài)存儲(chǔ)區(qū),生命周期到整個(gè)程序結(jié)束,它的有效范圍是到整個(gè)程序結(jié)束,束,它的有效范圍是到整個(gè)程序結(jié)束,兩者一致。兩者一致?!纠?.18】extern類型全局變量的生命周期和類型全局變量

36、的生命周期和 有效區(qū)域。有效區(qū)域。同一個(gè)項(xiàng)目中有兩個(gè)源文件同一個(gè)項(xiàng)目中有兩個(gè)源文件test1.c、test2.c。運(yùn)行運(yùn)行test2.c文件,輸出文件,輸出0。擴(kuò)展也可以寫為擴(kuò)展也可以寫為“extern A;”,這是,這是test1.c中定義的全局變量中定義的全局變量A的有效區(qū)域的有效區(qū)域擴(kuò)展到擴(kuò)展到test2.c文件中。若未給全局變文件中。若未給全局變量賦初值,內(nèi)存空間中的值為量賦初值,內(nèi)存空間中的值為0。【例例5.19】用用extern擴(kuò)展擴(kuò)展static類型全局變量類型全局變量的有效區(qū)域。的有效區(qū)域。運(yùn)行運(yùn)行test2.c文件,程序出錯(cuò)。靜態(tài)全文件,程序出錯(cuò)。靜態(tài)全局變量局變量A的有效區(qū)

37、域是其定義所在的的有效區(qū)域是其定義所在的文件文件test1.c,不能擴(kuò)展它的有效范圍,不能擴(kuò)展它的有效范圍到程序中的其他文件。到程序中的其他文件。5、register類型的局部變量類型的局部變量有些使用頻繁的變量,為了節(jié)省存取變量時(shí)有些使用頻繁的變量,為了節(jié)省存取變量時(shí)花費(fèi)的時(shí)間,花費(fèi)的時(shí)間,提高程序效率提高程序效率,可以將其設(shè)置,可以將其設(shè)置為為register類型的變量,直接從寄存器中存類型的變量,直接從寄存器中存取。例如:在一個(gè)函數(shù)中執(zhí)行取。例如:在一個(gè)函數(shù)中執(zhí)行100000此循此循環(huán),每次循環(huán)都要用到某個(gè)局部變量環(huán),每次循環(huán)都要用到某個(gè)局部變量i,就可,就可以將其說(shuō)明為以將其說(shuō)明為regis

溫馨提示

  • 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)論