C程序設(shè)計課件第4章函數(shù)_第1頁
C程序設(shè)計課件第4章函數(shù)_第2頁
C程序設(shè)計課件第4章函數(shù)_第3頁
C程序設(shè)計課件第4章函數(shù)_第4頁
C程序設(shè)計課件第4章函數(shù)_第5頁
已閱讀5頁,還剩34頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第第4章章 函數(shù)函數(shù) 本章導(dǎo)讀 l掌握掌握 C C 語言中常見的內(nèi)置函數(shù)語言中常見的內(nèi)置函數(shù) l理解函數(shù)原型和函數(shù)的返回值理解函數(shù)原型和函數(shù)的返回值 l熟練掌握自定義函數(shù)的定義和調(diào)用熟練掌握自定義函數(shù)的定義和調(diào)用 l理解變量的作用域理解變量的作用域 l理解變量的存儲類型理解變量的存儲類型 l理解參數(shù)傳遞的方式:傳值理解參數(shù)傳遞的方式:傳值 l預(yù)處理指令預(yù)處理指令 l宏定義宏定義 l條件編譯條件編譯 函數(shù)的優(yōu)點函數(shù)的優(yōu)點 void main() : if(xy) max1=x; else max1=y; if(ab) max2=a; else max2=b : 重復(fù)多次的同一 計算類型 void

2、 main() : max1=max(x,y); max2=max(a,b); : int max(int a,int b) int res; res=a b ? a : b; return res; 函數(shù) 主程序 ans 函數(shù)可以把相對獨立的某個功能抽象出來,使之成為 程序中的一個獨立實體。可以在同一個程序或其他程 序中多次重復(fù)使用 函數(shù)的優(yōu)點函數(shù)的優(yōu)點 (1)使程序變得更簡短而清晰;)使程序變得更簡短而清晰; (2)提高了代碼的重用性;)提高了代碼的重用性; (3)有利于程序維護(hù);)有利于程序維護(hù); (4)可以提高程序開發(fā)的效率。)可以提高程序開發(fā)的效率。 常見內(nèi)置函數(shù)常見內(nèi)置函數(shù) 函數(shù)的

3、定義與調(diào)用函數(shù)的定義與調(diào)用 一、定義一、定義 函數(shù)的定義與調(diào)用函數(shù)的定義與調(diào)用 二、函數(shù)的調(diào)用二、函數(shù)的調(diào)用 調(diào)用形式:調(diào)用形式: 函數(shù)名函數(shù)名(實參表實參表) l例例 1 int f(int a, int b) l int c; l if(ab) c=1; l else if(a=b) c=0; l else c=-1; l return(c); l lmain() l int i=2,p; l p=f(i, i+); l printf(%d,p); l 函數(shù)的定義與調(diào)用函數(shù)的定義與調(diào)用 三、函數(shù)的參數(shù)及傳遞方式三、函數(shù)的參數(shù)及傳遞方式 l形式參數(shù):定義函數(shù)時函數(shù)名后面括號中的變量名。形式參

4、數(shù):定義函數(shù)時函數(shù)名后面括號中的變量名。 l實際參數(shù):調(diào)用函數(shù)時函數(shù)名后面括號中的表達(dá)式。實際參數(shù):調(diào)用函數(shù)時函數(shù)名后面括號中的表達(dá)式。 說明:實參必須有確定的值,形參必須指定類型,形參與實參類型一致, 個數(shù)相同,若形參與實參類型不一致,自動按形參類型轉(zhuǎn)換 函數(shù)調(diào)用轉(zhuǎn)換,形參在函數(shù)被調(diào)用前不占內(nèi)存,函數(shù)調(diào)用時為形參分配內(nèi)存, 調(diào)用結(jié)束時內(nèi)存釋放。 函數(shù)的定義與調(diào)用函數(shù)的定義與調(diào)用 l函數(shù)參數(shù)的傳遞方式函數(shù)參數(shù)的傳遞方式 l傳值調(diào)用傳值調(diào)用 l例例2 參數(shù)傳遞示例參數(shù)傳遞示例 l#include ls a,int b) l int temp; l temp=a; a=b; b=temp; l p

