照老師講義第05章函數(shù)_第1頁(yè)
照老師講義第05章函數(shù)_第2頁(yè)
照老師講義第05章函數(shù)_第3頁(yè)
照老師講義第05章函數(shù)_第4頁(yè)
照老師講義第05章函數(shù)_第5頁(yè)
已閱讀5頁(yè),還剩56頁(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、第五章 函數(shù)一個(gè)源程序文件由一個(gè)或多個(gè)函數(shù)組成程序的執(zhí)行從main函數(shù)開始,并回到main函數(shù)結(jié)束函數(shù)之間可以相互調(diào)用,或調(diào)用自身不能調(diào)用main函數(shù)必須的起點(diǎn)main()f1()f2()f3()f11()f12()f21()f22()f31()void main( ) int a,b,c; cin ab; c=max( a , b); cout=y? x : y ; return ( z) ;主函數(shù)函數(shù)體函數(shù)的類型,返回值的類型函數(shù)名(用標(biāo)識(shí)符命名),引用函數(shù)的標(biāo)志,并得到結(jié)果。函數(shù)參數(shù)說(shuō)明表。定義!調(diào)用!函數(shù)定義是要確定函數(shù)的名稱、函數(shù)的類型、函數(shù)的參數(shù)及函數(shù)的功能。函數(shù)分類(1)從用戶角

2、度標(biāo)準(zhǔn)函數(shù)(庫(kù)函數(shù)):用戶include相應(yīng)的庫(kù)函數(shù)頭文件后便可以直接使用。用戶自定義函數(shù):由用戶按照邏輯功能自己編寫的程序(2)從函數(shù)形式無(wú)參函數(shù):調(diào)用該函數(shù)時(shí),主調(diào)函數(shù)不需函數(shù)要將數(shù)據(jù)傳遞給被調(diào)用函數(shù),只執(zhí)行指定的一組操作有參函數(shù):主調(diào)需傳遞數(shù)據(jù)給被調(diào)函數(shù)(3)從函數(shù)返回值角度:有返回值函數(shù)和無(wú)返回值函數(shù)函數(shù)的定義與調(diào)用函數(shù)類型 函數(shù)名(函數(shù)參數(shù)定義)說(shuō)明部分(變量聲明)語(yǔ)句部分 return 結(jié)果;int max(int x ,int y) int z ; z=x=y? x : y ; return (z) ;int max(int x,int y) int cx(int c,int d

3、) 函數(shù)定義不可以嵌套一、函數(shù)定義的一般格式函數(shù)類型: 函數(shù)返回值的類型。指數(shù)據(jù)類型,如:int ,float,double, bool,char, void 等等。如果函數(shù)沒(méi)有返回值,應(yīng)指明返回類型void。 和變量命名一樣,是標(biāo)識(shí)符函數(shù)名后一定要有一對(duì)圓括號(hào)( ),這是函數(shù)的標(biāo)志,使函數(shù)與其他標(biāo)識(shí)符名區(qū)分開來(lái)函數(shù)名:int max(int x ,int y) int z ; z=x=y? x : y ; return (z) ;函數(shù)體函數(shù)體用一對(duì)包括。里面就是函數(shù)用以實(shí)現(xiàn)功能的代碼。聲明部分:用于聲明在函數(shù)中使用到的變量語(yǔ)句部分:在函數(shù)中用于實(shí)現(xiàn)某項(xiàng)任務(wù)的語(yǔ)句序列空函數(shù):函數(shù)體為空(沒(méi)有語(yǔ)

4、句,但 不能省略)int max(int x ,int y) int z ; z=x=y? x : y ; return (z) ;return 語(yǔ)句 return 語(yǔ)句只在函數(shù)內(nèi)使用.它起到讓函數(shù)停止運(yùn)行,然后返回一個(gè)值的作用,并返回到函數(shù)調(diào)用程序的下一條語(yǔ)句。return 返回的結(jié)果,類型一般和前面“返回類型”一致。如果不一致,系統(tǒng)自動(dòng)將表達(dá)式類型轉(zhuǎn)換為函數(shù)類型。 int max(int x ,int y) int z ; z=x=y? x : y ; return (z) ;int max(int a, int b) if(a b) return a; return b;多個(gè)參數(shù)之間用逗

5、號(hào)隔開。用于接收從主調(diào)函數(shù)傳給這個(gè)函數(shù)的數(shù)據(jù)形參個(gè)數(shù)不受限制,可以很多,也可以無(wú)形參必須指定參數(shù)類型int max(int x ,int y) int z ; z=x=y? x : y ; return (z) ;形式參數(shù):函數(shù)在聲明或定義時(shí),所寫出的參數(shù)定義。int max(x,y) int x,y;或int max(int x,y) 或int max(x,y)int x,y,z; z = x y ? x : y; return( z );形參也可以這樣定義如下定義都是錯(cuò)誤的 int max(x,y)int x,y; int z; z = x y ? x : y; return( z );二

6、、函數(shù)參數(shù)形式參數(shù)int main(void ) int a,b,c; cin ab; c=max( a , b); cout=y? x : y ; return ( z) ;實(shí)參形參c=max(a,b);(main 函數(shù))(max 函數(shù))max(int x, int y) int z; z=xy?x:y; return(z); 形式參數(shù)與實(shí)際參數(shù)實(shí)參必須有確定的值實(shí)參可以是常量、變量、表達(dá)式、函數(shù)調(diào)用形參必須指定類型形參與實(shí)參類型一致,個(gè)數(shù)相同若形參與實(shí)參類型不一致,自動(dòng)按形參類型轉(zhuǎn)換函數(shù)調(diào)用轉(zhuǎn)換形參在函數(shù)被調(diào)用前不占內(nèi)存;函數(shù)調(diào)用時(shí)為形參分配內(nèi)存;調(diào)用結(jié)束,內(nèi)存釋放函數(shù)的調(diào)用函數(shù)調(diào)用的方式

7、:一般調(diào)用方式有三種:語(yǔ)句形式: max(a,b); /*不要求函數(shù)帶回值*/表達(dá)式形式: c=max(a, b)*2; /*函數(shù)是表達(dá)式的一部分*/函數(shù)參數(shù): c=max(a,max(b,d ); /*函數(shù)調(diào)用作為一個(gè)函數(shù)的實(shí)參*/void main (void) int a ,b ,c ; cinab ; c=max( a ,b ); couty? x : y ; return (z) ; 先計(jì)算實(shí)參的值,從右向左向函數(shù)傳遞調(diào)賦值給形參。23abXy23 轉(zhuǎn)移在函數(shù)中運(yùn)行,執(zhí)行到一個(gè)return語(yǔ)句,將返回表達(dá)式的值。由函數(shù)名帶回給調(diào)用函數(shù)。z3函數(shù)如果沒(méi)有return語(yǔ)句,由最后一個(gè)返回

8、一個(gè)不確定的值!函數(shù)的調(diào)用函數(shù)調(diào)用的執(zhí)行過(guò)程:1、程序在執(zhí)行過(guò)程中一旦遇到一個(gè)函數(shù)調(diào)用,系統(tǒng)首先為每個(gè)形參分配一定數(shù)目的存儲(chǔ)單元;然后計(jì)算實(shí)參表達(dá)式的值,并將實(shí)參的值送到形參對(duì)應(yīng)的存儲(chǔ)單元中;2、將執(zhí)行的控制轉(zhuǎn)移到被調(diào)用函數(shù),直到函數(shù)體末尾或遇到一個(gè)return語(yǔ)句為止;3、當(dāng)執(zhí)行到函數(shù)體末尾或執(zhí)行return語(yǔ)句時(shí),如果函數(shù)有返回值,則將控制返回到調(diào)用點(diǎn)同時(shí)返回一個(gè)值,這個(gè)返回值就是函數(shù)調(diào)用表達(dá)式的值;從函數(shù)調(diào)用點(diǎn)繼續(xù)向后執(zhí)行。函數(shù)原型的一般形式為:函數(shù)類型 函數(shù)名(參數(shù)類型1,參數(shù)類型2 );函數(shù)類型 函數(shù)名(參數(shù)類型1,參數(shù)名1,參數(shù)類型2,參數(shù)名2);int max(int a, in

9、t b);int max (int, int);int max(int x, int y);函數(shù)的聲明(函數(shù)原型)函數(shù)使用必須遵循“先聲明、后使用”原則#include int sum(int,int)void main()int a,b,c;cout輸入兩個(gè)數(shù):ab;c=sum(a,b);coutcendl;int sum(int a,int b)int c;c=a+b;return (c);先聲明、后使用#include int sum(int a,int b)int c;c=a+b;return (c);void main()int a,b,c;cout輸入兩個(gè)數(shù):ab;c=sum(a,

10、b);coutcendl;內(nèi)聯(lián)函數(shù)在c+中,為了解決一些頻繁調(diào)用的小函數(shù)大量消耗內(nèi)存的問(wèn)題,引入了inline修飾符,表示為內(nèi)聯(lián)函數(shù)。 當(dāng)編譯器發(fā)現(xiàn)某段代碼在調(diào)用一個(gè)內(nèi)聯(lián)函數(shù)時(shí),它不是去調(diào)用該函數(shù),而是將該函數(shù)的代碼,整段插入到當(dāng)前位置。 缺點(diǎn):由于每當(dāng)代碼調(diào)用到內(nèi)聯(lián)函數(shù),就需要在調(diào)用處直接插入一段該函數(shù)的代碼,所以程序的體積將增大 優(yōu)點(diǎn):省去了調(diào)用的過(guò)程,加快程序運(yùn)行速度 #include inline int square(int x)return x*x;void main() for(int i=1;i=10;i+) coutsquare(i)y? x : y ; return (z)

11、 ;void main (void) int a ,b ,c ; cinab ; c=max( a ,b ); cout形式參數(shù) ,傳遞的是參數(shù)的值引用: int x=3; int &m=x; m為x的引用void f(int &m) m+; Void main() int x=3; f(x); coutxendl;按引用調(diào)用缺省形參必須從右邊開始定義int func(int a, float b, int c=0);若在函數(shù)調(diào)用時(shí)指定了形式參數(shù)對(duì)應(yīng)的實(shí)際參數(shù),則形式參數(shù)使用實(shí)際參數(shù)的值,若未指定相應(yīng)的實(shí)際參數(shù),則形式參數(shù)使用缺省值。缺省形參void fun(int a=1, int b=2,

12、 int c=3) ;void fun(int a, int b, int c=3) ;注意:賦予缺省值的參數(shù)必須放在形參表列中的最右端。 void fun(int a=1, int b, int c=3) ;void fun(int a=1,int b=2,int c=3) couta=a,b=b,c=cendl;void main() fun(); fun(4); fun(4,5); fun(4,5,6);運(yùn)行結(jié)果如下:a=1,b=2,c=3a=4,b=2,c=3a=4,b=5,c=3a=4,b=5,c=6C+編譯器通過(guò)檢查函數(shù)調(diào)用中的實(shí)參個(gè)數(shù),類型和順序來(lái)確定相應(yīng)的被調(diào)用函數(shù)函數(shù)重載 求

13、絕對(duì)值的函數(shù) int abs(int i) double fabs(double i)生存期: (從時(shí)間角度考慮)變量的生存期是指在程序運(yùn)行過(guò)程中變量占存儲(chǔ)空間的時(shí)限作用域: (從空間角度考慮)指在變量占用存儲(chǔ)空間的時(shí)間內(nèi)變量的名字能被引用的區(qū)域,即變量名作用的有效范圍。變量說(shuō)明的方式不同,其作用域也不同。 +語(yǔ)言中的變量,按作用域范圍可分為兩種, 即局部變量和全局變量。全局變量和局部變量(作用域)(1)局部變量-內(nèi)部變量定義:在函數(shù)內(nèi)定義,只在本函數(shù)內(nèi)有效,在此函數(shù)之外是不能使用這些變量的,這稱為“局部變量”說(shuō)明:不同函數(shù)中可以使用相同名字的變量,占不同的內(nèi)存儲(chǔ)單元;形式參數(shù)也是局部變量;在

14、一個(gè)函數(shù)內(nèi)部,可以在復(fù)合語(yǔ)句中定義變量,這些變量只在本復(fù)合語(yǔ)句中有效 /*函數(shù)f1*/int f1(int a) int b,c; /*函數(shù)f2*/ int f2(int x) int y,z; main() int m,n; a,b,c作用域:僅限于函數(shù)f1()中x,y,z作用域:僅限于函數(shù)f2()中m,n作用域:僅限于main函數(shù)中例子int main()int x =2, y = 3;int temp;temp = x;x = y;y = temp;cout“x = ”x“, y = ”yendl; return 0;復(fù)合語(yǔ)句中變量(2)全局變量-外部變量定義:在函數(shù)外部定義的變量。不屬

15、于哪一個(gè)函數(shù),它屬于一個(gè)源程序文件其有效范圍是從定義變量的位置開始到本源文件結(jié)束int a,b; /*外部變量*/void f1() /*函數(shù)f1*/float x,y; /*外部變量*/ int f2() /*函數(shù)f2*/main() /*主函數(shù)*/x,y作用域a,b作用域從上例可以看出:a、b、x、y 都是在函數(shù)外部定義的外部變量,都是全局變量。但x,y 定義在函數(shù)f1之后,所以它們?cè)趂1內(nèi)無(wú)效。 a,b定義在源程序最前面,因此在f1,f2及main內(nèi)不加說(shuō)明也可使用。輸入長(zhǎng)方體的長(zhǎng)寬高l,w,h。求體積及三個(gè)面x*y,x*z,y*z的面積。int s1,s2,s3;int vs( int

16、 a,int b,int c)int v;v=a*b*c;s1=a*b;s2=b*c;s3=a*c;return v;int main()int v,l,w,h;coutlwh;v=vs(l,w,h);coutvns1ns2ns3b?a:b; return(c);int main() int a=8; coutmax = max(a,b)n; Return 0;全局變量與局部變量同名,在局部時(shí),局部變量起作用運(yùn)行結(jié)果:max=8全局變量的副作用void prt();int i;Int main() for(i=0;i5;i+) prt(); return 0;void prt() for(i=

17、0;i5;i+) cout*n; printf(“n”);運(yùn)行結(jié)果:*不是25個(gè) *沒(méi)有同名局部變量時(shí),全局變量起作用從生存期(時(shí)間)來(lái)分,變量有兩種存儲(chǔ)方式靜態(tài)存儲(chǔ)方式:在程序運(yùn)行期間占用固定存儲(chǔ)空間動(dòng)態(tài)存儲(chǔ)方式:運(yùn)行時(shí),根據(jù)需要?jiǎng)討B(tài)分配存儲(chǔ)空間代碼區(qū)靜態(tài)存儲(chǔ)區(qū)動(dòng)態(tài)存儲(chǔ)區(qū)全局變量、局部靜態(tài)變量形參變量局部動(dòng)態(tài)變量(auto register)函數(shù)調(diào)用現(xiàn)場(chǎng)保護(hù)和返回地址等 auto變量 :格式:auto 類型 變量名列表; auto 可省略 auto int a; 等價(jià)于 int a;函數(shù)內(nèi)部“ auto ”可以省略,不寫“ auto ”則隱含確定為自動(dòng)存儲(chǔ)類型.因此,一般所定義的無(wú)存儲(chǔ)類型的

