C語言新教材PPT課堂課件-7-函數(shù)_第1頁
C語言新教材PPT課堂課件-7-函數(shù)_第2頁
C語言新教材PPT課堂課件-7-函數(shù)_第3頁
C語言新教材PPT課堂課件-7-函數(shù)_第4頁
C語言新教材PPT課堂課件-7-函數(shù)_第5頁
已閱讀5頁,還剩61頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、1第七章 函數(shù)7.1 函數(shù)概述7.2 函數(shù)定義和調(diào)用7.3 函數(shù)調(diào)用中的參數(shù)傳遞7.4 函數(shù)的嵌套調(diào)用和遞歸調(diào)用7.5 函數(shù)的返回值為指針7.6 變量的作用域和存儲類別7.7 內(nèi)部函數(shù)和外部函數(shù) 2函數(shù)是構(gòu)成C程序的基本構(gòu)件。C語言的程序是由一個主函數(shù)或若干個函數(shù)組成的。但編譯單位是源程序文件,而不是函數(shù)。C程序執(zhí)行是從main函數(shù)(主函數(shù))開始,在main函數(shù)中結(jié)束,不管main函數(shù)的位置如何。所有的函數(shù)獨(dú)立定義,main( )函數(shù)可以調(diào)用任意其它函數(shù),其它函數(shù)之間可以相互調(diào)用,但任何函數(shù)都不能調(diào)用main( )函數(shù)。7.1 函數(shù)概述3函數(shù)的分類庫函數(shù):由系統(tǒng)提供,供用戶直接調(diào)用自定義函數(shù):

2、由程序員自己定義,解決特定的問題有參函數(shù):函數(shù)帶有參數(shù)(自變量) 如 sqrt(x)、printf (y=%dn,y)無參函數(shù):函數(shù)無參數(shù) 如 getchar() 、rand()有返回值函數(shù):函數(shù)被調(diào)用后返回一個值 如 sin(x) 、getchar() 無返回值函數(shù):函數(shù)被調(diào)用后無返回值 如 clrscr()4 如: g(x,y)= g(3,4)= = 5函數(shù)定義函數(shù)調(diào)用兩個形式參數(shù)兩個實(shí)際參數(shù)函數(shù)值7.2 函數(shù)的定義與調(diào)用函數(shù)定義時函數(shù)名后的括號中的變量叫形式參數(shù),簡稱形參函數(shù)調(diào)用時函數(shù)名后的括號中的參數(shù)叫實(shí)際參數(shù),簡稱實(shí)參5一、函數(shù)定義與調(diào)用的一般形式函數(shù)定義的格式:函數(shù)類型名 函數(shù)名(

3、 形參及形參聲明表 ) 內(nèi)部變量定義和聲明部分 執(zhí)行語句 函數(shù)定義后,并不被執(zhí)行,只有當(dāng)調(diào)用函數(shù)時,程序才轉(zhuǎn)到函數(shù)去執(zhí)行。函數(shù)調(diào)用的格式: 函數(shù)名( 實(shí)參表 )6#include (一)無參無返回值函數(shù)的定義與調(diào)用 void pstar( ) printf(*n);/*輸出一行20個*號 */ void main ( )int i; for (i=1;i=10;i+) pstar(); 函數(shù)類型void(“空類型”)表示無返回值無參數(shù)以語句方式調(diào)用無返回值函數(shù)函數(shù)定義函數(shù)名函數(shù)體7#include 體內(nèi)變量定義,形參在體內(nèi)不能再定義(二)有參無返回值函數(shù)的定義與調(diào)用形參n定義為int型函數(shù)定義

4、實(shí)參20 void pstar(int n ) int i; for (i=1;i=n;i+) printf(*); printf(n); void main ( )int i; for (i=1;i=10;i+) pstar(20); 若實(shí)參改為i,程序輸出結(jié)果又是什么?8#include (三)有返回值函數(shù)的定義與調(diào)用 int max ( int x, int y ) int z; z= xy?x:y; return (z ); void main ( ) int a,b,c; scanf(%d%d,&a,&b); c=max(a,b); printf(max is %dn,c ); 函數(shù)

