C++第5章 (函數(shù)鞏固)_第1頁
C++第5章 (函數(shù)鞏固)_第2頁
C++第5章 (函數(shù)鞏固)_第3頁
C++第5章 (函數(shù)鞏固)_第4頁
C++第5章 (函數(shù)鞏固)_第5頁
已閱讀5頁,還剩43頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、1第五章 函數(shù)與編譯預(yù)處理21、一個源程序文件由一個或多個函數(shù)組成,編譯程序以、一個源程序文件由一個或多個函數(shù)組成,編譯程序以文件而不是以函數(shù)為單位進(jìn)行編譯的。文件而不是以函數(shù)為單位進(jìn)行編譯的。2、一個程序可以由多個源文件組成,可以分別編譯,統(tǒng)、一個程序可以由多個源文件組成,可以分別編譯,統(tǒng)一執(zhí)行。一執(zhí)行。3、一個程序必須有且只有一個、一個程序必須有且只有一個main( )函數(shù),函數(shù),C+從從main( )函數(shù)開始執(zhí)行。函數(shù)開始執(zhí)行。4、C+語言中,語言中,所有函數(shù)都是平行獨立的,無主次、相互所有函數(shù)都是平行獨立的,無主次、相互包含之分包含之分。函數(shù)可以嵌套調(diào)用,不可嵌套定義函數(shù)可以嵌套調(diào)用,

2、不可嵌套定義。5、從使用角度來說,分標(biāo)準(zhǔn)函數(shù)和用戶自定義函數(shù);從、從使用角度來說,分標(biāo)準(zhǔn)函數(shù)和用戶自定義函數(shù);從形式來說,分無參函數(shù)和有參函數(shù)。形式來說,分無參函數(shù)和有參函數(shù)。36、在未出現(xiàn)函數(shù)調(diào)用時,形參并不占內(nèi)存的存儲單元,、在未出現(xiàn)函數(shù)調(diào)用時,形參并不占內(nèi)存的存儲單元,只有在函數(shù)開始調(diào)用時,形參才被分配內(nèi)存單元只有在函數(shù)開始調(diào)用時,形參才被分配內(nèi)存單元。調(diào)用結(jié)。調(diào)用結(jié)束后,形參所占用的內(nèi)存單元被釋放。束后,形參所占用的內(nèi)存單元被釋放。7、實參對形參變量的傳遞是、實參對形參變量的傳遞是“值傳遞值傳遞”,即單向傳遞。,即單向傳遞。在內(nèi)存中實參、形參分占不同的單元在內(nèi)存中實參、形參分占不同的單

3、元。8、形參只作用于被調(diào)函數(shù),可以在別的函數(shù)中使用相同、形參只作用于被調(diào)函數(shù),可以在別的函數(shù)中使用相同的變量名。的變量名。4函數(shù)的返回值函數(shù)的返回值函數(shù)的返回值通過函數(shù)的返回值通過return語句獲得。語句獲得。函數(shù)只函數(shù)只能有唯一的返回值。能有唯一的返回值。函數(shù)返回值的類型就是函數(shù)的類型。函數(shù)返回值的類型就是函數(shù)的類型。return語句可以是一個表達(dá)式,函數(shù)先計算語句可以是一個表達(dá)式,函數(shù)先計算表達(dá)式后再返回值。表達(dá)式后再返回值。return語句還可以終止函數(shù),并將控制返回語句還可以終止函數(shù),并將控制返回到主調(diào)函數(shù)。到主調(diào)函數(shù)。一個函數(shù)中可以有一個以上的一個函數(shù)中可以有一個以上的return

4、語句,執(zhí)行語句,執(zhí)行到哪一個到哪一個return語句,哪一個語句起作用。語句,哪一個語句起作用。 5int add ( int a, int b) return (a+b); int max ( int a, int b) if (xy) return x ; else return y; 若函數(shù)體內(nèi)沒有若函數(shù)體內(nèi)沒有return語語句,就一直執(zhí)行到函數(shù)體句,就一直執(zhí)行到函數(shù)體的末尾,然后返回到主調(diào)的末尾,然后返回到主調(diào)函數(shù)的調(diào)用處。函數(shù)的調(diào)用處。先計算,后返回先計算,后返回可以有多個可以有多個return語句語句6不帶返回值的函數(shù)可說明為不帶返回值的函數(shù)可說明為void型。型。函數(shù)的類型與函

