函數(shù)與宏定義市公開課獲獎?wù)n件_第1頁
函數(shù)與宏定義市公開課獲獎?wù)n件_第2頁
函數(shù)與宏定義市公開課獲獎?wù)n件_第3頁
函數(shù)與宏定義市公開課獲獎?wù)n件_第4頁
函數(shù)與宏定義市公開課獲獎?wù)n件_第5頁
已閱讀5頁,還剩44頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第六章 函數(shù)與宏定義 6.1 函數(shù)概念 6.2 變量作用域和存儲類型 6.3 內(nèi)部函數(shù)與外部函數(shù) 6.4 遞歸函數(shù)設(shè)計和調(diào)用 6.6 綜合范例 10/10/1第1頁第1頁6.1 函數(shù)概念 C語言允許把問題設(shè)計成一個一個模塊,程序通過調(diào)用模塊功效來處理問題。這些模塊通常都是通過函數(shù)來實現(xiàn),又可稱其為函數(shù)模塊。 C語言中,函數(shù)可分為兩類 :一類是由系統(tǒng)定義原則函數(shù),又稱為庫函數(shù),其函數(shù)申明普通是放在系統(tǒng)include目錄下以.h為后綴頭文獻中,如在程序中要用到某個庫函數(shù),必須在調(diào)用該函數(shù)之前用#include命令將庫函數(shù)信息包括到本程序中。另一類函數(shù)是自定義函數(shù) ,兩種形式: 第一個:函數(shù)申明、函

2、數(shù)調(diào)用、函數(shù)定義。第二種:函數(shù)定義、函數(shù)調(diào)用。10/10/2第2頁第2頁 6.1.1 函數(shù)定義 函數(shù)定義普通形式能夠有兩種。形式一: 存儲類型符 返回值類型符 函數(shù)名(形參闡明表) 函數(shù)語句體 形式二: 存儲類型符 返回值類型型符 函數(shù)名(形參表) 形參闡明; 函數(shù)語句體 10/10/3第3頁第3頁闡明: 1存儲類型符指是函數(shù)作用范圍,它只有兩種形式:static和extern。 static闡明函數(shù)只能作用于其所在源文獻,用static闡明函數(shù)又稱為內(nèi)部函數(shù)。extern闡明函數(shù)可被其它源文獻中函數(shù)調(diào)用,用extern闡明函數(shù),又稱為外部函數(shù)。缺省情況為extern。 2返回值類型符指是函數(shù)

3、體語句執(zhí)行完畢后,函數(shù)返回值類型,如int, float, char等等,若函數(shù)無返回值,則用空類型void來定義函數(shù)返回值。缺省情況為int型。10/10/4第4頁第4頁3函數(shù)名由任何合法標(biāo)識符構(gòu)成。提議將函數(shù)名命名與函數(shù)內(nèi)容有一定關(guān)系。4在第一個函數(shù)定義形式中,形參闡明表是一系列用逗號分開每個形參變量闡明。如:int x, int y, int z這表示形參變量有三個:x, y, z。它們類型都是int型。 在第二種函數(shù)定義形式中,形參表是一系列用逗號分開形參變量。如:x, y, z 5函數(shù)語句體是放在一對花括號 中,由局部數(shù)據(jù)類型描述和功效實現(xiàn)兩部分構(gòu)成。 10/10/5第5頁第5頁6函