5、定義 return后z 的值作為函數(shù)返回值return z;return (xy?x:y);int型函數(shù)(int 可缺省),表示函數(shù)返回值為整型max函數(shù)帶回返回值并賦給c return后的括號可以不要 return后可以是一個表達(dá)式例7.5有參有返回值/*或 return xy?x:y; */不能寫為int x,y;9有返回值函數(shù)的定義與調(diào)用int max ( int x, int y ) return (xy?x:y); void main ( ) int a,b; scanf(%d%d,&a,&b); printf(max is %dn, max(a,b) ); 函數(shù)定義將max函數(shù)的返

6、回值作為printf函數(shù)的參數(shù)#include 10函數(shù)返回值通過return語句獲得: return (表達(dá)式); 或 return 表達(dá)式; 一個函數(shù)只能返回一個確定的值。 return a,b; 表示返回逗號表達(dá)式(a,b)的值。一個函數(shù)可以有多個return語句,即多個出口。二、函數(shù)的返回值 P202int max ( int x, int y ) if ( xy ) return x ; else return y ; 11函數(shù)返回值的類型:取決于函數(shù)的類型。函數(shù)的返回值一個函數(shù)若沒有返回值,函數(shù)體內(nèi)無需return語句,或return后面不跟表達(dá)式。 將無返回值的函數(shù)類型定義為vo

7、id。int max ( float x, float y ) float z; z= xy?x:y; return (z); 函數(shù)返回值是float還是int型?int例7.612三、函數(shù)調(diào)用的方式 P200 函數(shù)調(diào)用的格式:函數(shù)名( 實(shí)參表 )函數(shù)語句方式:把函數(shù)調(diào)用作為一個語句,這種調(diào)用方式不要求函數(shù)有返回值,或不使用函數(shù)的返回值。如,pstar(20); printf(Hello!);函數(shù)表達(dá)式方式:函數(shù)調(diào)用出現(xiàn)在表達(dá)式中,這種調(diào)用方式要求函數(shù)返回一個確定的值以參加表達(dá)式的運(yùn)算。如,c=max(a,b);y=2*sin(x);函數(shù)參數(shù)方式:把函數(shù)調(diào)用作為一個實(shí)參進(jìn)行函數(shù)調(diào)用,這種調(diào)用方

8、式也要使用函數(shù)的返回函數(shù)值。如,printf(max is %dn, max(a,b) );13舉例 判斷素數(shù)函數(shù)1(無返回值函數(shù))prime ( int m ) int j,k; k= sqrt(m); for ( j=2; jk ) printf(%d is a prime numbern, m ) ; else printf(%d is not a prime numbern, m ) ;main ( ) int n; scanf(%d, &n ) ; prime ( n ) ;void prime ( int m )為了明確表示“不帶回值”,用void定義函數(shù)類型#include #i

9、nclude 14舉例 判斷素數(shù)函數(shù)2(有返回值函數(shù))#include #include void main ( ) int n; scanf(%d, &n ) ; f = 1 ; f = 0 ;return ( f ) ;if ( ) printf (%d is a prime numbern, n);else printf (%d is not a prime numbern, n ) ;( prime(n)=1)( prime(n) )int prime ( int m ) int j ,k, f ; k= sqrt(m) ; /*f標(biāo)識是否為素數(shù)*/ for ( j=2; jk ) e