5、rintf(“in sn”); l printf(a=%d,tb=%dn,a,b); l lmain() l int x=7,y=11; l printf(“in main function, before s n”); l printf(x=%d,ty=%dn,x,y); l s); l printf(“in main function, after s n”); l printf(x=%d,ty=%dn,x,y); l 運行結(jié)果: in main function, before s x=7, y=11 in s a=11, b=7 in main function, after s x=

6、7, y=11 內(nèi)存空間 main swap x y a b 7 11 7 11 本例參數(shù)的傳遞采用了傳遞值調(diào)用 的方式。子函數(shù)swap的作用是交 換a、b的值,但在調(diào)用函數(shù)main 中,x、y的值依然保持不變。這是 因為傳值調(diào)用僅僅將實參x、y的值 拷貝到swap的形參a、b中,在 swap中交換的是形參a、b的值, 并未影響到main中相應(yīng)實參的值。 如果希望swap中形參的操作能夠 影響到main中實參的值,可以使用 傳地址調(diào)用(見后續(xù)章節(jié))。 l函數(shù)的形參與實參有如下特點:函數(shù)的形參與實參有如下特點: l(1 1)形參變量只有在被調(diào)用時才分配內(nèi)存單元,在調(diào)用結(jié)束時,即)形參變量只有在被

7、調(diào)用時才分配內(nèi)存單元,在調(diào)用結(jié)束時,即 刻釋放所分配的內(nèi)存單元。因此,形參只有在函數(shù)內(nèi)部有效。函數(shù)調(diào)刻釋放所分配的內(nèi)存單元。因此,形參只有在函數(shù)內(nèi)部有效。函數(shù)調(diào) 用結(jié)束返回主調(diào)函數(shù)后則不能再使用該形參變量;用結(jié)束返回主調(diào)函數(shù)后則不能再使用該形參變量; l(2 2)實參可以是常量、變量、表達(dá)式、函數(shù)等,無論實參是何種類)實參可以是常量、變量、表達(dá)式、函數(shù)等,無論實參是何種類 型的量,在進(jìn)行函數(shù)調(diào)用時,它們都必須具有確定的值,以便把這些型的量,在進(jìn)行函數(shù)調(diào)用時,它們都必須具有確定的值,以便把這些 值傳送給形參。因此應(yīng)預(yù)先用賦值,輸入等辦法使實參獲得確定值;值傳送給形參。因此應(yīng)預(yù)先用賦值,輸入等辦法

8、使實參獲得確定值; l(3 3)實參和形參在數(shù)量上,類型上,順序上應(yīng)嚴(yán)格一致,否則會發(fā))實參和形參在數(shù)量上,類型上,順序上應(yīng)嚴(yán)格一致,否則會發(fā) 生類型不匹配的錯誤;生類型不匹配的錯誤; l(4 4)函數(shù)調(diào)用中發(fā)生的數(shù)據(jù)傳送是單向的。即只能把實參的值傳送)函數(shù)調(diào)用中發(fā)生的數(shù)據(jù)傳送是單向的。即只能把實參的值傳送 給形參,而不能把形參的值反向地傳送給實參。給形參,而不能把形參的值反向地傳送給實參。 因此在函數(shù)調(diào)用過因此在函數(shù)調(diào)用過 程中,形參的值發(fā)生改變,而實參中的值不會變化。程中,形參的值發(fā)生改變,而實參中的值不會變化。 返回語句:返回語句: l形式:形式: return(表達(dá)式表達(dá)式); l 或

