C語(yǔ)言課件:第八章 函數(shù)_第1頁(yè)
C語(yǔ)言課件:第八章 函數(shù)_第2頁(yè)
C語(yǔ)言課件:第八章 函數(shù)_第3頁(yè)
C語(yǔ)言課件:第八章 函數(shù)_第4頁(yè)
C語(yǔ)言課件:第八章 函數(shù)_第5頁(yè)
已閱讀5頁(yè),還剩107頁(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、共 81頁(yè) 第 1 1 頁(yè)共 81頁(yè) 第 2 2 頁(yè) 本章要點(diǎn)本章要點(diǎn) 函數(shù)的定義函數(shù)的定義 函數(shù)的調(diào)用函數(shù)的調(diào)用 函數(shù)參數(shù)的傳遞方式函數(shù)參數(shù)的傳遞方式 變量的作用域和存儲(chǔ)方法變量的作用域和存儲(chǔ)方法 內(nèi)部函數(shù)和外部函數(shù)內(nèi)部函數(shù)和外部函數(shù) 有參宏定義與調(diào)用有參宏定義與調(diào)用共 81頁(yè) 第 3 3 頁(yè)函數(shù)函數(shù)F1 ( )main ( )F11 ( )F2 ( )F21 ( )F22 ( ) C C程序是函數(shù)的集合體,每程序是函數(shù)的集合體,每個(gè)函數(shù)是一個(gè)獨(dú)立的程序模個(gè)函數(shù)是一個(gè)獨(dú)立的程序模塊;塊; 由由一個(gè)主函數(shù)一個(gè)主函數(shù)和和若干個(gè)子函若干個(gè)子函數(shù)數(shù)組成組成,程序總是從主函數(shù),程序總是從主函數(shù)開(kāi)始執(zhí)行

2、;開(kāi)始執(zhí)行; 所有子函數(shù)地位平等,可互所有子函數(shù)地位平等,可互相調(diào)用、自我調(diào)用。相調(diào)用、自我調(diào)用。 函數(shù)可集中或分散存放在一函數(shù)可集中或分散存放在一個(gè)或多個(gè)源程序文件中。個(gè)或多個(gè)源程序文件中。 引入函數(shù)的優(yōu)點(diǎn):引入函數(shù)的優(yōu)點(diǎn): 減少減少重復(fù)編寫(xiě)程序的工作量;使重復(fù)編寫(xiě)程序的工作量;使程序便于調(diào)試和閱讀。程序便于調(diào)試和閱讀。 共 81頁(yè) 第 4 4 頁(yè)main: 主函數(shù)主函數(shù) e, d, h ,g 被多次調(diào)用被多次調(diào)用a, b, c,d, e, f,g, h, 相互調(diào)相互調(diào)用用mainabdeghhgedcgf函數(shù)函數(shù)是是C程序的程序的最小最小單元。單元。主主函數(shù)可以調(diào)用其它函數(shù),其函數(shù)可以調(diào)用

3、其它函數(shù),其它函數(shù)可以相互調(diào)用它函數(shù)可以相互調(diào)用.函數(shù)調(diào)用舉例函數(shù)調(diào)用舉例main() /* 主函數(shù)主函數(shù) */ printstar(); /*調(diào)用調(diào)用printstar函數(shù)畫(huà)函數(shù)畫(huà)*/ print_message(); /*調(diào)用調(diào)用print _message函數(shù)寫(xiě)字函數(shù)寫(xiě)字*/ printstar(); /*調(diào)用調(diào)用printstar函數(shù)畫(huà)函數(shù)畫(huà)*/ printstar() /*printstar函數(shù)函數(shù)*/ printf(“n*”);print_message() /* print_message函數(shù)函數(shù)*/ printf(“n Hello! ”);運(yùn)行結(jié)果:* Hello! * 一個(gè)一

4、個(gè)c c程序由一個(gè)或多個(gè)源文件組成程序由一個(gè)或多個(gè)源文件組成# include “l(fā)x2.c”# include “l(fā)x3.c”main() printstar(); print_message(); printstar(); printstar() printf(“n*”);print_message() printf(“n Hello! ”);Lx1.cLx2.cLx3.c共 81頁(yè) 第 7 7 頁(yè)數(shù)學(xué)函數(shù)數(shù)學(xué)函數(shù) # #include include math.hmath.h 字符和字符串函數(shù)字符和字符串函數(shù) ctype.h, string.hctype.h, string.hI/OI/

5、O函數(shù)函數(shù) # #include include stdio.hstdio.h 動(dòng)態(tài)存儲(chǔ)分配函數(shù)動(dòng)態(tài)存儲(chǔ)分配函數(shù) 形式形式有有參參函數(shù)函數(shù)無(wú)無(wú)參參函數(shù)函數(shù)空函數(shù)空函數(shù)庫(kù)函數(shù)庫(kù)函數(shù)用戶定義函數(shù)用戶定義函數(shù): :共 81頁(yè) 第 8 8 頁(yè)一、定義形式一、定義形式:類型標(biāo)識(shí)符類型標(biāo)識(shí)符 函數(shù)名函數(shù)名(形式參數(shù)表形式參數(shù)表)形式參數(shù)說(shuō)明形式參數(shù)說(shuō)明 說(shuō)明與定義部分說(shuō)明與定義部分 語(yǔ)句語(yǔ)句各形參之間用各形參之間用”,”隔開(kāi)隔開(kāi)形參可以缺省形參可以缺省,但括號(hào)但括號(hào)不可省不可省函數(shù)類型函數(shù)類型函數(shù)體(是一段程序,實(shí)函數(shù)體(是一段程序,實(shí)現(xiàn)函數(shù)的功能)現(xiàn)函數(shù)的功能)函數(shù)名字有值,它代表函函數(shù)名字有值,它代表

6、函數(shù)的入口地址。數(shù)的入口地址。有參函數(shù)定義形式有參函數(shù)定義形式這是有參函數(shù)定義形式這是有參函數(shù)定義形式共 81頁(yè) 第 9 9 頁(yè)無(wú)參函數(shù)的定義形式無(wú)參函數(shù)的定義形式: 類型標(biāo)識(shí)符類型標(biāo)識(shí)符 函數(shù)名(函數(shù)名( ) 說(shuō)明部分說(shuō)明部分 語(yǔ)句語(yǔ)句 例例:print_message( ) printf(“How are you !n”); 例例:dummy ( )( ) l 沒(méi)有沒(méi)有數(shù)據(jù)類型數(shù)據(jù)類型說(shuō)明、說(shuō)明、和和形參說(shuō)明形參說(shuō)明l函數(shù)體函數(shù)體為空。為空。無(wú)參函數(shù)定義無(wú)參函數(shù)定義空函數(shù)定義空函數(shù)定義 longlong factofacto ( ( n n ) ) intint n;n; long s=1

7、;int i; long s=1;int i; for (i=1; i=n; i+) for (i=1; i y ? x : y ; return ( z );形式參數(shù)列表形式參數(shù)列表:是是用用“,”分開(kāi)的一分開(kāi)的一組變量,用來(lái)接收組變量,用來(lái)接收調(diào)用時(shí)傳入的數(shù)據(jù)調(diào)用時(shí)傳入的數(shù)據(jù)形式參數(shù)說(shuō)明:形式參數(shù)說(shuō)明:在在 外面對(duì)形式參數(shù)外面對(duì)形式參數(shù)的類型進(jìn)行說(shuō)明的類型進(jìn)行說(shuō)明函數(shù)調(diào)用函數(shù)調(diào)用求兩個(gè)變量的最大值求兩個(gè)變量的最大值 函數(shù)聲明函數(shù)聲明也可寫(xiě)成:也可寫(xiě)成:int max(int x,int y)共 81頁(yè) 第 1212 頁(yè)二、二、 形式參數(shù)和實(shí)際參數(shù)形式參數(shù)和實(shí)際參數(shù) 形式參數(shù)形式參數(shù):形參調(diào)

8、用前不占內(nèi)存單元,調(diào)用時(shí)占用,調(diào)用后釋放形參調(diào)用前不占內(nèi)存單元,調(diào)用時(shí)占用,調(diào)用后釋放形參是函數(shù)的內(nèi)部變量,只在函數(shù)內(nèi)部才有意義。形參是函數(shù)的內(nèi)部變量,只在函數(shù)內(nèi)部才有意義。對(duì)每個(gè)形參必須指明其名字和數(shù)據(jù)類型。對(duì)每個(gè)形參必須指明其名字和數(shù)據(jù)類型。 實(shí)際參數(shù)實(shí)際參數(shù):實(shí)參必須有確定的值,可以是常量,變量或表達(dá)式。實(shí)參必須有確定的值,可以是常量,變量或表達(dá)式。實(shí)參與形參的類型、個(gè)數(shù)必須一致。實(shí)參與形參的類型、個(gè)數(shù)必須一致。共 81頁(yè) 第 1313 頁(yè) 1. 函數(shù)調(diào)用的一般形式為:函數(shù)調(diào)用的一般形式為: 函數(shù)名(實(shí)際參數(shù)列表);函數(shù)名(實(shí)際參數(shù)列表);(函數(shù)以語(yǔ)句的形式出現(xiàn)函數(shù)以語(yǔ)句的形式出現(xiàn))或或

9、 函數(shù)名(實(shí)際參數(shù)列表)函數(shù)名(實(shí)際參數(shù)列表)(函數(shù)出現(xiàn)在表達(dá)式中函數(shù)出現(xiàn)在表達(dá)式中)實(shí)參的數(shù)量、類型和排列順序必須與函數(shù)定義時(shí)形參實(shí)參的數(shù)量、類型和排列順序必須與函數(shù)定義時(shí)形參表中形參的數(shù)量、類型和排列順序一致。表中形參的數(shù)量、類型和排列順序一致。 2. 執(zhí)行過(guò)程:執(zhí)行過(guò)程: 在一個(gè)函數(shù)中調(diào)用另一個(gè)函數(shù)時(shí),程序?qū)⒃谝粋€(gè)函數(shù)中調(diào)用另一個(gè)函數(shù)時(shí),程序?qū)⒖刂瓶刂茝恼{(diào)從調(diào)用函數(shù)處用函數(shù)處轉(zhuǎn)移轉(zhuǎn)移到被調(diào)用函數(shù),并且執(zhí)行被調(diào)用函數(shù)。到被調(diào)用函數(shù),并且執(zhí)行被調(diào)用函數(shù)。在執(zhí)行完在執(zhí)行完被調(diào)用函數(shù)被調(diào)用函數(shù)的所有語(yǔ)句或者遇到的所有語(yǔ)句或者遇到returnreturn語(yǔ)語(yǔ)句時(shí),程序的控制要句時(shí),程序的控制要返回

10、返回到調(diào)用函數(shù)中到調(diào)用函數(shù)中原來(lái)調(diào)用函原來(lái)調(diào)用函數(shù)的地方繼續(xù)執(zhí)行。數(shù)的地方繼續(xù)執(zhí)行。共 81頁(yè) 第 1414 頁(yè)例:調(diào)用例:調(diào)用maxmax函數(shù)的程序函數(shù)的程序int main()int main()int a,b,c;int a,b,c; int int max();max(); scanf(%d,%d,&a,&b); scanf(%d,%d,&a,&b); c c= =maxmax(a,b);(a,b); printf(max=%dn, printf(max=%dn,c c);); return 0; return 0; 函數(shù)調(diào)用函數(shù)調(diào)用int int ma

11、xmax(x,y)(x,y)int x,y;int x,y;int z;int z; if(xy)z=x; if(xy)z=x; else z=y; else z=y; return(z); return(z); 實(shí)際參數(shù)實(shí)際參數(shù)形式參數(shù)形式參數(shù)返回函數(shù)值返回函數(shù)值接收接收返回值返回值程序執(zhí)行順序程序執(zhí)行順序? ?共 81頁(yè) 第 1515 頁(yè)/ /* *1 1* */ / /* *2 2* */ / /* *3 3* */ / /* *4 4* */ / /* *5 5* */ / /* *1111* */ / /* *1212* */ / /* *1313* */ / /* *1414* *

12、/ / /* *1515* */ / /* *1616* */ /int main()int main() int a,b,c; int int a,b,c; int maxmax();(); scanf(%d,%d,&a,&b); scanf(%d,%d,&a,&b); c= c=max(a,b);max(a,b); printf(max=%dn,c); printf(max=%dn,c); return 0; return 0; int int max(x,y)max(x,y) int x,y; int x,y; int z; int z; if (xy)

13、z=x; if (xy) z=x; else z=y; else z=y; return(z); return(z); 斷點(diǎn)斷點(diǎn)保護(hù)斷點(diǎn)和保護(hù)斷點(diǎn)和現(xiàn)場(chǎng),轉(zhuǎn)向現(xiàn)場(chǎng),轉(zhuǎn)向1111入口入口返回?cái)帱c(diǎn)返回?cái)帱c(diǎn)恢復(fù)現(xiàn)場(chǎng)恢復(fù)現(xiàn)場(chǎng)帶回函數(shù)值帶回函數(shù)值虛實(shí)結(jié)合虛實(shí)結(jié)合a x,b ya x,b y共 81頁(yè) 第 1616 頁(yè)(1) 函數(shù)語(yǔ)句函數(shù)語(yǔ)句 (把(把函數(shù)調(diào)用作為一個(gè)語(yǔ)句)函數(shù)調(diào)用作為一個(gè)語(yǔ)句) 一般形式:一般形式:函數(shù)名(實(shí)際參數(shù)表);函數(shù)名(實(shí)際參數(shù)表); 此時(shí)不要求函數(shù)帶回值,只要求函數(shù)完成一定的操作。此時(shí)不要求函數(shù)帶回值,只要求函數(shù)完成一定的操作。 例如:例如: printstar( );3. 函