5、數(shù)參數(shù)的類型沒有關(guān)系。函數(shù)的類型與函數(shù)參數(shù)的類型沒有關(guān)系。double blink ( int a, int b)如果函數(shù)的類型和如果函數(shù)的類型和return表達(dá)式中的類型不一致,表達(dá)式中的類型不一致,則以函數(shù)的類型為準(zhǔn)。則以函數(shù)的類型為準(zhǔn)。函數(shù)的類型決定返回值的函數(shù)的類型決定返回值的類型。類型。對數(shù)值型數(shù)據(jù),可以自動進(jìn)行類型轉(zhuǎn)換。對數(shù)值型數(shù)據(jù),可以自動進(jìn)行類型轉(zhuǎn)換。 既然函數(shù)有返回值,這個值當(dāng)然應(yīng)屬于某一個確既然函數(shù)有返回值,這個值當(dāng)然應(yīng)屬于某一個確定的類型,應(yīng)當(dāng)在定義函數(shù)時指定函數(shù)值的類型。定的類型,應(yīng)當(dāng)在定義函數(shù)時指定函數(shù)值的類型。 int max (float a, float b)

6、/ 函數(shù)值為整型函數(shù)值為整型 函數(shù)返回值的類型,也是函數(shù)的類型函數(shù)返回值的類型,也是函數(shù)的類型71) 被調(diào)用的函數(shù)必須是已存在的函數(shù)被調(diào)用的函數(shù)必須是已存在的函數(shù)2) 如果使用庫函數(shù),必須用如果使用庫函數(shù),必須用 #include 在一個函數(shù)中調(diào)用另一函數(shù)(即被調(diào)用函數(shù))需要在一個函數(shù)中調(diào)用另一函數(shù)(即被調(diào)用函數(shù))需要具備哪些條件呢?具備哪些條件呢?3) 函數(shù)調(diào)用遵循函數(shù)調(diào)用遵循先定義、后調(diào)用先定義、后調(diào)用的原則,即的原則,即被調(diào)被調(diào)函數(shù)應(yīng)出現(xiàn)在主調(diào)函數(shù)之前函數(shù)應(yīng)出現(xiàn)在主調(diào)函數(shù)之前。4) 如果使用用戶自己定義的函數(shù),而該函數(shù)與調(diào)如果使用用戶自己定義的函數(shù),而該函數(shù)與調(diào)用它的函數(shù)(即主調(diào)函數(shù))在

7、同一個程序單位中用它的函數(shù)(即主調(diào)函數(shù))在同一個程序單位中且位置在主調(diào)函數(shù)之后且位置在主調(diào)函數(shù)之后,則必須在調(diào)用此函數(shù)之,則必須在調(diào)用此函數(shù)之前前對被調(diào)用的函數(shù)作聲明對被調(diào)用的函數(shù)作聲明。 8函數(shù)的嵌套調(diào)用函數(shù)的嵌套調(diào)用C語言中,語言中,所有函數(shù)都是平行獨立的,無主次、相所有函數(shù)都是平行獨立的,無主次、相互包含之分互包含之分。函數(shù)可以嵌套調(diào)用,不可嵌套定義。函數(shù)可以嵌套調(diào)用,不可嵌套定義。int max ( int a, int b) int c; int min ( int a, int b) return ( ab? a : b); int max ( int a, int b) int