9、或 return 表達(dá)式表達(dá)式; l 或或 return; l功能:使程序控制從被調(diào)用函數(shù)返回到調(diào)用函數(shù)中,同時功能:使程序控制從被調(diào)用函數(shù)返回到調(diào)用函數(shù)中,同時 把返回值帶給調(diào)用函數(shù)。把返回值帶給調(diào)用函數(shù)。 l說明:說明: l(1)函數(shù)至多可以返回一個值,不能返回多個值;)函數(shù)至多可以返回一個值,不能返回多個值; l(2)返回值的數(shù)據(jù)類型必須與函數(shù)原型中返回值的數(shù)據(jù))返回值的數(shù)據(jù)類型必須與函數(shù)原型中返回值的數(shù)據(jù) 類型匹配;類型匹配; l(3)當(dāng)遇到)當(dāng)遇到 return 語句時,函數(shù)執(zhí)行將終止。程序控制語句時,函數(shù)執(zhí)行將終止。程序控制 流將立即返回調(diào)用函數(shù)。流將立即返回調(diào)用函數(shù)。 函數(shù)的返回

10、值函數(shù)的返回值 函數(shù)的原型函數(shù)的原型 l對使用被調(diào)用函數(shù)的要求:對使用被調(diào)用函數(shù)的要求: l(1 1)必須是已存在的函數(shù);)必須是已存在的函數(shù); l(2 2)庫函數(shù))庫函數(shù): #include : #include .h; l(3 3)用戶自定義函數(shù))用戶自定義函數(shù): : 函數(shù)類型原型說明。函數(shù)類型原型說明。 l函數(shù)原型說明在形式上與函數(shù)頭部類似,最后加一個分號。原型說明函數(shù)原型說明在形式上與函數(shù)頭部類似,最后加一個分號。原型說明 中參數(shù)表里的參數(shù)名可以不寫(只寫參數(shù)類型)。中參數(shù)表里的參數(shù)名可以不寫(只寫參數(shù)類型)。 l函數(shù)聲明一般形式:函數(shù)聲明一般形式: l函數(shù)類型函數(shù)類型 函數(shù)名函數(shù)名(

11、 (形參類型形參類型 形參名形參名,. );,. ); l或或 函數(shù)類型函數(shù)類型 函數(shù)名函數(shù)名();(); l作用:告訴編譯系統(tǒng)函數(shù)類型、參數(shù)個數(shù)及類型,以便檢驗。作用:告訴編譯系統(tǒng)函數(shù)類型、參數(shù)個數(shù)及類型,以便檢驗。 l注意:函數(shù)定義與函數(shù)聲明不同。定義是指對函數(shù)功能的確立,從無注意:函數(shù)定義與函數(shù)聲明不同。定義是指對函數(shù)功能的確立,從無 到有對函數(shù)進(jìn)行規(guī)劃,而聲明是對已經(jīng)存在的函數(shù)進(jìn)行說明并通知給到有對函數(shù)進(jìn)行規(guī)劃,而聲明是對已經(jīng)存在的函數(shù)進(jìn)行說明并通知給 編譯系統(tǒng),便于編譯工作順利完成。編譯系統(tǒng),便于編譯工作順利完成。 l例例3 函數(shù)原型函數(shù)原型 lmain() l float add(

12、float,float); /*function declaration*/ l float a,b,c; l scanf(%f,%f, l c=add(a,b); l printf(sum is %f,c); l lfloat add(float x, float y) l float z; l z=x+y; l return(z); l 函數(shù)定義與函數(shù)聲明不同。定義是指對函數(shù)功能的確立, 從無到有對函數(shù)進(jìn)行規(guī)劃,而聲明是對已經(jīng)存在的函數(shù) 進(jìn)行說明并通知給編譯系統(tǒng),便于編譯工作順利完成。 函數(shù)的調(diào)用函數(shù)的調(diào)用 l函數(shù)的調(diào)用方式: l嵌套調(diào)用 l遞歸調(diào)用 嵌套調(diào)用 從一個函數(shù)調(diào)用另一個函數(shù)稱為

13、函數(shù)的嵌套調(diào)用 遞歸調(diào)用 l函數(shù)直接或間接的調(diào)用自身叫函數(shù)的遞歸函數(shù)直接或間接的調(diào)用自身叫函數(shù)的遞歸 調(diào)用。調(diào)用。 遞歸調(diào)用 lC編譯系統(tǒng)對遞歸函數(shù)的自調(diào)用次數(shù)沒有限制;每調(diào)用函編譯系統(tǒng)對遞歸函數(shù)的自調(diào)用次數(shù)沒有限制;每調(diào)用函 數(shù)一次,在內(nèi)存堆棧區(qū)分配空間,用于存放函數(shù)變量、返數(shù)一次,在內(nèi)存堆棧區(qū)分配空間,用于存放函數(shù)變量、返 回值等信息。實際中不是所有的問題都可以采用遞歸調(diào)用回值等信息。實際中不是所有的問題都可以采用遞歸調(diào)用 的方法。只有滿足下列要求的問題才可使用遞歸調(diào)用方法的方法。只有滿足下列要求的問題才可使用遞歸調(diào)用方法 來解決:能夠?qū)⒃械膯栴}化為一個新的問題,而新的問來解決:能夠?qū)⒃?/p>

