第5章 函數(shù)和C程序結(jié)構(gòu)ppt課件_第1頁
第5章 函數(shù)和C程序結(jié)構(gòu)ppt課件_第2頁
第5章 函數(shù)和C程序結(jié)構(gòu)ppt課件_第3頁
第5章 函數(shù)和C程序結(jié)構(gòu)ppt課件_第4頁
第5章 函數(shù)和C程序結(jié)構(gòu)ppt課件_第5頁
已閱讀5頁,還剩50頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、n便于軟件調(diào)試、軟件擴(kuò)充和軟件維護(hù);便于軟件調(diào)試、軟件擴(kuò)充和軟件維護(hù); C源程序源文件源文件1 1 預(yù) 處預(yù) 處理 語理 語句句函函數(shù)數(shù)1 1函 數(shù)函 數(shù)定 義定 義部分部分源文件源文件2 2 源文件源文件n n 函函數(shù)數(shù)2 2函函數(shù)數(shù)mm函 數(shù)函 數(shù)執(zhí) 行執(zhí) 行部分部分傳統(tǒng)風(fēng)格的函數(shù)定義形式類型說明符 函數(shù)名形式參數(shù)表)形式參數(shù)說明 函數(shù)體包括變量的定義和說明以及函數(shù)的執(zhí)行語句)現(xiàn)代風(fēng)格的函數(shù)定義形式類型說明符 函數(shù)名形式參數(shù)表及其說明) 函數(shù)體包括變量的定義和說明以及函數(shù)的執(zhí)行語句) 例:求階乘函數(shù)的傳統(tǒng)風(fēng)格例:求階乘函數(shù)的傳統(tǒng)風(fēng)格 定義形式定義形式 long fac(x) long fa

2、c(x) int x; int x; long y=1; long y=1; int k; int k; for(k=1;k=x ;k+) for(k=1;k=x ;k+) y y* *=k;=k; return y; return y; 例:求階乘函數(shù)的現(xiàn)代風(fēng)格例:求階乘函數(shù)的現(xiàn)代風(fēng)格 定義形式定義形式 long fac(int x) long fac(int x) long y=1; long y=1; int k; int k; for(k=1;k=x ;k+) for(k=1;k=x ;k+) y y* *=k;=k; return y; return y; C序的執(zhí)行總是從主函數(shù)開始

3、的。序的執(zhí)行總是從主函數(shù)開始的。nn#include “ 相應(yīng)頭文件相應(yīng)頭文件 ” 例:自定義函數(shù)的聲明方法 設(shè)在C程序中有如下所示函數(shù)定義 double funa(double a, int b, float c) 函數(shù)體 則在程序中聲明該函數(shù)的方法有: 方法1:double funa(double a, int b, float c); 方法2: double funa(double , int , float );對被調(diào)函數(shù)的聲明示例對被調(diào)函數(shù)的聲明示例#include #include void main()void main() long fac (int n); long fac