10、lse /*返回1表示m是素數(shù), 返回0表示m不是素數(shù)*/prime ( int m )函數(shù)返回值類型為int時,int可缺省15四、函數(shù)調(diào)用的條件 P2051、被調(diào)函數(shù)是庫函數(shù)或已經(jīng)存在的自定義函數(shù)。2、若被調(diào)函數(shù)是庫函數(shù),需在文件開頭將其頭文件#include到本文件。 TC2.0例外:調(diào)用scanf函數(shù)和printf函數(shù)時,可缺省 #include 3、若被調(diào)函數(shù)是自定義函數(shù),一般應(yīng)在調(diào)用前進(jìn)行函數(shù)原型聲明,聲明的格式是: 函數(shù)類型名 函數(shù)名(形參名及其類型表); 或者:函數(shù)類型名 函數(shù)名(形參類型表); 舉例:int max(int x,int y); 或 int max(int,in

11、t); 例外:若被調(diào)函數(shù)定義在前、調(diào)用在后,則可不加函數(shù)原型聲明。16函數(shù)原型聲明方式1、在主調(diào)函數(shù)內(nèi)部聲明;2、在函數(shù)的外部聲明,一般放在所有函數(shù)定義之前,即文件開頭。17函數(shù)原型聲明舉例#include void main( ) float a, b, c ; scanf(%f,%f, &a, &b ); c=sub( a , b ); printf(“sub is %fn, c);float sub (float x , float y ) float z ; z = x-y ; return ( z ) ;float sub ( float x, float y ) ;函數(shù)的調(diào)用和聲明

12、的格式有什么區(qū)別?函數(shù)定義在后函數(shù)調(diào)用在前在執(zhí)行語句之前對原型函數(shù)聲明例7.818五、形式參數(shù)與實(shí)際參數(shù) P201對無參函數(shù),形參表列與實(shí)參表列均為空,但括號不能省略,如fun( )。對有參函數(shù),實(shí)參與形參應(yīng)個數(shù)相等,順序?qū)?yīng),類型一致或賦值相容。實(shí)參可以是常量、變量或表達(dá)式。 如函數(shù)原型: int max(int x,int y); 函數(shù)調(diào)用: max( 3, x1+5 ) max( ai, bi ) 數(shù)組元素ai,bi也是變量19形式參數(shù)與實(shí)際參數(shù) P201實(shí)參的值傳遞給形參,而形參的值不會傳回給實(shí)參,即改變形參的值不會使實(shí)參的值發(fā)生變化。 C語言實(shí)參與形參相互作用的特點(diǎn):單向值傳遞 實(shí)參

13、 形參值“值傳遞”又分為“數(shù)值傳遞”和“地址傳遞”兩種20int mult ( int n ) n*=10; return (n); void main ( ) int number,result; number=668; result=mult(number); printf(result= %dn , result ); printf(number= %dn , number );#include 例7.97.3 函數(shù)調(diào)用中的參數(shù)傳遞7.3.1 簡單變量作函數(shù)參數(shù)形參n在mult函數(shù)定義時指定,但mult函數(shù)未被調(diào)用時,n不占存儲單元:調(diào)用前:n未分配,當(dāng)執(zhí)行到函數(shù)調(diào)用語句時,才給形參n分

14、配存儲單元,并將實(shí)參number的值傳遞給形參:nnumber668668調(diào)用時:number66821int mult ( int n ) n*=10; return (n); void main ( ) int number,result; number=668; result=mult(number); printf(result= %dn, result ); printf(number= %dn, number );#include 例7.9mult函數(shù)調(diào)用中,n的值發(fā)生變化:調(diào)用中:668 nmult函數(shù)調(diào)用結(jié)束,形參n所占用存儲單元被釋放,實(shí)參number值不變:調(diào)用后:n被釋放

15、number668實(shí)參 簡單形參數(shù)值單向數(shù)值傳遞6680number66822舉例 寫函數(shù)對兩個數(shù)按降序排列(1)swap(int x,int y) int t; t=x; x=y; y=t;#include void main( ) int a,b; scanf(%d,%d”,&a,&b); /*假設(shè)讀入5和9*/ if(ab) swap(a,b); printf(%d,%dn,a,b);以下程序能實(shí)現(xiàn)a和b兩個變量的交換嗎?ab59調(diào)用前ab59xy59調(diào)用時 txy955ab59調(diào)用中調(diào)用后ab59改變形參變量的值無法實(shí)現(xiàn)a和b兩個變量的交換!23指針類型實(shí)參 指針類型形參地址值7.3.