14、數(shù)調(diào)用的幾種方式函數(shù)調(diào)用的幾種方式(2) 函數(shù)表達(dá)式函數(shù)表達(dá)式(函數(shù)調(diào)用出現(xiàn)在表達(dá)式中)(函數(shù)調(diào)用出現(xiàn)在表達(dá)式中) 一般形式:一般形式:變量名變量名= =函數(shù)表達(dá)式函數(shù)表達(dá)式 這時(shí)要求函數(shù)帶回一個(gè)確定的值以參加表達(dá)式的運(yùn)算。這時(shí)要求函數(shù)帶回一個(gè)確定的值以參加表達(dá)式的運(yùn)算。 例如:例如:c=3+max(a, b);注意:注意:無(wú)返回值函數(shù)的調(diào)用,不能出現(xiàn)在表達(dá)式中。無(wú)返回值函數(shù)的調(diào)用,不能出現(xiàn)在表達(dá)式中。 函數(shù)調(diào)用作為一個(gè)函數(shù)的實(shí)參。函數(shù)調(diào)用作為一個(gè)函數(shù)的實(shí)參。例如:例如:m = max( a, max(b, c) );(3) 函數(shù)參數(shù)函數(shù)參數(shù) (函數(shù)調(diào)用出現(xiàn)在函數(shù)參數(shù)中)(函數(shù)調(diào)用出現(xiàn)在函數(shù)參

15、數(shù)中)值傳遞值傳遞: 在調(diào)用函數(shù)時(shí),實(shí)參將值傳遞給形參。在調(diào)用函數(shù)時(shí),實(shí)參將值傳遞給形參。C語(yǔ)言規(guī)定,實(shí)參對(duì)形參的數(shù)據(jù)傳遞是語(yǔ)言規(guī)定,實(shí)參對(duì)形參的數(shù)據(jù)傳遞是“值傳遞值傳遞”,即單向傳遞,即單向傳遞。 在調(diào)用函數(shù)時(shí),給形參分配存儲(chǔ)單元,并將實(shí)在調(diào)用函數(shù)時(shí),給形參分配存儲(chǔ)單元,并將實(shí)參對(duì)應(yīng)的值傳遞給形參,調(diào)用結(jié)束后,形參單元參對(duì)應(yīng)的值傳遞給形參,調(diào)用結(jié)束后,形參單元被釋放,實(shí)參單元仍保留并維持原值。被釋放,實(shí)參單元仍保留并維持原值。 因此,在執(zhí)行一個(gè)被調(diào)用函數(shù)時(shí),形參的值如因此,在執(zhí)行一個(gè)被調(diào)用函數(shù)時(shí),形參的值如果發(fā)生變化,并不會(huì)改變主調(diào)函數(shù)中實(shí)參的值。果發(fā)生變化,并不會(huì)改變主調(diào)函數(shù)中實(shí)參的值。8

