版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、函數(shù):高級(jí)概念2007年秋1提綱函數(shù)的遞歸調(diào)用數(shù)組作為函數(shù)參數(shù)變量的作用域變量的存儲(chǔ)類別和聲明修飾符動(dòng)態(tài)存儲(chǔ)方式和靜態(tài)存儲(chǔ)方式auto修飾符和register修飾符static修飾符extern修飾符變量的定義與變量的聲明存儲(chǔ)類別小結(jié)內(nèi)部函數(shù)和外部函數(shù)結(jié)束2函數(shù)的遞歸調(diào)用遞歸定義:在調(diào)用一個(gè)函數(shù)的過程中又出現(xiàn)直接或間接地調(diào)用函數(shù)本身的情況,稱為函數(shù)的遞歸調(diào)用。如何判斷遞歸?上述定義也是遞歸的判斷標(biāo)準(zhǔn)! P173為何要引進(jìn)遞歸?簡(jiǎn)化程序設(shè)計(jì),使程序代碼簡(jiǎn)潔易讀!兩種形式的遞歸(模型見P171:圖8-9,圖8-10)直接遞歸:f1中調(diào)用f1間接遞歸:f1中調(diào)用f2、f2再調(diào)用f1遞歸函數(shù)的編寫與使
2、用應(yīng)注意:遞歸函數(shù)一定要有出口示例P172,例8.7,8.8漢諾塔問題遞歸之所以大家覺得難,主要在于不容易被理解。往往用戶無法理解怎么用了“遞歸”,程序如此簡(jiǎn)單,結(jié)果就給算出來了 ,這么神奇!這個(gè)時(shí)候需要認(rèn)真考慮遞歸調(diào)用的實(shí)質(zhì)!返回3遞歸編寫程序的一些思考首先要思考有哪些題目可以用遞歸來解決:?jiǎn)栴}的特征:?jiǎn)栴}的解決依賴于類似問題的解決,只不過后者的復(fù)雜程度或規(guī)模較原來的問題更小,而且一旦將問題的復(fù)雜度或規(guī)模簡(jiǎn)到足夠小,問題就可解。初學(xué)者至少要掌握以下兩種情形: 情形一:一些似乎也可用循環(huán)解決的問題:例8.7,例8.8,P129:6.10此類問題似乎有個(gè)特征,可以“歸納”成數(shù)學(xué)公式! 情形二:一
3、些似乎只能用遞歸的問題:漢諾塔問題對(duì)于第一類問題,編程的要點(diǎn):首先要獲得歸納式,然后要把公式表述出來。一般來說,有一個(gè)if語句,其條件,即使用來描述遞歸跳出條件條件成立時(shí),就是執(zhí)行值確定的情況;條件不成立時(shí),就是執(zhí)行公式的另一部分;對(duì)于第二類問題,編程的要點(diǎn):就是要把工作思路搞清楚什么是工作思路呢?類似P175第三段什么是工作步驟呢?類似P176第五段一般來說,有一個(gè)if語句,其條件:即使用來描述遞歸跳出條件條件成立時(shí),就是工作的最后一步;條件不成立時(shí),就是工作的其他步驟;返回4數(shù)組作為函數(shù)參數(shù)(1)分為三個(gè)主題:數(shù)組元素作為函數(shù)實(shí)參數(shù)組名作為函數(shù)實(shí)參多維數(shù)組名作為函數(shù)參數(shù)數(shù)組元素作為函數(shù)實(shí)參
4、定義與使用 數(shù)組元素可以作為函數(shù)的實(shí)參,與用變量作實(shí)參一樣,是單向傳遞,即“值傳送”方式函數(shù)定義時(shí),通過定義形參來接受實(shí)參的值示例(P178,例8.7.1)回顧下,函數(shù)的三要素如何實(shí)現(xiàn)使用數(shù)組元素來調(diào)用函數(shù)的關(guān)于數(shù)組的基本操作及在實(shí)際操作時(shí)賦初值的作用“/”的作用返回注意:這里只是細(xì)化了“數(shù)組作為函數(shù)中的參數(shù)”這一具體問題!始終都要考慮函數(shù)的三要素!5數(shù)組作為函數(shù)參數(shù)(2)數(shù)組名作為函數(shù)的參數(shù)定義與使用定義時(shí),形參數(shù)組采用:類似數(shù)組定義的形式:float average(float array10)可以不指定數(shù)組大?。篺loat average(float array,int n)調(diào)用時(shí),實(shí)參
5、數(shù)組是相應(yīng)的數(shù)組名實(shí)參數(shù)組與形參數(shù)組的元素類型應(yīng)該一致注意用數(shù)組名作為參數(shù)時(shí),傳遞的不是數(shù)組的值,而是實(shí)參數(shù)組的首地址實(shí)參數(shù)組和形參數(shù)組大小可以不一致,甚至可以在定義函數(shù)時(shí)候省略對(duì)形參數(shù)組長(zhǎng)度的定義。思考,傳遞數(shù)組長(zhǎng)度的必要性?!由于傳遞的是地址,所以形式參數(shù)和實(shí)際參數(shù)共享同一段存儲(chǔ)空間。其含義:在子函數(shù)中對(duì)數(shù)組元素值的改變將直接影響到主函數(shù)中的值。示例返回6數(shù)組作為函數(shù)參數(shù)(3)多維數(shù)組名作為函數(shù)的參數(shù)定義與使用定義時(shí),形參數(shù)組采用:類似數(shù)組定義的形式:float average(float array56)可以省略第一維的大小:float average(float array6)調(diào)用時(shí),
6、實(shí)參數(shù)組是相應(yīng)的數(shù)組名實(shí)參數(shù)組與形參數(shù)組的元素類型應(yīng)該一致注意用數(shù)組名作為參數(shù)時(shí),傳遞的不是數(shù)組的值,而是實(shí)參數(shù)組的首地址實(shí)參數(shù)組和形參數(shù)組大小可以不一致由于傳遞的是地址,所以形式參數(shù)和實(shí)際參數(shù)共享同一段存儲(chǔ)空間。其含義:在子函數(shù)中對(duì)數(shù)組元素值的改變將直接影響到主函數(shù)中的值。示例 P183,例8.14 強(qiáng)調(diào)兩者用相同的一段空間!返回7變量作用域(1)變量定義的兩種位置(位置決定了內(nèi)外部變量)在所有函數(shù)之外在塊內(nèi)的開頭部分在塊內(nèi)的開頭部分定義的變量稱為內(nèi)部變量。內(nèi)部變量只在所在塊中有效,故稱局部變量。函數(shù)體是典型的塊,所以在函數(shù)聲明語句部分定義的變量也是局部變量。形式參數(shù)只在函數(shù)中有效,也是局部
7、變量。在所有函數(shù)之外定義的變量稱為外部變量。例子外部變量的有效范圍為從定義變量的位置開始到所在文件的結(jié)束,可以由其有效范圍內(nèi)的多個(gè)函數(shù)共用,因而也稱為全局變量或全程變量。注意,這體現(xiàn)了全局變量的優(yōu)點(diǎn)!變量的有效范圍稱為變量的作用域。 內(nèi)部、外部變量是從定義的位置來看!而全局、局部變量是從有效性來看!思考,什么叫有效性?8變量作用域(2)使用全局變量的優(yōu)點(diǎn)(P185)使用全局變量的缺點(diǎn):全局變量在全部執(zhí)行過程中都占用存儲(chǔ)單元。使用全局變量將降低函數(shù)的通用性。使用全局變量過多,將導(dǎo)致程序的清晰性降低。如果在變量的作用域中又定義了同名的變量,則內(nèi)層的變量將“屏蔽”外層變量,使之暫時(shí)失效。例子見P18
8、7返回int x, y;func() int x; main() int x, z; if() int x, z; xyz9動(dòng)態(tài)存儲(chǔ)方式和靜態(tài)存儲(chǔ)方式靜態(tài)存儲(chǔ)方式是指在程序運(yùn)行期間分配固定的存儲(chǔ)空間的方式。動(dòng)態(tài)存儲(chǔ)方式則是在程序運(yùn)行期間根據(jù)需要進(jìn)行動(dòng)態(tài)的分配存儲(chǔ)空間的方式。內(nèi)存中供用戶使用的存儲(chǔ)空間情況(P188)全局變量、加static修飾的局部變量放在靜態(tài)存儲(chǔ)區(qū)中;形式參數(shù)、未加static修飾的局部變量放在動(dòng)態(tài)存儲(chǔ)區(qū)中。返回10auto修飾符和register修飾符auto修飾符函數(shù)中的局部變量,如果不專門聲明為static存儲(chǔ)類別,都是動(dòng)態(tài)地分配存儲(chǔ)空間的。這類局部變量稱為自動(dòng)變量。自
9、動(dòng)變量的特征(P189)定義自動(dòng)變量用auto修飾符。auto可以省略。register變量變量的值是放在內(nèi)存中的,C語言還允許將局部變量放在CPU的寄存器中。這種變量叫做寄存器變量使用寄存器變量的好處:提高執(zhí)行效率定義寄存器變量使用register修飾符只有局部自動(dòng)變量和形式參數(shù)可以作為寄存器變量一個(gè)計(jì)算機(jī)系統(tǒng)中的寄存器數(shù)目是有限的,register修飾符只是一種建議。返回11static修飾符(1)普通局部變量只在函數(shù)的本次調(diào)用中有效,其值在離開相應(yīng)函數(shù)就消失了。有時(shí)希望函數(shù)中的局部變量的值在函數(shù)調(diào)用結(jié)束后不消失,下次函數(shù)調(diào)用時(shí)候可以使用。這時(shí)應(yīng)該指定該局部變量為“靜態(tài)局部變量”,用關(guān)鍵字
10、static進(jìn)行聲明。靜態(tài)局部變量屬于靜態(tài)存儲(chǔ)類別,在靜態(tài)存儲(chǔ)區(qū)內(nèi)分配存儲(chǔ)單元。在使用時(shí),靜態(tài)局部變量一般是在子函數(shù)中定義。12static修飾符(2)對(duì)靜態(tài)局部變量是在編譯時(shí)賦初值的,即只賦初值一次。在定義局部變量時(shí)如果不賦初值,則對(duì)于靜態(tài)局部變量將自動(dòng)被賦0或空字符而自動(dòng)變量則取一個(gè)不確定的值。值得注意的是:靜態(tài)局部變量在其它函數(shù)中是不可見的。P191若非必要,不要多用靜態(tài)局部變量,需要用局部變量的情況:需要保留函數(shù)上一次調(diào)用結(jié)束時(shí)的值如果初始化后,變量只被引用而不改變其值示例返回13extern修飾符外部變量的作用域?yàn)閺淖兞康亩x處開始,到本程序文件的末尾.注意:”外部”的說法來源于其定
11、義的位置!用extern聲明變量,可擴(kuò)展相應(yīng)外部變量作用域多文件:如果想使用外部程序文件中定義的外部變量(左)文件內(nèi):如果想在外部變量定義點(diǎn)之前使用該外部變量(右)用extern聲明變量時(shí),類型名可以省略。注意位置! 返回int x;extern x;x=3;extern x;x=3;int x;14變量的定義與變量的聲明除了變量名外變量還有如下兩個(gè)要素值:變量的內(nèi)容地址:變量所對(duì)應(yīng)存儲(chǔ)單元的首地址對(duì)于強(qiáng)類型語言,變量都有類型。類型實(shí)際上指出了變量所對(duì)應(yīng)存儲(chǔ)單元的大小。變量的定義除了指定變量名和類型的之間的對(duì)應(yīng)關(guān)系外,還建立了相應(yīng)的存儲(chǔ)單元。變量的聲明則只指定了變量名和類型之間的對(duì)應(yīng)關(guān)系。帶上
12、extern修飾符實(shí)際上是只聲明了相應(yīng)的變量外部變量只能定義一次,而聲明可以有多次。變量一定要定義,但未必需要聲明。返回15內(nèi)部函數(shù)和外部函數(shù)內(nèi)部函數(shù)如果一個(gè)函數(shù)只能被本文件中的其他函數(shù)調(diào)用,稱為內(nèi)部函數(shù)。定義內(nèi)部函數(shù)時(shí)在函數(shù)首部的最前面應(yīng)加static。內(nèi)部函數(shù)(靜態(tài)函數(shù))的功能外部函數(shù)在定義函數(shù)時(shí),如果在函數(shù)首部的最左加上關(guān)鍵字extern表示此函數(shù)是外部函數(shù)可供其他文件調(diào)用。C語言規(guī)定,如果在定義函數(shù)時(shí)省略extern,則隱含為外部函數(shù).在需要調(diào)用外部函數(shù)的地方,用extern聲明所用的函數(shù)是外部函數(shù)。注意:內(nèi)部函數(shù)和外部函數(shù)強(qiáng)調(diào)的是函數(shù)在不同文件中!返回16函數(shù)的小結(jié)學(xué)習(xí)時(shí):一定要慢慢
13、去體會(huì),引進(jìn)函數(shù)的功能牢記函數(shù)三個(gè)要素關(guān)于函數(shù)的調(diào)用(一定要記住的原則是?)簡(jiǎn)單調(diào)用嵌套調(diào)用遞歸調(diào)用(有一個(gè)”推”的過程和一個(gè)”歸”的過程)關(guān)于函數(shù)的參數(shù)變量為實(shí)參數(shù)組元素為實(shí)參數(shù)組名為實(shí)參(一定要記住”共用存儲(chǔ)空間”這一特性!)再從兩個(gè)角度對(duì)變量進(jìn)行研究(這些角度對(duì)程序值的影響!)從變量的作用域角度:全局和局部變量(內(nèi)部與外部變量)從變量的生存期角度:動(dòng)態(tài)存儲(chǔ)和靜態(tài)存儲(chǔ)auto; static; register; extern;內(nèi)外部函數(shù)返回17示例:數(shù)組作為函數(shù)參數(shù)(1)void swap(int a) int t; t=a0; a0=a1; a1=t;main() int temp2,
14、 a, b; scanf(%d%d, &a, &b); printf(a=%d,b=%dn, a, b); temp0=a; temp1=b; swap(temp); a=temp0; b=temp1; printf(a=%d,b=%dn, a, b);注意:引進(jìn)此例題的目的是要考察數(shù)組a和數(shù)組temp指向同一組空間.正是由于指向了同一段存儲(chǔ)空間,因此在子函數(shù)中對(duì)值的改變也將體現(xiàn)在主函數(shù)中!18示例:數(shù)組作為函數(shù)參數(shù)(2)void sort(int array,int n) int i, j, k, t; for(i=0;in-1;i+) k=i;for(j=i+1; jn; j+) if(a
15、rrayjarrayk) k=j; t=arrayk; arrayk=arrayi; arrayi=t; main() int a10,i; printf(enter the arrayn); for(i=0;i10;i+) scanf(%d, &ai); sort(a,10); for(i=0;i10;i+) printf(%d , ai); printf(n);返回一 , 此題使用選擇法排序,該法與冒泡法的異同點(diǎn):1 冒泡法,在處理的時(shí)候,是兩個(gè)兩兩交換位置,換一個(gè)數(shù),全部數(shù)的位置改變;2 選擇法,在處理的時(shí)候,是只有兩個(gè)數(shù)交換位置,換一個(gè)數(shù),只有兩個(gè)數(shù)位置改變。但是,無論如何都必須使用循
16、環(huán)的嵌套,并且循環(huán)變量間有對(duì)應(yīng)的關(guān)系!二 , 此題的引入同7.2比較,算法沒有變化,只是引進(jìn)了數(shù)組作為參數(shù)的情況!注意:1 sort()函數(shù)的類型為void2 并且sort()中沒有輸出語句這是否可以給我們一個(gè)借鑒?通過子函數(shù)對(duì)主函數(shù)中相同空間的操作,在主函數(shù)中輸出19示例:遞歸函數(shù)執(zhí)行情況分析#include int i=1;int age(int n) int c; if (n=1) c=10; printf(第%d次返回:值為%d. n,i,c); else c=age(n-1)+2; i+; printf(第%d次返回:值為%d. n,i,c); return c; void main
17、() printf(%d,age(5);返回注意:1 找出遞歸;2 需要研究?jī)?nèi)在的執(zhí)行過程,見圖8-1220示例:遞歸函數(shù)執(zhí)行情況分析#include int i=1;int age(int n) int c; if (n=1) c=10; printf(第%d次返回:值為%d. n,i,c); else c=age(n-1)+2; i+; printf(第%d次返回:值為%d. n,i,c); return c; void main() printf(%d,age(5);返回注意:1 找出遞歸;2 需要研究?jī)?nèi)在的執(zhí)行過程,見圖8-12原則:發(fā)生函數(shù)調(diào)用時(shí),主調(diào)函數(shù)的執(zhí)行在函數(shù)調(diào)用處暫時(shí)被掛起,程序控制離開主調(diào)函數(shù)轉(zhuǎn)入被調(diào)函數(shù)執(zhí)行只有當(dāng)被調(diào)函數(shù)執(zhí)行完后,才返回到主調(diào)函數(shù)的調(diào)用點(diǎn)繼續(xù)向下執(zhí)行,所以主調(diào)函數(shù)一定要在被調(diào)函數(shù)執(zhí)行完后才能繼續(xù)執(zhí)行并結(jié)束。變量的問題:每次調(diào)用就新生成新的變量空間(形參和局部變量)!21示例:Fibonacci數(shù)列求Fibonacci數(shù)列的前20項(xiàng)int f(int n) if(n=1|n=2) return 1; else return f(n-1)+f(n-2);main() int i; for(i=1;i=20;i+) if(i-1)%5=0) printf(n); printf(%12d,f(i); 返回注意:1
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 定金罰則法律風(fēng)險(xiǎn)
- 誠實(shí)保證字萬能保證書
- 招標(biāo)文件條款的全面解讀與實(shí)踐
- 招標(biāo)文件商務(wù)評(píng)分的操作流程
- 正規(guī)訂餐服務(wù)合同樣本
- 非受雇關(guān)系非固定員工聲明書
- 技術(shù)支持服務(wù)合同樣本
- 招標(biāo)房屋租賃信息
- 招標(biāo)信息格式技巧
- 招標(biāo)文件疑問全解析
- XX公司學(xué)歷、職稱、技能工資補(bǔ)貼規(guī)定
- 廣東省江門市2022-2023學(xué)年高一上學(xué)期期末調(diào)研考試物理試題(一)
- 超高大截面框架柱成型質(zhì)量控制
- 簡(jiǎn)單年會(huì)策劃方案
- GB/T 38228-2019呼吸防護(hù)自給閉路式氧氣逃生呼吸器
- 廣東省深圳市羅湖區(qū)五年級(jí)上冊(cè)期末數(shù)學(xué)試卷(及答案)
- 酒店安全用電常識(shí)介紹課件
- 皇帝的新裝英語話劇劇本
- 頂管施工詳解上課講義共課件
- is620p系列伺服用戶手冊(cè)-v0.2綜合版
- 差動(dòng)保護(hù)培訓(xùn)技巧電氣稿課件
評(píng)論
0/150
提交評(píng)論