c語言第08章函數(shù).ppt_第1頁
c語言第08章函數(shù).ppt_第2頁
c語言第08章函數(shù).ppt_第3頁
c語言第08章函數(shù).ppt_第4頁
c語言第08章函數(shù).ppt_第5頁
已閱讀5頁,還剩56頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第八章 函數(shù),8.1 概述 模塊化程序設(shè)計 基本思想:將一個大的程序按功能分割成一些小模塊, 特點: 各模塊相對獨立、功能單一、結(jié)構(gòu)清晰、接口簡單 控制了程序設(shè)計的復(fù)雜性 提高元件的可靠性 縮短開發(fā)周期 避免程序開發(fā)的重復(fù)勞動 易于維護和功能擴充 開發(fā)方法: 自上向下,逐步分解,分而治之,C是模塊化程序設(shè)計語言,C程序結(jié)構(gòu),C是函數(shù)式語言 必須有且只能有一個名為main的主函數(shù) C程序的執(zhí)行總是從main函數(shù)開始,在main中結(jié)束 函數(shù)不能嵌套定義,可以嵌套調(diào)用,函數(shù)分類 從用戶角度 標(biāo)準(zhǔn)函數(shù)(庫函數(shù)):由系統(tǒng)提供 用戶自定義函數(shù) 從函數(shù)形式 無參函數(shù) 有參函數(shù),使用庫函數(shù)應(yīng)注意: 1、函數(shù)功

2、能 2、函數(shù)參數(shù)的數(shù)目和順序,及各參數(shù)意義和類型 3、函數(shù)返回值意義和類型 4、需要使用的包含文件,8.2 函數(shù)的定義 一般格式,合法標(biāo)識符,函數(shù)返回值類型 缺省int型 無返回值void,函數(shù)體,例 有參函數(shù)(現(xiàn)代風(fēng)格) int max(int x,int y) int z; z=xy?x:y; return(z); ,例 無參函數(shù) printstar( ) printf(“*n”); 或 printstar(void ) printf(“*n”); ,例 有參函數(shù)(傳統(tǒng)風(fēng)格) int max(x,y) int x,y; int z; z=xy?x:y; return(z); ,8.3 函數(shù)

3、的返回值 返回語句 形式: return(表達式); 或 return 表達式; 或 return; 功能:使程序控制從被調(diào)用函數(shù)返回到調(diào)用函數(shù)中,同時把返值帶給調(diào)用函數(shù) 說明: 函數(shù)中可有多個return語句 若無return語句,遇時,自動返回調(diào)用函數(shù) 若函數(shù)類型與return語句中表達式值的類型不一致,按前者為準(zhǔn),自動轉(zhuǎn)換-函數(shù)調(diào)用轉(zhuǎn)換 void型函數(shù),例 無返回值函數(shù) void swap(int x,int y ) int temp; temp=x; x=y; y=temp; ,printstar() printf(*); main() int a; a=printstar(); pr