4、(int n);/ /* *對函數(shù)對函數(shù)facfac的聲明的聲明* */ / int num; int num; printf(Input the num:); printf(Input the num:); scanf(%d,&num); scanf(%d,&num); printf(%d!=%ldn,num,fac(num); printf(%d!=%ldn,num,fac(num); long fac(int n) /long fac(int n) /函數(shù)函數(shù)facfac的定義的定義 int int i; i; long fact=1; long fact=1; for(

5、i=1;i=n;i+) for(i=1;i=n;i+)factfact* *=i;=i; return fact; return fact; long fac ( int );long fac ( int );long fac (int m);long fac (int m);還可以將聲明語句移到此處還可以將聲明語句移到此處例例5-1 5-1 被調(diào)函數(shù)的聲被調(diào)函數(shù)的聲( (說說) )明方法。明方法。 n現(xiàn)。現(xiàn)。#include #include void main()void main() void swap(int x, int y); void swap(int x, int y); in

6、t a=3,b=5; int a=3,b=5; printf(a=%d,b=%dn,a,b); printf(a=%d,b=%dn,a,b); swap(a,b); swap(a,b); printf(a=%d,b=%dn,a,b); printf(a=%d,b=%dn,a,b); void swap(int x, int y)void swap(int x, int y) int t; int t; t=x t=x; x=y x=y; y=t; y=t; printf(x=%d,y=%dn,x,y); printf(x=%d,y=%dn,x,y); 35ab輸出結(jié)果如下:輸出結(jié)果如下:a=3

7、,b=5a=3,b=5xyt35353x=5,y=3x=5,y=3a=3,b=5a=3,b=5例例5-3 5-3 數(shù)值參數(shù)傳遞方數(shù)值參數(shù)傳遞方式函數(shù)調(diào)用示例。式函數(shù)調(diào)用示例。 #include #include void main()void main() void swap(int void swap(int * *x,int x,int * *y);y); int a=3,b=5; int a=3,b=5; printf(a=%d,b=%dn,a,b); printf(a=%d,b=%dn,a,b); swap(&a,&b); swap(&a,&b); pr

8、intf(a=%d,b=%dn,a,b); printf(a=%d,b=%dn,a,b); void swap(int void swap(int * *x,int x,int * *y)y) int t; int t; t= t=* *x;x; * *x=x=* *y;y; * *y=t;y=t; 35a10002000tb輸出結(jié)果如下:輸出結(jié)果如下:a=3,b=5a=3,b=5xy10002000* *x x 等價于等價于 a a* *y y 等價于等價于 b b353a=5,b=3a=5,b=3例例5-4 5-4 地址值參數(shù)傳地址值參數(shù)傳遞函數(shù)調(diào)用示例。遞函數(shù)調(diào)用示例。#include

9、#include void main()void main() void swap(int void swap(int * *x,int x,int * *y);y); int a=3,b=5; int a=3,b=5; printf(a=%d,b=%dn,a,b); printf(a=%d,b=%dn,a,b); swap(&a,&b); swap(&a,&b); printf(a=%d,b=%dn,a,b); printf(a=%d,b=%dn,a,b); void swap(int void swap(int * *x,int x,int * *y)y)

10、int int * *t;t; t=x; t=x; x=y; x=y; y=t; y=t; 輸出結(jié)果如下:輸出結(jié)果如下:a10002000b53a=3,b=5a=3,b=5txy10002000100020001000a=3,b=5a=3,b=5結(jié)論:用指針變量作為被調(diào)函數(shù)結(jié)論:用指針變量作為被調(diào)函數(shù)形式參數(shù)接收從主調(diào)函數(shù)中傳遞形式參數(shù)接收從主調(diào)函數(shù)中傳遞過來的實參首地址值是在被調(diào)函過來的實參首地址值是在被調(diào)函數(shù)中操作主調(diào)函數(shù)中實參的必要數(shù)中操作主調(diào)函數(shù)中實參的必要條件。條件。 在被調(diào)函數(shù)中操作指針形參在被調(diào)函數(shù)中操作指針形參指向的對象即實參本身則可指向的對象即實參本身則可以達(dá)到在被調(diào)函數(shù)中操

11、作或修改以達(dá)到在被調(diào)函數(shù)中操作或修改主調(diào)函數(shù)實參的目的;主調(diào)函數(shù)實參的目的;在被調(diào)函數(shù)中操作指針形參本在被調(diào)函數(shù)中操作指針形參本身則不能實現(xiàn)在被調(diào)函數(shù)中操作身則不能實現(xiàn)在被調(diào)函數(shù)中操作或修改主調(diào)函數(shù)實參的目的。或修改主調(diào)函數(shù)實參的目的。 例例5-5 5-5 地址值參數(shù)傳遞函數(shù)調(diào)用地址值參數(shù)傳遞函數(shù)調(diào)用示例。示例。a aaiai int a10;int a10;形參:形參:int xint x整型變量)整型變量)實參:實參:aiai(數(shù)組元素)(數(shù)組元素)x x特點:數(shù)組元素作參數(shù)特點:數(shù)組元素作參數(shù)實現(xiàn)的是傳數(shù)值調(diào)用,實現(xiàn)的是傳數(shù)值調(diào)用,參數(shù)傳遞后形參和實參參數(shù)傳遞后形參和實參仍然沒有關(guān)系。仍

12、然沒有關(guān)系。例例5-6 5-6 數(shù)組元素作為函數(shù)調(diào)用實際數(shù)組元素作為函數(shù)調(diào)用實際參數(shù)示例。參數(shù)示例。實參數(shù)組實參數(shù)組a形參數(shù)組形參數(shù)組b注:形參數(shù)組注:形參數(shù)組b本質(zhì)上是指針變量本質(zhì)上是指針變量例例5-7 5-7 編制求和函數(shù)并通過該函數(shù)求數(shù)組的元素值和。編制求和函數(shù)并通過該函數(shù)求數(shù)組的元素值和。實參數(shù)組實參數(shù)組&a2形參數(shù)組形參數(shù)組b注:形參數(shù)組注:形參數(shù)組b本質(zhì)上是指針變量本質(zhì)上是指針變量例例5-8 5-8 編制求和函數(shù)并通過該函數(shù)求數(shù)組自某一元素后的所有元素值編制求和函數(shù)并通過該函數(shù)求數(shù)組自某一元素后的所有元素值和,起始點元素序號從鍵盤上輸入。和,起始點元素序號從鍵盤上輸入。數(shù)組

