C語言第8章函數(shù)ppt課件_第1頁
C語言第8章函數(shù)ppt課件_第2頁
C語言第8章函數(shù)ppt課件_第3頁
C語言第8章函數(shù)ppt課件_第4頁
C語言第8章函數(shù)ppt課件_第5頁
已閱讀5頁,還剩51頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、12一、概述一、概述 二、二、函數(shù)定義的一般形式函數(shù)定義的一般形式三、三、函數(shù)參數(shù)和函數(shù)的值函數(shù)參數(shù)和函數(shù)的值 四、四、函數(shù)調(diào)用函數(shù)調(diào)用五、函數(shù)的嵌套調(diào)用五、函數(shù)的嵌套調(diào)用 六、函數(shù)的遞歸調(diào)用六、函數(shù)的遞歸調(diào)用七、數(shù)組作為函數(shù)的參數(shù)七、數(shù)組作為函數(shù)的參數(shù) 八、局部變量和全局變量八、局部變量和全局變量3源 程 序 文 件 1預(yù) 編 譯 命 令說 明 部 分執(zhí) 行 部 分函 數(shù) 1函 數(shù) n源 程 序 文 件 i源 程 序 文 件 nC程 序C C程序結(jié)構(gòu)程序結(jié)構(gòu)4#include stdio.hvoid main() void printstar(); /對(duì)函數(shù)進(jìn)行聲明對(duì)函數(shù)進(jìn)行聲明 void

2、printmessage(); printstar(); /調(diào)用函數(shù)調(diào)用函數(shù) printmessage(); printstar(); void printstar()/定義函數(shù)定義函數(shù)printf(*n);void printmessage()/定義函數(shù)定義函數(shù)printf( How do you do?n);引例5練習(xí):采用函數(shù)調(diào)用方式,輸出下列歡迎界面。#include stdio.hvoid main() void p1(); void p2(); p1(); p2(); p1(); void p1() printf(*n); void p2() printf(*歡迎歡迎*n); 6

3、一個(gè)一個(gè)C程序可由一個(gè)主函數(shù)和若干個(gè)函數(shù)構(gòu)成。程序可由一個(gè)主函數(shù)和若干個(gè)函數(shù)構(gòu)成。 由主函數(shù)調(diào)用其他函數(shù)。由主函數(shù)調(diào)用其他函數(shù)。 其他函數(shù)可以相互調(diào)用其他函數(shù)可以相互調(diào)用,但不能調(diào)用主函數(shù)。但不能調(diào)用主函數(shù)。 同一函數(shù)可以被一個(gè)或多個(gè)函數(shù)調(diào)用任意多次。同一函數(shù)可以被一個(gè)或多個(gè)函數(shù)調(diào)用任意多次。基本概念基本概念分類分類從用戶使用的角度看:從用戶使用的角度看:標(biāo)準(zhǔn)函數(shù)和用戶自定義函數(shù)標(biāo)準(zhǔn)函數(shù)和用戶自定義函數(shù)從函數(shù)的形式看:從函數(shù)的形式看:無參函數(shù)和有參函數(shù)無參函數(shù)和有參函數(shù)7(一)、(一)、舉例舉例(二)、(二)、函數(shù)的定義函數(shù)的定義8輸入兩個(gè)數(shù),輸出最大值。(判斷的兩個(gè)數(shù)的最大值用函數(shù))輸入兩個(gè)