4、intf(%d,a); ,例 函數(shù)帶回不確定值,輸出:10,void printstar() printf(*); main() int a; a=printstar(); printf(%d,a); ,編譯錯誤!,例 函數(shù)返回值類型轉(zhuǎn)換,main() float a,b; int c; scanf(%f,%f, ,8.4 函數(shù)的調(diào)用 調(diào)用形式 函數(shù)名(實參表); 說明: 實參與形參個數(shù)相等,類型一致,按順序一一對應(yīng) 實參表求值順序,因系統(tǒng)而定(Turbo C 自右向左),main() int i=2,p; p=f(i,+i); printf(%d,p); int f(int a, int b

5、) int c; if(ab) c=1; else if(a=b) c=0; else c=-1; return(c); ,例 參數(shù)求值順序,main() int i=2,p; p=f(i, i+); printf(%d,p); int f(int a, int b) int c; if(ab) c=1; else if(a=b) c=0; else c=-1; return(c); ,運行結(jié)果:0,運行結(jié)果:1,調(diào)用方式 函數(shù)語句: 例 printstar(); printf(“Hello,World!n”); 函數(shù)表達式: 例 m=max(a,b)*2; 函數(shù)參數(shù): 例 printf(“%

6、d”,max(a,b); m=max(a,max(b,c);,函數(shù)說明 對被調(diào)用函數(shù)要求: 必須是已存在的函數(shù) 庫函數(shù): #include 用戶自定義函數(shù): 函數(shù)類型說明 函數(shù)說明 一般形式: 函數(shù)類型 函數(shù)名(形參類型 形參名,. ); 或 函數(shù)類型 函數(shù)名(); 作用:告訴編譯系統(tǒng)函數(shù)類型、參數(shù)個數(shù)及類型,以便檢驗 函數(shù)定義與函數(shù)說明不同 函數(shù)說明位置:程序的數(shù)據(jù)說明部分(函數(shù)內(nèi)或外) 下列情況下,可不作函數(shù)說明 若函數(shù)返值是char或int型,系統(tǒng)自動按int型處理 被調(diào)用函數(shù)定義出現(xiàn)在主調(diào)函數(shù)之前 有些系統(tǒng)(如Borland C+)要求函數(shù)說明指出函數(shù)返值類型和形參類型,并且對void

7、 和 int 型函數(shù)也要進行函數(shù)說明,例 函數(shù)說明舉例,函數(shù)參數(shù)及其傳遞方式 形參與實參 形式參數(shù):定義函數(shù)時函數(shù)名后面括號中的變量名 實際參數(shù):調(diào)用函數(shù)時函數(shù)名后面括號中的表達式,例 比較兩個數(shù)并輸出大者,main() int a,b,c; scanf(%d,%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ù)參數(shù)及其傳遞方式 形參與實參 形式參數(shù):定義函數(shù)時函數(shù)名后面括號中的變量名 實際參數(shù):調(diào)用函數(shù)時函數(shù)名后面括號中的表達式,例 計算x的立

8、方,#include float cube(float x) return(x*x*x); main() float a, product; printf(Please input value of a:); scanf(%f, ,x,1.2,1.2,1.728,參數(shù)傳遞方式 值傳遞方式 方式:函數(shù)調(diào)用時,為形參分配單元,并將實參的值復(fù)制到形參中;調(diào)用結(jié)束,形參單元被釋放,實參單元仍保留并維持原值 特點: 形參與實參占用不同的內(nèi)存單元 單向傳遞,例 交換兩個數(shù),#include main() int x=7,y=11; printf(x=%d,ty=%dn,x,y); printf(swapp

9、ed:n); swap(x,y); printf(x=%d,ty=%dn,x,y); swap(int a,int b) int temp; temp=a; a=b; b=temp; ,地址傳遞 方式:函數(shù)調(diào)用時,將數(shù)據(jù)的存儲地址作為參數(shù)傳遞給形參 特點: 形參與實參占用同樣的存儲單元 “雙向”傳遞 實參和形參必須是地址常量或變量,8.5-6 函數(shù)的嵌套與遞歸調(diào)用 嵌套調(diào)用 C規(guī)定:函數(shù)定義不可嵌套,但可以嵌套調(diào)用函數(shù),例 求三個數(shù)中最大數(shù)和最小數(shù)的差值,#include int dif(int x,int y,int z); int max(int x,int y,int z); int m

10、in(int x,int y,int z); void main() int a,b,c,d; scanf(%d%d%d, ,int dif(int x,int y,int z) return max(x,y,z)-min(x,y,z); int max(int x,int y,int z) int r; r=xy?x:y; return(rz?r:z); int min(int x,int y,int z) int r; r=xy?x:y; return(rz?r:z); ,例 用弦截法求方程根,運行情況: Input x1,x2: 2,6 A root of equation is 5.0

11、000,遞歸調(diào)用 定義:函數(shù)直接或間接的調(diào)用自身叫函數(shù)的遞歸調(diào)用,說明 C編譯系統(tǒng)對遞歸函數(shù)的自調(diào)用次數(shù)沒有限制 每調(diào)用函數(shù)一次,在內(nèi)存堆棧區(qū)分配空間,用于存放函數(shù)變量、返回值等信息,所以遞歸次數(shù)過多,可能引起堆棧溢出,int f(int x) int y,z; z=f(y); . return(2*z); ,例 求n的階乘,#include int fac(int n) int f; if(n0) printf(n0,data error!); else if(n=0|n=1) f=1; else f=fac(n-1)*n; return(f); main() int n, y; print

12、f(Input a integer number:); scanf(%d, ,例 Hanoi問題,void move(char getone, char putone) printf(%c-%cn,getone,putone); void hanoi(int n,char one,char two,char three) if(n=1) move(one,three); else hanoi(n-1,one,three,two); move(one,three); hanoi(n-1,two,one,three); main() int m; printf(Input the number o

13、f disks:); scanf(%d, ,8.7 數(shù)組作為函數(shù)參數(shù) 數(shù)組元素作函數(shù)實參值傳遞,例 兩個數(shù)組大小比較,n=0 m=0 k=0,a和b為有10個元素的整型數(shù)組 比較兩數(shù)組對應(yīng)元素 變量n,m,k記錄aibi, ai=bi, aik,認(rèn)為數(shù)組ab 若nk,認(rèn)為數(shù)組ab 若n=k,認(rèn)為數(shù)組a=b,數(shù)組名作函數(shù)參數(shù) 地址傳遞 在主調(diào)函數(shù)與被調(diào)函數(shù)分別定義數(shù)組,且類型應(yīng)一致 形參數(shù)組大小(多維數(shù)組第一維)可不指定 形參數(shù)組名是地址變量,例 求學(xué)生的平均成績,#include float average(int stu10, int n); void main() int score10,

14、 i; float av; printf(Input 10 scores:n); for( i=0; i10; i+ ) scanf(%d, ,float average(int stu10, int n) int i; float av,total=0; for( i=0; in; i+ ) total += stui; av = total/n; return av; ,實參用數(shù)組名,形參用數(shù)組定義, int stu ,例 數(shù)組元素與 數(shù)組名 作函數(shù)參數(shù)比較,#include void swap2(int x,int y) int z; z=x; x=y; y=z; main() int

15、a2=1,2; swap2(a0,a1); printf(a0=%dna1=%dn,a0,a1); ,值傳遞,#include void swap2(int x) int z; z=x0; x0=x1; x1=z; main() int a2=1,2; swap2(a); printf(a0=%dna1=%dn,a0,a1); ,地址傳遞,例 數(shù)組元素與 數(shù)組名 作函數(shù)參數(shù)比較,例 數(shù)組排序-簡單選擇排序,9,49,i=0,例 數(shù)組排序-簡單選擇排序,13,68,i=1,i=8,例 數(shù)組排序-簡單選擇排序,例 求二維數(shù)組中最大元素值,int max_value(int array34) int

16、 i,j,k,max; max=array00; for(i=0;imax) max=arrayij; return(max); main() int a34=1,3,5,7, 2,4,6,8,15,17,34,12; printf(max value is %dn,max_value(a); ,例 求二維數(shù)組中各行元素之和,get_sum_row(int x3, int result ,int row, int col) int i,j; for(i=0;irow;i+) resulti=0; for(j=0;jcol;j+) resulti+=xij; main() int a23=3,6

17、,9,1,4,7; int sum_row2,row=2,col=3,i; get_sum_row(a,sum_row,row,col); for(i=0;irow;i+) printf(The sum of row%d=%dn,i+1,sum_rowi); ,18,12,8.8 變量的存儲屬性 概述 變量是對程序中數(shù)據(jù)的存儲空間的抽象,編譯或函數(shù)調(diào)用時為其分配內(nèi)存單元,10,程序中使用變量名對內(nèi)存操作,變量的屬性 數(shù)據(jù)類型:變量所持有的數(shù)據(jù)的性質(zhì)(操作屬性) 存儲屬性 存儲器類型:寄存器、靜態(tài)存儲區(qū)、動態(tài)存儲區(qū) 生存期:變量在某一時刻存在-靜態(tài)變量與動態(tài)變量 作用域:變量在某區(qū)域內(nèi)有效-局部

18、變量與全局變量 變量的存儲類型 auto -自動型 register-寄存器型 static -靜態(tài)型 extern -外部型 變量定義格式: 存儲類型 數(shù)據(jù)類型 變量表;,8.8 變量的存儲屬性 概述 變量是對程序中數(shù)據(jù)的存儲空間的抽象,如: int sum; auto int a,b,c; register int i; static float x,y;,局部變量與全局變量 局部變量-內(nèi)部變量 定義:在函數(shù)內(nèi)定義,只在本函數(shù)內(nèi)有效 說明: main中定義的變量只在main中有效 不同函數(shù)中同名變量,占不同內(nèi)存單元 形參屬于局部變量 可定義在復(fù)合語句中有效的變量 局部變量可用存儲類型:au

19、to register static (默認(rèn)為auto),全局變量-外部變量 定義:在函數(shù)外定義,可為本文件所有函數(shù)共用 有效范圍:從定義變量的位置開始到本源文件結(jié)束,及有extern說明的其它源文件,應(yīng)盡量少使用全局變量,因為: 全局變量在程序全部執(zhí)行過程中占用存儲單元 降低了函數(shù)的通用性、可靠性,可移植性 降低程序清晰性,容易出錯,定義 說明 次數(shù): 只能1次 可說明多次 位置: 所有函數(shù)之外 函數(shù)內(nèi)或函數(shù)外 分配內(nèi)存: 分配內(nèi)存,可初始化 不分配內(nèi)存,不可初始化,外部變量說明: extern 數(shù)據(jù)類型 變量表;,外部變量定義與外部變量說明不同,若外部變量與局部變量同名,則外部變量被屏蔽,

20、外部變量可用存儲類型:缺省 或 static,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(arrayimin) min=arrayi; sum+=arrayi; return(sum/n); main() int i; float ave,score10; /*Input */ ave=average(score,10); printf(max=%6.2fnmin=%6.2fn average

21、=%6.2fn,max,min,ave); ,extern char c1,c2;,extern char c1,c2;,運行結(jié)果:max=13,extern int a,b; int max() int z; z=ab?a:b; return(z); main() printf(max=%d,max(); int a=13,b=-8;,int a=3,b=5; max(int a, int b) int c; c=ab?a:b; return(c); main() int a=8; printf(max=%d,max(a,b); ,例 外部變量與局部變量,運行結(jié)果:max=8,int i;

22、main() void prt(); for(i=0;i5;i+) prt(); void prt() for(i=0;i5;i+) printf(“%c”,*); printf(“n”); ,例 外部變量副作用,運行結(jié)果:*,動態(tài)變量與靜態(tài)變量 存儲方式 靜態(tài)存儲:程序運行期間分配固定存儲空間 動態(tài)存儲:程序運行期間根據(jù)需要動態(tài)分配存儲空間 內(nèi)存用戶區(qū),生存期 靜態(tài)變量:從程序開始執(zhí)行到程序結(jié)束 動態(tài)變量:從包含該變量定義的函數(shù)開始執(zhí)行至函數(shù)執(zhí)行結(jié)束,例 文件file1.c int a; main( ) . . f2; . f1; . f1( ) auto int b; f2; . f2(

23、) static int c; ,例 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); ,運行結(jié)果: 3th x=5 2nd x=3 1st x=1,main() void increment(void); increment(); increment(); increment(); void increment(void) int x=0;

24、 x+; printf(“%dn”,x); ,例 局部靜態(tài)變量值具有可繼承性,運行結(jié)果:1 1 1,main() void increment(void); increment(); increment(); increment(); void increment(void) static int x=0; x+; printf(“%dn”,x); ,運行結(jié)果:1 2 3,例 變量的壽命與可見性,#include int i=1; main() static int a; register int b=-10; int c=0; printf(-MAIN-n); printf(i:%d a:%

25、d b:%d c:%dn,i,a,b,c); c=c+8; other(); printf(-MAIN-n); printf(i:%d a:%d b:%d c:%dn,i,a,b,c); i=i+10; other(); ,other() static int a=2; static int b; int c=10; a=a+2; i=i+32; c=c+5; printf(-OTHER-n); printf(i:%d a:%d b:%d c:%dn,i,a,b,c); b=a; ,-Main- i:1 a:0 b:-10 c:0,-Other- i:33 a:4 b:0 c:15,-Main

26、- i:33 a:0 b:-10 c:8,-Other- i:75 a:6 b:4 c:15,8,4,33,15,4,43,6,75,15,6,main() void gx(),gy(); extern int x,y; printf(“1: x=%dty=%dn”,x,y); y=246; gx(); gy(); void gx() extern int x,y; x=135; printf(“2: x=%dty=%dn”,x,y); int x,y; void gy() printf(“3: x=%dty=%dn”,x,y); ,例 用extern擴展外部變量作用域,運行結(jié)果: 1: x=0 y=0 2: x=135 y=246 3: x=135 y=246,例 引用其它文件中的外部變量,例 引用其它文件中的變量,輸出ab和a的m次方,變量存儲類型,局部變量默認(rèn)為auto型 register型變量個數(shù)受限,且不能為long, double, float型 局部static變量具有全局壽命和局部可見性 局部static變量具有

溫馨提示

  • 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

提交評論