18、變量均屬自動(dòng)變量.由于 自動(dòng)變量是局部變量,因此,自動(dòng)變量只能定義在函數(shù)內(nèi),其作用域僅限于定義該變量的個(gè)體內(nèi)。register變量寄存器變量:自動(dòng)存儲(chǔ)類型,只能修飾變量,屬于動(dòng)態(tài)局部變量.格式:register 類型 變量名列表;寄存器變量存在于CPU內(nèi)部的寄存器中,數(shù)量很少,由于CPU中寄存器存取速度要比存儲(chǔ)器快得多,所以使用寄存器變量的主要目的是提高程序的運(yùn)行速度.,一般是將循環(huán)使用很多次的變量放在寄存器中。register int a,b=3;void main() for (int k=1;k=2;k+) register int m=0; m=m+1; m=m+k; coutm=me

19、ndl; 說(shuō)明的變量稱為靜態(tài) 變量,靜態(tài)變量的說(shuō)明格式為: static 類型 變量名列表; static int a;根據(jù)靜態(tài)變量定義在函數(shù)內(nèi)還是函數(shù)外,可分為局部靜態(tài)變量與全局靜態(tài)變量。 static變量程序開始執(zhí)行時(shí),為靜態(tài)局部變量分配存儲(chǔ)空間,當(dāng)調(diào)用定義該變量的函數(shù)結(jié)束后,系統(tǒng)并不收回這些變量所占用的存儲(chǔ)空間,當(dāng)再次調(diào)用函數(shù)時(shí),變量仍使用相同的存儲(chǔ)空間,因此這些變量仍保留原來(lái)的值,即在整個(gè)程序運(yùn)行期間變量都存在靜態(tài)局部變量具有確定的值,其默認(rèn)初值為 0。 雖然靜態(tài)局部變量在函數(shù)調(diào)用后仍然存在,但其他函數(shù)不能引用它,只能由定義它的函數(shù)引用。定義在函數(shù)內(nèi)的靜態(tài)變量稱為局部靜態(tài)變量 靜態(tài)局部

