函數(shù)與編譯預處理.ppt_第1頁
函數(shù)與編譯預處理.ppt_第2頁
函數(shù)與編譯預處理.ppt_第3頁
函數(shù)與編譯預處理.ppt_第4頁
函數(shù)與編譯預處理.ppt_第5頁
已閱讀5頁,還剩36頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第6章 函數(shù)與編譯預處理,10學時(課堂+實驗),目錄,6.1 模塊化程序設計與函數(shù) 6.2 函數(shù)的定義與調(diào)用 6.3 函數(shù)的嵌套、遞歸調(diào)用 6.4 變量作用域與存儲方式 6.5 編譯預處理 6.6 函數(shù)設計舉例,模塊化程序設計,在設計較復雜的程序時,我們一般采用的方法是:把問題分成幾個部分,每部分又可分成更細的若干小部分,逐步細化,直至分解成很容易求解的小問題。這樣的話,原來問題的解就可以用這些小問題來表示。 求解小問題的算法和程序稱為“功能模塊”。 在C語言中,這樣的“功能模塊”是通過函數(shù)來實現(xiàn)的,最終函數(shù)通過調(diào)用完成組合,形成的源程序文件就對應完整的功能要求。 函數(shù)是C語言程序最基本的單

2、位,一個C語言源程序往往由一個或多個函數(shù)組成,但是任何一個C語言源程序有且僅有一個main函數(shù),程序執(zhí)行從main函數(shù)開始,在main函數(shù)中結束程序。,函數(shù)的分類,庫函數(shù) 自定義函數(shù),庫函數(shù),#include #include void main() int a, s; a = -100; s = abs(a); printf(數(shù)據(jù)%d的絕對值是%dn,a,s); ,(1)標準庫函數(shù):函數(shù)的功能由系統(tǒng)提供,可以直接調(diào)用。 (2)調(diào)用標準庫函數(shù),必須在程序中用編譯預處理命令把相應的頭文件包含到程序中。 (3)頭文件位于程序開始處。,引例,#include void main() int x,y,