16、.1.4 函數(shù)參數(shù)的傳遞方式函數(shù)參數(shù)的傳遞方式共 81頁(yè) 第 1818 頁(yè)例例 編寫(xiě)函數(shù)交換兩個(gè)變量的值。編寫(xiě)函數(shù)交換兩個(gè)變量的值。 #include void swap ( int x, int y) int temp; temp=x; x=y; y=temp; printf ( x=%d,y=%dn, x, y); int main ( ) int a, b; a=5; b=10; printf ( a=%d,b=%dn, a, b); swap(a, b); printf ( a=%d,b=%dn, a, b);運(yùn)行結(jié)果:運(yùn)行結(jié)果:a=5 ,b=10 x=10,y=5a=5 ,b=10共

17、 81頁(yè) 第 1919 頁(yè) 值傳遞的優(yōu)點(diǎn)值傳遞的優(yōu)點(diǎn):被調(diào)用的函數(shù)不可能改變調(diào)用函數(shù)被調(diào)用的函數(shù)不可能改變調(diào)用函數(shù) 中變量的值,而只能改變它的局部的臨時(shí)副本。中變量的值,而只能改變它的局部的臨時(shí)副本。 值傳遞的缺點(diǎn)值傳遞的缺點(diǎn):每個(gè)形式參數(shù)僅能傳遞一個(gè)數(shù)據(jù),每個(gè)形式參數(shù)僅能傳遞一個(gè)數(shù)據(jù), 不適用需要在函數(shù)之間傳遞大量數(shù)據(jù)。不適用需要在函數(shù)之間傳遞大量數(shù)據(jù)。 地址傳遞:地址傳遞:將實(shí)參的地址傳遞給形參,實(shí)參和將實(shí)參的地址傳遞給形參,實(shí)參和形參指向同一內(nèi)存空間,對(duì)形參的修改,可以直形參指向同一內(nèi)存空間,對(duì)形參的修改,可以直接影響實(shí)參。接影響實(shí)參。8.1.4 函數(shù)參數(shù)的傳遞方式(續(xù))函數(shù)參數(shù)的傳遞方

18、式(續(xù))共 81頁(yè) 第 2020 頁(yè)2. 函數(shù)的返回值語(yǔ)句函數(shù)的返回值語(yǔ)句: return語(yǔ)句語(yǔ)句 一般形式:一般形式: return (表達(dá)式表達(dá)式); 或或 return 表達(dá)式表達(dá)式; 1. 定義定義:通過(guò)函數(shù)調(diào)用使主調(diào)函數(shù)得到一個(gè)確定:通過(guò)函數(shù)調(diào)用使主調(diào)函數(shù)得到一個(gè)確定 的值,稱為的值,稱為函數(shù)的返回值函數(shù)的返回值。注意不要丟掉注意不要丟掉;括號(hào)可以省略括號(hào)可以省略功能:功能:退出函數(shù),將退出函數(shù),將表達(dá)式的值表達(dá)式的值帶回主調(diào)函數(shù),回到程帶回主調(diào)函數(shù),回到程序原來(lái)的位置繼續(xù)執(zhí)行。序原來(lái)的位置繼續(xù)執(zhí)行。 共 81頁(yè) 第 2121 頁(yè)說(shuō)明說(shuō)明:一個(gè)函數(shù)中可以有多個(gè)一個(gè)函數(shù)中可以有多個(gè)re

19、turn語(yǔ)句,但是一次語(yǔ)句,但是一次 函數(shù)執(zhí)行只能執(zhí)行其中的一個(gè)。當(dāng)執(zhí)行到某個(gè)函數(shù)執(zhí)行只能執(zhí)行其中的一個(gè)。當(dāng)執(zhí)行到某個(gè) return語(yǔ)句時(shí),則終止函數(shù)執(zhí)行,并帶回函數(shù)值。語(yǔ)句時(shí),則終止函數(shù)執(zhí)行,并帶回函數(shù)值。fun(int x) if(x1) return 2*x+1; else if(xy? x:y; return(z); return (xy? x:y); 等效等效共 81頁(yè) 第 2222 頁(yè)說(shuō)明說(shuō)明(續(xù)續(xù)): 當(dāng)函數(shù)類型被定義為當(dāng)函數(shù)類型被定義為void類型時(shí),表示函數(shù)沒(méi)有類型時(shí),表示函數(shù)沒(méi)有返回值。這是函數(shù)可沒(méi)有返回值。這是函數(shù)可沒(méi)有 return語(yǔ)句,或者在語(yǔ)句,或者在 return

20、后面只寫(xiě)分號(hào),即后面只寫(xiě)分號(hào),即 return ; 如果函數(shù)體內(nèi)沒(méi)有如果函數(shù)體內(nèi)沒(méi)有return語(yǔ)句,就一直運(yùn)行到函語(yǔ)句,就一直運(yùn)行到函數(shù)的最后一條語(yǔ)句后,再返回調(diào)用函數(shù),數(shù)的最后一條語(yǔ)句后,再返回調(diào)用函數(shù),共 81頁(yè) 第 2323 頁(yè)3. 函數(shù)值的類型函數(shù)值的類型 函數(shù)定義時(shí)應(yīng)該指定函數(shù)的類型函數(shù)定義時(shí)應(yīng)該指定函數(shù)的類型(即函數(shù)值即函數(shù)值的類型),應(yīng)該與的類型),應(yīng)該與return語(yǔ)句的類型一致。語(yǔ)句的類型一致。說(shuō)明說(shuō)明:(1)如果函數(shù)類型和如果函數(shù)類型和return語(yǔ)句的類型不一致,語(yǔ)句的類型不一致,以函以函數(shù)類型為準(zhǔn)數(shù)類型為準(zhǔn)。對(duì)數(shù)值型數(shù)據(jù),可以自動(dòng)進(jìn)行類型。對(duì)數(shù)值型數(shù)據(jù),可以自動(dòng)進(jìn)行類

21、型 轉(zhuǎn)換。既函數(shù)類型決定返回值的類型。轉(zhuǎn)換。既函數(shù)類型決定返回值的類型。(2)如果函數(shù)無(wú)返回值,可以將函數(shù)定義為如果函數(shù)無(wú)返回值,可以將函數(shù)定義為“無(wú)類無(wú)類 型型”void (或稱(或稱“空類型空類型”)。)。例如例如: void print_star()用用void定義函數(shù)類型定義函數(shù)類型,明確表示沒(méi)返回值,明確表示沒(méi)返回值共 81頁(yè) 第 2424 頁(yè)例:編寫(xiě)計(jì)算例:編寫(xiě)計(jì)算 的程序。的程序。 201ii1程序程序2:float sum(n) int n;int i; float s =0; for( i=1;i=n;i+) s+=1.0/i; return(s);int main( )in