20、變量#include int f() static int c=3; c=c+1; return (c); void main()int i;for(i=0;i3;i+)coutf()y?x:y; return(z);main() extern A,B; printf(%dn,max(A,B);int A=13,B=-8;本來(lái)在main函數(shù)中不能引用外部變量A,B。在main函數(shù)中用extern對(duì)A和B進(jìn)行“外部變量聲明”,就可以從“聲明”處起,合法地使用該外部變量A和B。遞歸程序設(shè)計(jì)在函數(shù)定義中,一個(gè)函數(shù)直接或間接地調(diào)用自己,稱遞歸調(diào)用,這類函數(shù)為遞歸函數(shù)。遞歸就象我們講的那個(gè)故事:山上有座

21、廟,廟里有個(gè)老和尚,老和尚在講故事,它講的故事是:山上有座廟,廟里有個(gè)老和尚,老和尚在講故事遞歸直接或間接地調(diào)用了其自身 遞歸問(wèn)題:有5個(gè)人坐在一起。問(wèn)第5個(gè)人多少歲?他說(shuō)比第4個(gè)人大2歲。問(wèn)第4個(gè)人多少歲?他說(shuō)比第3個(gè)人大2歲。問(wèn)第3個(gè)人多少歲?他說(shuō)比第2個(gè)人大2歲。問(wèn)第2個(gè)人多少歲?他說(shuō)比第1個(gè)人大2歲。問(wèn)第1個(gè)人多少歲?他說(shuō)是10歲。請(qǐng)問(wèn)第5個(gè)人多大?即:age(5)=age(4)+2 age(4)=age(3)+2 age(3)=age(2)+2 age(2)=age(1)+2 age(1)=10可以用式子表達(dá)如下: age(n)=10 (n=1) age(n)= age(n-1)+2