16、2 指針變量作函數(shù)參數(shù)單向地址傳遞實(shí)參 形參值單向值傳遞若指針作為函數(shù)參數(shù):24swap(int *p1,int *p2) int *t; /*不能用int t;*/ t=p1; p1=p2; p2=t;#include void main( )int a,b; int *pointer1,*pointer2; scanf(%d,%d,&a,&b); pointer1=&a;pointer2=&b; if(ab)swap(pointer1,pointer2); printf(%d,%dn,a,b);p1p220002002 舉例 寫函數(shù)對兩個數(shù)按降序排列(2)2000200259ab20002

17、002pointer1pointer2例7.12調(diào)用前調(diào)用時調(diào)用中 t200220002000改變形參指針的值無法實(shí)現(xiàn)a和b兩個變量的交換!25swap(int *p1,int *p2) int t; /*不能用int*t;*/ t=*p1; *p1=*p2; *p2=t;#include void main( )int a,b; int *pointer1,*pointer2; scanf(%d,%d,&a,&b); pointer1=&a;pointer2=&b; if(ab)swap(pointer1,pointer2); printf(%d,%dn,a,b);p1p220002002

18、舉例 寫函數(shù)對兩個數(shù)按降序排列(3)2000200259ab20002002pointer1pointer2例7.11調(diào)用前調(diào)用時調(diào)用中p1p220002002955 t改變形參指針?biāo)竼卧闹挡拍軐?shí)現(xiàn)a和b兩個變量的交換!26指針變量作函數(shù)參數(shù)小結(jié)欲通過函數(shù)調(diào)用得到 n個要改變的值,方法:主調(diào)函數(shù):設(shè)置n個簡單變量a1,a2,分別存放n個要改變的值;被調(diào)函數(shù):設(shè)置n個指針變量p1,p2,作為形參,函數(shù)體改變*p1,*p2,的值;函數(shù)調(diào)用:主調(diào)函數(shù)以a1,a2, 的地址為實(shí)參,于是形參p1,p2,指向a1,a2, ,被調(diào)函數(shù)改變 *p1,*p2, 的值實(shí)際上就是改變a1,a2,的值。因此,函數(shù)

19、調(diào)用結(jié)束,主調(diào)函數(shù)得到改變了的值。27#include void fun(int *p,int *q) printf(%d%d,*p,*q); *p=7; *q=8;void main() int x=55,y=66; fun(&y,&x); printf(%d%dn,x,y);指針變量作函數(shù)參數(shù)舉例運(yùn)行結(jié)果:665587 287.3.3 數(shù)組作函數(shù)參數(shù) 數(shù)組元素作函數(shù)參數(shù) - 等同于簡單變量作函數(shù)參數(shù), 單向數(shù)值傳遞 數(shù)組名作函數(shù)參數(shù) - 等同于指針變量作函數(shù)參數(shù) 單向地址傳遞29一、數(shù)組元素作函數(shù)參數(shù)舉例 判斷兩個數(shù)值型數(shù)組的大小例7.15:對應(yīng)數(shù)組元素逐個比較,如果數(shù)組a中的元素比數(shù)組b

20、中元素大的次數(shù)多,則數(shù)組a大于數(shù)組b,反之?dāng)?shù)組b大于數(shù)組a,如果兩數(shù)組元素大于對方的元素次數(shù)相等,則兩數(shù)組相等。 通過調(diào)用 large函數(shù)實(shí)現(xiàn)函數(shù)large()的功能:判斷形參x、y的大小,返回1、 0、-1三種函數(shù)值large( int x , int y )int flag ; if ( xy ) flag = 1 ; else if (x=y ) flag = 0 ; else flag = -1 ; return ( flag ) ; 30#include void main ( ) int a 10 , b 10 , i , n=0 , k=0 ; for ( i=0 ; i10 ;