22、t n ; float x ; n=20; x=sum(n); printf(x=%f,x);return 0; void sum(n) int n; int i;float s=0; for( i=1;i=n;i+) s+=1/(float)i; printf(s=%f,s); int main( ) int n; n=20; sum(n); return 0;程序程序1:程序運(yùn)行結(jié)果:程序運(yùn)行結(jié)果:s=3.597740調(diào)用函數(shù)時(shí),變量做函數(shù)實(shí)參,它和對(duì)應(yīng)的形參各自占用調(diào)用函數(shù)時(shí),變量做函數(shù)實(shí)參,它和對(duì)應(yīng)的形參各自占用獨(dú)立的存儲(chǔ)單元。獨(dú)立的存儲(chǔ)單元。共 81頁(yè) 第 2525 頁(yè)例:閱讀程序例

23、:閱讀程序 float add (x, y) float x, y; float z; z=x+y; return (z); int main( ) float a, b; scanf(%f, %f, &a, &b); printf( sum is %f n, add(a, b) ); return 0; add函數(shù)函數(shù)程序運(yùn)行:程序運(yùn)行: 3.6, 5.5 sum is 9.100000以上程序另一寫(xiě)法以上程序另一寫(xiě)法: int main( ) float add( ); float a, b; scanf(%f, %f, &a, &b); printf( s

24、um is %f , add(a, b) ); return 0; float add (x, y) float x, y; float z; z=x+y; return (z); /*定義定義add函數(shù)函數(shù)*/程序運(yùn)行結(jié)果:程序運(yùn)行結(jié)果: 3.6, 5.5 sum is 9.100000 主函數(shù)在前面主函數(shù)在前面子函數(shù)在后面子函數(shù)在后面對(duì)被調(diào)用函數(shù)的說(shuō)明對(duì)被調(diào)用函數(shù)的說(shuō)明共 81頁(yè) 第 2727 頁(yè)8.1.6 函數(shù)的說(shuō)明函數(shù)的說(shuō)明 對(duì)被調(diào)用函數(shù)說(shuō)明的對(duì)被調(diào)用函數(shù)說(shuō)明的前提條件前提條件 被調(diào)用函數(shù)必須是已存在的函數(shù),例如用戶被調(diào)用函數(shù)必須是已存在的函數(shù),例如用戶自定義函數(shù)或庫(kù)函數(shù)。自定義函數(shù)或

25、庫(kù)函數(shù)。2. 被調(diào)用函數(shù)是被調(diào)用函數(shù)是用戶自定義函數(shù)的函數(shù)說(shuō)明用戶自定義函數(shù)的函數(shù)說(shuō)明 同變量一樣,函數(shù)的調(diào)用也應(yīng)該遵循同變量一樣,函數(shù)的調(diào)用也應(yīng)該遵循“先聲先聲明,后使用明,后使用”的原則。的原則。 如使用用戶自定義函數(shù),而且主調(diào)函數(shù)和被如使用用戶自定義函數(shù),而且主調(diào)函數(shù)和被調(diào)用函數(shù)在同一個(gè)文件中,應(yīng)該在主調(diào)函數(shù)中說(shuō)調(diào)用函數(shù)在同一個(gè)文件中,應(yīng)該在主調(diào)函數(shù)中說(shuō)明被調(diào)函數(shù)的類型。其說(shuō)明形式如下:明被調(diào)函數(shù)的類型。其說(shuō)明形式如下:共 81頁(yè) 第 2828 頁(yè)函數(shù)說(shuō)明的一般形式:函數(shù)說(shuō)明的一般形式: 類型標(biāo)識(shí)符類型標(biāo)識(shí)符 函數(shù)名函數(shù)名( (類型類型1 1,類型,類型2 2,); 或類型標(biāo)識(shí)符或類型標(biāo)

26、識(shí)符 函數(shù)名函數(shù)名( (類型類型1 1 形參形參1 1,類型,類型2 2 形參形參2,);2,);功能:功能:通知編譯程序函數(shù)值是什么類型,有多少參數(shù)及它們各自通知編譯程序函數(shù)值是什么類型,有多少參數(shù)及它們各自的類型,為編譯程序進(jìn)行類型檢查提供依據(jù)。的類型,為編譯程序進(jìn)行類型檢查提供依據(jù)。main() float add(float x,float y); float a, b, c; scanf(“ %f, %f”, &a, &b); c=add(a,b) ; printf(“ sum is %f ”, c );/*定義定義add函數(shù)函數(shù)*/float add (float

27、x,float y) float z; z=x+y; return (z); 對(duì)被調(diào)用函數(shù)的說(shuō)明對(duì)被調(diào)用函數(shù)的說(shuō)明作為表達(dá)式被調(diào)用作為表達(dá)式被調(diào)用運(yùn)行結(jié)果:運(yùn)行結(jié)果: 3.6, 5.5sum is 9.100000 或:類型標(biāo)識(shí)符或:類型標(biāo)識(shí)符 函數(shù)名();函數(shù)名();共 81頁(yè) 第 2929 頁(yè)3. 函數(shù)說(shuō)明和函數(shù)定義的區(qū)別函數(shù)說(shuō)明和函數(shù)定義的區(qū)別 函數(shù)說(shuō)明函數(shù)說(shuō)明的作用是把函數(shù)的名字、函數(shù)類型的作用是把函數(shù)的名字、函數(shù)類型以及形參的類型、個(gè)數(shù)和順序通知編譯系統(tǒng),以以及形參的類型、個(gè)數(shù)和順序通知編譯系統(tǒng),以便在調(diào)用該函數(shù)時(shí)系統(tǒng)按此進(jìn)行對(duì)照檢查。便在調(diào)用該函數(shù)時(shí)系統(tǒng)按此進(jìn)行對(duì)照檢查。 函數(shù)定義

28、函數(shù)定義是指對(duì)函數(shù)功能的確立,包括指定是指對(duì)函數(shù)功能的確立,包括指定函數(shù)名、函數(shù)值類型、形參及其類型、函數(shù)體等,函數(shù)名、函數(shù)值類型、形參及其類型、函數(shù)體等,它是一個(gè)完整的、獨(dú)立的函數(shù)單位。它是一個(gè)完整的、獨(dú)立的函數(shù)單位。 函數(shù)說(shuō)明與函數(shù)定義的首部唯一區(qū)別:函數(shù)說(shuō)明語(yǔ)函數(shù)說(shuō)明與函數(shù)定義的首部唯一區(qū)別:函數(shù)說(shuō)明語(yǔ)句的(句的( )之后必須)之后必須有分號(hào)有分號(hào),而函數(shù)定義首部的(,而函數(shù)定義首部的( )之后之后沒(méi)有分號(hào)沒(méi)有分號(hào)。函數(shù)定義只能一次函數(shù)定義只能一次函數(shù)說(shuō)明可以多次函數(shù)說(shuō)明可以多次共 81頁(yè) 第 3030 頁(yè) (1)被調(diào)用函數(shù)的定義在主調(diào)函數(shù)之前,可以省略被調(diào)用函數(shù)的定義在主調(diào)函數(shù)之前,可

29、以省略聲明。聲明。 float add (float x, float y) float z; z=x+y; return (z); main() float a, b; scanf(“ %f, %f, “&a, &b); printf(“ sum is %f ”, add(a, b) ); 被調(diào)函數(shù)在主被調(diào)函數(shù)在主調(diào)函數(shù)之前調(diào)函數(shù)之前主調(diào)函主調(diào)函數(shù)在被數(shù)在被調(diào)函數(shù)調(diào)函數(shù)之后之后4. 以下兩種情況可以省略被調(diào)用函數(shù)的說(shuō)明以下兩種情況可以省略被調(diào)用函數(shù)的說(shuō)明共 81頁(yè) 第 3131 頁(yè)(2)如果已在所有函數(shù)定義之前,在文件的開(kāi)頭,如果已在所有函數(shù)定義之前,在文件的開(kāi)頭, 在函數(shù)的

30、外部已說(shuō)明了函數(shù)類型,則在各個(gè)主在函數(shù)的外部已說(shuō)明了函數(shù)類型,則在各個(gè)主 調(diào)函數(shù)中不必對(duì)所調(diào)用的函數(shù)再作聲明。調(diào)函數(shù)中不必對(duì)所調(diào)用的函數(shù)再作聲明。char letter( char,char);float f(float,float );int i(float,float);main( ) .char letter (char c1,char c2)float f(float x,float y)int i(float,float)此處不必說(shuō)明此處不必說(shuō)明在所有函數(shù)之前在所有函數(shù)之前說(shuō)明函數(shù)類型說(shuō)明函數(shù)類型定義函數(shù)定義函數(shù)letter、f和和i共 81頁(yè) 第 3232 頁(yè)# include “

31、stdio.h” /*調(diào)用輸入輸出函數(shù)調(diào)用輸入輸出函數(shù)*/# include “math.h” /*調(diào)用數(shù)學(xué)函數(shù)調(diào)用數(shù)學(xué)函數(shù)*/# include “string.h” /*調(diào)用字符,字符串函數(shù)調(diào)用字符,字符串函數(shù)*/# include “graphics.h” /*調(diào)用圖形函數(shù)調(diào)用圖形函數(shù)*/用戶也可建立自己的庫(kù)函數(shù),這是高級(jí)應(yīng)用的內(nèi)容。用戶也可建立自己的庫(kù)函數(shù),這是高級(jí)應(yīng)用的內(nèi)容。5. 庫(kù)函數(shù)及調(diào)用庫(kù)函數(shù)及調(diào)用 庫(kù)函數(shù)庫(kù)函數(shù):由人們根據(jù)需要編制并提供給用戶使用的一些基:由人們根據(jù)需要編制并提供給用戶使用的一些基 本函數(shù),在用戶定義的函數(shù)中常常調(diào)用這些函數(shù)。本函數(shù),在用戶定義的函數(shù)中常常調(diào)用

32、這些函數(shù)。 方法方法:在文件的開(kāi)頭用:在文件的開(kāi)頭用#include 命令將需要的庫(kù)函數(shù)命令將需要的庫(kù)函數(shù)包含到包含到 文件中。文件中。共 81頁(yè) 第 3333 頁(yè)8.2 8.2 數(shù)組作函數(shù)參數(shù)數(shù)組作函數(shù)參數(shù) 數(shù)組元素可以作函數(shù)的實(shí)參數(shù)組元素可以作函數(shù)的實(shí)參 數(shù)組名可以作函數(shù)的實(shí)參和形參數(shù)組名可以作函數(shù)的實(shí)參和形參 多維數(shù)組可以作函數(shù)參數(shù)多維數(shù)組可以作函數(shù)參數(shù) 8.2.1. 數(shù)組元素作函數(shù)實(shí)參數(shù)組元素作函數(shù)實(shí)參 由于表達(dá)式可以做實(shí)參,數(shù)組元素可以作為表達(dá)式由于表達(dá)式可以做實(shí)參,數(shù)組元素可以作為表達(dá)式的組成部分,因此,數(shù)組元素可以做函數(shù)的實(shí)參,的組成部分,因此,數(shù)組元素可以做函數(shù)的實(shí)參,與變量一

33、樣與變量一樣,是,是單向傳遞,即單向傳遞,即“值傳送值傳送”方式方式。 例如:例如: int a10; x=power(a9,5);數(shù)組元素?cái)?shù)組元素作實(shí)參作實(shí)參共 81頁(yè) 第 3434 頁(yè)8.2.2數(shù)組名作函數(shù)的參數(shù)數(shù)組名作函數(shù)的參數(shù) 可以用數(shù)組名作函數(shù)參數(shù),此時(shí)實(shí)參和形可以用數(shù)組名作函數(shù)參數(shù),此時(shí)實(shí)參和形參都用數(shù)組名。參都用數(shù)組名。 由于由于數(shù)組名代表數(shù)組名代表的就是數(shù)組在內(nèi)存中存放的就是數(shù)組在內(nèi)存中存放區(qū)域的區(qū)域的首地址首地址。把數(shù)組名作為函數(shù)參數(shù)來(lái)實(shí)現(xiàn)。把數(shù)組名作為函數(shù)參數(shù)來(lái)實(shí)現(xiàn)大量數(shù)據(jù)的傳遞是一個(gè)非常好的數(shù)據(jù)傳遞方法。大量數(shù)據(jù)的傳遞是一個(gè)非常好的數(shù)據(jù)傳遞方法。這種傳遞方式是這種傳遞方式