8、c; c=min(a,b); return ( ab? a : b); int min ( int a, int b) return ( ab? a: b);嵌套定義嵌套定義嵌套調(diào)用嵌套調(diào)用平行定義平行定義9kkkknnkf.321),(int power(int m,int n)/mnint i,product=m;for(i=1;in;i+)product=product*m;return product;int sum_of_power(int k,int n)/nk的累加和的累加和int i,sum=0;for(i=1;ikm;coutf(k,m)=sum_of_power(k,m)1

9、int age ( int n ) int c; c=age(n-1)+2; return c;void main(void) int age(int); coutage(5)endl;int age ( int n ) int c; if (n= =1) c=10; else c=age(n-1)+2; return c;必須有遞歸結(jié)束條件必須有遞歸結(jié)束條件12int age ( int n ) int c; if (n= =1) c=10; else c=age(n-1)+2; return c;void main(void) int age(int); coutage(5)endl;ag

10、e (5)n=5c=age (4)+2age (4)n=4c=age (3)+2age (3)n=3c=age (2)+2age (2)n=2c=age (1)+2age (1)n=1c=10return creturn cc=12return cc=14return cc=16return cc=18雖然算法一致,雖然算法一致,但但n不同,不同,c不同不同,在內(nèi)存中每一層函數(shù)在內(nèi)存中每一層函數(shù)變變量量所在的內(nèi)存單元均不相同所在的內(nèi)存單元均不相同。必須有遞歸終止條件必須有遞歸終止條件。13int sub(int);void main (void) int i=5; coutsub(i)i; f

11、(i);void f(int n )if(n= =0) return; else coutn%10; f(n/10); coutn%10; return; f(1234)coutn%10f(n/10)f (123)coutn%10f(n/10)f(12)coutn%10f(n/10)f(1)coutn%10f (n/10)f(0)n=0returncoutn%10returncoutn%10returncoutn%10returncoutn%10return4321123443211234輸入:輸入:123415void recur(char c) coutc; if(c5) recur(c+

12、1); cout=10) f(n/10); coutnendl;void main(void) f(12345);11212312341234517作用域和存儲類作用域和存儲類作用域是指程序中所說明的標(biāo)識符在哪一個區(qū)間作用域是指程序中所說明的標(biāo)識符在哪一個區(qū)間內(nèi)有效,即在哪一個區(qū)間內(nèi)可以使用或引用該標(biāo)內(nèi)有效,即在哪一個區(qū)間內(nèi)可以使用或引用該標(biāo)識符識符。在。在C+中,作用域共分為五類:中,作用域共分為五類:塊作用域、塊作用域、文件作用域、函數(shù)原型作用域、函數(shù)作用域和類文件作用域、函數(shù)原型作用域、函數(shù)作用域和類的作用域。的作用域。 18塊作用域塊作用域我們把用花括號括起來的一部分程序稱為一個塊。我

13、們把用花括號括起來的一部分程序稱為一個塊。在塊內(nèi)說明的標(biāo)識符,只能在該塊內(nèi)引用,即其在塊內(nèi)說明的標(biāo)識符,只能在該塊內(nèi)引用,即其作用域在該塊內(nèi),開始于標(biāo)識符的說明處,結(jié)束作用域在該塊內(nèi),開始于標(biāo)識符的說明處,結(jié)束于塊的結(jié)尾處。于塊的結(jié)尾處。 在一個函數(shù)內(nèi)部定義的變量或在一個塊中定義的在一個函數(shù)內(nèi)部定義的變量或在一個塊中定義的變量稱為局部變量。變量稱為局部變量。 19在函數(shù)內(nèi)或復(fù)合語句內(nèi)部定義的變量,其作用域是在函數(shù)內(nèi)或復(fù)合語句內(nèi)部定義的變量,其作用域是從定義的位置起到函數(shù)體或復(fù)合語句的結(jié)束從定義的位置起到函數(shù)體或復(fù)合語句的結(jié)束。形參形參也是局部變量。也是局部變量。float f1( int a)

14、 int b,c; .float f2( int x, int y) int i, j; .void main(void ) int m, n; .x,y,i,j 有效有效a,b,c有效有效m,n有效有效20注意:注意:具有塊作用域的標(biāo)識符在其作用域內(nèi),將屏具有塊作用域的標(biāo)識符在其作用域內(nèi),將屏蔽其作用塊包含本塊的同名標(biāo)識符,即蔽其作用塊包含本塊的同名標(biāo)識符,即變量名相同,局部更優(yōu)先。變量名相同,局部更優(yōu)先。21void main(void) int a=2, b=3, c=5; coutatbtcendl; int a, b=2; a=b+c; coutatbtcendl; c=a-b; c

15、outatbtcendl; a2b3c52 3 57 2 5ab27-12 3 -122void main(void) int a=1,b=2,c=3; +a; c+=+b; int b=4, c; c=b*3; a+=c; cout“first:”atbtcendl; a+=c; cout“second:”atbtcendl; cout“third:”atbtcendl;a=2b=3, c=6b=4c=12a=14a=14,b=4,c=12a=26a=26,b=4,c=12a=26,b=3,c=623文件作用域文件作用域 在函數(shù)外定義的變量稱為全局變量。在函數(shù)外定義的變量稱為全局變量。全局變

16、量的作用域稱為文件作用域,即在整個文全局變量的作用域稱為文件作用域,即在整個文件中都是可以訪問的。件中都是可以訪問的。 其缺省的作用范圍是其缺省的作用范圍是:從定義全局變量的位置開始從定義全局變量的位置開始到該源程序文件結(jié)束到該源程序文件結(jié)束。當(dāng)在塊作用域內(nèi)的變量與全局變量同名時,當(dāng)在塊作用域內(nèi)的變量與全局變量同名時,局部局部變量優(yōu)先。變量優(yōu)先。 24p,q有效有效int p=1, q=5;float f1( int a) int b,c; .char c1,c2;main( ) int m, n; .a,b,c有效有效m,n有效有效c1,c2有效有效全局變量全局變量局部變量局部變量全局變量全

17、局變量增加了函數(shù)間數(shù)據(jù)聯(lián)系的渠道增加了函數(shù)間數(shù)據(jù)聯(lián)系的渠道,在函數(shù)調(diào),在函數(shù)調(diào)用時可以得到多于一個的返回值。用時可以得到多于一個的返回值。254int min;int max (int x, int y) int z; min=(xy)? x : y ; return z; void main (void) int a,b,c; cinab; c=max (a , b) ; cout“The max is”cendl; cout“ The min is”minb? a:b; return c;void main(void) int a=8; coutmax(a,b)endl;3a5ba88a5

18、bmax (8,5)輸出:輸出:827int x;void cude(void) x=x*x*x ;void main (void) x=5; cude ( ); coutxendl;輸出:輸出: 125輸出:輸出: 5int x=5;x為為028函數(shù)原型作用域函數(shù)原型作用域 在函數(shù)原型的參數(shù)表中說明的標(biāo)識符所具有的作在函數(shù)原型的參數(shù)表中說明的標(biāo)識符所具有的作用域稱為函數(shù)原型作用域,用域稱為函數(shù)原型作用域,它從其說明處開始,它從其說明處開始,到函數(shù)原型說明的結(jié)束處結(jié)束到函數(shù)原型說明的結(jié)束處結(jié)束。 float tt(int x , float y); /函數(shù)函數(shù)tt的原型說明的原型說明 由于所說

19、明的標(biāo)識符與該函數(shù)的定義及調(diào)用無關(guān),由于所說明的標(biāo)識符與該函數(shù)的定義及調(diào)用無關(guān),所以,所以,可以在函數(shù)原型說明中只作參數(shù)的類型說可以在函數(shù)原型說明中只作參數(shù)的類型說明,而省略參量名明,而省略參量名。 float tt (int , float); 29int i=0;int workover(int i) i=(i%i)*(i*i)/(2*i)+4); cout“i=“iendl; return i;int rest (int i) i=i2?5:0; return i;void main(void) int i=5; rest(i/2); cout“i=“iendl; rest(i=i/2)