21、 i+ ) scanf (%d,&a i ) ; for ( i=0 ; i10 ; i+ ) scanf (%d,&b i ) ; for ( i=0 ; ibi的次數(shù)*/ else if ( large(ai, bi)=-1 ) k+; /*累計aik ) printf( array a is larger than array b n ) ; else if ( nk ) printf( array b is larger than array a n ) ; else printf( array a is equal to array b n ) ; 例7.15 主函數(shù)數(shù)組元素ai 、

22、bi作實(shí)參31二、一維數(shù)組名作函數(shù)參數(shù) P216形參一維數(shù)組名指針變量 數(shù)組名形參實(shí)質(zhì)是指針變量,接收實(shí)參傳遞的數(shù)組首地址。 實(shí)參數(shù)組首地址 形參數(shù)組名或指針變量地址等同void fun(int x6) void main() int a6; fun(a); 789069實(shí)參a形參xaint *x注意:形參是數(shù)組名x, 而不是x6!32實(shí)參數(shù)組與形參數(shù)組類型要一致。定義函數(shù)時,形參數(shù)組不占存儲單元; 發(fā)生函數(shù)調(diào)用時,實(shí)參數(shù)組名傳數(shù)組的首地址給形參數(shù)組名,于是形參數(shù)組結(jié)合到實(shí)參數(shù)組所占用的存儲空間。效果:函數(shù)調(diào)用期間,形參數(shù)組就是實(shí)參數(shù)組。對形參數(shù)組的操作,也就是對實(shí)參數(shù)組的操作。一維數(shù)組名作函

23、數(shù)參數(shù)789069實(shí)參a形參xa調(diào)用時33一維數(shù)組名作函數(shù)參數(shù)形參一維數(shù)組名指針變量實(shí)參一維數(shù)組名 指向一維數(shù)組的指針變量 實(shí)參數(shù)組首地址 形參數(shù)組名或指針變量地址等同等效種等價形式:(1)形參、實(shí)參都用數(shù)組名 (2)形參、實(shí)參都用指針變量 (3)形參用指針變量、實(shí)參用數(shù)組名 (4)形參用數(shù)組名、實(shí)參用指針變量34int solve ( int b 10 ) int sum=0, i ; for ( i=0 ; i 10 ; i+ ) if (bi!=0 ) sum + ; return (sum); void main ( ) int a10 , num, i ; for ( i=0 ; i

24、10 ; i+ ) scanf(%d , &ai ); num = solve (a ) ; printf(num = %d n , num) ; int b )只能在實(shí)參數(shù)組大小范圍內(nèi)使用形參數(shù)組#include 舉例 編寫函數(shù)統(tǒng)計一維數(shù)組中非0元素個數(shù)例7.17形參數(shù)組第一維大小形同虛設(shè),無論如何定義,函數(shù)調(diào)用后它結(jié)合到的是整個實(shí)參數(shù)組,故可以不指定形參數(shù)組第一維的大小。35int solve ( int b ) int sum=0, i ; for ( i=0 ; i 10 ; i+ ) if (bi!=0 ) sum + ; return (sum); void main ( ) in

25、t a10 , num, i ; for ( i=0 ; i10 ; i+ ) scanf(%d , &ai ) ; num = solve (a ) ; printf(num = %d n , num) ; #include 舉例 編寫函數(shù)統(tǒng)計一維數(shù)組中非0元素個數(shù)例7.17 改進(jìn)程序?yàn)榉奖惚徽{(diào)函數(shù)的編程,通常另設(shè)一參數(shù)用于傳遞數(shù)組元素的個數(shù)。int b , int n )n, 10 ) ; 思考:將實(shí)參數(shù)組定義為a20 行嗎?36舉例 編寫函數(shù)實(shí)現(xiàn)數(shù)組逆置(1)void fun( int x ,int n) int t,i,j; for (i=0,j=n-1;ij;i+,j-) t=xi;

26、xi=xj;xj=t; #include void main ( ) int i,a10=3,7,9,11,0,6,7,5,4,2; printf(The original array:n); for (i=0;i10;i+) printf(%3d,ai); printf(n); fun(a,10); printf(The array has been inverted:n); for (i=0;i10;i+) printf(%3d,ai); /* 輸出原始數(shù)組a */* 調(diào)用函數(shù)fun( ) 逆置數(shù)組a */* 輸出逆置后的數(shù)組a */類例7.19 :形參和實(shí)參均為數(shù)組名37void fun

27、( int *x, int n) int t,*i,*j,m=(n-1)/2; for (i=x,j=x+n-1;i=x+m;i+,j-) t=*i; *i=*j; *j=t; #include void main ( ) int i,a10=3,7,9,11,0,6,7,5,4,2; printf(The original array:n); for (i=0;i10;i+) printf(%3d,ai); printf(n); fun(a,10); printf(The array has been inverted:n); for (i=0;i10;i+) printf(%3d,ai);

28、 /* 調(diào)用函數(shù)fun( )逆置數(shù)組a */舉例 編寫函數(shù)實(shí)現(xiàn)數(shù)組逆置(2) 形參為指針變量,實(shí)參為數(shù)組名38void fun( int x , int n) int t,i,j,m=(n-1)/2; for (i=0;i=m;i+) j=n-i-1; t=xi;xi=xj;xj=t; #include void main ( ) int i,a10=3,7,9,11,0,6,7,5,4,2,*p; printf(The original array:n); for (i=0;i10;i+) printf(%3d,ai); printf(n); p=a; fun(p,10); printf(T

29、he array has been inverted:n); for (i=0;i10;i+) printf(%3d,ai); /* 調(diào)用函數(shù)fun( )逆置數(shù)組*/形參為數(shù)組名,實(shí)參為指針變量舉例 編寫函數(shù)實(shí)現(xiàn)數(shù)組逆置(3)39#include void main ( ) int i,a10=3,7,9,11,0,6,7,5,4,2,*p; printf(The original array:n); for (i=0;i10;i+) printf(%3d,ai); printf(n); p=a; fun(p,10); printf(The array has been inverted:n)