4、數(shù),輸出最大值。(判斷的兩個(gè)數(shù)的最大值用函數(shù))void main()int max(int x,int y) ; /對(duì)對(duì)max函數(shù)進(jìn)行聲明函數(shù)進(jìn)行聲明int a,b,c;scanf(%d,%d,&a,&b); c=max(a,b); /調(diào)用調(diào)用max函數(shù)函數(shù) printf(The max is %d,c);int max(int x,int y) /以下為以下為max函數(shù)的定義函數(shù)的定義int z; if (xy) z=x; else z=y; return(z);9練習(xí):用函數(shù)調(diào)用的方式求解兩個(gè)數(shù)的差。10類型標(biāo)識(shí)符類型標(biāo)識(shí)符 函數(shù)名(函數(shù)名(形參列表形參列表 ) 聲明部分聲

5、明部分 語句部分語句部分函數(shù)首部函數(shù)首部函數(shù)體函數(shù)體格式格式11int max(int x,int y) /int:函數(shù)類型函數(shù)類型;max:函數(shù)名函數(shù)名; /int x,int y: 形參及其定義形參及其定義 int z; /聲明部分聲明部分,說明函數(shù)內(nèi)部用到的變量。說明函數(shù)內(nèi)部用到的變量。 if (xy) z=x; else z=y; return(z); /返回函數(shù)的結(jié)果返回函數(shù)的結(jié)果12函數(shù)參數(shù)函數(shù)參數(shù)形參與實(shí)參形參與實(shí)參形參形參:定義函數(shù)時(shí)函數(shù)名后面括號(hào)中的變量名:定義函數(shù)時(shí)函數(shù)名后面括號(hào)中的變量名實(shí)參實(shí)參:調(diào)用函數(shù)時(shí)函數(shù)名后面括號(hào)中的表達(dá)式:調(diào)用函數(shù)時(shí)函數(shù)名后面括號(hào)中的表達(dá)式 13

6、nvoid main()nnint max(int x,int y) ;nint a,b,c;nscanf(%d,%d,&a,&b);n c=max(a,b); /a,b為實(shí)參為實(shí)參n printf(The max is %d,c);nnint max(int x,int y) /x,y 為形參為形參nint z;n if (xy) z=x;n else z=y;n return(z);n14形參與實(shí)參、函數(shù)名與返回值之間的關(guān)系:形參與實(shí)參、函數(shù)名與返回值之間的關(guān)系: c=max(a, b); - 實(shí)參實(shí)參:在運(yùn)行時(shí) 把函數(shù)的 int max(int x,int y) 把值傳給

7、函數(shù)。 結(jié)果賦給 函數(shù)名 return (z); 形參形參:通知系統(tǒng) 要預(yù)留內(nèi)存位置。 15說明:說明:(1)形參在函數(shù)被調(diào)用前不占內(nèi)存;)形參在函數(shù)被調(diào)用前不占內(nèi)存; 函數(shù)調(diào)用時(shí)為形參分函數(shù)調(diào)用時(shí)為形參分配內(nèi)存;調(diào)用結(jié)束,釋放內(nèi)存。配內(nèi)存;調(diào)用結(jié)束,釋放內(nèi)存。(2)實(shí)參可以是常量、變量或表達(dá)式)實(shí)參可以是常量、變量或表達(dá)式,但必須有確定的值。但必須有確定的值。 (3)在被定義的函數(shù)中,必須指定形參的類型)在被定義的函數(shù)中,必須指定形參的類型 (4)形參與實(shí)參類型一致,個(gè)數(shù)相同)形參與實(shí)參類型一致,個(gè)數(shù)相同 (5)實(shí)參對(duì)形參進(jìn)行)實(shí)參對(duì)形參進(jìn)行單向單向“值傳遞值傳遞” ,不能把形參的值反,不能

8、把形參的值反向地傳送給實(shí)參。形參與實(shí)參占用向地傳送給實(shí)參。形參與實(shí)參占用不同不同的內(nèi)存單元的內(nèi)存單元. 假設(shè):假設(shè):a,b 為實(shí)際參數(shù);為實(shí)際參數(shù);x,y為形式參數(shù)為形式參數(shù)16 假設(shè):假設(shè):a,b 為實(shí)際參數(shù);為實(shí)際參數(shù);x,y為形式參數(shù)為形式參數(shù)(6)在函數(shù)調(diào)用過程中,形參的值發(fā)生改變,并不改變)在函數(shù)調(diào)用過程中,形參的值發(fā)生改變,并不改變實(shí)參中的值。實(shí)參中的值。 17#include stdio.hmain() int n; int s(int n1); printf(input numbern); scanf(%d,&n); s(n); printf(n=%dn,n);int

9、s(int n1) int i; for(i=n1-1;i=1;i-) n1=n1+i; printf(n1=%dn,n1);實(shí)參未變舉例實(shí)參未變舉例18函數(shù)的返回值函數(shù)的返回值形式:形式: return (return (表達(dá)式表達(dá)式) ); 或或 return return 表達(dá)式表達(dá)式 ; ;19#includestdio.hmain()int max(int x,int y);int a,b,c;scanf(%d,%d,&a,&b); c=max(a,b); printf(The max is %d,c);int max(int x,int y)int z; if (x