13、數(shù)組a起始地址起始地址數(shù)組的起始地數(shù)組的起始地址表示方法址表示方法a 表示平面的起始地址表示平面的起始地址(二級地址二級地址)&a00 表示線性的起始地址表示線性的起始地址(一級地址一級地址)a0 表示線性的起始地址表示線性的起始地址(一級地址一級地址)*a 表示線性的起始地址表示線性的起始地址(一級地址一級地址)nn實參用實參用a形參用形參用b5例例5-9 5-9 編制求二維矩陣最大編制求二維矩陣最大元素的函數(shù)元素的函數(shù)( (假定矩陣為假定矩陣為3 3行行4 4列列) ),用相應(yīng)主函數(shù)進(jìn)行測,用相應(yīng)主函數(shù)進(jìn)行測試。試。實參用實參用&a00a0*a形參用形參用b例例5-10 5

14、-10 編制求二維矩編制求二維矩陣最大元素的函數(shù),要陣最大元素的函數(shù),要求函數(shù)能夠處理任意行求函數(shù)能夠處理任意行列的二維數(shù)組,并用相列的二維數(shù)組,并用相應(yīng)主函數(shù)進(jìn)行測試。應(yīng)主函數(shù)進(jìn)行測試。 兩層嵌套函數(shù)調(diào)用過程示意圖兩層嵌套函數(shù)調(diào)用過程示意圖 主函數(shù)主函數(shù)函數(shù)函數(shù)fun1fun1函數(shù)函數(shù)fun2fun2程序運行結(jié)束程序運行結(jié)束調(diào)用函數(shù)調(diào)用函數(shù)fun1fun1調(diào)用函數(shù)調(diào)用函數(shù)fun2fun2fun1fun1調(diào)用結(jié)束調(diào)用結(jié)束fun2fun2調(diào)用結(jié)束調(diào)用結(jié)束例例5-11 5-11 編程序計算編程序計算 ,要求對,要求對n n項的求和以及每一項的求和以及每一項項ikik的計算都用獨立的函數(shù)實現(xiàn),的計算

15、都用獨立的函數(shù)實現(xiàn),k k和和n n的值在主函數(shù)中從鍵盤輸入。的值在主函數(shù)中從鍵盤輸入。kkkns.21輸入數(shù)據(jù):輸入數(shù)據(jù):abc#數(shù)出結(jié)果:數(shù)出結(jié)果:putchar(a)putchar(b)putchar(c)#cba堆棧結(jié)構(gòu)示意堆棧結(jié)構(gòu)示意 ch=a; if(ch=#) putchar(ch); else reverse(); putchar(ch); ch=b; if(ch=#) putchar(ch); else reverse(); putchar(ch); ch=c; if(ch=#) putchar(ch); else reverse(); putchar(ch); ch=#;

16、if(ch=#) putchar(ch); else reverse(); putchar(); reverse();主函數(shù)主函數(shù)輸出輸出#輸輸出出c輸出輸出b輸輸出出a用嵌套調(diào)用方式理解遞歸調(diào)用用嵌套調(diào)用方式理解遞歸調(diào)用例例5-13 5-13 編程序使用遞歸方式求編程序使用遞歸方式求n!n!。分解為遞歸方式即問題的形式和遞歸結(jié)束條件分解為遞歸方式即問題的形式和遞歸結(jié)束條件即最簡問題的解兩個部分。即最簡問題的解兩個部分。n1)2() 1(101)(nnfnfnnf例例5-15 5-15 編程序用遞歸方法求兩個正整數(shù)的最大公約數(shù)。編程序用遞歸方法求兩個正整數(shù)的最大公約數(shù)。0)%(),(0)%()

17、,(nmrrnGcdnmrnnmGcdABC321121解題思想:解題思想: 把把n-1個盤子設(shè)法借助個盤子設(shè)法借助b桿放到桿放到c桿,記做桿,記做hanoi(n-1,A,C,B)3把第把第n n個盤子從個盤子從a a桿移動到桿移動到b b桿桿D1: ABD2: ACD1: BCD3: AB把把c c桿上的桿上的n-1n-1個盤子借助個盤子借助a a桿移動到桿移動到b b桿,記做桿,記做hanoi(n-1,C,B,A)hanoi(n-1,C,B,A)D1: CA 1D2: CB 2D1: AB 1算法:算法:Hanoi(n,A,B,C) Hanoi(n,A,B,C) 算法開始算法開始 If(n

18、=1) then If(n=1) then金盤金盤ABAB盤;盤;/ /* * 如果盤數(shù)如果盤數(shù)n=1n=1即只有一個圓盤即只有一個圓盤 * */ / Else ElseHanoi(n-1,A,C,B) /Hanoi(n-1,A,C,B) /* * 先把先把A A頂上的頂上的n-1n-1個圓盤借助于個圓盤借助于B B移到移到C C* */ / 金盤金盤ABAB盤;盤; / /* *把把A A剩下的最大的圓盤一次移到剩下的最大的圓盤一次移到B B* */ / Hanoi(n-1,C,B,A) / Hanoi(n-1,C,B,A) /* *同樣把同樣把C C中的中的n-1n-1個圓盤借助于個圓盤借

19、助于A A移到移到B B * */ /算法結(jié)束算法結(jié)束 特別提示特別提示 通過計算可以得出,通過計算可以得出,6464個盤的移動次數(shù)為:個盤的移動次數(shù)為: 264-1=18264-1=18,466466,744744,073073,709709,511511,615615次。次。例例5-17 5-17 全局變量的作用域示例。全局變量的作用域示例。n5-19 5-19 5 5號,共輸出號,共輸出5 5行)。行)。n函數(shù)體內(nèi)部函數(shù)體內(nèi)部n復(fù)合語句內(nèi)部復(fù)合語句內(nèi)部int x;void main() x+;void f1() int x=1; int x=2; x+; x+;void f2() x+;