34、是“地址傳遞地址傳遞”共 81頁(yè) 第 3535 頁(yè)一維數(shù)組作函數(shù)參數(shù),一維數(shù)組作函數(shù)參數(shù),形參的寫(xiě)法形參的寫(xiě)法為:為: 類型說(shuō)明符類型說(shuō)明符 形參數(shù)組名形參數(shù)組名數(shù)組長(zhǎng)度數(shù)組長(zhǎng)度例如:例如: float average(float array10) main() float b10;int i; for(i=0;i10;i+) scanf(“%f”,&bi); average(b); 1. 一維數(shù)組作函數(shù)參數(shù)一維數(shù)組作函數(shù)參數(shù)2. 數(shù)組作函數(shù)形參的數(shù)組作函數(shù)形參的函數(shù)調(diào)用函數(shù)調(diào)用方式方式 函數(shù)名函數(shù)名(數(shù)組名,數(shù)組名,)這是一維數(shù)組這是一維數(shù)組形參的定義形參的定義這是一維數(shù)組這是一維數(shù)

35、組的調(diào)用的調(diào)用共 81頁(yè) 第 3636 頁(yè)說(shuō)明:說(shuō)明: 在主調(diào)函數(shù)和被調(diào)用函數(shù)中在主調(diào)函數(shù)和被調(diào)用函數(shù)中分別分別定義數(shù)組定義數(shù)組,實(shí)參數(shù)組實(shí)參數(shù)組和形參數(shù)組類型要一致。和形參數(shù)組類型要一致。 實(shí)參數(shù)組和形參數(shù)組大小可以不一致,實(shí)參數(shù)組和形參數(shù)組大小可以不一致,形參數(shù)組可形參數(shù)組可以不指定大小以不指定大小。 (這里指一維數(shù)組)。(這里指一維數(shù)組)。 數(shù)組名除作為變量的標(biāo)識(shí)外數(shù)組名除作為變量的標(biāo)識(shí)外,還代表該還代表該數(shù)組在內(nèi)存中數(shù)組在內(nèi)存中存放區(qū)域的首地址存放區(qū)域的首地址。 數(shù)組名做函數(shù)實(shí)參與形參之間是數(shù)組名做函數(shù)實(shí)參與形參之間是“地址傳遞地址傳遞”,實(shí)參實(shí)參數(shù)組將數(shù)組的起始地址傳遞給形參數(shù)組。編

36、譯系統(tǒng)數(shù)組將數(shù)組的起始地址傳遞給形參數(shù)組。編譯系統(tǒng)不再為形參數(shù)組分配存儲(chǔ)單元。不再為形參數(shù)組分配存儲(chǔ)單元。 在函數(shù)體中對(duì)形參數(shù)組的元素操作時(shí)就是對(duì)實(shí)參數(shù)在函數(shù)體中對(duì)形參數(shù)組的元素操作時(shí)就是對(duì)實(shí)參數(shù)組的元素進(jìn)行操作。組的元素進(jìn)行操作。形參數(shù)組各元素的值發(fā)生變化形參數(shù)組各元素的值發(fā)生變化會(huì)使實(shí)參數(shù)組各元素的值發(fā)生同樣的變化會(huì)使實(shí)參數(shù)組各元素的值發(fā)生同樣的變化。 數(shù)組名作函數(shù)參數(shù)可實(shí)現(xiàn)大量數(shù)據(jù)的傳遞數(shù)組名作函數(shù)參數(shù)可實(shí)現(xiàn)大量數(shù)據(jù)的傳遞,無(wú)須返回?zé)o須返回?cái)?shù)組值。數(shù)組值。共 81頁(yè) 第 3737 頁(yè)例:例: 編寫(xiě)函數(shù),求編寫(xiě)函數(shù),求n個(gè)數(shù)組元素的算術(shù)平均值。個(gè)數(shù)組元素的算術(shù)平均值。double aver