30、; for (i=0;i10;i+) printf(%3d,ai); /* 調(diào)用函數(shù)fun( )逆置數(shù)組*/ 形參、實(shí)參均為指針變量舉例 編寫函數(shù)實(shí)現(xiàn)數(shù)組逆置(4)void fun( int *x,int n) int t,*i,*j,m=(n-1)/2; for (i=x,j=x+n-1;i=x+m;i+,j-) t=*i; *i=*j; *j=t; 40void main( ) int a10, int i;void select( int *a, int n) int i,j,k,temp; for( i=0 ; in-1 ; i+ ) k=i ; for( j=i+1 ; jn ; j

31、+ ) if(ajak) k=j ; if (k!=i) temp=ak;ak=ai;ai=temp ; 舉例 編寫函數(shù)用選擇法實(shí)現(xiàn)從小到大排序printf(Enter the array:n);for(i=0;i10;i+) scanf(%d,&ai); select( a , 10 );printf(the sorted array: n);for( i=0; i10 ; i+ ) printf(%d ,ai);printf(n);例7.20#include 41三、多維數(shù)組名作函數(shù)參數(shù) P223形參二維數(shù)組名行指針變量實(shí)參二維數(shù)組名行指針元素指針變量元素指針 效果:函數(shù)調(diào)用期間,形參二維