20、; cout“i=“iendl; i= rest(i/2); cout“i=“iendl; workover(i) cout“i=“iendl;i=5i=2i=5i=0i=530int f (int a) int b=0; static int c=3; b=b+1; c=c+1; return a+b+c;void main(void) int a=2,i; for (i=0;i3;i+) coutf(a)endl;i=0a=2b=0, b=1c=3, c=4輸出:輸出:7i=1a=2b=0, b=1c=4, c=5輸出:輸出:8i=2a=2b=0, b=1c=5, c=6輸出:輸出:978

21、9只賦一只賦一次初值次初值31int fun(int a) int c; static int b=3; c=a+ b+; return c;void main(void) int x=2, y; y=fun(x); coutyendl; y=fun(x+3); coutyendl;x2ya2b3c5455a5只賦一次初值只賦一次初值c9599輸出:輸出:變量變量b是靜態(tài)局部變量,在內(nèi)存是靜態(tài)局部變量,在內(nèi)存一旦開辟空間,就不會釋放,空一旦開辟空間,就不會釋放,空間值一直保留間值一直保留32int func (int a, int b) static int m=0, i=2; i+=m+1;

22、 m=i+a+b; return m; void main(void) int k=4, m=1, p; p=func(k, m); coutpendl; p=func(k, m); coutpendl;func( 4, 1)a=4, b=1m=0, i=2i=3m=3+4+1=8func( 4, 1)a=4, b=1m=8, i=3i=3+8+1=12m=12+4+1=17輸出:輸出:8,1733int q(int x) int y=1; static int z=1; z+=z+y+; return x+z;void main(void) coutq(1)t; coutq(2)t; cou

23、tq(3)am; c=a*b; couta“*”b“=“cendl; d= power(m); couta“*”m“=“dendl; 文件文件file2.c中的內(nèi)容為:中的內(nèi)容為:extern int a;int power (int n ) int i, y=1; for (i=1; i=n; i+) y*=a; return y; 外部全局外部全局變量定義變量定義外部全局外部全局變量說明變量說明引用文件外定引用文件外定義的全局變量義的全局變量35具有缺省參數(shù)值和參數(shù)個數(shù)可變的函數(shù)具有缺省參數(shù)值和參數(shù)個數(shù)可變的函數(shù)在在C+中定義函數(shù)時,允許給參數(shù)指定一個缺中定義函數(shù)時,允許給參數(shù)指定一個缺省