37、age(int a , int n) int i; double s=0; for(i=0; in; i+) s=s+ai; return s/n; 主函數(shù)調(diào)用如何編寫(xiě)?主函數(shù)調(diào)用如何編寫(xiě)? main()int b3=1,2,3;double s;s=average(b,3);printf(“%fn”,s);形參數(shù)組不指定形參數(shù)組不指定大小,數(shù)組名后大小,數(shù)組名后跟一個(gè)空方括號(hào)跟一個(gè)空方括號(hào)這是數(shù)組作形參時(shí)常這是數(shù)組作形參時(shí)常使用的技巧使用的技巧實(shí)參實(shí)參a獲得獲得b的起始地址的起始地址數(shù)組名做函數(shù)是數(shù)組名做函數(shù)是“地址傳遞地址傳遞”。也就是把實(shí)參數(shù)組的。也就是把實(shí)參數(shù)組的起起始地址始地址傳遞給

38、形參數(shù)組,這樣二者傳遞給形參數(shù)組,這樣二者共占一段內(nèi)存單元共占一段內(nèi)存單元。因此,因此,形參數(shù)組各元素的值如果發(fā)生變化會(huì)使實(shí)參數(shù)組形參數(shù)組各元素的值如果發(fā)生變化會(huì)使實(shí)參數(shù)組各元素的值發(fā)生同樣的變化各元素的值發(fā)生同樣的變化。例:閱讀下列程序,指出輸出結(jié)果。例:閱讀下列程序,指出輸出結(jié)果。main( ) void swap( ); /*函數(shù)聲明函數(shù)聲明*/ int b2=10,2; swap(b); printf(“b0=%d, b1=%dn”, b0, b1); void swap( int a ) int t; t=a0; a0=a1; a1=t;共 81頁(yè) 第 3939 頁(yè)數(shù)組數(shù)組bbb1b

39、0102數(shù)組數(shù)組a數(shù)組數(shù)組bb, ab1b0102a1a0函數(shù)開(kāi)始調(diào)用之前函數(shù)開(kāi)始調(diào)用之前函數(shù)開(kāi)始調(diào)用,實(shí)參數(shù)組函數(shù)開(kāi)始調(diào)用,實(shí)參數(shù)組b將起始地址傳將起始地址傳遞給形參數(shù)組遞給形參數(shù)組a,二者共占一段內(nèi)存單元,二者共占一段內(nèi)存單元數(shù)組數(shù)組a數(shù)組數(shù)組bb, ab1b0210a1a0swap函數(shù)執(zhí)行過(guò)程中,函數(shù)執(zhí)行過(guò)程中,a0與與a1的值交換的值交換數(shù)組數(shù)組bbb1b0210函數(shù)調(diào)用結(jié)束后函數(shù)調(diào)用結(jié)束后共 81頁(yè) 第 4040 頁(yè)例:編寫(xiě)一個(gè)函數(shù)例:編寫(xiě)一個(gè)函數(shù). 功能功能:在在n個(gè)整數(shù)中,找出數(shù)值最大的數(shù)。個(gè)整數(shù)中,找出數(shù)值最大的數(shù)。 給定給定10個(gè)整型數(shù)個(gè)整型數(shù),找出其中數(shù)值最大的數(shù)。找出其中

40、數(shù)值最大的數(shù)。int max(int a,int n)int m,i; m=a0; for(i=1;im) m=ai; return(m);子函數(shù):子函數(shù):main( )int x10,amax; int i; for(i=0;i10;i+) scanf(%d,&xi); amax=max(x,10); printf(“amax= %d,amax);主函數(shù):主函數(shù):前面所學(xué)內(nèi)容前面所學(xué)內(nèi)容int max(a,n) int a ,n;共 81頁(yè) 第 4141 頁(yè)例:用選擇法對(duì)數(shù)組中例:用選擇法對(duì)數(shù)組中10個(gè)整數(shù)按由小到大排序個(gè)整數(shù)按由小到大排序.方法:方法:寫(xiě)一個(gè)函數(shù)寫(xiě)一個(gè)函數(shù)sort(

41、int array, int n) :對(duì)數(shù)組元素按由小到大排序。:對(duì)數(shù)組元素按由小到大排序。寫(xiě)主函數(shù)寫(xiě)主函數(shù) :輸入輸入array數(shù)組,調(diào)用數(shù)組,調(diào)用 sort 函數(shù),輸出排序后的函數(shù),輸出排序后的array數(shù)組。數(shù)組。void sort (int array , int n) int i, j, t; for (i=0; in-1; i+) for (j=i+1; jn; j+) if (arrayjarrayi) t=arrayj; arrayj=arrayi; arrayi=t; 前面所學(xué)內(nèi)容前面所學(xué)內(nèi)容共 81頁(yè) 第 4242 頁(yè)main ( ) int a10, i; printf(

42、“enter array: n”); for (i=0; i10; i+) scanf (“%d”,&ai); sort(a, 10); printf(“the sorted array: n”); for (i=0; i10; i+) printf (“ %d ”, ai); printf(“n”);由于地址傳遞,由于地址傳遞,實(shí)參數(shù)組實(shí)參數(shù)組 a 改變改變數(shù)組名做參數(shù)的好處:數(shù)組名做參數(shù)的好處:由于只需復(fù)制一個(gè)地址值,而無(wú)須復(fù)制全部需要處由于只需復(fù)制一個(gè)地址值,而無(wú)須復(fù)制全部需要處 理的數(shù)據(jù),因此節(jié)約存儲(chǔ)空間并提高效率。理的數(shù)據(jù),因此節(jié)約存儲(chǔ)空間并提高效率。 由于主調(diào)函數(shù)和被調(diào)函數(shù)

43、是在相同的內(nèi)存區(qū)域上對(duì)由于主調(diào)函數(shù)和被調(diào)函數(shù)是在相同的內(nèi)存區(qū)域上對(duì) 數(shù)據(jù)進(jìn)行操作,因此可以實(shí)現(xiàn)數(shù)據(jù)的同步更新。數(shù)據(jù)進(jìn)行操作,因此可以實(shí)現(xiàn)數(shù)據(jù)的同步更新。 函數(shù)的調(diào)用函數(shù)的調(diào)用共 81頁(yè) 第 4343 頁(yè)#include stdio.hmain()int i=0; char s180,s280; scanf(%s,s2); for(i=0;s2i!=0;i+) s1i=s2i; s1i=0; printf(%sn,s1); 我們以前留的數(shù)組作業(yè)我們以前留的數(shù)組作業(yè)3:#include stdio.hmain()int i=0; char s180,s280; gets(s2); for(i=0;

44、i=strlen(s2);i+) s1i=s2i; printf(%sn,s1); 或或 :i=0開(kāi)始,后沒(méi)開(kāi)始,后沒(méi)有追加有追加0如輸入:如輸入:abc123 efty 結(jié)果:結(jié)果:abc123編寫(xiě)一個(gè)程序,將字符數(shù)組編寫(xiě)一個(gè)程序,將字符數(shù)組s2中的全部字符復(fù)制到字符數(shù)組中的全部字符復(fù)制到字符數(shù)組s1中,中,不許用不許用strcpy函數(shù)。復(fù)制時(shí),函數(shù)。復(fù)制時(shí),0后面的字符不復(fù)制。后面的字符不復(fù)制。(自己假設(shè)給定自己假設(shè)給定s2數(shù)組數(shù)組)改用改用gets(s2)可以可以輸入任意字符輸入任意字符注意表達(dá)式注意表達(dá)式2共 81頁(yè) 第 4444 頁(yè) 寫(xiě)成函數(shù):將給定字符串寫(xiě)成函數(shù):將給定字符串s2復(fù)