32、數(shù)組就是 實(shí)參二維數(shù)組。等同等效42舉例 編寫求二維數(shù)組最大值int max_value( int a 4 ) int i , j , max ; max=a00 ; for( i=0 ; i3 ; i+ ) for( j=0 ; jmax ) max = aij ; return ( max ) ;void main ( ) int a34 = 1, 3, 5, 7, 2, 4, 6, 8, 15, 17, 34, 12 ; printf (max = %dn, max_value(a) ) ; 例7.23形參二維數(shù)組的第一維大小可以不指定,但第二維大小必須指定#include 或:int

33、max_value( int (*a)4 )可以加一個形參n,用來傳遞第一維的大小43四、字符數(shù)組作函數(shù)參數(shù) P225形參一維字符數(shù)組名字符指針變量實(shí)參一維字符數(shù)組名字符指針 效果:函數(shù)調(diào)用期間,形參字符串就是 實(shí)參字符串。等同等效44舉例 編寫函數(shù)將串t復(fù)制到串svoid stringcopy (char s , char *t ) int i=0 ; while( *t!=0) si=*t; i+; t+; si=0;#include void main ( ) char str1 =I love Beijing!; char *str2=I love China!; stringcopy

34、 (str1,str2); printf(str1=%sn str2=%sn,str1,str2); 調(diào)用函數(shù)復(fù)制例7.24例7.25 改用兩個字符指針變量作形參void stringcopy (char *p, char *q) while( (*p+=*q+)!=0 ); 45舉例 將串s1第k個字符開始的后續(xù)字符組成子串s2例7.28void copysubstring (char *s1, char *s2, int k) s1=s1+k-1; /*假設(shè)k小于等于串長*/ while( *s1! =0 ) *s2+=*s1+; *s2 =0; 舉例 從串s1第k個字符取n個字符組成子串

35、s2(若不足n個,取所有后續(xù)字符)void copysubstring (char *s1, char *s2, int k , int n) s1=s1+k-1; while( n0&*s1! =0 ) *s2+=*s1+; n-; *s2 =0; 46main( )函數(shù) . . . .調(diào)用函數(shù)fun1fun1( )函數(shù) . . . .調(diào)用函數(shù)fun2fun2( )函數(shù)結(jié)束7.4 函數(shù)的嵌套調(diào)用和遞歸調(diào)用從什么地方調(diào)用函數(shù),就返回到什么地方。7.4.1 函數(shù)的嵌套調(diào)用47函數(shù)的嵌套調(diào)用舉例求組合數(shù)cnmfloat fac(int t) int i ; float s=1; for(i=1;i

36、=t;i+) s*=i; return ( s ) ; float c ( int m , int n) float f , fac(int ) ; f = fac(m) / ( fac(n) * fac(m-n) ); return ( f ) ; 返回 c 函數(shù)在c 函數(shù)中三次調(diào)用fac 函數(shù)返回 main 函數(shù)函數(shù)fac:求 t!函數(shù)C:求cnm#include void main( ) int m,n,t; float c( int , int); scanf(%d%d,&m,&n); if ( nm ) printf(Input Error!); else printf(%.0fn,

37、 c(m,n) ); 在main 函數(shù)中調(diào)用c 函數(shù)48 int a(int n) int d,c,b(); d=a(c); 7.4.2 函數(shù)的遞歸調(diào)用函數(shù)的遞歸調(diào)用:在定義一個函數(shù)的過程中又直接或間接地調(diào)用函數(shù)本身遞歸函數(shù)兩要素 遞歸調(diào)用 使遞歸結(jié)束的條件49遞歸函數(shù)應(yīng)用舉例1年齡問題int age( int n ) int c; if ( n=1 ) c = 10; else c = age( n-1 ) + 2 ; return ( c ) ; #include void main( ) printf ( %dn , age ( 5 ) ) ; 結(jié)束遞歸的條件遞歸調(diào)用函數(shù) age :求第