10、y) z=x; else z=y; return(x); /返回的是哪一個(gè)變量的值呢?返回的是哪一個(gè)變量的值呢? return(z);1)函數(shù)中可有多個(gè)函數(shù)中可有多個(gè)return語句語句202)若函數(shù)類型與若函數(shù)類型與return語句中表達(dá)式值的類型不語句中表達(dá)式值的類型不一致,自動(dòng)轉(zhuǎn)換為函數(shù)類型一致,自動(dòng)轉(zhuǎn)換為函數(shù)類型-函數(shù)調(diào)用轉(zhuǎn)換函數(shù)調(diào)用轉(zhuǎn)換#includestdio.hmain()int max(float x,float y);float a,b;int c;scanf(%f,%f,&a,&b); c=max(a,b); printf(The max is %d,c);

11、int max(float x,float y)float z; if (xy) z=x; else z=y; return(z); 21n建議:建議:n1)定義函數(shù)時(shí)都要指定函數(shù)類型。)定義函數(shù)時(shí)都要指定函數(shù)類型。n2)定義函數(shù)時(shí)指定的函數(shù)類型與)定義函數(shù)時(shí)指定的函數(shù)類型與return 返回返回值的類型一致。值的類型一致。n3)對(duì)于不帶回值的函數(shù),用)對(duì)于不帶回值的函數(shù),用void 定義為空類定義為空類型,此時(shí)函數(shù)體內(nèi)不能出現(xiàn)型,此時(shí)函數(shù)體內(nèi)不能出現(xiàn)return語句。語句。22格式格式函數(shù)名(實(shí)參列表函數(shù)名(實(shí)參列表 )對(duì)無參函數(shù)調(diào)用時(shí)則無實(shí)際參數(shù)表。對(duì)無參函數(shù)調(diào)用時(shí)則無實(shí)際參數(shù)表。實(shí)際參數(shù)

12、表中的參數(shù)可以是常數(shù),變量或其它實(shí)際參數(shù)表中的參數(shù)可以是常數(shù),變量或其它 構(gòu)造類型數(shù)據(jù)及表達(dá)式。構(gòu)造類型數(shù)據(jù)及表達(dá)式。各各實(shí)參之間用逗號(hào)分隔實(shí)參之間用逗號(hào)分隔。23函數(shù)調(diào)用的方式函數(shù)調(diào)用的方式1 1。函數(shù)語句函數(shù)語句 printstar()printstar(); printf();printf();2 2。函數(shù)表達(dá)式函數(shù)表達(dá)式 c=4+max(a,b)c=4+max(a,b) 3 3。函數(shù)實(shí)參函數(shù)實(shí)參 printf(%d,max(a,b);printf(%d,max(a,b); m=max(a,max(b,c); m=max(a,max(b,c);24main()int a,b,c; c=m

13、ax(a,b); printf(“The max is %d”,c);函數(shù)調(diào)用函數(shù)調(diào)用main()int a,b,c;printf(“The max is %d”, max(a,b);函數(shù)作為另一個(gè)函數(shù)作為另一個(gè)函數(shù)調(diào)用的實(shí)參函數(shù)調(diào)用的實(shí)參出現(xiàn)。出現(xiàn)。25對(duì)被調(diào)用函數(shù)的聲明和函數(shù)原型對(duì)被調(diào)用函數(shù)的聲明和函數(shù)原型標(biāo)準(zhǔn)函數(shù)標(biāo)準(zhǔn)函數(shù)函數(shù)外使用函數(shù)外使用#include調(diào)用有關(guān)庫函數(shù)。調(diào)用有關(guān)庫函數(shù)。#include #include 26用戶自定義函數(shù)用戶自定義函數(shù)1。當(dāng)函數(shù)定義出現(xiàn)。當(dāng)函數(shù)定義出現(xiàn)在函數(shù)調(diào)用之后時(shí),在函數(shù)調(diào)用之后時(shí),在主調(diào)函數(shù)中,采用在主調(diào)函數(shù)中,采用函數(shù)原型函數(shù)原型對(duì)被調(diào)用函對(duì)被

14、調(diào)用函數(shù)進(jìn)行聲明。數(shù)進(jìn)行聲明。#include stdio.hvoid main() float add(float x,float y);/函數(shù)聲明函數(shù)聲明 float a,b,c; scanf(%f,%f,&a,&b); c=add(a,b); printf(sum is %f,c); float add(float x,float y) /函數(shù)定義函數(shù)定義float z;z=x+y;return(z);27在以下情況下可省去在主調(diào)函數(shù)中對(duì)被調(diào)函數(shù)聲明。在以下情況下可省去在主調(diào)函數(shù)中對(duì)被調(diào)函數(shù)聲明。1) 函數(shù)定義出現(xiàn)在函數(shù)調(diào)用之前函數(shù)定義出現(xiàn)在函數(shù)調(diào)用之前char str(

15、int a) main() 28 char str(int a); float f(float b); main() char str(int a) float f(float b) 2) 在所有函數(shù)定義之前,在函數(shù)外預(yù)先說明了各個(gè)函數(shù)的類型在所有函數(shù)定義之前,在函數(shù)外預(yù)先說明了各個(gè)函數(shù)的類型29例例編程求:編程求:C(m,n)=m!/(n!*(m-n)!) (mn)main()float c; int m,n; float fac(int x);/函數(shù)聲明函數(shù)聲明 printf(input m,n:); scanf(%d%d,&m,&n); c=fac(m)/(fac(n)*

16、fac(m-n); /函數(shù)的調(diào)用函數(shù)的調(diào)用 printf(The result is %8.1f,c);float fac(int x)/函數(shù)的定義函數(shù)的定義int i; float t=1; for (i=1;iy?x:y; return(rz?r:z); int min(int x,int y,int z) int r1,r2; r1=xy?x:y; r2=r1y?x:y; return(r); int min(int x,int y) int r; r=xy?x:y; return(r); 35 在調(diào)用一個(gè)函數(shù)的過程中又出現(xiàn)直接或間接地調(diào)用該函數(shù)本在調(diào)用一個(gè)函數(shù)的過程中又出現(xiàn)直接或間接地

17、調(diào)用該函數(shù)本身,稱為函數(shù)的身,稱為函數(shù)的遞歸調(diào)用。遞歸調(diào)用。例如: 有函數(shù)f如下: int f(int x) int y; z=f(y); return z;n 這個(gè)函數(shù)是一個(gè)遞歸函數(shù)。這個(gè)函數(shù)是一個(gè)遞歸函數(shù)。n 該函數(shù)將無休止地調(diào)用其自身。該函數(shù)將無休止地調(diào)用其自身。n 可以用可以用if語句來控制。語句來控制。36float fac(int x)float f;if(x0)printf(n1) 報(bào)錯(cuò) (n0)37nfloat fac(int x)/函數(shù)的定義函數(shù)的定義nint i;n float t=1;n for (i=1;i=x;i+)n t=t*i;n return(t);n遞推法求階

18、乘38n練習(xí):n小王問他的爺爺多大歲數(shù)?爺爺說我比你父親的歲數(shù)的二倍大6,你父親的歲數(shù)是你的歲數(shù)的2倍還大6,小王今年12歲,問爺爺多少歲? 編程求解。39#include stdio.hint age (int n)int c;if (n=1) c=12;else c=2*age(n-1)+6;return(c);void main() printf(%d,age(3); 方法1:使用函數(shù)的遞歸調(diào)用40方法2:使用數(shù)組n#include stdio.hnvoid main()nn int a3,i;n a0=12;n for (i=1;i3;i+)n ai=ai-1*2+6;n for (i

19、=0;i3;i+)n printf(%d ,ai) ;n41數(shù)組元素作函數(shù)實(shí)參數(shù)組元素作函數(shù)實(shí)參v值傳遞值傳遞數(shù)組名作函數(shù)參數(shù)數(shù)組名作函數(shù)參數(shù)v地址傳遞地址傳遞v在主調(diào)函數(shù)與被調(diào)函數(shù)分別定義數(shù)組在主調(diào)函數(shù)與被調(diào)函數(shù)分別定義數(shù)組, ,且類型應(yīng)一致且類型應(yīng)一致v形參數(shù)組大小形參數(shù)組大小( (二維數(shù)組的第一維二維數(shù)組的第一維) )可不指定可不指定v形參數(shù)組名是形參數(shù)組名是地址變量地址變量42例例 數(shù)組元素與數(shù)組名數(shù)組元素與數(shù)組名 作函數(shù)參數(shù)比較作函數(shù)參數(shù)比較(數(shù)組元素?cái)?shù)組元素作為參數(shù))作為參數(shù))void swap( int x,int y ) int z; z=x; x=y; y=z;main( )

20、 int a2=1,2; swap(a0,a1); printf(a0=%dna1=%dn,a0,a1);值傳遞值傳遞12a調(diào)用前a0a112a調(diào)用a0a112xy21xy交換12a返回43例例 數(shù)組元素與數(shù)組名數(shù)組元素與數(shù)組名 作函數(shù)參數(shù)比較作函數(shù)參數(shù)比較(數(shù)組名數(shù)組名作為參數(shù))作為參數(shù))void swap( int x ) int z; z=x0; x0=x1; x1=z;main( ) int a2=1,2; swap(a); printf(a0=%dna1=%dn,a0,a1);地址傳遞地址傳遞12a調(diào)用前12ax調(diào)用21ax交換21a返回44例例 (數(shù)組名數(shù)組名作函數(shù)參數(shù))求學(xué)生的平

21、均成績(jī)作函數(shù)參數(shù))求學(xué)生的平均成績(jī) #include float average(int stu10, int n); void main() int score10, i; float av; printf(Input 10 scores:n); for( i=0; i10; i+ ) scanf(%d, &scorei); av=average(score,10); printf(Average is:%.2f, av); float average(int stu10, int n) int i; float av,total=0; for( i=0; in; i+ ) tota