45、制到另一字符串復(fù)制到另一字符串s1。#include “stdio.h”void strcopy(char str1 ,char str2 ) int i=0; for(i=0;str2i!=0;i+) str1i=str2i; str1i=0;main() char s150,s250; gets(s2); strcopy(s1,s2); printf(“%s”,s1);共 81頁(yè) 第 4545 頁(yè)有兩種形式有兩種形式 (形式基本同一維形式基本同一維) 函數(shù)值類型說(shuō)明符函數(shù)值類型說(shuō)明符 函數(shù)名函數(shù)名(類型說(shuō)明符類型說(shuō)明符 數(shù)組名數(shù)組名 正整型常量表達(dá)式正整型常量表達(dá)式 , ) 函數(shù)體函數(shù)體

46、函數(shù)值類型說(shuō)明符函數(shù)值類型說(shuō)明符 函數(shù)名函數(shù)名(數(shù)組名數(shù)組名,) 類型說(shuō)明符類型說(shuō)明符 數(shù)組名數(shù)組名 正整型常量表達(dá)式正整型常量表達(dá)式; 函數(shù)體函數(shù)體 “行行”可以可以不確定不確定“列列”必須必須確定確定!共 81頁(yè) 第 4646 頁(yè)說(shuō)明:說(shuō)明: 形參數(shù)組定義時(shí)可以指定每一維的大小,也可以省略第形參數(shù)組定義時(shí)可以指定每一維的大小,也可以省略第一維的大小,不允許省略第二維以及其他高維的大小一維的大小,不允許省略第二維以及其他高維的大小. 例如例如 : int array 310; 或或 int array 10; 是一樣的!是一樣的! 但但 int array 3 ; 和和int array ;

47、是錯(cuò)誤的是錯(cuò)誤的! 實(shí)參數(shù)組可以大于形參數(shù)組。實(shí)參數(shù)組可以大于形參數(shù)組。(行行可以不同,可以不同,列列必須相同)必須相同)例如:實(shí)參數(shù)組定義為:例如:實(shí)參數(shù)組定義為:int array 510; 形參數(shù)組定義為:形參數(shù)組定義為:int array 310; 這時(shí)形參數(shù)組只取實(shí)參數(shù)組的一部分,其余部分不起作這時(shí)形參數(shù)組只取實(shí)參數(shù)組的一部分,其余部分不起作用。用。共 81頁(yè) 第 4747 頁(yè)例:閱讀程序,指出運(yùn)行結(jié)果。例:閱讀程序,指出運(yùn)行結(jié)果。 void add1(int a 3 ,int n) int i; for(i=0;in;i+) +aii; main() int x33=0,1,2,3

48、,4,5,6,7,8,i; add1(x,3); for(i=0;i3;i+) printf(%d ,xii); printf(n); 程序運(yùn)行結(jié)果為:程序運(yùn)行結(jié)果為:1 5 9 注意:二維注意:二維數(shù)組的調(diào)用數(shù)組的調(diào)用注意:二維注意:二維數(shù)組的定義數(shù)組的定義共 81頁(yè) 第 4848 頁(yè)例:寫(xiě)函數(shù)打印例:寫(xiě)函數(shù)打印n行行10列二維數(shù)組,其中列二維數(shù)組,其中n是任意整數(shù)。是任意整數(shù)。 void print_array(int a 10, int n) int i, j; for(i=0;in; i+) for(j=0;j10;j+) printf(“%3d”, aij); printf(“n”)

49、; 例:寫(xiě)函數(shù)交換任意一個(gè)例:寫(xiě)函數(shù)交換任意一個(gè)n*10的二維數(shù)組的的二維數(shù)組的i,j兩行兩行 void exchange(int a 10, int i,int j) int k, t; for(k=0;k10;k+) t=aik; aik=ajk; ajk=t; 例:編寫(xiě)函數(shù),例:編寫(xiě)函數(shù),計(jì)算兩個(gè)計(jì)算兩個(gè)3行行4列的矩陣之和。并求:列的矩陣之和。并求:C3X4=A3X4+B3X4void qiuh(float x4,float y4,float z4,int n)int i,j; for(i=0;in;i+) for(j=0;j4;j+) zij=xij+yij;main()float

50、a34,b34,c34;int i,j; for(i=0;i3;i+) for(j=0;j4;j+) scanf(“%f%f”,&aij, &bij); qiuh(a,b,c,3); for(i=0;i3;i+) for(j=0;j4;j+) printf(“%10.2f”,cij);printf(“n”);注意函數(shù)的定義注意函數(shù)的定義和函數(shù)的調(diào)用和函數(shù)的調(diào)用共 81頁(yè) 第 5050 頁(yè)8.3 函數(shù)的嵌套調(diào)用和遞歸調(diào)用函數(shù)的嵌套調(diào)用和遞歸調(diào)用8.3.1 函數(shù)的嵌套調(diào)用函數(shù)的嵌套調(diào)用 嵌套定義:嵌套定義:在定義一個(gè)函數(shù)時(shí),該函數(shù)體內(nèi)包含在定義一個(gè)函數(shù)時(shí),該函數(shù)體內(nèi)包含另一個(gè)函數(shù)的

51、定義。另一個(gè)函數(shù)的定義。 嵌套調(diào)用:嵌套調(diào)用:在調(diào)用一個(gè)函數(shù)的過(guò)程中,又調(diào)用另在調(diào)用一個(gè)函數(shù)的過(guò)程中,又調(diào)用另一個(gè)函數(shù)。一個(gè)函數(shù)。 C語(yǔ)言不允許嵌套定義,但可以嵌套調(diào)用。語(yǔ)言不允許嵌套定義,但可以嵌套調(diào)用。在調(diào)在調(diào)用一個(gè)函數(shù)的過(guò)程中,又調(diào)用另一個(gè)函數(shù)。用一個(gè)函數(shù)的過(guò)程中,又調(diào)用另一個(gè)函數(shù)。共 81頁(yè) 第 5151 頁(yè)mainmain函數(shù)函數(shù) 調(diào)用函調(diào)用函數(shù)數(shù) A;A; 函數(shù)函數(shù) A A 調(diào)用函數(shù)調(diào)用函數(shù) B; 函數(shù)函數(shù) B B 調(diào)用調(diào)用調(diào)用調(diào)用返回返回返回返回共 81頁(yè) 第 5252 頁(yè)例:閱讀程序,指出運(yùn)行結(jié)果。例:閱讀程序,指出運(yùn)行結(jié)果。(嵌套調(diào)用嵌套調(diào)用)main( ) int a=0,