38、n個人的年齡P233例7.32age(n-1) +2 (n1)10 (n=1) 分析:age(n)=或int age( int n ) if ( n=1 ) return 10; else return age( n-1 ) + 2 ; 50age(5)c=age(4)+2c=age(3)+2c=age(2)+2c=age(1)+2c=10(age(1)c=12(age(2)c=14(age(3)c=16(age(4)c=18(age(5)main()遞歸函數(shù)應(yīng)用舉例1年齡問題51遞歸函數(shù)應(yīng)用舉例2 求階乘float fac ( int n ) /* 求階乘函數(shù)*/ float f ; if

39、( n=0 | n=1 ) f = 1 ; else f =n* fac ( n-1 ) ; return ( f ) ; #include void main( ) int n; scanf(%d, &n ); if (n0) printf(n1)分析:fac(n)=52遞歸優(yōu)點(diǎn):程序簡潔;有時能解決非遞歸方法不能解決的問題。遞歸最大缺點(diǎn):效率低原因如下:(1) 遞歸函數(shù)會帶來大量的重復(fù)計算,例如n!程序,每一次遞歸函數(shù)調(diào)用都會帶來前面的重復(fù)計算,大大降低效率(2) 函數(shù)的每一次調(diào)用都需進(jìn)行保留現(xiàn)場、傳遞參數(shù)以及恢復(fù)現(xiàn)場等操作,效率低遞歸函數(shù)的優(yōu)缺點(diǎn)537.5 函數(shù)的返回值為指針一個函數(shù)可以

40、返回整型、字符型、實(shí)型函數(shù)值,也可以返回一個指針值,即將地址作為函數(shù)值返回到主調(diào)函數(shù)中。這樣的函數(shù)叫做返回指針的函數(shù),簡稱指針函數(shù)。54返回指針的函數(shù)的定義指針函數(shù)的定義: 類型名 *函數(shù)名(形參表) 如: int *f(int m,int n) 表示f是一個函數(shù),有兩個形參m和n,均為整型,函數(shù)的返回值是一個指向整型數(shù)據(jù)的指針注意:返回的指針必須是參數(shù)的地址或靜態(tài)變量的地址,不能是函數(shù)體內(nèi)定義的動態(tài)變量的地址。55舉例 返回新串#includevoid main() char *delspace( char*); char s100; gets(s); printf(%sn,delspace

41、(s); char *delspace( char *s) int *p1,*p2;/*p1:原串指針,p2:新串指針*/ p1=p2=s; while(*p1!=0) if (*p1= ) p1+; else *p2+=*p1+; *p2=0; return(s);函數(shù)功能:從串s中刪去所有的空格,返回刪去空格后的s串。567.6 變量的作用域和存儲類別變量按照其作用范圍分為:局部變量和全局變量(外部變量)類別作用域(有效范圍)局部變量函數(shù)形參本函數(shù)在函數(shù)體首部定義的變量/數(shù)組本函數(shù)在復(fù)合語句首部定義的變量/數(shù)組本復(fù)合語句全局變量在函數(shù)之外定義的變量/數(shù)組定義起至文件結(jié)束57局部變量和全局變

42、量 int a = 3 , b = 5 ; int max( int a , int b ) int c ; c = ab ? a : b ; return (c) ; #include void main( ) int a=8 ; printf ( %dn, max( a , b ) ) ; max()的局部變量cmax()的局部變量a、bmain()的局部變量a實(shí)參a是main()的局部變量(8),實(shí)參b是全局變量(5)使用max()的局部變量a、b兩點(diǎn)說明:不同函數(shù)中的局部變量可以同名,全局變量與局部變量也可以同名,但它們代表不同的變量,在內(nèi)存中占有不同的存儲空間。局部變量起作用時,同名全局變量不起作用。全局變量a、b程序運(yùn)行結(jié)果:858全局變量應(yīng)用舉例#include float Max, Min ; float average ( float array , int n ) int i ; float aver , sum = array 0 ; Max = Min = array 0 ; for( i=1 ; i Max ) Max=arrayi; else if ( arrayi Min ) Min=arrayi; sum=sum+arrayi ; ave

溫馨提示

  • 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

提交評論