![第5章 函數(shù)(修改版).ppt_第1頁](http://file1.renrendoc.com/fileroot2/2020-1/11/7b7de4c6-5218-4906-8ecb-0544b685c729/7b7de4c6-5218-4906-8ecb-0544b685c7291.gif)
![第5章 函數(shù)(修改版).ppt_第2頁](http://file1.renrendoc.com/fileroot2/2020-1/11/7b7de4c6-5218-4906-8ecb-0544b685c729/7b7de4c6-5218-4906-8ecb-0544b685c7292.gif)
![第5章 函數(shù)(修改版).ppt_第3頁](http://file1.renrendoc.com/fileroot2/2020-1/11/7b7de4c6-5218-4906-8ecb-0544b685c729/7b7de4c6-5218-4906-8ecb-0544b685c7293.gif)
![第5章 函數(shù)(修改版).ppt_第4頁](http://file1.renrendoc.com/fileroot2/2020-1/11/7b7de4c6-5218-4906-8ecb-0544b685c729/7b7de4c6-5218-4906-8ecb-0544b685c7294.gif)
![第5章 函數(shù)(修改版).ppt_第5頁](http://file1.renrendoc.com/fileroot2/2020-1/11/7b7de4c6-5218-4906-8ecb-0544b685c729/7b7de4c6-5218-4906-8ecb-0544b685c7295.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、1,第五章 函 數(shù),結(jié)構(gòu)化(模塊化)程序設(shè)計(jì)基礎(chǔ),2,5.1.1 函數(shù)的概念 、模塊化及優(yōu)點(diǎn)為模塊化而提出函數(shù) 結(jié)構(gòu)化程序設(shè)計(jì)要求:將復(fù)雜的系統(tǒng),按照自頂向下、逐步細(xì)化的設(shè)計(jì)方法,劃分為相對(duì)獨(dú)立的、功能較為單一的子系統(tǒng)的組合。每個(gè)子系統(tǒng)稱為模塊,在C語言中就是子函數(shù)(函數(shù))。,復(fù)雜問題,main(),a塊,b塊,c塊,a1塊,a2塊,b1塊,b2塊,c1塊,c2塊,各模塊之間的連接 (如帶參數(shù)調(diào)用)稱之為接口。,模塊化的6個(gè)優(yōu)點(diǎn): 功能單一完整;可以獨(dú)立設(shè)計(jì);單獨(dú)調(diào)試;易于維護(hù);通用性強(qiáng);便于分工協(xié)作。,5.1 函數(shù)概述,3,、按照不同的分類方法,函數(shù)可分為 (5 類): 、用戶型和系統(tǒng)型(又
2、稱標(biāo)準(zhǔn)庫函數(shù),參見實(shí)驗(yàn)指導(dǎo)后的附錄和教材5.3)函數(shù)之分。 、主函數(shù)和子函數(shù)(即調(diào)用和被調(diào)用)之分。 、有參函數(shù)和無參函數(shù)之分。 、有具體返回值和無具體返回值型函數(shù)之分。 、內(nèi)部函數(shù)和外部函數(shù)之分: 內(nèi)部函數(shù):存儲(chǔ)類型以 static 定義的,即只能在本文件中使用。 外部函數(shù):存儲(chǔ)類型以 extern(或省略)定義的,即既可被本文件(如a1.c)中的函數(shù)調(diào)用, 也可被其它文件(如a2.c)中的函數(shù)調(diào)用)。,4,、用戶子函數(shù)(函數(shù)) 結(jié)構(gòu)和執(zhí)行過程引例 :,#include void main(void ) int a,b,c; scanf ( “%d,%d” , ,主函數(shù),函數(shù)的類型,決定返回
3、值的類型。,函數(shù)名:用標(biāo)識(shí)符命名,是引用函數(shù)的標(biāo)識(shí),并得到返回值。,子函數(shù)的形式參數(shù)(接口參數(shù))說明表。,子函數(shù)定義一般要5確定: 函數(shù)的名稱;函數(shù)返回值的類型;函數(shù)的參數(shù);函數(shù)的功能;是否返回值。,子函數(shù)定義,函數(shù)功能:此處是找大的。,引用(使用或調(diào)用)子函數(shù)!,5,5.1.2 用戶子函數(shù)(函數(shù))定義的一般形式及2個(gè)說明,格式 : type 函數(shù)名(形式參數(shù)說明表) 內(nèi)部變量定義語句; 功能語句; ,如果函數(shù)有返回值,應(yīng)另含有return語句。,int max(int x ,int y) int z ; z=x=y? x : y ; return ( z) ; ,說明:,、函數(shù)不能嵌套定義(
4、但可以嵌套引用,且可引用自己)。,int max(int x,int y) int cx(int c,int d) /*Error !*/ ,、函數(shù)如果無返回值,type 應(yīng)說明為空類型void。函數(shù)無 參數(shù),也應(yīng)定義成void。主函數(shù)和子函數(shù)都可以如此:,void Bell(void) printf(“2008.08.08”); ,6,5.1.3 函數(shù)的調(diào)用(使用或稱引用),、調(diào)用方式: 函數(shù)名(實(shí)參表),一般,函數(shù)調(diào)用有 4種出現(xiàn)形式: 獨(dú)立語句形式: max(a,b); 表達(dá)式形式: c= max(a, b) *2 ; 用戶函數(shù)參數(shù): c=max (a , max (b , d) ) *
5、2 ; /*嵌套*/ 標(biāo)準(zhǔn)函數(shù)參數(shù): printf(“%dn”, max(a,b) ) ;,7,、帶參數(shù)函數(shù)(max)調(diào)用過程,void main (void) int a ,b ,c ; scanf (“%d,%d” , /*括號(hào)也可不要*/ ,、從右到左先計(jì)算實(shí)參的值,再?gòu)挠业阶笙蛐螀鬟f值。,2,3,a b,X y,2,3,、轉(zhuǎn)移到子函數(shù)中運(yùn)行,執(zhí)行到“return 表達(dá)式”語句時(shí), 返回表達(dá)式的值,并將值由函數(shù)名帶回到調(diào)用函數(shù)的調(diào)用處。,z,3,8,(3)、關(guān)于返回值的3點(diǎn)補(bǔ)充說明:,子函數(shù)只能通過return語句返回一個(gè)值; 也可以不返回值,此時(shí)應(yīng)在定義函數(shù)時(shí)用void類型加以說明。
6、 子函數(shù)若沒有return語句,則由它的最后一 個(gè)“”返回一個(gè)不確定的值!,函數(shù)中可以出現(xiàn)多個(gè)return語句,但只有一個(gè)有效。,int max ( int x , int y ) if (x=y ) return x ; return y ; ,返回值的類型應(yīng)與函數(shù)的類型一致,如不一致,以函數(shù)類型為準(zhǔn),先轉(zhuǎn)換為函數(shù)類型后,再返回。,int max(void) float z; return z; /*z先轉(zhuǎn)為整型*/ ,(4)、 函數(shù)的調(diào)用聲明(說明) 為了確保參數(shù)類型、返回值類型正確和調(diào)用合法,有時(shí)必須在函數(shù)調(diào)用前對(duì)其加以說明,該說明稱之為聲明,如:,9,例如:通過子函數(shù)求 xn;主函數(shù)輸
7、出x19。,#include /*系統(tǒng)函數(shù)調(diào)用聲明*/ double pow(float x, int n); void main(void) int i ; for (i=1; i =9 ; i+) printf ( “%d , %f n” , i, pow(2.5 ,i); double pow(float x ,int n ) int i ; double p=1 ; for (i=1 ; i=n ; i+) p=p*x ; return ( p) ; ,用戶函數(shù)調(diào)用聲明:因子函數(shù)是非整形,并且出現(xiàn)在函數(shù)調(diào)用之后,故此處聲明不能缺。,定義子函數(shù),調(diào)用函數(shù)。,特別注意: “定義” 函數(shù)與“
8、聲明”函數(shù)的不同意義 !,10,5.2 再論函數(shù)間的數(shù)據(jù)傳遞,兩個(gè)過程:函數(shù)在調(diào)用的過程中,調(diào)用函數(shù)和被調(diào)函數(shù)存在 數(shù)據(jù)的相互傳遞(接口)。數(shù)據(jù)的傳遞包括兩個(gè)過程:,、將待處理數(shù)據(jù)(數(shù)據(jù)本身或數(shù)據(jù)的地址)傳給被調(diào)函數(shù);,、將結(jié)果數(shù)據(jù)(數(shù)據(jù)本身或數(shù)據(jù)的地址)返回給調(diào)用函數(shù)。,調(diào)用函數(shù)(主),被調(diào)函數(shù)(子),向被調(diào)函數(shù)傳數(shù)據(jù)或數(shù)據(jù)的地址(帶參數(shù))。,將結(jié)果數(shù)據(jù)或數(shù)據(jù)地址返回調(diào)用函數(shù)。,先講指針 !,11,主、子函數(shù)間有 5種數(shù)據(jù)傳遞方式:,、通過函數(shù)參數(shù)傳待處理數(shù)據(jù)的實(shí)際值,數(shù)據(jù)傳遞單向性(前面已多次出現(xiàn)) ; 、通過return返回結(jié)果數(shù)據(jù)的實(shí)際值 (前面已多次出現(xiàn)) ; 、通過函數(shù)參數(shù)傳待處理
9、數(shù)據(jù)的地址值(首地址) ;地址參數(shù)本身仍然為單向傳遞,但其數(shù)據(jù)可理解為雙向傳遞;實(shí)際 上,此種情況數(shù)據(jù)本身沒有傳 ! 、通過return返回結(jié)果數(shù)據(jù)的地址值; 、通過全局變量或數(shù)組傳待處理數(shù)據(jù)的實(shí)際值或結(jié)果數(shù)據(jù)的實(shí)際值。 下面分別舉例介紹: (以在主函數(shù)中I/O數(shù)據(jù),在子函數(shù)中實(shí)現(xiàn)兩數(shù)相加求和為例;求兩數(shù)和并非一定如此):,12,5.2.1 通過函數(shù)參數(shù)和return傳數(shù)據(jù)的實(shí)際值(、 ),通過實(shí)參與形參的結(jié)合,將數(shù)據(jù)本身傳給形參;形參的數(shù)值改變不影響實(shí)參,因?yàn)樗鼈冇懈髯源鎯?chǔ)單元,單向傳。,#include int sum(int , int ) ; /*或int sum(int x,int
10、y );或缺*/ void main(void ) int a , b , c ; scanf (“ %d , %d” , ,調(diào)用函數(shù),被調(diào)函數(shù),x、y為形參。,a、b為實(shí)參變量的值。,傳遞參數(shù),a:2,b:3,y:,x:,3,2,z:,5,返回值,13,5.2.2 通過函數(shù)參數(shù)傳數(shù)據(jù)的地址值( ),形參定義為指針變量(以此接收另一變量的地址),實(shí)參為 變量的地址;在被調(diào)函數(shù)中,由指針操作所指變量;高效 !,2,3,a,b,2000H,2002H,x,y,2002H,2000H,前例修改如下: #include void main(void ) int a,b,c; scanf (%d,%d,
11、 ,指針變量,普通變量,3000H,3002H,14,前例可否修改為如下(即不要return,但在主函數(shù)中仍可得到被調(diào)函數(shù)的處理結(jié)果) ? #include void sum(int *x,int *y,int *z) *z=*x+*y; void main(void ) int a,b,c=0; scanf (%d,%d, ,屬于,即通過return返回結(jié) 果數(shù)據(jù)的地址值:指針型函數(shù)。,輔以圖示說明,15,5.2.3 用外部變量或數(shù)組傳數(shù)據(jù)實(shí)際值或結(jié)果實(shí)際值(),定義外部變量,調(diào)用函數(shù)和被調(diào)函數(shù)共享;任何函數(shù)對(duì)其值的修改,都會(huì)影響到其他函數(shù)中所用到的外部變量的值。,#include /*前例
12、又可修改為:*/ int c=2 ; void sum (int x , int y ); void main ( void) /*還是求兩個(gè)數(shù)和*/ int a ,b ; scanf ( “ %d ,%d ” , ,定義外部變量,2,c,5,注意:應(yīng)盡量少用外部變量,這樣可使函數(shù)內(nèi)部的內(nèi)聚性強(qiáng),函數(shù)之間的偶合性弱,從而模塊的獨(dú)立性就較強(qiáng)。,16,5.3 標(biāo)準(zhǔn) 函數(shù)庫 (略),17,5.4 數(shù)組(數(shù)值、字符、一、二維)做函數(shù)參數(shù),問題的提出: 在數(shù)組一章曾經(jīng)說過:引用數(shù)組時(shí)只能引用數(shù)組元素。如果用元素做實(shí)元參數(shù)傳遞數(shù)組,則函數(shù)需要參數(shù)(實(shí)參和形參)的量太多且不高效。為了解決此問題,也可以傳遞數(shù)
13、組的首地址傳數(shù)據(jù)的地址高效。 當(dāng)然,元素是可以做實(shí)元參數(shù)的,它的用法同一般變量,所以這里不再專門介紹,見08版5.4.1和09版p129下面。,數(shù)組名或指針名作實(shí)參,被調(diào)函數(shù)的形參形式有3種:,形參為指針: int ave( int *p,int num) 形參為無下標(biāo)數(shù)組: int ave( int a ,int num) 形參為有下標(biāo)(大小不限)數(shù)組: int ave( int a10 , int num) 以上也適合二維 數(shù)組(數(shù)值、字符) ! 下面舉一個(gè)例說明以上3種情況:,18,例1:子函數(shù)求數(shù)組平均值av ,主函數(shù)中I/O(av、a0)值。,#include float mean(
14、 int *, int); /3種情況不變 void main (void) int a5=1,2,3,4,5 ; float av ; av=mean(a,5) ; printf( “av=%f,%dn” ,av ,a0 ) ; float mean( int *p , int num ) int i ; float avg=0 ; for (i=0 ; inum ; i+) avg+= *p+或pi或*(p+i) ; avg/=num ; *(p-num) =-1; return (avg ) ; ,形參為指針; *p+或*(p+) 均表示先取*p做運(yùn)算,再做p+(指向下一數(shù)據(jù)單元,非字節(jié)
15、單元) ;,形參為指針,形參為無下標(biāo)數(shù)組;,無下標(biāo)數(shù)組。,int a ,a0 =-1;,a i ;或*(a+i) ;,int a10,形參為有下標(biāo)(大小不限,虛)數(shù)組。,形參為有下標(biāo)數(shù)組。,兩點(diǎn)說明:,三種方法的實(shí)質(zhì)都是傳遞地址。,形參數(shù)據(jù)的任何改變都影響(共享 空間)實(shí)參數(shù)據(jù)(如*(p-num)=-1;) 。,使子函數(shù)通用,num等價(jià)“4*num” !但不可這樣用,用指針p,如何做?,補(bǔ):,*p=a,19,例2、在子函數(shù)中求3行3列矩陣(二維數(shù)組)主對(duì)角線元素的和并將其返回。試用各種可行的參數(shù)形式和元素的表示方法。,void main() /hscs1.c int s, a33=1,2,3,
16、1,2,3,1,2,3; s=fun(a) ; / printf(Sum=%dn,s); ,還有可行的實(shí)參、形參和元素的表示方法如下: fun(a) 與int fun( int a3 ) 實(shí)參用一級(jí)指針名p(p=*a)和二級(jí)指針名pp(pp=a),形參用數(shù)組,可行但都有警告)。 實(shí)、形參都用指向元素的指針,訪問元素方法用指針加位置號(hào): int *p=*a;s=fun(p);與int fun(int *p) 。訪問元素:*(p+3*i+i) 實(shí)參用行指針名,形參不變;或fun(a) 與int fun( int (*p)3)。 實(shí)參用指針數(shù)組名與形參用二級(jí)指針。 實(shí)參用二級(jí)指針名與形參用指針數(shù)組。
17、 無參和使用外部靜態(tài)數(shù)組。等。,#include stdio.h int fun(int b33 ) / int sum=0,i; for(i=0;i3;i+) sum=sum+ bii ; return sum; ,20,21,22,23,5.5 函數(shù)的嵌套和遞歸調(diào)用,5.5.1 函數(shù)的嵌套調(diào)用 1、引言 C 語言的函數(shù)不 允許嵌套定義 ,但可 以 嵌套調(diào)用。見右圖 (假定一個(gè)C程序有3個(gè) 函數(shù)單位),main,a 函數(shù),b 函數(shù),調(diào)用a 函數(shù),調(diào)用b 函數(shù),1,2,3,4,5,6,7,8,9,結(jié)束,返回,返回,2、嵌套調(diào)用實(shí)例,逐級(jí)返回,逐級(jí)調(diào)用,例如: 計(jì)算 s=(1*1*1)!+(2*
18、2*2)!+(3*3*3)!+(4*4*4)!+(5*5*5)!,使用嵌套調(diào)用結(jié)構(gòu)設(shè)計(jì)程序,程序清單如下:,main,b函數(shù),a函數(shù),24,#include double fact(int m) /求階乘的子函數(shù) double a=1; int i ; for(i=1;i=m;i+) a=a*i; return a; / ,double squa(int n) /求“n*n*n”的子函數(shù) double b; int k ; b= fact(n*n*n) ; return b; / ,void main(void) double s=0; int i; for(i=1;i5;i+) s=s+ s
19、qua(i) ; printf(“n s=%en”,s); ,25,5.5.2 函數(shù)的遞歸調(diào)用,概念:函數(shù)直接或間接地自我調(diào)用稱為遞歸函數(shù)。,int fun1(int x) z=fun1(y); ,int fun1(int x) int fun2(int t) z=fun2(y); c=fun1(a); ,直接引用自身。,控制條件和遞歸表達(dá)式:遞歸在沒有控制條件的情況下是無 窮的遞歸(相當(dāng)于死循環(huán)),不能用。,無控制條件: void main(void) printf(“*n”); main(); ,加控制條件,void main(void) printf(“*n”); ch=getchar(
20、); if(ch!=9)main(); ,26,舉例1:用遞歸的方法求n!(曾使用過循環(huán)遞推法)。,n!=,1 n=0或n=1,n(n-1)! n1,f(n)=,1 n=0或n=1,n*f(n-1) n1 (人工求結(jié)果就是 根據(jù)遞歸表達(dá)式),#include long lfac(long); void main(void) long n=4,x; x=lfac(n); printf(“n%ld”,x); long lfac(long n) if (n=0|n=1) return 1; /不要理解為1返回到主函數(shù) else return(n*lfac(n-1); /等價(jià):return(4*3*2
21、*1) ,lfac(4),4* lfac(3),3* lfac(2),2* flac(1),2*1,3*2*1,4*3*2*1 /最后一次返回乘積結(jié)果到主程序,遞過程,歸過程(隱含逐次返回調(diào)用處),1,提醒:理解為逐次返回到調(diào)用處,最后返回主函數(shù) !,27,遞歸舉例2: 寫出下列程序的執(zhí)行結(jié)果,main() int y; y=f(6); printf(“%d”,y); f(int n) int f1; if(n=1|n=2) f1=1; else f1=f(n-1)+f(n-2); return(f1); ,8,分析:當(dāng)執(zhí)行f(6)時(shí) f1=f(5)+f(4) =f(4)+f(3)+ f(3)
22、+f(2) = =f(3)+f(2)+f(2)+f(1) + f(2)+f(1)+f(2) = = f(2)+f(1)+ f(2)+f(2)+f(1) + f(2)+f(1)+f(2)=等價(jià)if(n=1|n=2) return 1(即(f1=11) =1+1+1+1+1+1+1+1= 8,理解為遞歸終止條件;返回到調(diào)用處 !,返回到調(diào)用處,最后返回主函數(shù) !,28, 5.6 變量的作用域和存儲(chǔ)類型,變量不但有數(shù)據(jù)類型,還有存儲(chǔ)類型。 而存儲(chǔ)類型不但確定了變量在空間上的作用域,而且還確定了變量在時(shí)間上的生存期。,變量的存儲(chǔ)類型有以下四種:,自動(dòng)類型 auto /定義時(shí)可缺省,寄存器類型 regi
23、ster,靜態(tài)類型 static,外部類型 extern /聲明外部變量;定義時(shí)可缺省,從而變量的定義格式是:,存儲(chǔ)類型 數(shù)據(jù)類型 變量名表;,確定變量在內(nèi)存中的表示方法。,確定變量的生存期和作用域。 在函數(shù)內(nèi)部,該項(xiàng)省略表示auto存儲(chǔ)類型。在函數(shù)外部,該項(xiàng)省略表示extern。,29,auto存儲(chǔ)類型,3個(gè)特點(diǎn):塊內(nèi)定義;塊內(nèi)有效;隨塊生存。,#include void main(void) auto int a,b; scanf(“%d,%d”, ,a b 的 作 用 域,iTemp的作用域,此處編譯出語法錯(cuò): Undeclared identifier,若增加定義 iTemp=0 還有
24、語法錯(cuò)嗎?輸出結(jié)果 ?,特別提醒:形式參數(shù)也屬于auto型 !,4,0,30, register存儲(chǔ)類型,、作用域和生存期與auto相同。 、差別在于:如果CPU內(nèi)部的寄存器空閑, 則使用寄存器作為變量的存儲(chǔ)單元,以提高速度。 主要用于循環(huán)變量。 實(shí)際上,編譯系統(tǒng)在CPU不忙的情況下,能 自動(dòng)將使用頻繁的變量(如循環(huán)變量)處理成register。,31, static(靜態(tài))存儲(chǔ)類型,作用域: 同auto存儲(chǔ)類型,即塊內(nèi)定義,塊內(nèi)有效。,生存期: 不同auto存儲(chǔ)類型,從定義直到整個(gè)程序執(zhí)行結(jié) 束,退出 塊時(shí),原值并不消失,但是塊外不能引用其值。,void row (void) ; void
25、main ( void ) /下列程序能輸出“九九”乘法表? int b ; /auto型,局部,每次進(jìn)入程序塊都初始化 ! for (b=1 ; b=9 ; b+ ) row() ; void row (void ) int a=1 ; int b ; /auto型,局部 for (b=1 ; b=9 ; b+) printf ( “%5d” , a*b ) ; printf ( “ n ”) ; a+ ; ,static,改為靜態(tài)變量。,a的作用域,如何修改就能輸出“九九”乘法表?,還有哪些修改方法 ?,聯(lián)想前面講的函數(shù)間數(shù)據(jù)傳遞的5種方法 !,32, 外部變量(extern存儲(chǔ)類型),外
26、部變量是定義在任何模塊之外的變量。也稱為全局變量。,作用域:從定義點(diǎn)到文件結(jié)束(不同前3種 )。,生存期:在程序的整個(gè)執(zhí)行過程中(同static),任何函 數(shù)對(duì)外部變量值的修改,都會(huì)影響其他函數(shù)中該外部變量的值。,#include void add(void); int a,b,c; void main(void) scanf(“%d,%d”, ,定義外部變量, extern缺省。其他文件(其他編譯單位)中聲明后可用。,作用域,注意:08版教材p137關(guān)于外部變量的介紹有錯(cuò)(新版無錯(cuò)) : 定義(說明)與聲明不同; 定義時(shí)不加extern; 應(yīng)是b1.c中使用了a1.c , 。,33,關(guān)于外部
27、變量的4點(diǎn)補(bǔ)充說明:, 通過聲明,可以改變外部變量的作用域或后定義先使用。,void main( ) int i; /*定義 i為外部變量*/ void max(int a,int b) ,i 作用域,extern int i; /聲明外部變量,數(shù)據(jù)類型可省,i 新的作用域, 通過聲明,可使外部變量被另一個(gè)文件共享。,file1.c file2.c int a ; extern int a ;,文件1定義的外部變量。,在文件2中先聲明要使用文件1中已定義的外部變量的值。,如果外部變量值只在本文件中使用,可以加static定義。,static,34,關(guān)于外部變量的4點(diǎn)補(bǔ)充說明(續(xù)):,定義外部變
28、量占用內(nèi)存且增加模塊的耦合性,故應(yīng)少使用 外部變量。 另外,外部變量還可能引起其他問題,見下例:,#include int i; void prt(void); void main( void ) for(i=0;i5;i+) prt(); void prt(void) for(i=0;i5;i+) printf(“%c”, *); printf(“n”); ,函數(shù)的作用: 打印五個(gè)* ,再回車。,該程序想輸出25個(gè)*,能做到嗎 ? 如何改,就能輸出25個(gè)*?,不,因函數(shù)只調(diào)用1次 !,35, 當(dāng)模塊中出現(xiàn)和全局變量同名的局部變量時(shí),局部變量在 模塊中優(yōu)先,見下例執(zhí)行結(jié)果:,int a=5;
29、void fun(void); void main(void) int b;b=a; /a取5 printf(%dn,b); fun(); void fun(void) int b,a=8; b=a; /這里a取8 printf(%dn,b); ,#include int a=5; void fun(void); void main(void) int b; b=a; printf(%dn,b); fun(); void fun(void) int b,a=8; extern a; /聲明 b=a; printf(%dn,b); ,5 5,右邊的程序執(zhí)行結(jié)果又是什么 ?,5 8,36,5. 用
30、戶子函數(shù)有內(nèi)部函數(shù)和外部函數(shù)之分 子函數(shù)本質(zhì)上是全局的,因?yàn)橐粋€(gè)子函數(shù)就是要被 所有 函數(shù)調(diào)用;但是,可以指定子函數(shù)不能被其他文件中的函數(shù)調(diào)用。根據(jù)函數(shù)能否被其他源文件調(diào)用,將函數(shù)區(qū)分為內(nèi)部函數(shù)和外部函數(shù)。 (1)、內(nèi)部函數(shù) 如果一個(gè)函數(shù)只能被本文件中其他函數(shù)所調(diào)用,它稱為內(nèi)部函數(shù)。在定義內(nèi)部函數(shù)時(shí),函數(shù)首部的前面必須加static,即: static 類型標(biāo)識(shí)符號(hào) 函數(shù)名(形參表) 如: static int fun(int a , int b) 內(nèi)部函數(shù)又稱靜態(tài)函數(shù)。使用內(nèi)部函數(shù),可以使函數(shù)只限于所在文件使用,如果在不同的文件中有同名的內(nèi)部函數(shù),互不干擾。這樣不同的人在編寫子函數(shù)時(shí),不必?fù)?dān)
31、心函數(shù)是否會(huì)與其他文件中的函數(shù)同名(如同前面所講的static型變量)。,37,(2)、外部函數(shù) 、在定義函數(shù)時(shí),如果在函數(shù)首部的最左端冠以存儲(chǔ)器類型關(guān)鍵字extern或缺?。– 語言規(guī)定,如果在定義函數(shù)時(shí)省略extern ,則隱含為外部函數(shù)), 則表示此函數(shù)是外部函數(shù)。外部函數(shù)本文件和其他文件都可調(diào)用。例如: extern int fun(int a , int b) 、如果某文件要調(diào)用另一個(gè)文件中的此函數(shù),應(yīng)在調(diào)用此函數(shù)的文件中先聲明所調(diào)用的函數(shù)是外部函數(shù)(聲明時(shí)extern 也可缺?。?。 、舉例:略,聲明外部變量不能缺省,38,5.7 編譯預(yù)處理,C 語言除了說明語句、執(zhí)行語句及控制語
32、句外,還有編譯 預(yù)處理語句。該類語句的作用是在編譯前對(duì)程序作一定的 處理。編譯預(yù)處理是C語言的重要特征。,編譯預(yù)處理語句的語法形式:,#關(guān)鍵詞 參數(shù)表,編譯預(yù)處理語句不用分號(hào)作為語句結(jié)束標(biāo)志!共有3類:,宏定義預(yù)處理, 不帶形式參數(shù)的宏定義和宏替代,作用:定義常量名,提高程序的可讀性,便于修改。,格式: #define 宏名 字符串,#define PI 3.1415926 void main(void) flaot r; scanf(“%f ”, ,編譯前用字符串替代程序中的宏名。,3.1415926,39,6點(diǎn)說明:,宏名一般用大寫; 編譯前用字符串無條件替代程序中的宏名;,#define
33、 PI 3.1415926; /注意串中若有分號(hào)的情況 ! PI*r*r,3.1415926;*r*r,宏名的有效范圍,從定義處到整個(gè)程序尾。也可以通過 #undef 修改定義范圍。,#define G 9.8 void main(void ) #undef G ,現(xiàn)G的范圍,可以在宏定義的字符串中使用已定義過的宏名。, “ ” 中的宏名不替換。,#define R 3.0 #define PI 3.14159 #define S PI*R*R,printf(“S=%f”,S);,不替換。,宏定義可應(yīng)用于定義輸出格式等,以簡(jiǎn)化源程序的書寫。,40,例:宏定義可應(yīng)用于定義輸出格式,以簡(jiǎn)化源程序的
34、書寫。,41, 帶形式參數(shù)的宏定義和宏調(diào)用,格式: #define 宏名(參數(shù)表) 含參數(shù)的字符串,#define S( a , b ) a*b area=S( 3 , 4 );,替換過程(編譯前完成):,用實(shí)際參數(shù)替換宏定義的形參。,替換字符串中的參數(shù)。,替換整個(gè)宏(即用第步的結(jié)果替代宏調(diào)用)。,3*4,帶參的宏與函數(shù)的區(qū)別:,帶參宏中的形參不分配內(nèi)存;也不返回值;只是在編譯前(預(yù)處理)按規(guī)則替換;實(shí)參若是表達(dá)式不能先計(jì)算。,關(guān)于帶參宏的2點(diǎn)說明:,要嚴(yán)格按格式書寫,宏名后不能加空格,否則會(huì)造成錯(cuò)誤。,對(duì)于 #define S (a,b)a*b , S(3,4)被替換成:(a,b)a*b(3
35、,4),參數(shù)有可能用到表達(dá)式時(shí),字符串中參數(shù)字符要加()。,它與無括號(hào)的作用不同 ! #define S(r) PI*r*r S(a+b)替換為:PI*a+b*a+b,#define S(r) PI*(r)*(r) S(a+b)替換為:PI*(a+b)*(a+b),42, 文件包含預(yù)處理,格式: #include #include “被包含的文件名”,其中:表示編譯系統(tǒng)定義路徑,即先找?guī)旌瘮?shù); “ ”表示用戶指明路徑,即先找用戶目錄。,作用:將指定文件的內(nèi)容(原形)和當(dāng)前文件合并一起編譯。 聲明系統(tǒng)函數(shù)調(diào)用。 共享某指定的文件(但以這種方式共享會(huì)造成代碼冗 余)。,4點(diǎn)說明:,一個(gè)#include只包一個(gè)文件。被包含的文件也可是用戶文件。,被包含文件可以嵌套包含文件,見下面例子中my.h中又出現(xiàn)了#include 。,對(duì)用戶來說,一般將宏定義及函數(shù)的原型聲明放在被包含文件中,也可做到簡(jiǎn)化程序書寫。,被包含的文件一般擴(kuò)展名為.h,稱為頭文件。,43,文件包含舉例: 求半徑為r的園面積、園周長(zhǎng)。
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年個(gè)人門面買賣合同格式版(2篇)
- 2025年個(gè)人貨車租賃合同常用版(2篇)
- 2025年個(gè)人貨運(yùn)汽車租賃合同(4篇)
- 2025年個(gè)人雇傭協(xié)議參考范文(三篇)
- 2013-2022年北京市中考真題物理試題匯編:電功和電功率章節(jié)綜合
- 2025年中介行業(yè)保密協(xié)議(五篇)
- 2025年個(gè)人成交租賃合同模板(三篇)
- 城市綠化混凝土供應(yīng)協(xié)議書
- 服裝快遞運(yùn)輸協(xié)議
- 乳制品運(yùn)輸協(xié)調(diào)服務(wù)協(xié)議
- 煤場(chǎng)用車輛倒運(yùn)煤的方案
- 《預(yù)防犯罪》課件
- 【企業(yè)作業(yè)成本在上海汽車集團(tuán)中的應(yīng)用研究案例7300字(論文)】
- 《民航服務(wù)溝通技巧》教案第6課巧妙化解沖突
- 化學(xué)用語專項(xiàng)訓(xùn)練
- 中國(guó)高血壓臨床實(shí)踐指南(2022版)解讀
- 《了凡四訓(xùn)》課件
- 醫(yī)院住院病人健康教育表
- 風(fēng)險(xiǎn)矩陣法(詳細(xì))
- 實(shí)驗(yàn)室供應(yīng)商評(píng)價(jià)的5個(gè)基本步驟
- 電力公司工程勘察設(shè)計(jì)管理辦法
評(píng)論
0/150
提交評(píng)論