




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、第5章 函 數(shù)2019年3月1主要內容 5.1 概述5.2 函數(shù)的定義與調用5.3 數(shù)組作函數(shù)參數(shù)5.4 函數(shù)的嵌套調用和遞歸調用5.5 局部變量和全局變量及其作用域5.6 變量的存儲類別及變量的生存期5.7 函數(shù)的存儲分類2019年3月25.1 概述 程序結構清晰,可讀性好。 減少重復編碼的工作量。 可多人共同編制一個大程序,縮短程序設計周期,提高程序設計和調試的效率。使用函數(shù)的好處C程序源程序文件n函數(shù)1函數(shù)m 源程序文件1函數(shù)1函數(shù)n2019年3月3【例5.1】求一個整數(shù)的立方。int cube (int x) /* 函數(shù)定義 */ return (x * x * x); main( )
2、 int f, a; printf(nEnter an integer number:); scanf(%d, &a); f = cube (a); printf(%d * %d * %d = %dn, a, a, a, f);程序運行情況如下:Enter an integer number:22 * 2 * 2 = 8函數(shù)調用程序的執(zhí)行總是從main函數(shù)開始2019年3月4 一個C源程序可以由一個或多個源程序文件組成。C編譯系統(tǒng)在對C源程序進行編譯時是以文件為單位進行的。 一個C源程序文件可以由一個或多個函數(shù)組成。所有函數(shù)都是獨立的。主函數(shù)可以調用其它函數(shù),其它函數(shù)可以相互調用。 在一個C程
3、序中,有且僅有一個主函數(shù)main。C程序的執(zhí)行總是從main函數(shù)開始,調用其它函數(shù)后最終回到main函數(shù),在main函數(shù)中結束整個程序的運行。說明2019年3月5 函數(shù)的種類從函數(shù)定義形式分: 有參函數(shù):在主調(用)函數(shù)和被調(用)函數(shù)之間通過參數(shù)進行數(shù)據(jù)傳遞, 如: int cube (int x) 無參函數(shù):如:getchar( )在調用無參函數(shù)時,主調函數(shù)不需要將數(shù)據(jù)傳遞給無參函數(shù)。從使用的角度看: 標準函數(shù)(庫函數(shù))庫函數(shù)是由系統(tǒng)提供的。如:getchar( )、sin(x)等。在程序中可以直接調用它們。附錄3列出了C的部分庫函數(shù)。 用戶自定義函數(shù)。如:例5.1中的cube函數(shù)。201
4、9年3月6【例5.2】無參函數(shù)的定義與調用。void welcome ( ) printf(*n); printf( Welcome to China n); printf(*n);main( ) welcome( ); 程序的輸出結果如下:* Welcome to China*2019年3月75.2.1 函數(shù)的定義函數(shù)定義的一般形式函數(shù)類型 函數(shù)名(類型名 形式參數(shù)1, ) 說明語句 執(zhí)行語句例如:求兩個數(shù)的最大值。 int max(int x,int y) int z; z = x y ? x : y; return( z );類型省略時默認為int類型沒有形式參數(shù)為無參函數(shù) 2019年3
5、月8int max(x,y)int x,y; int z; z = x y ? x : y; return( z );int max(x,y) int x,y;或int max(int x,y) 或int max(x,y)int x,y,z; z = x y ? x : y; return( z );花括號中也可以為空,這種函數(shù)叫空函數(shù) 。不能在函數(shù)體內定義其他函數(shù),即函數(shù)不能嵌套定義。形參也可以這樣定義如下定義都是錯誤的 2019年3月9函數(shù)名(實參表列)在C語言中,把函數(shù)調用也作為一個表達式。因此凡是表達式可以出現(xiàn)的地方都可以出現(xiàn)函數(shù)調用。例如: welcome( ); if (iabs
6、(a)max) max=iabs(a); m=max(c,max(a,b);5.2.2 函數(shù)的調用函數(shù)調用的一般形式:2019年3月10int sum100( ) int i,t=0; for (i=1; i=100; i+) t+=i; return (t);main( ) int s; s=sum100( ); printf(%dn, s);程序輸出結果:5050int sum ( int x ) int i,t=0; for (i=1; iy?x:y; return (z); /* 返回z的值 */main( ) int a,b,c; scanf(%d,%d,&a,&b); c=max(
7、a,b); printf(max is %dn,c);2019年3月15函數(shù)的返回值是通過return語句帶回到主調函數(shù)的功能:終止函數(shù)的運行,返回主調函數(shù),若有返回值,將返回值帶回主調函數(shù)。說明: 若函數(shù)沒有返回值,return語句可以省略。 return語句中的表達式類型一般應和函數(shù)的類型一致,如果不一致,系統(tǒng)自動將表達式類型轉換為函數(shù)類型。 函數(shù)的返回值return 語句格式:return (表達式); 或 return 表達式 ;或 return;2019年3月16【例5.8】計算并輸出圓的面積。s(int r) return 3.14*r*r;main( ) int r,area;
8、scanf(%d,&r); printf(%dn,s(r);自動轉換為int型 思考:若要得到單精度實型的圓面積,程序應如何修改程序運行情況如下:212?2019年3月17 5.2.4 對被調函數(shù)的聲明和函數(shù)原型變量要先定義后使用,函數(shù)也如此。即被調函數(shù)的定義要出現(xiàn)在主調函數(shù)的定義之前。如swap函數(shù):允許整型函數(shù)(且參數(shù)也是整型)的定義出現(xiàn)在主調函數(shù)之后。如max函數(shù):如果非整型函數(shù)在主調函數(shù)之后定義,則應在主調函數(shù)中或主調函數(shù)之前對被調函數(shù)進行聲明。void swap(int x, int y) main( ) swap(a,b); main( ) c=max(a,b);max(int x
9、,int y) 2019年3月18對被調函數(shù)進行聲明的一般形式 函數(shù)類型 函數(shù)名(參數(shù)類型1 參數(shù)名1,);或 函數(shù)類型 函數(shù)名(參數(shù)類型1,參數(shù)類型2,);思考:以下哪種情況需要在主調函數(shù)中對被調函數(shù)聲明被調函數(shù)定義在前,主調函數(shù)定義在后。主調函數(shù)定義在前,被調函數(shù)定義在后。第二種形式省略了參數(shù)名,此種形式也稱為函數(shù)的原型。?2019年3月19main( ) void calc(float x,float y,char opr); float a,b; char opr; printf(nInput expression:); scanf(%f%c%f,&a,&opr,&b); calc(a
10、,b,opr);void calc(float x,float y,char opr) switch(opr) case +:printf(%5.2f%c%5.2f=%6.2fn,x,opr,y,x+y);return; case -:printf(%5.2f%c%5.2f=%6.2fn,x,opr,y,x-y);return; case *:printf(%5.2f%c%5.2f=%6.2fn,x,opr,y,x*y);return; case /:printf(%5.2f%c%5.2f=%6.2fn,x,opr,y,x/y);return; default :printf(Operator
11、 err! n); 對被調函數(shù)的聲明【例5.9】計算并輸出兩個數(shù)的和、差、積、商。2019年3月205.3 數(shù)組作函數(shù)參數(shù)5.3.1 一維數(shù)組元素作函數(shù)參數(shù)main( ) int a5,i,m ; for (i=0; i5; i+) scanf(%d,&ai); m=a0; for (i=1; i5; i+) m=min(m,ai); printf(%dn, m);【例5.11】求5個數(shù)中的最小值。int min(int x, int y) return (xy?x:y); 用打擂臺方法求最小值。m相當于擂主2019年3月215.3.2 一維數(shù)組名作函數(shù)參數(shù)數(shù)組名表示數(shù)組在內存中的起始地址。
12、例如:數(shù)組a在內存中從2000地址開始存放,則a的值為2000。2000是地址值,是指針類型的數(shù)據(jù)(后面將介紹指針類型),不能把它看成是整型或其他類型數(shù)據(jù)。實參是數(shù)組名,形參也應定義為數(shù)組形式,形參數(shù)組的長度可以省略,但 不能省,否則就不是數(shù)組形式了。 【例.12】用冒泡法將10個整數(shù)排序。2019年3月22void 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);
13、 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 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; 2019年3月23 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
14、(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) 排序后圖7.3 調用sort函數(shù)2000b形參 b 實際是一個可以存放地址的變量a:2000實參賦給形參首地址: 2000首地址: 20002019年3月24#include stdio.hmain( ) void scat(char str1 ,char str2 ); char s150,s250; int i,k; printf(Input s1:); gets(s1); printf(Inpu
15、t s2:); gets(s2); scat(s1,s2); printf(Output s1:%sn,s1); printf(Output s2:%sn,s2);void scat(char str1 ,char str2 ) int i=0,k=0; while (str1i!=0) i+; while (str2k!=0) str1i=str2k; i+; k+; str1i=0;scat函數(shù)還可簡化為:void scat(char str1 ,char str2 ) int i=0,k=0; while (str1i) i+; while (str1i+=str2k+);【例5.13】
16、編程序,實現(xiàn)字符串連接。2019年3月255.4 函數(shù)的嵌套調用和遞歸調用main函數(shù) 調用函數(shù) A; 函數(shù) A 調用函數(shù) B; 函數(shù) B 5.4.1 函數(shù)的嵌套調用2019年3月26【例5.15】函數(shù)的嵌套調用main( ) int n=3; printf (%dn,sub1(n); sub1(int n) int i,a=0; for (i=n; i0; i-) a+=sub2(i); return a ; sub2(int n) return n+1; 程序輸出結果:9 2019年3月275.4.2 函數(shù)的遞歸調用1遞歸的基本概念遞歸調用:一個函數(shù)直接或間接地調用了它本身,就稱為函數(shù)的遞
17、歸調用。遞歸函數(shù):在函數(shù)體內調用該函數(shù)本身。int sub(int x) int y,z; if( ) z=sub(y); else return ;例如:直接調用sub函數(shù)本身2019年3月282遞歸函數(shù)的執(zhí)行過程【例5.16】編一遞歸函數(shù)求n!。思路:以求4的階乘為例:4!=4*3!,3!=3*2!,2!=2*1!,1!=1,0!=1。遞歸結束條件:當n=1或n=0時,n!=1。遞歸公式:n! =1 (n=0, 1)n(n-1)! (n1)2019年3月29程序如下:float fact (int n) float f=0; if(n0) printf(n0)再找出遞歸結束條件:當n=0時
18、,xn=1。2019年3月32程序如下: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);程序運行情況如下:2,1010242019年3月335.5 局部變量和全局變量及其作用域5.5.1 變量的作用域5.5.2 局部變量及其作用域變量的作用域:變量在程序中可以被使用的范圍。根據(jù)
19、變量的作用域可以將變量分為局部變量和全局變量。局部變量(內部變量):在函數(shù)內或復合語句內定義的變量以及形參。作用域:函數(shù)內或復合語句內?!纠?.19】分析下面程序的運行結果及變量的作用域。問題:一個變量在程序的哪個函數(shù)中都能使用嗎?2019年3月34void sub(int a,int b) int c; a=a+b; b=b+a; c=b-a;printf(sub:ta=%d b= %d c= %dn,a,b,c); 局部變量main( ) int a=1,b=1,c=1; printf(main:ta=%d b= %d c= %dn,a,b,c); sub(a,b); printf(mai
20、n:ta=%d b= %d c= %dn,a,b,c); int a=2,b=2; printf(comp:ta=%d b= %d c= %dn,a,b,c); printf(main:ta=%d b= %d c= %dn,a,b,c); 局部變量局部變量“分程序”或“程序塊”程序輸出結果:main: a=1 b= 1 c= 1sub: a=2 b= 3 c= 1main: a=1 b= 1 c= 1comp: a=2 b= 2 c= 1main: a=1 b= 1 c= 12019年3月355.5.3 全局變量及其作用域全局變量(外部變量):在函數(shù)外部定義的變量。作用域:從定義變量的位置開始
21、到本源文件結束。如在其作用域內的函數(shù)或分程序中定義了同名局部變量,則在局部變量的作用域內,同名全局變量暫時不起作用?!纠?.20】全局變量和局部變量的作用域。2019年3月36int a = 5;void f(int x, int y) int b,c; b=a+x; c=a-y;printf(%dt%dt%dn,a,b,c); 局部變量main( ) int b=6,c=7; f(b,c); printf(%dt%dt%dn,a,b,c); int a=9,b=8; printf(%dt%dt%dn,a,b,c); c=10; printf(%dt%dt%dn, a,b,c); printf
22、(%dt%dt%dn,a,b,c); printf(%dt%dt%dn,a,b,c); 局部變量局部變量程序輸出結果:5 11 -25 6 79 8 79 8 109 8 105 6 10全局變量2019年3月375.6 變量的存儲類別及變量的生存期5.6.1 變量的生存期與變量的存儲分類變量的生存期:變量在內存中占據(jù)存儲空間的時間。思考:1. 何時為變量分配內存單元? 2. 將變量分配在內存的什么區(qū)域? 3. 變量占據(jù)內存的時間(生存期)?程序代碼區(qū)靜態(tài)存儲區(qū)動態(tài)存儲區(qū)存儲分配動態(tài)存儲變量靜態(tài)存儲變量2019年3月385.6.2 變量的存儲類別變量的屬性數(shù)據(jù)類型:決定為變量分配內存單元的長度
23、,數(shù)據(jù)的存放形式,數(shù)的范圍。存儲類別:決定了變量的生存期,給它分配在哪個存儲區(qū)。2019年3月39變量定義語句的一般形式存儲類別 數(shù)據(jù)類型 變量名1, , 變量名n ;auto(自動的) register(寄存器的)static(靜態(tài)的) extern(外部的)1自動變量(auto類別) 局部變量可以定義為自動變量。main()int x,y; main()auto int x,y; 自動變量等價可省2019年3月40 內存分配調用函數(shù)或執(zhí)行分程序時在動態(tài)存儲區(qū)為其分配存儲單元,函數(shù)或分程序執(zhí)行結束,所占內存空間即刻釋放。 變量的初值定義變量時若沒賦初值,變量的初值不確定;如果賦初值則每次函數(shù)
24、被調用時執(zhí)行一次賦值操作。 生存期 在函數(shù)或分程序執(zhí)行期間。 作用域自動變量所在的函數(shù)內或分程序內。自動變量2019年3月412靜態(tài)變量(static類別)除形參外,局部變量和全局變量都可以定義為靜態(tài)變量。局部靜態(tài)變量(或稱內部靜態(tài)變量)全局靜態(tài)變量(或稱外部靜態(tài)變量)靜態(tài)變量靜態(tài)變量static int a; main( ) float x,y; f( ) static int b=1; 全局靜態(tài)變量局部靜態(tài)變量自動變量不能省2019年3月42 內存分配編譯時,將其分配在內存的靜態(tài)存儲區(qū)中,程序運行結束釋放該單元。 靜態(tài)變量的初值若定義時未賦初值,在編譯時,系統(tǒng)自動賦初值為0;若定義時賦初值
25、,則僅在編譯時賦初值一次,程序運行后不再給變量賦初值 。 生存期整個程序的執(zhí)行期間。 作用域局部靜態(tài)變量的作用域是它所在的函數(shù)或分程序。全局靜態(tài)變量的作用域是從定義處開始到本源文件結束。靜態(tài)變量2019年3月43int c;static int a; main( ) float x,y; char s;f( ) static int b=1; 3.外部變量(extern類別)在函數(shù)外定義的變量若沒有用 static說明,則是外部變量。外部變量只能隱式定義為extern類別,不能顯式定義。全局靜態(tài)變量自動變量局部靜態(tài)變量外部變量2019年3月44 內存分配編譯時,將其分配在靜態(tài)存儲區(qū),程序運行結
26、束釋放該單元。 變量的初值若定義變量時未賦初值,在編譯時,系統(tǒng)自動賦初值為0。 生存期整個程序的執(zhí)行期間。 作用域從定義處開始到本源文件結束。外部變量問題:全局靜態(tài)變量的作用域可以擴展到本程序的其它文件嗎?此外,還可以用extern進行聲明,以使其作用域擴大到該程序的其它文件中。2019年3月45外部變量聲明的一般格式 extern 數(shù)據(jù)類型 變量名1,變量名n;或 extern 變量名1,變量名n;注意:外部變量聲明用關鍵字extern,而外部變量的定義不能用extern,只能隱式定義。定義外部變量時,系統(tǒng)要給變量分配存儲空間,而對外部變量聲明時,系統(tǒng)不分配存儲空間,只是讓編譯系統(tǒng)知道該變量是一個已經(jīng)定義過的外部變量,與函數(shù)聲明的作用類似。2019年3月46int p=1,q=5; float f1(int a) extern char c1,c2; char c1,c2; char f2(int x,int y) main( ) 外部變量聲明定義外部變量定義外部變量思考:在f1函數(shù)中聲明c1、c2的作用是什么?如何修改程序使所有函數(shù)都可以使用外部變量而又不需要聲明?【例5.24】在一個文件內聲明外部變量。20
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度智能家居產(chǎn)品傭金支付及智能家居服務合同
- 二零二五年度事業(yè)單位聘用合同:事業(yè)單位物業(yè)管理人員崗位服務合同
- 二零二五年度文化旅游產(chǎn)業(yè)合作終止合同
- 二零二五年度公司股東內部關于戰(zhàn)略合作的框架協(xié)議
- 2025年度服裝廠員工保密與競業(yè)禁止合同
- 2025年度洗浴場所員工激勵機制與雇傭協(xié)議
- 二零二五年度物聯(lián)網(wǎng)設備技術顧問服務協(xié)議
- 二零二五年度耕作地清理與農業(yè)標準化生產(chǎn)合同
- 二零二五年度抵押方式知識產(chǎn)權質押合同
- 2025年度汽車貸款風險分擔合作協(xié)議
- 工程質量回訪記錄
- GB/T 2572-2005纖維增強塑料平均線膨脹系數(shù)試驗方法
- 2023年江蘇省中學生生物奧林匹克競賽試題及答案
- 維修質量檢驗制度
- 食管支架植入術后護理課件
- 品質控制計劃(QC工程圖)
- 海外派遣人員管理辦法
- 混凝土灌注樁質量平行檢查記錄(鋼筋籠)
- 汽車營銷學(全套課件)
- 現(xiàn)澆墩臺身軸線偏位、全高豎直度檢測記錄表
- 激光共聚焦顯微鏡校準規(guī)范編制說明
評論
0/150
提交評論