22、l += stui; av = total/n; return av; int stu .2109score562312.88stu45局部變量l定義:定義:在函數(shù)內(nèi)定義,只在本函數(shù)內(nèi)有效在函數(shù)內(nèi)定義,只在本函數(shù)內(nèi)有效l說明:說明:umainmain中定義的變量只在中定義的變量只在mainmain中有效中有效u不同函數(shù)中同名變量,占不同內(nèi)存單元不同函數(shù)中同名變量,占不同內(nèi)存單元u形參屬于局部變量形參屬于局部變量全局變量-外部變量l定義:定義:在函數(shù)外定義的變量在函數(shù)外定義的變量l有效范圍:從定義變量的位置開始到本源文件結(jié)束有效范圍:從定義變量的位置開始到本源文件結(jié)束l應(yīng)盡量少使用全局變量應(yīng)盡量

23、少使用全局變量46float f1(int a) int b,c; .char f2(int x,int y) int i,j; main() int m,n; .a,b,cx,y,i,jm,nint p=1,q=5;float f1(int a) int b,c; .int f3 ( ).char c1,c2;char f2(int x,int y) int i,j; main ( ) int m,n; .c1,c2的作用范圍的作用范圍p,q的作用范圍的作用范圍局部變量局部變量全局變量全局變量47例例1 1 不同函數(shù)中同名變量不同函數(shù)中同名變量( (局部變量)局部變量)main( )int