3、sum,maxdata,i; printf(從鍵盤輸入變量x和y的值n); scanf(%d,%d, ,分析程序的功能: (1)輸出20個* (2)計算兩數(shù)之和 (3)找出兩數(shù)之間的大值,自定義函數(shù),用戶根據(jù)實際需求先定義函數(shù),然后通過調(diào)用執(zhí)行函數(shù),實現(xiàn)函數(shù)的功能。 運算類函數(shù):為了完成某類運算,函數(shù)執(zhí)行結束后會得到運算結果,通常需要將這個結果反饋給調(diào)用它的函數(shù)。 操作類函數(shù):為了完成某類操作,函數(shù)的執(zhí)行過程對應一系列操作,這類函數(shù)通常不需要產(chǎn)生反饋結果。,函數(shù)的定義,/函數(shù)首部 函數(shù)類型 函數(shù)名(參數(shù)列表) /大括號內(nèi)的稱為“函數(shù)體” 變量定義語句; 操作語句; return 語句; ,函數(shù)

4、的定義,函數(shù)首部 函數(shù)體 int max(int a, int b) int m; if(ab)m=a; elsem=b; return m; ,函數(shù)首部,函數(shù)類型 函數(shù)名(參數(shù)列表) 對于計算類函數(shù),函數(shù)執(zhí)行結束后將向調(diào)用它的函數(shù)產(chǎn)生一個結果,這個結果的類型就是函數(shù)類型,對于操作類函數(shù),函數(shù)類型通常定義為void。 函數(shù)名由用戶自己定義,其命名規(guī)則和變量名相同。 參數(shù)是指函數(shù)調(diào)用時需要提供的初始數(shù)據(jù),各參數(shù)之間用逗號分隔。 參數(shù)列表的形式為: 參數(shù)1類型 參數(shù)1名,參數(shù)2類型 參數(shù)2名,.,參數(shù)n類型 參數(shù)n名 如果函數(shù)調(diào)用時不需要提供初始數(shù)據(jù),則圓括號內(nèi)的參數(shù)可以為空,但是括號不能省略,這

5、樣的函數(shù)稱為無參函數(shù),反之則為有參函數(shù)。,int max(int a, int b) int m; if(ab)m=a; else m=b; return m; ,函數(shù)體,函數(shù)體由大括號括起來,用于實現(xiàn)函數(shù)功能的若干條語句均寫在函數(shù)體內(nèi)。 計算類函數(shù)需要向調(diào)用它的函數(shù)產(chǎn)生一個反饋結果,這個結果稱為函數(shù)返回值,函數(shù)體內(nèi)需要有return語句。 函數(shù)返回值類型和函數(shù)類型應該一致,不一致時以函數(shù)類型為準。,int max(int a, int b) int m; if(ab)m=a; else m=b; return m; ,程序的執(zhí)行,#include void main() int x=3,y=

6、5,z; int max(int a,int b); z=max(x,y); printf(最大數(shù)是:%dn,z); int max(int a,int b) int m; if(ab)m=a; elsem=b; return m; ,主調(diào)函數(shù):發(fā)出調(diào)用請求的函數(shù)。 被調(diào)用函數(shù):接受調(diào)用請求的函數(shù)。 (1)程序的執(zhí)行是從主函數(shù)main開始的。 (2)遇到調(diào)用語句時,暫停主函數(shù)main的執(zhí)行,轉(zhuǎn)去執(zhí)行被調(diào)用的自定義函數(shù)max。 (3)函數(shù)發(fā)生調(diào)用時,參數(shù)a和b被分別賦值為3和5。 (4)執(zhí)行函數(shù),變量m中存放的是變量a和b中的最大值5,使用return語句將其反饋給調(diào)用它的主函數(shù)main。 (5

7、)被調(diào)用函數(shù)執(zhí)行結束后,返回至主函數(shù)繼續(xù)執(zhí)行,程序在主函數(shù)main中結束。,函數(shù)的參數(shù),參數(shù)的類型 參數(shù)的傳遞,參數(shù)的類型,#include void main()/主調(diào)函數(shù) int x=3,y=5,z; int max(int a,int b); z=max(x,y);/調(diào)用語句 printf(最大數(shù)是:%dn,z); /被調(diào)用的自定義函數(shù)max int max(int a,int b) int m; if(ab)m=a; elsem=b; return m; ,(1)實際參數(shù):主調(diào)函數(shù)中調(diào)用語句括號內(nèi)出現(xiàn)的參數(shù),簡稱實參。 /x和y是實際參數(shù) (2)形式參數(shù):被調(diào)用函數(shù)中函數(shù)定義時括號內(nèi)出

8、現(xiàn)的參數(shù),簡稱形參。 /a和b是形式參數(shù),參數(shù)的傳遞,函數(shù)調(diào)用時,實際參數(shù)按照位置上的對應關系依次傳遞給形式參數(shù)。 值傳遞 地址傳遞 參數(shù)的傳遞為右結合性。,值傳遞,#include void main()/主調(diào)函數(shù) int x=2,y=3; void swap(int a,int b); swap(x,y);/調(diào)用語句 /被調(diào)用的自定義函數(shù)swap void swap(int a, int b) int temp; if(ab) temp=a; a=b; b=temp; ,將實參的數(shù)據(jù)值單向傳遞給對應的形參,但是形參的改變不會影響對應的實參。 (1)主函數(shù)開始執(zhí)行時,給實際參數(shù)分配存儲空存儲

9、變量值。 (2)函數(shù)調(diào)用時,給形式參數(shù)分配空間,實際參數(shù)傳值給對應的形式參數(shù)。 (3)實際參數(shù)和形式參數(shù)占用不同的存儲空間。,函數(shù)的調(diào)用,函數(shù)聲明 嵌套調(diào)用 遞歸調(diào)用,函數(shù)聲明,#include void main()/主調(diào)函數(shù) int x=3,y=2; /函數(shù)聲明 void swap(int a,int b); swap(x,y);/調(diào)用語句 /被調(diào)用的自定義函數(shù)swap void swap(int a,int b) int temp; if(ab) temp=a; a=b; b=temp; ,調(diào)用一個函數(shù)之前,先要對其返回值類型、函數(shù)名和參數(shù)進行聲明。 (1)C語言中,函數(shù)聲明是一條語句,

10、所以函數(shù)聲明的末尾一定要有分號。 (2)函數(shù)聲明的格式和函數(shù)首部的形式是一致的。 (3)聲明參數(shù)時可以只聲明參數(shù)類型,參數(shù)名可以缺省,也就是說以下兩種函數(shù)聲明形式都是正確的。 int max(int x, int y); 或int max(int, int);,#include void main() int x,y; void printstar();/輸出*,圖示中*個數(shù)為20 int sum(int a, int b);/找出兩數(shù)的和 void max(int a, int b);/找出兩數(shù)的最大值 printf(“從鍵盤輸入變量x和y的值n); scanf(%d,%d, /通過對自定義

11、函數(shù)的調(diào)用實現(xiàn)程序功能 ,函數(shù)綜合舉例,已知程序的主函數(shù)main部分代碼如下,請分別設計3個自定義函數(shù)實現(xiàn)圖示的輸出結果。,嵌套調(diào)用,編寫程序,計算圓柱體的體積。,#include #define PI 3.14 float v(float h, float r);/函數(shù)聲明 void main() float h,r,tj; printf(輸入圓柱體的高和圓半徑:); scanf(%f,%f, ,嵌套調(diào)用,float v(float h, float r)/自定義函數(shù)v,求圓柱體體積 float tj; tj=h*PI*r*r; return tj; float s(float r)/自定義

12、函數(shù)s,求圓面積 float area; area=PI*r*r; return area; ,tj=h*s(r); (1) main函數(shù)調(diào)用自定義函數(shù)v (2) 自定義函數(shù)v調(diào)用自定義函數(shù)s,遞歸調(diào)用,#include void main() int x,y,z,n; int max(int a, int b); x=2; y=8; z=-12; /調(diào)用max找出x、y、z的最大值 /并賦值給變量n n = max(y, z); n = max(x, n); printf(“最大值是%dn”,n) ,int max(int a, int b) int m; if(ab)m=a; elsem=

13、b; return m; ,n = max(x, max(y,z);,遞歸調(diào)用,編程計算n!,其中n從鍵盤輸入。,#include void main() int i,n; long result=1; printf(從鍵盤輸入變量n的值n); scanf(%d, ,如果要求設計自定義函數(shù)計算n!,程序該如何編寫呢?,遞歸調(diào)用,編程計算n!,其中n從鍵盤輸入。 分析n!的數(shù)學表達式 (1)當n等于0或1時,n!=1 (2)當n大于等于2時,n!=n*(n-1)*(n-2)*2*1 表達式1 事實上,(n-1)!=(n-1)*(n-2)*2*1 表達式2 合并表達式1和表達式2,可以得到下面的表

14、達式3 (3)n!=n*(n-1)! 如果定義函數(shù)f(n)=n!,那么n!也可以表示為f(n)=n*f(n-1),遞歸調(diào)用,定義函數(shù)f(n)計算n!,/直接遞歸 /函數(shù)在本函數(shù)體內(nèi)直接調(diào)用本函數(shù) long f(int n) long fac; if(n=0 | n=1) fac=1; else fac=n*f(n-1); /*調(diào)用f(n)計算n!的過程中又調(diào)用了函數(shù)f(n-1)*/ return fac; ,遞歸調(diào)用,函數(shù)在執(zhí)行過程中對自己的調(diào)用,稱為函數(shù)的遞歸調(diào)用。 直接遞歸:函數(shù)在本函數(shù)體內(nèi)直接調(diào)用本函數(shù),稱為直接遞歸。 間接遞歸:函數(shù)調(diào)用其它函數(shù),其他函數(shù)又調(diào)用本函數(shù),稱為間接遞歸。 遞

15、歸調(diào)用的兩個條件 要解決的問題可以分解成一個新問題,這個新問題的解法與原問題的解決方案相同,不同的只是數(shù)據(jù)值的變化,也就是調(diào)用時傳遞給形參的數(shù)據(jù)值有所不同。 必須有一個結束條件,在滿足結束條件時遞歸結束。,變量的作用域,變量有效的范圍稱為變量的作用域。 (1)局部變量 (2)全局變量,變量的作用域,局部變量:在某一范圍內(nèi)定義的變量,其作用域僅限于定義它的范圍內(nèi)。 全局變量:定義在函數(shù)之外的變量,它的作用域是從定義處開始,到所在文件結束。 說明: 局部變量只能在定義它的范圍內(nèi)有效,超出該范圍使用即會語法報錯。 不同函數(shù)里面的局部變量可以同名,因為局部變量只在定義它的函數(shù)內(nèi)有效。 一個C文件中的全

16、局變量和局部變量可以同名,但是在局部變量有效的范圍內(nèi)同名的全局變量被屏蔽。,變量的作用域,#include int x1=2,y1=3;/定義全局變量 void main() int x2=5,y2=7;/定義函數(shù)局部變量 int s1,s2,s3; s1=x1+y1; s2=x2+y2; int x3=7,y3=9;/定義復合語句局部變量 s3=x3+y3; printf(全局變量求和:%dn,s1); printf(函數(shù)局部求和:%dn,s2); printf(復合語句局部變量求和:%dn,s3); ,外部變量的使用,如果想在一個C源程序的所有文件中使用全局變量,需要用extern將其聲明

17、為外部變量,語法格式為: extern 全局變量類型 全局變量名;,變量的生存期,動態(tài)變量:變量在使用時才分配存儲空間,使用完畢立即釋放。 靜態(tài)變量:變量在定義時即分配存儲空間直至整個程序結束。 靜態(tài)變量需要用關鍵字static聲明,定義靜態(tài)變量的形式為: static 變量類型 變量名; 說明: 靜態(tài)局部變量作用域僅在定義它的函數(shù)內(nèi)有效,但是它的生存期為整個程序。 靜態(tài)局部變量若未賦初值,系統(tǒng)自動賦值0。 函數(shù)第一次調(diào)用時給靜態(tài)局部變量賦初值,函數(shù)調(diào)用結束,靜態(tài)局部變量的存儲空間不會被釋放。,變量的生存期,編程計算15的階乘并輸出計算結果。,#include int fac(int n);/

18、函數(shù)聲明 void main() int i,result; for(i=1;i=5;i+) result=fac(i); printf(%d! = %dn,i,result); ,int fac(int n) static int f=1; f=f*n; return f; ,編譯預處理,含義:預處理是指在進行詞法掃描和語法分析之前所作的工作。 預處理是C語言的一個重要功能,它由預處理程序負責完成。 預處理命令是“#”開頭的行。一般都放在源程序文件的開頭,被稱為預處理部分。,宏定義,宏定義是用一個標識符來表示一個字符串,這個標識符稱為宏名,定義形式為: #define 宏名(參數(shù)) 字符串

19、無參宏定義 有參宏定義 說明 宏定義不是語句,在行末不加分號。 宏定義必須寫在函數(shù)之外,其作用域為宏定義命令起到源程序結束,使用#undef命令可以終止宏定義的作用域。 宏名一般用大寫字母表示,以便與變量區(qū)別。,宏定義,#include #define PI 3.14 #define M 3 #define N M*M #define L(r) r*r #define S(x) x+2 void main() float area; float s(float radus); area=s(M); printf(圓面積是:%.2fn,area); float s(float radus) float result; result=PI*L(radus); return result; ,/無參宏定義,/有參宏定義,文件包含,文件包含命令行的一般形式: #include 文件名 #include 說明: #include 文件名和#include 的區(qū)別 使用尖括號表示在包含文件目錄中查找,而不在源文件目錄中查找。 使用雙引號表示首先在當前的源文件目錄中查找,若未找到才

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論