山西財(cái)經(jīng)大學(xué)華商學(xué)院《C語(yǔ)言程序設(shè)計(jì)》課件第7章函數(shù)的課件_第1頁(yè)
山西財(cái)經(jīng)大學(xué)華商學(xué)院《C語(yǔ)言程序設(shè)計(jì)》課件第7章函數(shù)的課件_第2頁(yè)
山西財(cái)經(jīng)大學(xué)華商學(xué)院《C語(yǔ)言程序設(shè)計(jì)》課件第7章函數(shù)的課件_第3頁(yè)
山西財(cái)經(jīng)大學(xué)華商學(xué)院《C語(yǔ)言程序設(shè)計(jì)》課件第7章函數(shù)的課件_第4頁(yè)
山西財(cái)經(jīng)大學(xué)華商學(xué)院《C語(yǔ)言程序設(shè)計(jì)》課件第7章函數(shù)的課件_第5頁(yè)
已閱讀5頁(yè),還剩47頁(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、第7章 函數(shù)山西財(cái)經(jīng)大學(xué)華商學(xué)院C語(yǔ)言程序設(shè)計(jì)函數(shù)概述函數(shù)定義的一般形式函數(shù)的調(diào)用、參數(shù)和返回值局部變量和全局變量變量的存儲(chǔ)類(lèi)型內(nèi)部函數(shù)和外部函數(shù)概述C程序源程序文件n函數(shù)1函數(shù)m 源程序文件1函數(shù)1函數(shù)nC語(yǔ)言用函數(shù)實(shí)現(xiàn)程序模塊化一個(gè)源程序文件由一個(gè)或多個(gè)函數(shù)組成;一個(gè)程序由一個(gè)或多個(gè)源程序文件組成C程序的執(zhí)行從main函數(shù)開(kāi)始,并回到main函數(shù)結(jié)束函數(shù)之間可以相互調(diào)用,或調(diào)用自身不能調(diào)用main函數(shù)函數(shù)之間相互獨(dú)立,不存在從屬關(guān)系【例】求一個(gè)整數(shù)的立方int cube (int x) /* 函數(shù)定義 */ return (x * x * x); main( ) int f, a; pri

2、ntf(nEnter an integer number:); scanf(%d, &a); f = cube (a); printf(%d * %d * %d = %dn, a, a, a, f);程序運(yùn)行情況如下:Enter an integer number:22 * 2 * 2 = 8函數(shù)調(diào)用程序的執(zhí)行總是從main函數(shù)開(kāi)始 函數(shù)的種類(lèi)從函數(shù)定義形式分: 有參函數(shù):int cube (int x) 無(wú)參函數(shù):如 getchar( )從使用的角度看: 標(biāo)準(zhǔn)函數(shù)(庫(kù)函數(shù)) 用戶自定義函數(shù)。7.2.1 函數(shù)的定義函數(shù)定義的一般形式函數(shù)類(lèi)型 函數(shù)名(形式參數(shù)表列) 聲明部分 語(yǔ)句返回類(lèi)型、參數(shù)

3、、函數(shù)體內(nèi)容都可沒(méi)有dummy()/* does nothing & returns nothing */關(guān)于“聲明部分”指變量、函數(shù)的聲明函數(shù)定義形式的說(shuō)明關(guān)于“函數(shù)類(lèi)型”指函數(shù)返回值的類(lèi)型若省略此項(xiàng),則認(rèn)為返回類(lèi)型是int若無(wú)返回值,則定義返回類(lèi)型為void例如:求兩個(gè)數(shù)的最大值。 int max(int x,int y) int z; z = x y ? x : y; return( z );類(lèi)型省略時(shí)默認(rèn)為int類(lèi)型int max(x,y)int x,y; int z; z = x y ? x : y; return( z );int max(x,y) int x,y;或int max

4、(int x,y) 或int max(x,y)int x,y,z; z = x y ? x : y; return( z );形參也可以這樣定義如下定義都是錯(cuò)誤的 形參定義格式:類(lèi)型 形參名, 類(lèi)型 形參名, .int max(int x,int y) 函數(shù)名(實(shí)參表列)在C語(yǔ)言中,把函數(shù)調(diào)用也作為一個(gè)表達(dá)式。因此凡是表達(dá)式可以出現(xiàn)的地方都可以出現(xiàn)函數(shù)調(diào)用。例如: welcome( ); if (iabs (a)max) max=iabs(a); m=max(c,max(a,b);7.2.2 函數(shù)的調(diào)用函數(shù)調(diào)用的一般形式:int sum ( ) int i,t=0; for (i=1; i=1

5、00; i+) t+=i; return (t);main( ) int s; s=sum ( ); printf(%dn, s);程序輸出結(jié)果:5050int sum ( int x ) int i,t=0; for (i=1; i=x; i+) t+=i; return (t);main( ) int s; s=sum (100); printf(%dn, s); 【例】求1100的累加和。思考:兩個(gè)程序有何不同程序輸出結(jié)果:5050?void swap(int x, int y) int z; z=x; x=y; y=z; printf(nx=%d,y=%d,x ,y);main( )

6、int a= 10,b=20; swap(a,b); printf(na=%d,b=%dn,a,b);7.2.3 函數(shù)參數(shù)與函數(shù)的返回值1函數(shù)的形式參數(shù)與實(shí)際參數(shù)程序輸出結(jié)果:x=20,y=10a=10,b=20形式參數(shù)(形參)實(shí)際參數(shù)(實(shí)參)【例】編一程序,將主函數(shù)中的兩個(gè)變量的值傳遞給swap函數(shù)中的兩個(gè)形參,交換兩個(gè)形參的值。單向值傳遞有關(guān)形參和實(shí)參的說(shuō)明: 說(shuō)明:實(shí)參必須有確定的值形參必須指定類(lèi)型形參與實(shí)參類(lèi)型一致,個(gè)數(shù)相同若形參與實(shí)參類(lèi)型不一致,自動(dòng)按形參類(lèi)型轉(zhuǎn)換函數(shù)調(diào)用轉(zhuǎn)換形參在函數(shù)被調(diào)用前不占內(nèi)存;函數(shù)調(diào)用時(shí)為形參分配內(nèi)存;調(diào)用結(jié)束,內(nèi)存釋放“單向值傳遞”return語(yǔ)句形式形式

7、一:return (表達(dá)式);形式二:return 表達(dá)式;功能函數(shù)返回語(yǔ)句結(jié)束函數(shù)調(diào)用如果需要,還可以帶回函數(shù)返回值函數(shù)的返回值說(shuō)明函數(shù)返回值的類(lèi)型在函數(shù)定義中指定函數(shù)返回值通過(guò)函數(shù)中的return語(yǔ)句獲得return語(yǔ)句后的表達(dá)式類(lèi)型,與函數(shù)返回值類(lèi)型不同時(shí),自動(dòng)做按函數(shù)類(lèi)型轉(zhuǎn)換函數(shù)需要返回值時(shí),若缺少return語(yǔ)句,或return語(yǔ)句未帶返回值,則返回一個(gè)不確定值為明確表示不帶回值,用void定義無(wú)類(lèi)型。系統(tǒng)保證不使函數(shù)帶回任何值。【例】計(jì)算并輸出圓的面積。s(int r) return 3.14*r*r;main( ) int r,area; scanf(%d,&r); printf

8、(%dn,s(r);自動(dòng)轉(zhuǎn)換為int型 程序運(yùn)行情況如下:212函數(shù)聲明的一般形式如下:類(lèi)型名 函數(shù)名(類(lèi)型1 形參1,類(lèi)型2 形參2,類(lèi)型n 形參n);或類(lèi)型名 函數(shù)名(類(lèi)型1,類(lèi)型2,類(lèi)型n);或類(lèi)型名 函數(shù)名();函數(shù)聲明是以語(yǔ)句形式出現(xiàn)的,因此其后有語(yǔ)句結(jié)束標(biāo)記“;”若函數(shù)定義放在主調(diào)函數(shù)之前,遵循先定義后調(diào)用原則,函數(shù)聲明可以省略。庫(kù)函數(shù)的聲明包括在頭文件(*.h)里,不需聲明對(duì)被調(diào)函數(shù)的聲明和函數(shù)原型允許整型函數(shù)(且參數(shù)也是整型)的定義出現(xiàn)在主調(diào)函數(shù)之后。如max函數(shù):如果非整型函數(shù)在主調(diào)函數(shù)之后定義,則應(yīng)在主調(diào)函數(shù)中或主調(diào)函數(shù)之前對(duì)被調(diào)函數(shù)進(jìn)行聲明。void swap(int x

9、, int y) main( ) swap(a,b); main( ) c=max(a,b);max(int x,int y) 函數(shù)聲明被調(diào)函數(shù)出現(xiàn)在主調(diào)函數(shù)之前,不必函數(shù)說(shuō)明int型函數(shù)可不作函數(shù)說(shuō)明 例 函數(shù)聲明舉例#include foat max(float x, float y);main() float a,b; int c; scanf(%f,%f,&a,&b); c=max(a,b); printf(Max is %dn,c);foat max(float x, float y) float z; z=xy?x:y; return(z);在函數(shù)外面做了聲明, 所有調(diào)用函數(shù)不必再

10、聲明main() float add(float,float); /*function declaration*/ float a,b,c; scanf(%f,%f,&a,&b); c=add(a,b); printf(sum is %f,c);float add(float x, float y) float z; z=x+y; return(z);float add();一維數(shù)組名作函數(shù)參數(shù)數(shù)組名表示數(shù)組在內(nèi)存中的起始地址。 例如:數(shù)組a在內(nèi)存中從2000地址開(kāi)始存放,則a的值為2000。2000是地址值,是指針類(lèi)型的數(shù)據(jù),不能把它看成是整型或其他類(lèi)型數(shù)據(jù)。實(shí)參是數(shù)組名,形參也應(yīng)定義為數(shù)組

11、形式,形參數(shù)組的長(zhǎng)度可以省略,但 不能省,否則就不是數(shù)組形式了。void sort(int b ,int n); void printarr(int b ); main( ) int a10 = 11,22,63,97,58,80,45, 32,73,36; printf(Before sort:n); printarr(a); sort(a,10); printf(After sort:n); printarr(a);void printarr(int b10) int i; for (i=0; i10; i+) printf(%5d,bi); printf(n);void sort(int

12、 b , int n) int i,j,t; for (i=1; in; i+) for (j=0; jbj+1) t=bj;bj=bj+1;bj+1=t; 用冒泡法將10個(gè)整數(shù)排序 a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 b0 b1 b2 b3 b4 b5 b6 b7 b8 b911 22 63 97 58 80 45 32 73 36(a) 排序前a0 a1 a2 a3 a4 a5 a6 a7 a8 a9b0 b1 b2 b3 b4 b5 b6 b7 b8 b911 22 32 36 45 58 63 73 80 97(b) 排序后圖8.3 調(diào)用sort函數(shù)2000b形

13、參 b 實(shí)際是一個(gè)可以存放地址的變量a:2000實(shí)參賦給形參首地址: 2000首地址: 2000函數(shù)的遞歸調(diào)用1遞歸的基本概念遞歸調(diào)用:一個(gè)函數(shù)直接或間接地調(diào)用了它本身,就稱(chēng)為函數(shù)的遞歸調(diào)用。遞歸函數(shù):在函數(shù)體內(nèi)調(diào)用該函數(shù)本身。int sub(int x) int y,z; if( ) z=sub(y); else return ;例如:直接調(diào)用sub函數(shù)本身2遞歸函數(shù)的執(zhí)行過(guò)程【例】編一遞歸函數(shù)求n!。思路:以求4的階乘為例:4!=4*3!,3!=3*2!,2!=2*1!,1!=1,0!=1。遞歸結(jié)束條件:當(dāng)n=1或n=0時(shí),n!=1。遞歸公式:n! =1 (n=0, 1)n(n-1)! (

14、n1)遞歸調(diào)用過(guò)程 回 推main( ) fact(4) fact(3) fact(2) fact(1) y=fact(4); f=4*fact(3); f=3*fact(2); f=2*fact(1); f=1; return 24 return 6 return 2 return 1 遞 推 3編制遞歸函數(shù)的方法對(duì)于數(shù)值型問(wèn)題,首先要找出解題的數(shù)學(xué)公式,這個(gè)公式必須是遞歸定義的,且所處理的對(duì)象要有規(guī)律地遞增或遞減,然后確定遞歸結(jié)束條件?!纠烤幰贿f歸函數(shù)求xn 。思路:首先把xn轉(zhuǎn)化成遞歸定義的公式xn =1 (n=0)x xn - 1 (n0)再找出遞歸結(jié)束條件:當(dāng)n=0時(shí),xn=1。程

15、序如下:long xn(int x,int n) long f=0; if (n0) printf(n0,data error!n); else if (n=0) f=1; else f=x*xn(x,n-1); return (f);main( ) int n,x; long y; scanf(%d,%d,&x,&n); y=xn(x,n); printf(%ldn,y);程序運(yùn)行情況如下:2,101024局部變量和全局變量在一個(gè)函數(shù)內(nèi)部定義的變量稱(chēng)為局部變量。 局部變量的有效范圍是所在定義的函數(shù)內(nèi)。float f1(int a)int b , c; char f2(int x, int y

16、) int b ,c ; a,b,c的有效范圍x , y ,b,c的有效范圍main()int m,n; m , n的有效范圍說(shuō)明:1、主函數(shù)中定義的變量也屬于局部變量。2、不同函數(shù)中可以使用相同名字的變量,在內(nèi)存中占有不同的存儲(chǔ)單元。例如上面的函數(shù) f1 和 f2中均使用局部變量 b 和c 。3、形參也是局部變量。4、在一個(gè)函數(shù)內(nèi)部,也可以在復(fù)合語(yǔ)句中定義變量,這些變量只能在本復(fù)合語(yǔ)句中有效,這種復(fù)合語(yǔ)句稱(chēng)為“分程序”或“程序塊”。例如: main() int a ,b ; . int c; c=a+b; . . C的有效范圍a ,b的有效范圍例 不同函數(shù)中同名變量main() int a,

17、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);例 不同函數(shù)中同名變量main() int 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é)果:main:a=3,b=4s

18、ub:a=6,b=7main:a=3,b=4地址地址3467函數(shù)main中的變量a,b的存儲(chǔ)單元20002050abba31003500函數(shù)sub中的變量a,b的存儲(chǔ)單元地址地址二、全局變量 定義在函數(shù)外部的變量稱(chēng)為全局變量,全局變量可以為本文件中其它函數(shù)所使用。它的有效范圍為從定義變量的位置開(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 i ,j ; . main() int m ,n ; 全局變量p、q有效范圍全局變量c1,c2有效范圍變量 p、q、c1、c2都是全

19、局變量,但是它們的作用范圍是不同的。全局變量也稱(chēng)為外部變量,通常定義中全局變量的變量名的第一個(gè)字母大寫(xiě),便于識(shí)別。float Max,Min;float average(float array, int n) int i; float sum=array0; Max=Min=array0; for(i=1;iMax) Max=arrayi; else if(arrayib?a:b; return(c);main() int a=8; printf(max=%d,max(a,b);運(yùn)行結(jié)果:max=8如果在同一個(gè)源文件中,外部變量與局部變量同名,則在局部變量的作用范圍內(nèi),外部變量被“屏蔽”,即不

20、起作用。變量的存儲(chǔ)類(lèi)型 一、動(dòng)態(tài)存儲(chǔ)方式與靜態(tài)存儲(chǔ)方式每一個(gè)變量從它的作用域角度來(lái)分:全局變量和局部變量。下面我們考慮變量在內(nèi)存中的存儲(chǔ)情況:C語(yǔ)言把用戶使用的內(nèi)存分為三部分(如圖):即1、程序區(qū)2、靜態(tài)存儲(chǔ)區(qū)3、動(dòng)態(tài)存儲(chǔ)區(qū)程序區(qū)靜態(tài)存儲(chǔ)區(qū)動(dòng)態(tài)存儲(chǔ)區(qū)用戶區(qū)內(nèi)存變量的存儲(chǔ)區(qū)靜態(tài)區(qū)中變量是源程序編譯時(shí)分配單元的,程序執(zhí)行完畢才釋放動(dòng)態(tài)區(qū)中變量是程序執(zhí)行過(guò)程中分配單元的,程序執(zhí)行過(guò)程中釋放二、變量的存儲(chǔ)類(lèi)別從全局變量、局部變量出發(fā)來(lái)考慮。C語(yǔ)言中規(guī)定所有的全局變量都放在靜態(tài)存儲(chǔ)區(qū)中 對(duì)局部變量分以下幾種情況來(lái)處理: 局部變量: 1、auto 變量 (自動(dòng)變量)2、static 變量 (靜態(tài)局部變量)

21、3、register 變量(寄存器變量)1、auto 變量 (自動(dòng)變量)所有未聲明為static存儲(chǔ)類(lèi)別的函數(shù)中的局部變量,就是auto變量。auto類(lèi)別變量是動(dòng)態(tài)的分配存儲(chǔ)空間,數(shù)據(jù)存儲(chǔ)在動(dòng)態(tài)存儲(chǔ)區(qū)中。 自動(dòng)變量使用關(guān)鍵字auto(可以省略)作存儲(chǔ)類(lèi)別聲明。例如: int f(int a) int f(int a) auto int b , c=3; int b ,c=3; a,b,c都是auto類(lèi)型變量,這類(lèi)變量是在調(diào)用該函數(shù)時(shí)系統(tǒng)會(huì)給它們分配存儲(chǔ)空間,在函數(shù)調(diào)用結(jié)束時(shí)就釋放這些存儲(chǔ)空間。因此稱(chēng)為自動(dòng)變量。2、用static聲明局部變量 (靜態(tài)局部變量) 用static聲明的局部變量稱(chēng)為靜

22、態(tài)局部變量,特點(diǎn)是變量存儲(chǔ)在靜態(tài)存儲(chǔ)區(qū)中,函數(shù)編譯時(shí)賦初值,函數(shù)調(diào)用結(jié)束后不釋放存儲(chǔ)單元,其值作為下次調(diào)用的初始值。靜態(tài)局部變量用關(guān)鍵字static聲明。例如: f(int a) main() auto int b=0; int a=2, i ; static int c=3; for(i=0;i3;i+) b=b+1; printf(“%d”,f(a); c=c+1; return(a+b+c); 運(yùn)行結(jié)果: 7 8 93、register 變量(寄存器變量)只有函數(shù)內(nèi)定義的變量或形參可以定義為寄存器變量。凡是聲明為register類(lèi)別的變量 ,不是保存在內(nèi)存中,而是保存在CPU中的寄存器中

23、。聲明方式如下: int fac( int n) main() register int i, f=1; int i; for(i=1;i=n;i+) for(i=1; iy?x:y; return(z);main() extern int a,b; printf(max=%d,max(a,b);int a=13,b=-8;extern a,b;int max() int z; z=ab?a:b; return(z);main() printf(max=%d,max();int a=13,b=-8;A、變量的存儲(chǔ)方式小節(jié)程序區(qū)靜態(tài)存儲(chǔ)區(qū)動(dòng)態(tài)存儲(chǔ)區(qū)全局變量、靜態(tài)局部變量 形參變量 局部動(dòng)態(tài)變量(

24、auto) 全局變量(定義在函數(shù)外部): 有效范圍是從定義處開(kāi)始到文件結(jié)束。局部變量(定義在函數(shù)內(nèi)部): 有效范圍是在所定義的函數(shù)內(nèi)。B、變量的作用范圍小節(jié)C、變量的聲明方式小節(jié)auto 類(lèi)型符 變量名 是自動(dòng)變量(局部變量)static 類(lèi)型符 變量名 register 類(lèi)型符 變量名 聲明為寄存器局部變量 extern 變量名 聲明外部變量,擴(kuò)展作用域聲明靜態(tài)的局部變量聲明靜態(tài)的外部變量(只限于本文件使用)D、變量存在的時(shí)間小節(jié)全局變量(外部變量):在程序的整個(gè)運(yùn)行期間。靜態(tài)局部變量(用static聲明的局部變量): 在程序的整個(gè)運(yùn)行期間。自動(dòng)變量(未用static聲明的局部變量): 從函

25、數(shù)調(diào)用到該函數(shù)結(jié)束。 寄存器變量:屬于自動(dòng)變量。靜態(tài)動(dòng)態(tài)存儲(chǔ)方式程序整個(gè)運(yùn)行期間函數(shù)調(diào)用開(kāi)始至結(jié)束生存期編譯時(shí)賦初值,只賦一次每次函數(shù)調(diào)用時(shí)賦初值自動(dòng)賦初值0或空字符不確定未賦初值靜態(tài)存儲(chǔ)區(qū)動(dòng)態(tài)區(qū)存儲(chǔ)區(qū)寄存器局部變量外部變量作用域定義變量的函數(shù)或復(fù)合語(yǔ)句內(nèi)本文件其它文件局部變量默認(rèn)為auto型局部static變量具有可繼承性extern不是變量定義,可擴(kuò)展外部變量作用域register局部staticauto外部static外部存儲(chǔ)類(lèi)別變量存儲(chǔ)類(lèi)型例 auto 變量的作用域main() int x=1; void prt(void); int x=3; prt(); printf(“2nd x=%dn”,x); printf(“1st x=%dn”,x);void prt(void) int x=5; printf(“3th x=%dn”,x);運(yùn)行結(jié)果:3th x=52nd x=31st x=1x=1作用域x=1作用域x=3作用域x=5作用域main() void increment(void); increment(); increment(); increment();void increment(void) int x=0; x+; printf(“%dn”,x);例 局部靜態(tài)變量值具有可繼承性main() void increment(v

溫馨提示

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