24、的值。省的值。在調(diào)用函數(shù)時,若明確給出了這種實在調(diào)用函數(shù)時,若明確給出了這種實參的值,則使用相應(yīng)實參的值;若沒有給出相參的值,則使用相應(yīng)實參的值;若沒有給出相應(yīng)的實參,則使用缺省的值。(舉例說明)應(yīng)的實參,則使用缺省的值。(舉例說明) 36int fac(int n=2) int t=1; for(int i=1;i=n;i+) t=t*i; return t;void main(void) cout fac(6) endl;輸出:輸出:720fac( )輸出:輸出:237int area(int long=4 , int width=2) return long* width;void ma

25、in(void ) int a=8, b=6; cout area(a,b) endl; cout area(a) endl; cout area( ) endl; 4816838使用具有缺省參數(shù)的函數(shù)時,應(yīng)注意以下幾點:使用具有缺省參數(shù)的函數(shù)時,應(yīng)注意以下幾點:1.不可以靠左邊缺省不可以靠左邊缺省 2.函數(shù)原型說明時可以不加變量名函數(shù)原型說明時可以不加變量名 float v(float,float=10,float=20);int area(int long , int width=2)int area(int long =4, int width)3.只能在前面定義一次缺省值只能在前面定義

26、一次缺省值,即原型說明時定義,即原型說明時定義了缺省值,后面函數(shù)的定義不可有缺省值。了缺省值,后面函數(shù)的定義不可有缺省值。錯誤!錯誤!39函數(shù)的重載函數(shù)的重載所謂函數(shù)的重載是指完成不同功能的函數(shù)可以具所謂函數(shù)的重載是指完成不同功能的函數(shù)可以具有有相同的函數(shù)名相同的函數(shù)名。 C+的編譯器是根據(jù)的編譯器是根據(jù)函數(shù)的實參函數(shù)的實參來確定應(yīng)該調(diào)用來確定應(yīng)該調(diào)用哪一個函數(shù)的。哪一個函數(shù)的。 int fun(int a, int b) return a+b; int fun (int a) return a*a; void main(void) coutfun(3,5)endl; coutfun(5)en

27、dl;82540 1、定義的重載函數(shù)必須具有定義的重載函數(shù)必須具有不同的參數(shù)個數(shù)不同的參數(shù)個數(shù),或或不同的參數(shù)類型不同的參數(shù)類型。只有這樣編譯系統(tǒng)才有可能。只有這樣編譯系統(tǒng)才有可能根據(jù)不同的參數(shù)去調(diào)用不同的重載函數(shù)。根據(jù)不同的參數(shù)去調(diào)用不同的重載函數(shù)。2、僅返回值不同時,不能定義為重載函數(shù)。、僅返回值不同時,不能定義為重載函數(shù)。即僅函數(shù)的類型不同,不能定義為重載函數(shù)即僅函數(shù)的類型不同,不能定義為重載函數(shù) int fun(int a, int b) return a+b; float fun (int a,int b) return (float) a*a; void main(void) co

28、utfun(3,5)endl; coutfun(3,5)x;coutsin(x)endl;coutsin(x,x)endl;coutsin(x,10)endl;sin(x,x)sin(x,10)不同的參不同的參數(shù)類型數(shù)類型42int q(int x) int y=1; static int z=1; z+=z+y+; return x+z;void main(void) coutq(1)t; coutq(2)t; coutq(3)t;4 9 18431、宏展開只是一個簡單的、宏展開只是一個簡單的“物理物理”替換,不做替換,不做語語法檢查法檢查,不是一個語句,不是一個語句,其后不加分號其后不加分號“;”2、#define命令出現(xiàn)在函數(shù)的外面,其有效范圍為命令出現(xiàn)在函數(shù)的外面,其有效范圍為定義處至本源文件結(jié)束??梢杂枚x處至本源文件結(jié)束。可以用# undef命令終止宏命令終止宏定義的作用域。定義的作用域。#define G 9.8void main(void ).# undef Gint max(int a,int b). 44#define A 3#define B(a) (A+1)*a)執(zhí)行執(zhí)行 x=3*(A+B(7); 后,后, x的值為的值為:93#define neg(x)

溫馨提示

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

評論

0/150

提交評論