20、全局變量x的作用域函數(shù)內(nèi)部定義的局部變量x的作用域復(fù)合語句內(nèi)部定義的局部變量x的作用域int x;void main() x+;void f1() int x=1; int x=2; x+; x+;void f2() x+;全局變量x的作用域函數(shù)內(nèi)部定義的局部變量x的作用域復(fù)合語句內(nèi)部定義的局部變量x的作用域在函數(shù)中如果定義有與在函數(shù)中如果定義有與全局變量同名的局部變?nèi)肿兞客木植孔兞?,則當(dāng)程序的控制流量,則當(dāng)程序的控制流程進(jìn)入到函數(shù)的作用范程進(jìn)入到函數(shù)的作用范圍時,使用在函數(shù)中定圍時,使用在函數(shù)中定義的局部同名變量;義的局部同名變量;在程序的一個更小局部在程序的一個更小局部范圍復(fù)合語句中

21、如范圍復(fù)合語句中如果定義有與較大范圍果定義有與較大范圍函數(shù)局部或全局變函數(shù)局部或全局變量同名的變量,則當(dāng)程量同名的變量,則當(dāng)程序的控制流程進(jìn)入到這序的控制流程進(jìn)入到這個小的局部范圍時,使個小的局部范圍時,使用在該小局部范圍內(nèi)所用在該小局部范圍內(nèi)所定義的局部同名變量;定義的局部同名變量; 例例5-20 全局變量與局部全局變量與局部變量作用域重疊時使用變量作用域重疊時使用變量示例。變量示例。限制強(qiáng)于擴(kuò)展,即若兩種存儲限制強(qiáng)于擴(kuò)展,即若兩種存儲說明對某外部變量同時出現(xiàn),說明對某外部變量同時出現(xiàn),以限制說明為準(zhǔn)。以限制說明為準(zhǔn)。例例5-21 5-21 全局變量作用域在一個源程全局變量作用域在一個源程序

22、文件序文件C C程序中的擴(kuò)充示例。程序中的擴(kuò)充示例。extern int x;extern int x;extern int y;extern int y;void f1()void f1() x+; x+; y+; y+; int x;int x;x x原作用域原作用域x x的作用域被擴(kuò)充的作用域被擴(kuò)充限制強(qiáng)于擴(kuò)展,即若兩種存儲限制強(qiáng)于擴(kuò)展,即若兩種存儲說明對某外部變量同時出現(xiàn),說明對某外部變量同時出現(xiàn),以限制說明為準(zhǔn)。以限制說明為準(zhǔn)。int x;static int y;extern int x;extern int x;extern int y;yxxy y是靜態(tài)變量,是靜態(tài)變量,不能擴(kuò)展作用域不能擴(kuò)展作用域X原作用范圍例例5-22 5-22 多源程序文件多源程序文件C C程序中使用程序中使用externextern關(guān)鍵字?jǐn)U充全局變量作關(guān)鍵字?jǐn)U充全局變量作用域示例。用域示例。 (static (static關(guān)鍵字對全局變量作用示例關(guān)鍵字對全局變量作用示例) )。(注:參見教材工程文件用法)(注:參見教材工程文件用法)n n宏定義的作用:宏定義的作用: 在宏定義的作用范圍之內(nèi),在宏定義的作用范圍之內(nèi),將所有的宏名用由宏體指定的將所有的宏名用由宏體指定的字符串替換。字符串替換。例例5-24 5-2

溫馨提示

  • 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

提交評論