52、b=0,b1(int,int),f1(); printf(b1=%d f1=%dn,b1(a,b),f1( ); int b1(int d,int e) int f1( ),f; d=5; e=10; f=f1( )+d+e; return f; int f1( ) int c,i=1; c=15; while(i1long int fact(int n) long int f; if(n=0|n=1) f=1; else f=n*fact(n-1); return f; main( ) long int red;int n; scanf(%d,&n); red=fact(n); pr

53、intf(red=%ld,red); 假如求假如求 5! , 則程序執(zhí)則程序執(zhí)行結(jié)果為:行結(jié)果為:red =1201 當(dāng)當(dāng) n=0,n=1 n!=共 81頁(yè) 第 5858 頁(yè)f=3*fact(2)f=1*2*3=6fact函數(shù)函數(shù) n=3f=2*fact(1)f=1*2=2fact函數(shù)函數(shù) n=2 調(diào)用調(diào)用fact 函數(shù)時(shí)函數(shù)時(shí) , 總是從總是從 fact 的第一條語(yǔ)句開(kāi)始執(zhí)行的第一條語(yǔ)句開(kāi)始執(zhí)行 ;執(zhí)執(zhí)行到行到 return 語(yǔ)句語(yǔ)句,總是返回到該次調(diào)用的調(diào)用位置繼續(xù)執(zhí)行調(diào)總是返回到該次調(diào)用的調(diào)用位置繼續(xù)執(zhí)行調(diào)用函數(shù)用函數(shù)。fact 函數(shù)的調(diào)用過(guò)程:函數(shù)的調(diào)用過(guò)程:main( )fact(5

54、)輸出輸出fact(5)f=5*fact(4)f=1*2*3*4*5=120fact函數(shù)函數(shù) n=5f=4*fact(3)f=1*2*3*4=24fact函數(shù)函數(shù) n=4第一次調(diào)用第一次調(diào)用第二次調(diào)用第二次調(diào)用第三次調(diào)用第三次調(diào)用第四次調(diào)用第四次調(diào)用第五次調(diào)用第五次調(diào)用返回返回返回返回返回返回返回返回返回返回共 81頁(yè) 第 5959 頁(yè)變量的數(shù)據(jù)類型變量的數(shù)據(jù)類型 char 型型 int 型型 float 型型 double 型型總結(jié)總結(jié):數(shù)據(jù)類型數(shù)據(jù)類型決定為變量分配的內(nèi)存單元的決定為變量分配的內(nèi)存單元的長(zhǎng)度長(zhǎng)度,數(shù)據(jù)的,數(shù)據(jù)的存放存放 形式。形式。(從程序設(shè)計(jì)角度,決定了(從程序設(shè)計(jì)角度,

55、決定了可以表示的數(shù)的范圍可以表示的數(shù)的范圍)問(wèn)題問(wèn)題:1. 何時(shí)何時(shí)為變量分配內(nèi)存單元?為變量分配內(nèi)存單元? 2. 變量位于內(nèi)存的什么變量位于內(nèi)存的什么位置位置? 3. 變量的有效變量的有效作用范圍作用范圍?(VC+6.0環(huán)境)共 81頁(yè) 第 6060 頁(yè) 變量的作用域和生存期變量的作用域和生存期u 變量的作用域變量的作用域 指一個(gè)變量在程序中的有效范圍。指一個(gè)變量在程序中的有效范圍。 C C語(yǔ)言規(guī)定語(yǔ)言規(guī)定:凡是在函數(shù)內(nèi)定義的變量,它的作用域僅僅是凡是在函數(shù)內(nèi)定義的變量,它的作用域僅僅是包含這個(gè)變量定義的復(fù)合語(yǔ)句;包含這個(gè)變量定義的復(fù)合語(yǔ)句;而在函數(shù)體外定義的變量,而在函數(shù)體外定義的變量,它

56、的作用域是從它的作用域是從定義點(diǎn)到文件尾。定義點(diǎn)到文件尾。u 變量的生存期變量的生存期 指程序在執(zhí)行期間,變量存在的時(shí)間間隔,即從給變量分指程序在執(zhí)行期間,變量存在的時(shí)間間隔,即從給變量分配內(nèi)存,至所分配內(nèi)存被系統(tǒng)收回的那段時(shí)間。配內(nèi)存,至所分配內(nèi)存被系統(tǒng)收回的那段時(shí)間。 C C語(yǔ)言規(guī)定語(yǔ)言規(guī)定:凡是出現(xiàn)在靜態(tài)數(shù)據(jù)區(qū)的變量,生存期都是從凡是出現(xiàn)在靜態(tài)數(shù)據(jù)區(qū)的變量,生存期都是從程序開(kāi)始執(zhí)行到程序結(jié)束;程序開(kāi)始執(zhí)行到程序結(jié)束;而出現(xiàn)在靜態(tài)區(qū)之外的變量,生而出現(xiàn)在靜態(tài)區(qū)之外的變量,生存期僅僅是從存期僅僅是從函數(shù)開(kāi)始執(zhí)行到函數(shù)執(zhí)行結(jié)束這段時(shí)間。函數(shù)開(kāi)始執(zhí)行到函數(shù)執(zhí)行結(jié)束這段時(shí)間。共 81頁(yè) 第 616

57、1 頁(yè)1. 1. 局部變量(內(nèi)部變量)局部變量(內(nèi)部變量)定義:定義:在函數(shù)內(nèi)部定義的變量,只能在本函數(shù)內(nèi)部使用,稱為局在函數(shù)內(nèi)部定義的變量,只能在本函數(shù)內(nèi)部使用,稱為局部量。部量。8.4.18.4.1局部變量和全局變量(從變量的作用域分)局部變量和全局變量(從變量的作用域分)如:如:float f1(int a) int b,c; . char f2(int x,int y) int a,b; main ( ) int m,n; . a,b,c在函數(shù)在函數(shù)f1中有效中有效x,y,a,b在函數(shù)在函數(shù)f2中有效中有效m,n在主函數(shù)中有效在主函數(shù)中有效共 81頁(yè) 第 6262 頁(yè) 主函數(shù)主函數(shù) m

58、ain 定義的變量只在主函數(shù)中有效,主函數(shù)不定義的變量只在主函數(shù)中有效,主函數(shù)不能使用其它函數(shù)定義的變量。能使用其它函數(shù)定義的變量。 不同函數(shù)可以使用相同名字的變量,它們?cè)趦?nèi)存中占不同函數(shù)可以使用相同名字的變量,它們?cè)趦?nèi)存中占不同的單元,互不影響。不同的單元,互不影響。(如,前例如,前例f1和和f2中的中的a,b變量變量) 形式參數(shù)也是局部變量。形式參數(shù)也是局部變量。 在一個(gè)函數(shù)內(nèi)部,可以在復(fù)合語(yǔ)句中定義變量,這些在一個(gè)函數(shù)內(nèi)部,可以在復(fù)合語(yǔ)句中定義變量,這些變量只在本復(fù)合語(yǔ)句中有效。變量只在本復(fù)合語(yǔ)句中有效。 關(guān)于局部變量幾點(diǎn)說(shuō)明:關(guān)于局部變量幾點(diǎn)說(shuō)明:如:如:main() int a,b;

59、 /*a,b在整個(gè)在整個(gè)main函數(shù)內(nèi)有效函數(shù)內(nèi)有效*/ int c; /*c僅在本復(fù)合語(yǔ)句內(nèi)有效僅在本復(fù)合語(yǔ)句內(nèi)有效*/ c=a+b; . 閱讀以下程序,寫(xiě)出程序的運(yùn)行結(jié)果。閱讀以下程序,寫(xiě)出程序的運(yùn)行結(jié)果。main() int i=3, j=2, k; k=i+j; int k=8; if(i=3) printf(%d, , k); else printf(%d, , j); printf(%d, %dn,i,k); 運(yùn)行結(jié)果:運(yùn)行結(jié)果:8,3,5共 81頁(yè) 第 6464 頁(yè)2. 全局變量全局變量 程序中,在函數(shù)之外定義的變量稱為外部變量,即全局變程序中,在函數(shù)之外定義的變量稱為外部變量,

60、即全局變量。全局變量可以為本文件中的其他函數(shù)所共用,但是,量。全局變量可以為本文件中的其他函數(shù)所共用,但是,它的它的有效范圍是從定義變量的位置開(kāi)始到源文件的結(jié)束。有效范圍是從定義變量的位置開(kāi)始到源文件的結(jié)束。如:如:int p=1,q=5; float f1(int a) int b,c; . char c1,c2; char f2(int x,int y) int a,b; main ( ) int m,n; . 全局變量全局變量c1,c2的作用范圍的作用范圍全局變量全局變量p,q的作用范圍的作用范圍共 81頁(yè) 第 6565 頁(yè) 從定義變量的位置開(kāi)始到本文件結(jié)束,這段程序中的函數(shù)可直接從定義變量的位置開(kāi)始到本文件結(jié)束,這段程序中的函數(shù)可直接使用全局變量。(注意全局變量的有效范圍)使用全局變量。(注意全局變量的有效范圍) 如果在同一源文件中,全局變量

溫馨提示

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