24、a,b; a=3; b=4; printf(main:a=%d,b=%dn,a,b); sub(); printf(main:a=%d,b=%dn,a,b);sub( ) int a,b; a=6; b=7; printf(sub:a=%d,b=%dn,a,b);運(yùn)行結(jié)果:運(yùn)行結(jié)果:main:a=3,b=4sub:a=6,b=7main:a=3,b=448main() int i=2,j=3,k; k=i+j; int k=8; printf(k1=%dn,k); printf(k=%dn,k);例例2 復(fù)合語句中可以聲明同名變量(局部變量)復(fù)合語句中可以聲明同名變量(局部變量)49靜態(tài)變量v

25、oid main() int f(int n); int a=2, i; for (i=0;i3;i+) printf(“%d”,f(a); int f(int a) auto int b=0; static int c=3; b=b+1; c=c+1; return(a+b+c);7 8 950寄存器變量n為了提高效率,C語言允許將局部變量得值放在CPU中的寄存器中,這種變量叫“寄存器變量”,用關(guān)鍵字register作聲明。nint fac(int n)nregister int i,f=1;n for(i=1;i=n;i+)nf=f*in return(f);nn說明:n只有局部自動(dòng)變量和形式參數(shù)可以作為寄存器變量;n一個(gè)計(jì)算機(jī)系統(tǒng)中的寄存器數(shù)目有限,不能定義任意多個(gè)寄存器變量;n局部靜態(tài)變量不能定義為寄存器變量。main()int i; for(i=0;i=5;i+) printf(%d!=%dn,i,fac(i);51作業(yè):n8.1,8.2,8.1152n練習(xí):求兩個(gè)數(shù)的階乘和。n要求:用三個(gè)函數(shù):主函數(shù),求和函數(shù),求階乘函數(shù)。53#include stdio.hvoid main()/求兩數(shù)階乘的和int m,n, c;int fac(int x);int add(int a,int b);/函數(shù)聲明 printf(input m,

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論