22、 (n1)求解過(guò)程age(5)=age(4)+2age(4)=age(3)+2age(3)=age(2)+2age(2)=age(1)+2age(1)=10age(2)=12age(3)=14age(4)=16age(5)=18遞推回歸#include int age(int n) int c;if(n=1) c=10;else c=age(n-1)+2;return c;void main() coutage(5)1f(n)=1 n=0或n=1nf(n-1) n1用遞歸法計(jì)算n!。f(4)4*f(3)3*f(2)2*f(1)2*13*2*14*3*2*1遞推回歸用遞歸法計(jì)算n!。long f

23、(int n) long r; if(n1) r=f(n-1)*n; else r=1; return(r); void main() int n; long y; coutn; y=f(n); coutyendl; 程序說(shuō)明: 程序中給出的函數(shù)f是一個(gè)遞歸函數(shù).主函數(shù)調(diào)用f 后即進(jìn)入函數(shù)f執(zhí)行,如果n0,n=0或n=1時(shí)都將結(jié)束函數(shù)的執(zhí)行,否則就遞歸調(diào)用f函數(shù)自身.由于每次遞歸調(diào)用的實(shí)參為n-1,即把n-1 的值賦予形參n,最后當(dāng)n-1的值為1時(shí)再作遞歸調(diào)用,形參n的值也為1,將使遞歸終止.然后可逐層退回。文件包含功能:一個(gè)源文件可將另一個(gè)源文件的內(nèi)容全部包含進(jìn)來(lái)一般形式: #include