14、有的問題化為一個新的問題,而新的問 題的解決辦法與原有問題的解決辦法相同,按這一原則依題的解決辦法與原有問題的解決辦法相同,按這一原則依 次地化分下去,最終化分出來的新的問題可以解決。次地化分下去,最終化分出來的新的問題可以解決。 遞歸調(diào)用 例例4 求求n的階乘。的階乘。 l#include llong fac(int n) l long f ; l if(n0) printf(n1) l p(n/2); l p(n%2); l else l printf(“%d”,n); l l 變量的作用域與存儲類型變量的作用域與存儲類型 l變量的作用域 l變量是對程序中數(shù)據(jù)的存儲空間的抽象,必須先定義后

15、使變量是對程序中數(shù)據(jù)的存儲空間的抽象,必須先定義后使 用,定義后其作用范圍是受約束的。變量的有效使用范圍用,定義后其作用范圍是受約束的。變量的有效使用范圍 就是作用域,其規(guī)則是:每個變量僅在定義它的語句塊就是作用域,其規(guī)則是:每個變量僅在定義它的語句塊 (包含下級語句塊)內(nèi)有效(包含下級語句塊)內(nèi)有效 變量的作用域與存儲類型變量的作用域與存儲類型 變量的作用域與存儲類型變量的作用域與存儲類型 l變量的屬性包括:變量的屬性包括: l操作屬性:變量所持有的數(shù)據(jù)的性質(zhì),又稱數(shù)據(jù)類型;操作屬性:變量所持有的數(shù)據(jù)的性質(zhì),又稱數(shù)據(jù)類型; l存儲屬性:數(shù)據(jù)在內(nèi)存中的存儲方式,又稱存儲類型。存儲屬性:數(shù)據(jù)在內(nèi)

16、存中的存儲方式,又稱存儲類型。 l變量定義格式變量定義格式: 存儲類型存儲類型 數(shù)據(jù)類型數(shù)據(jù)類型 變量表變量表; l變量除作用范圍受約束外,變量值存在的時間也受約束,變量除作用范圍受約束外,變量值存在的時間也受約束, 變量不一定在程序執(zhí)行過程中始終存在,即變量有生存期,變量不一定在程序執(zhí)行過程中始終存在,即變量有生存期, 變量值按(生存期)來分類,變量值按(生存期)來分類, 變量可分為靜態(tài)存儲變量變量可分為靜態(tài)存儲變量 和動態(tài)存儲變量。所謂靜態(tài)存儲方式是指在程序運行期間和動態(tài)存儲變量。所謂靜態(tài)存儲方式是指在程序運行期間 分配固定的存儲空間的方式。動態(tài)存儲方式則是在程序運分配固定的存儲空間的方式