4、數(shù)返回語句形式有下列兩種:函數(shù)無返回值情況:return;函數(shù)有返回值情況:return(表示式值);在第種情況下要注意“表示式值”類型必須與函數(shù)返回值類型相一致。比如:求兩個任意整數(shù)絕對值和,用函數(shù)abs_sum()實現(xiàn)。/*直接調(diào)用庫函數(shù)來計算m和n絕對值 */int abs_sum(int m, int n) return (abs(m)+abs(n); /*函數(shù)abs()是在頭文獻math.h中申明*/ 10/10/6第6頁第6頁函數(shù)定義下列:int abs_sum(int m, int n) if (m0) m=-m; if(n0) n=-n; return(m+n);6.1.2 函

5、數(shù)申明和調(diào)用 一函數(shù)申明函數(shù)申明普通形式:存儲類型符 返回值類型符 函數(shù)名(形參闡明表);如:int abs-sun(int m, int n);10/10/7第7頁第7頁二函數(shù)調(diào)用函數(shù)調(diào)用是通過函數(shù)調(diào)用語句來實現(xiàn),分兩種形式:無返回值情況: 函數(shù)名(實參表);有返回值情況: 變量名函數(shù)名(實參表);該變量名類型必須與函數(shù)返回值類型相同。函數(shù)調(diào)用時都會去執(zhí)行函數(shù)語句中內(nèi)容,函數(shù)執(zhí)行完畢后,回到函數(shù)調(diào)用處,繼續(xù)執(zhí)行下面語句。10/10/8第8頁第8頁6.1.3 函數(shù)傳值方式 函數(shù)傳值方式: 采用實參表將每一個實參值相應(yīng)地傳遞給每一個形參變量,形參變量在接受到實參表傳過來值時,會在內(nèi)存暫時開辟新空

6、間,以保留形參變量值,當(dāng)函數(shù)執(zhí)行完畢時,這些暫時開辟內(nèi)存空間會被釋放,并且形參值在函數(shù)中無論是否發(fā)生改變,都不會影響到實參變量值改變,這就是函數(shù)傳值方式。自定義函數(shù)在程序中使用順序有兩種形式: 先進行函數(shù)申明,再進行函數(shù)調(diào)用,函數(shù)定義放在函數(shù)調(diào)用之后。函數(shù)申明在函數(shù)調(diào)用之前。 函數(shù)定義放在函數(shù)調(diào)用之前。10/10/9第9頁第9頁【例6-1】 編程序,通過調(diào)用函數(shù)abs-sum(),求任意兩個整數(shù)絕對值和。/*exam6_1.c 調(diào)用函數(shù)求兩整數(shù)絕對值和*/#include int abs_sum(int m,int n);main()int x,y,z;scanf(%d%d,&x,&y);z=

7、abs_sum(x,y);printf(sum is %d,z);int abs_sum(int m,int n)if(m0)m=-m;if(n0)n=-n;return m+n;程序運營結(jié)果:7 12sum is 1910/10/10第10頁第10頁用傳值方式調(diào)用函數(shù)時,實參也能夠是函數(shù)調(diào)用語句 【例6-2】求任意三個數(shù)絕對值和。/*exam6_2.c 調(diào)用函數(shù)求三個整數(shù)絕對值和*/#include int abs_sum(int m,int n);main()int x,y,z,sum;scanf(%d%d%d,&x,&y,&z);sum=abs_sum(abs_sum(x,y),z);p

8、rintf(sum is %d,sum);int abs_sum(int m,int n)if(m0)m=-m;if(n0)n=-n;return m+n;程序運營結(jié)果:7 12 5sum is 2410/10/11第11頁第11頁注意: 對于有返回值函數(shù),調(diào)用時若沒有把它賦給某個變量,仍然是能夠,只是函數(shù)返回值有也許會被丟失?!纠?-3】 求任意兩數(shù)乘積。自定義一個函數(shù)mul(),用于求兩數(shù)乘積,程序:/*exam6_3.c 求兩個數(shù)乘積*/#include float mul(float a,float b);main()float x,y,z;scanf(%f %f,&x,&y);z=m

9、ul(x,y); /* */x=x+10;y=y-10;mul(x,y); /* */10/10/12第12頁第12頁x=x*2;y=y*2;printf(z=%f,mul(%f,%f)=%fn,z,x,y,mul(x,y); /* */float mul(float a,float b)return a*b;程序運營結(jié)果:5 6z=30.000000,mul(30.000000,-8.000000)=-240.00000010/10/13第13頁第13頁程序闡明: 注釋處調(diào)用函數(shù)后返回值賦給變量z。 注釋處調(diào)用函數(shù)后返回值沒有賦給任何變量,函數(shù)返回值被丟失。 注釋處調(diào)用函數(shù)后返回值成為了pr

10、intf()函數(shù)參數(shù)。10/10/14第14頁第14頁6.2 變量作用域和存儲類型 一變量作用域 變量作用域:指是變量有效范圍,針對變量不同作用域,可把變量分為局部變量和全局變量。局部變量:在函數(shù)內(nèi)部或某個控制塊內(nèi)部定義變量為局部變量,局部變量有效范圍只限于本函數(shù)內(nèi)部,退出函數(shù),該變量自動失效。 全局變量:在函數(shù)外面定義變量稱為全局變量,全局變量作用域是從該變量定義位置開始,直到源文獻結(jié)束。在同一文獻中所有函數(shù)都能夠引用全局變量。 10/10/15第15頁第15頁局部變量和全局變量作用域如圖所表示:10/10/16第16頁第16頁【例6-4】 變量作用域應(yīng)用舉例,閱讀下面程序,注意區(qū)別局部變量

11、和全局變量作用域。/*exam6_4.c 變量作用域舉例*/#include void a( void );void b( void );void c( void );int x = 1;main()int x = 5;printf(local x in outer scope of main is %dn, x );10/10/17第17頁第17頁int x = 7;printf( local x in inner scope of main is %dn, x );printf( local x in outer scope of main is %dn, x );a();b();c();

12、a();b();c();前三次輸出結(jié)果:local x in outer scope of main is 5local x in inner scope of main is 7local x in outer scope of main is 510/10/18第18頁第18頁printf( local x in main is %dn, x );getchar();return 0;void a( void )int x = 25;printf( nlocal x in a is %d after entering an, x );+x;printf( local x in a is %

13、d before exiting an, x );10/10/19第19頁第19頁void b( void ) static int x = 50; printf( nlocal static x is %d on entering bn, x ); +x; printf( local static x is %d on exiting bn, x );void c( void )printf( nglobal x is %d on entering cn, x );x *= 10;printf( global x is %d on exiting cn, x );10/10/20第20頁第2

14、0頁程序運營結(jié)果: 后6次函數(shù)調(diào)用local x in a is 25 after entering alocal x in a is 26 before exiting alocal static x is 50 on entering blocal static x is 51 on exiting bglobal x is 1 on entering cglobal x is 10 on exiting clocal x in a is 25 after entering alocal x in a is 26 before exiting alocal static x is 51 o

15、n entering blocal static x is 52 on exiting bglobal x is 10 on entering cglobal x is 100 on exiting c最后一次輸出:local x in main is 510/10/21第21頁第21頁二變量存儲類型 變量存儲類型:指是變量存儲屬性,它闡明變量占用存儲空間區(qū)域。 在內(nèi)存中,供用戶使用存儲區(qū)由程序區(qū)、靜態(tài)存儲區(qū)和動態(tài)存儲區(qū)三部分構(gòu)成。 變量存儲類型有四種:auto型、register型、static型和extern型。auto型變量存儲在內(nèi)存動態(tài)存儲區(qū)。register型變量保留在存儲器中。st

16、atic型變量和extern型變量存儲在靜態(tài)存儲器。10/10/22第22頁第22頁局部變量存儲類型缺省值為auto型 。全局變量存儲類型缺省值為extern型 。auto型變量和register型變量只用于定義局部變量。 static型變量即可定義成局部變量,又可定義成全局變量。 【例6-5】 設(shè)計一個函數(shù):long fac(int n),可用來計算15階乘。分析:可在函數(shù)中定義一個static型變量,用來保留上次計算結(jié)果。10/10/23第23頁第23頁/*exam6_5.c 用static型變量保留上次階乘值*/#include long fac(int n)static int f=1

17、;f=f*n;return f;main()int i;for(i=1;i=5;i+)printf(%d!=%ldn,i,fac(i);程序運營結(jié)果:1!=1 2!=2 3!=6 4!=24 5!=120局部變量f被定義成static型,因此,它只在該函數(shù)第1次被調(diào)用時候初始化其值為1,以后再調(diào)用該函數(shù)時,不再進行初始化,而是使用上一次調(diào)用值。 10/10/24第24頁第24頁6.3 內(nèi)部函數(shù)與外部函數(shù) 一內(nèi)部函數(shù) 若函數(shù)存儲類型為static型,則稱其為內(nèi)部函數(shù)或稱靜態(tài)函數(shù),它表示在同一個程序中(由多個源文獻構(gòu)成),該函數(shù)只能在一個文獻中存在,在其它文獻中不可使用。 如:static int

18、 fun-name();內(nèi)部函數(shù)只能被其所在源文獻調(diào)用。二外部函數(shù) 若函數(shù)存儲類型定義為extern型,則稱其為外部函數(shù),它表示該函數(shù)能被其它源文獻調(diào)用。函數(shù)缺省存儲類型為extern型。注意:在需要用到外部函數(shù)文獻中,其函數(shù)申明必須用extern進行闡明。10/10/25第25頁第25頁比如:有兩個源文獻file1.c和file2.c下列所表示:/* file1.c 調(diào)用外部函數(shù)*/# include int mod(int a, int b);extern int add (int m, int n); /*外部函數(shù)申明*main() int x, y, result; scanf (“%

19、d%d”, &x, &y); result=add(x,y); /*調(diào)用外部函數(shù)*/ if (result 0) result=result-mod(x,y); printf(“result=%dn”, result);10/10/26第26頁第26頁int mod(int a, int b) return(a%d);/* file2.c外部函數(shù)*/extern int add(int m, int n) return(m+n);闡明:1在文獻1(file1.c)中函數(shù)申明: int mod(int a, int b);事實上相稱于:extern int mod(int a, int b);1

20、0/10/27第27頁第27頁2在文獻2(file2.c)中函數(shù)定義: extern int add(int m, int n) return(m+n); 事實上相稱于:int add(int m, int n) return(m+n); 3由多個源文獻構(gòu)成一個程序時,main()函數(shù)只能出現(xiàn)在一個源文獻中。10/10/28第28頁第28頁4多個源文獻連接方式有三種:將各源文獻分別編譯成目的文獻,得到多個目的文獻(.obj后綴),然后用連接命令(tlink)把多個.obj文獻連接起來,在Turbo c上用下列命令: tlink file1.obj+file2.obj+filen.obj生成一個

21、file1.exe可執(zhí)行文獻。建立項目文獻(.prj后綴),詳細操作可參閱各種C編譯手冊。 使用文獻包括命令。 10/10/29第29頁第29頁6.4 遞歸函數(shù)設(shè)計和調(diào)用 C語言中一個函數(shù)中語句能夠是對另一個函數(shù)調(diào)用。函數(shù)嵌套調(diào)用圖例:調(diào)用過程按圖中箭頭所表示方向和順序進行,屬于一個線性調(diào)用關(guān)系,每次調(diào)用后,最后返回到原調(diào)用點,繼續(xù)執(zhí)行下列語句。 10/10/30第30頁第30頁C語言中還允許在函數(shù)中調(diào)用本身,或函數(shù)之間互相調(diào)用,這種調(diào)用方式稱之為遞歸。遞歸又分為直接遞歸調(diào)用和間接遞歸調(diào)用。 直接遞歸調(diào)用;函數(shù)直接調(diào)用本身。間接遞歸調(diào)用:函數(shù)互相調(diào)用對方。直接遞歸:int temp (int

22、x) int y, z; z=temp(y); 10/10/31第31頁第31頁間接遞歸:顯然,遞歸有也許陷入無限遞歸狀態(tài),最后造成錯誤發(fā)生。因此,設(shè)計一個遞歸問題必須具備兩個條件:1后一部分與原始問題類似。2后一問題是原始問題簡化。10/10/32第32頁第32頁【例6-6】 編程,從鍵盤輸入一個正整數(shù)n,求n!。n!數(shù)字表示式為:n!=定義一個求n!函數(shù):long fac(int n)long fac(int n) long result; if (n= = 0 | n= =1) result =1; else result=n*fac(n-1); return(result); 10/1

23、0/33第33頁第33頁完整程序下列: /*exam6_6.c 用遞歸法求n!*/#include long fac(int n)long result;if(n=0|n=1)result=1;elseresult=n*fac(n-1);return result;main()int x;long f;10/10/34第34頁第34頁scanf(%d,&x);if(x1)設(shè)計一個函數(shù):long fibonacci (int n)用于計算數(shù)列中第n項值, 10/10/36第36頁第36頁程序下列所表示: /*exam6_7.c 求第n項Fibonacci數(shù)列值*/#include long fi

24、bonacci(int n);main()int x=0;long result;doresult=fibonacci(x);printf(fibonacci(%d)=%ldn,x,result);scanf(%d,&x);while(x!=-1);10/10/37第37頁第37頁long fibonacci(int n)if(n=0|n=1)return n;elsereturn fibonacci(n-1)+fibonacci(n-2);程序運營結(jié)果:fibonacci(0)=03fibonacci(3)=24fibonacci(4)=3610/10/38第38頁第38頁以x=4為例,下圖

25、闡明了fibonacci函數(shù)是如何計算fibonacci(4)。圖中把fibonacci簡寫成f。10/10/39第39頁第39頁6.6 綜合范例【例6-12】 在屏幕上畫一個1818大小棋盤。程序下列: /*exam6_12.c 在屏幕上畫一個棋盤*/#include #include #include /*定義畫棋盤所需制表符*/#define LU 0 xda /*左上角*/#define RU 0 xbf /*右上角*/#define LD 0 xc0 /*左下角*/#define RD 0 xd9 /*右下角*/#define L 0 xc3 /*左邊*/#define R 0 xb

26、4 /*右邊*/10/10/40第40頁第40頁#define U 0 xc2 /*上邊*/#define D 0 xc1 /*下邊*/#define CROSS 0 xc5 /*十字叉*/*棋盤左上角坐標(biāo)*/#define MAP_X 5#define MAP_Y 5void draw_cross(int x,int y);void draw_map();main() textmode(C40); draw_map();10/10/41第41頁第41頁/*函數(shù)定義:*/void draw_map() /*畫棋盤*/int i,j;for(i=0;i19;i+)for(j=0;j19;j+)d

27、raw_cross(i,j);void draw_cross(int x,int y) gotoxy(x+MAP_X,y+MAP_Y);textcolor(GREEN);if(x=0 & y=0) putch(LU); /*畫左上角*/ return; 10/10/42第42頁第42頁if(x=0 & y=18) putch(LD); /*畫左下角*/ return; if(x=18 & y=0) putch(RU); /*畫右上角*/ return; if(x=18 & y=18) putch(RD); /*畫右下角*/ return; 10/10/43第43頁第43頁if(x=0) putch(L); /*畫左邊*/ return; if(x=18) putch(R); /*畫右邊*/ return; if(y=0) putch

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論