24、 “文件名” 或 #include 處理過(guò)程:預(yù)編譯時(shí),用被包含文件的內(nèi)容取代該預(yù)處理命令,再對(duì)“包含”后的文件作一個(gè)源文件編譯表示編譯系統(tǒng)定義路徑;“ ”表示用戶指明路徑。預(yù)處理命令一般將宏定義及函數(shù)的原型聲明放在包含文件中。#include “file2.h”file1.cppfile2.hfile1.cppfile2.h程序體A程序體B程序體A宏定義:1)不帶參數(shù)宏定義一般形式: #define 宏名 宏體功能:用指定標(biāo)識(shí)符(宏名)代替字符序列(宏體)定義位置:任意(一般在函數(shù)外面)作用域:從定義命令到文件結(jié)束#undef可終止宏名作用域 格式: #undef 宏名#define YES

25、 1main() .#undef YES#define YES 0max().YES原作用域YES新作用域宏展開:預(yù)編譯時(shí),用宏體替換宏名-不作語(yǔ)法檢查如 #define YES 1 #define NO 0 #define PI 3.1415926#define M (y*y+3*y)main() int s,y; printf(input a number: ); scanf(%d,&y); s=3*M; printf(s=%dn,s);帶參數(shù)宏定義一般形式: #define 宏名(參數(shù)表) 宏體#define S( a , b ) a*barea=S( 4 , 3 );替換過(guò)程:將實(shí)際參數(shù)替換宏定義的參數(shù)。替換字符串中的參數(shù)。替換整個(gè)宏。4*3帶參的宏與函數(shù)的區(qū)別:帶參宏不分配內(nèi)存單元,不返回值,只是在編譯時(shí)按規(guī)則替換。關(guān)于帶參宏的說(shuō)明:要嚴(yán)格按格式書寫,否則會(huì)造成錯(cuò)誤。#define S (a,b) a*b S(3,4)被替換成: (a,b) a*b(3,4) 參數(shù)有可能用到表達(dá)式時(shí),參數(shù)字符要加()。#define S(r) PI*r*rS(a+b)替換為:PI*a+b*a+b#define S(r) PI*(r)*(r)S(a+b)替換為:PI*(a+b)*(a+

溫馨提示

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