17、。動態(tài)存儲方式則是在程序運 行期間根據(jù)需要進(jìn)行動態(tài)的分配存儲空間的方式。行期間根據(jù)需要進(jìn)行動態(tài)的分配存儲空間的方式。 變量的作用域與存儲類型變量的作用域與存儲類型 l例例6 靜態(tài)變量使用示例靜態(tài)變量使用示例 lvoid display() lstatic int m = 0; l m+; l if (m % 5= 0) l printf(“n”); l else l printf(“ ”); l lvoid main() lint i; l for(i=0;i20;i+) l printf(%d,i); l display(); l l 輸出: 0 1 2 3 4 5 6 7 8 9 10 1

18、1 12 13 14 15 16 17 18 19 在display中定義了一個靜態(tài)的局部變量m用于換行控制, 由于靜態(tài)局部變量在整個程序運行期有效,存放于其中 的數(shù)據(jù)并不會因為display調(diào)用結(jié)束而釋放,而是一直 存在于m中,這是與動態(tài)變量不同的地方。 預(yù)處理指令預(yù)處理指令 l語言預(yù)處理器是編譯程序的一部分,語言預(yù)處理器是編譯程序的一部分, 它負(fù)責(zé)分析處理幾種特殊的指令,它負(fù)責(zé)分析處理幾種特殊的指令, 這些這些 指令被稱為預(yù)處理指令。指令被稱為預(yù)處理指令。 宏定義 l宏定義語句是將一個標(biāo)識符定義為一個字宏定義語句是將一個標(biāo)識符定義為一個字 符串,符串, 在程序中出現(xiàn)的標(biāo)識符在編譯之在程序中

19、出現(xiàn)的標(biāo)識符在編譯之 前被替換為該字符串,這個過程叫前被替換為該字符串,這個過程叫“宏替宏替 換換”(或宏展開)。(或宏展開)。 宏定義 l帶參數(shù)的宏定義的展開過程:在程序中如帶參數(shù)的宏定義的展開過程:在程序中如 果有帶實參的宏,則按果有帶實參的宏,則按 #define 命令行中命令行中 指定的字符串從左到右進(jìn)行置換。如果串指定的字符串從左到右進(jìn)行置換。如果串 中包含有宏中的形參,則將程序語句中相中包含有宏中的形參,則將程序語句中相 應(yīng)的實參(可以是常量、變量或表達(dá)式)應(yīng)的實參(可以是常量、變量或表達(dá)式) 代替形參,如果宏定義中的字符串中的字代替形參,如果宏定義中的字符串中的字 符不是參數(shù)字符

20、,則保留。符不是參數(shù)字符,則保留。 宏定義 l(1)對帶參數(shù)的宏的展開只是將語句中的)對帶參數(shù)的宏的展開只是將語句中的 宏名后面括號內(nèi)的實參字符串代替宏名后面括號內(nèi)的實參字符串代替#define 命令行中的形參。特別要注意多參數(shù)的情命令行中的形參。特別要注意多參數(shù)的情 況;況; l(2)在宏定義時,在宏名與帶參數(shù)的括弧)在宏定義時,在宏名與帶參數(shù)的括弧 之間不應(yīng)加空格,否則將空格以后的字符之間不應(yīng)加空格,否則將空格以后的字符 都作為替代字符串的一部分。都作為替代字符串的一部分。 宏定義 l例例7 宏展開示例宏展開示例 #define PI 3.1415926 #define S(r) PI*(r)*(r) main() float a,b,area; a=1;b=2; area=S(a+b); printf(“area=%fn”,area); 條件編譯條件編譯 l條件編譯就是根據(jù)外部定義的條件去編譯條件編譯就是根據(jù)外部定義的條件去編譯 不同的程序部分,不同的程序部

溫馨提示

  • 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

提交評論