




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、函數:高級概念2007年秋1提綱函數的遞歸調用數組作為函數參數變量的作用域變量的存儲類別和聲明修飾符動態存儲方式和靜態存儲方式auto修飾符和register修飾符static修飾符extern修飾符變量的定義與變量的聲明存儲類別小結內部函數和外部函數結束2函數的遞歸調用遞歸定義:在調用一個函數的過程中又出現直接或間接地調用函數本身的情況,稱為函數的遞歸調用。如何判斷遞歸?上述定義也是遞歸的判斷標準! P173為何要引進遞歸?簡化程序設計,使程序代碼簡潔易讀!兩種形式的遞歸(模型見P171:圖8-9,圖8-10)直接遞歸:f1中調用f1間接遞歸:f1中調用f2、f2再調用f1遞歸函數的編寫與使
2、用應注意:遞歸函數一定要有出口示例P172,例8.7,8.8漢諾塔問題遞歸之所以大家覺得難,主要在于不容易被理解。往往用戶無法理解怎么用了“遞歸”,程序如此簡單,結果就給算出來了 ,這么神奇!這個時候需要認真考慮遞歸調用的實質!返回3遞歸編寫程序的一些思考首先要思考有哪些題目可以用遞歸來解決:問題的特征:問題的解決依賴于類似問題的解決,只不過后者的復雜程度或規模較原來的問題更小,而且一旦將問題的復雜度或規模簡到足夠小,問題就可解。初學者至少要掌握以下兩種情形: 情形一:一些似乎也可用循環解決的問題:例8.7,例8.8,P129:6.10此類問題似乎有個特征,可以“歸納”成數學公式! 情形二:一
3、些似乎只能用遞歸的問題:漢諾塔問題對于第一類問題,編程的要點:首先要獲得歸納式,然后要把公式表述出來。一般來說,有一個if語句,其條件,即使用來描述遞歸跳出條件條件成立時,就是執行值確定的情況;條件不成立時,就是執行公式的另一部分;對于第二類問題,編程的要點:就是要把工作思路搞清楚什么是工作思路呢?類似P175第三段什么是工作步驟呢?類似P176第五段一般來說,有一個if語句,其條件:即使用來描述遞歸跳出條件條件成立時,就是工作的最后一步;條件不成立時,就是工作的其他步驟;返回4數組作為函數參數(1)分為三個主題:數組元素作為函數實參數組名作為函數實參多維數組名作為函數參數數組元素作為函數實參
4、定義與使用 數組元素可以作為函數的實參,與用變量作實參一樣,是單向傳遞,即“值傳送”方式函數定義時,通過定義形參來接受實參的值示例(P178,例8.7.1)回顧下,函數的三要素如何實現使用數組元素來調用函數的關于數組的基本操作及在實際操作時賦初值的作用“/”的作用返回注意:這里只是細化了“數組作為函數中的參數”這一具體問題!始終都要考慮函數的三要素!5數組作為函數參數(2)數組名作為函數的參數定義與使用定義時,形參數組采用:類似數組定義的形式:float average(float array10)可以不指定數組大小:float average(float array,int n)調用時,實參
5、數組是相應的數組名實參數組與形參數組的元素類型應該一致注意用數組名作為參數時,傳遞的不是數組的值,而是實參數組的首地址實參數組和形參數組大小可以不一致,甚至可以在定義函數時候省略對形參數組長度的定義。思考,傳遞數組長度的必要性?!由于傳遞的是地址,所以形式參數和實際參數共享同一段存儲空間。其含義:在子函數中對數組元素值的改變將直接影響到主函數中的值。示例返回6數組作為函數參數(3)多維數組名作為函數的參數定義與使用定義時,形參數組采用:類似數組定義的形式:float average(float array56)可以省略第一維的大小:float average(float array6)調用時,
6、實參數組是相應的數組名實參數組與形參數組的元素類型應該一致注意用數組名作為參數時,傳遞的不是數組的值,而是實參數組的首地址實參數組和形參數組大小可以不一致由于傳遞的是地址,所以形式參數和實際參數共享同一段存儲空間。其含義:在子函數中對數組元素值的改變將直接影響到主函數中的值。示例 P183,例8.14 強調兩者用相同的一段空間!返回7變量作用域(1)變量定義的兩種位置(位置決定了內外部變量)在所有函數之外在塊內的開頭部分在塊內的開頭部分定義的變量稱為內部變量。內部變量只在所在塊中有效,故稱局部變量。函數體是典型的塊,所以在函數聲明語句部分定義的變量也是局部變量。形式參數只在函數中有效,也是局部
7、變量。在所有函數之外定義的變量稱為外部變量。例子外部變量的有效范圍為從定義變量的位置開始到所在文件的結束,可以由其有效范圍內的多個函數共用,因而也稱為全局變量或全程變量。注意,這體現了全局變量的優點!變量的有效范圍稱為變量的作用域。 內部、外部變量是從定義的位置來看!而全局、局部變量是從有效性來看!思考,什么叫有效性?8變量作用域(2)使用全局變量的優點(P185)使用全局變量的缺點:全局變量在全部執行過程中都占用存儲單元。使用全局變量將降低函數的通用性。使用全局變量過多,將導致程序的清晰性降低。如果在變量的作用域中又定義了同名的變量,則內層的變量將“屏蔽”外層變量,使之暫時失效。例子見P18
8、7返回int x, y;func() int x; main() int x, z; if() int x, z; xyz9動態存儲方式和靜態存儲方式靜態存儲方式是指在程序運行期間分配固定的存儲空間的方式。動態存儲方式則是在程序運行期間根據需要進行動態的分配存儲空間的方式。內存中供用戶使用的存儲空間情況(P188)全局變量、加static修飾的局部變量放在靜態存儲區中;形式參數、未加static修飾的局部變量放在動態存儲區中。返回10auto修飾符和register修飾符auto修飾符函數中的局部變量,如果不專門聲明為static存儲類別,都是動態地分配存儲空間的。這類局部變量稱為自動變量。自
9、動變量的特征(P189)定義自動變量用auto修飾符。auto可以省略。register變量變量的值是放在內存中的,C語言還允許將局部變量放在CPU的寄存器中。這種變量叫做寄存器變量使用寄存器變量的好處:提高執行效率定義寄存器變量使用register修飾符只有局部自動變量和形式參數可以作為寄存器變量一個計算機系統中的寄存器數目是有限的,register修飾符只是一種建議。返回11static修飾符(1)普通局部變量只在函數的本次調用中有效,其值在離開相應函數就消失了。有時希望函數中的局部變量的值在函數調用結束后不消失,下次函數調用時候可以使用。這時應該指定該局部變量為“靜態局部變量”,用關鍵字
10、static進行聲明。靜態局部變量屬于靜態存儲類別,在靜態存儲區內分配存儲單元。在使用時,靜態局部變量一般是在子函數中定義。12static修飾符(2)對靜態局部變量是在編譯時賦初值的,即只賦初值一次。在定義局部變量時如果不賦初值,則對于靜態局部變量將自動被賦0或空字符而自動變量則取一個不確定的值。值得注意的是:靜態局部變量在其它函數中是不可見的。P191若非必要,不要多用靜態局部變量,需要用局部變量的情況:需要保留函數上一次調用結束時的值如果初始化后,變量只被引用而不改變其值示例返回13extern修飾符外部變量的作用域為從變量的定義處開始,到本程序文件的末尾.注意:”外部”的說法來源于其定
11、義的位置!用extern聲明變量,可擴展相應外部變量作用域多文件:如果想使用外部程序文件中定義的外部變量(左)文件內:如果想在外部變量定義點之前使用該外部變量(右)用extern聲明變量時,類型名可以省略。注意位置! 返回int x;extern x;x=3;extern x;x=3;int x;14變量的定義與變量的聲明除了變量名外變量還有如下兩個要素值:變量的內容地址:變量所對應存儲單元的首地址對于強類型語言,變量都有類型。類型實際上指出了變量所對應存儲單元的大小。變量的定義除了指定變量名和類型的之間的對應關系外,還建立了相應的存儲單元。變量的聲明則只指定了變量名和類型之間的對應關系。帶上
12、extern修飾符實際上是只聲明了相應的變量外部變量只能定義一次,而聲明可以有多次。變量一定要定義,但未必需要聲明。返回15內部函數和外部函數內部函數如果一個函數只能被本文件中的其他函數調用,稱為內部函數。定義內部函數時在函數首部的最前面應加static。內部函數(靜態函數)的功能外部函數在定義函數時,如果在函數首部的最左加上關鍵字extern表示此函數是外部函數可供其他文件調用。C語言規定,如果在定義函數時省略extern,則隱含為外部函數.在需要調用外部函數的地方,用extern聲明所用的函數是外部函數。注意:內部函數和外部函數強調的是函數在不同文件中!返回16函數的小結學習時:一定要慢慢
13、去體會,引進函數的功能牢記函數三個要素關于函數的調用(一定要記住的原則是?)簡單調用嵌套調用遞歸調用(有一個”推”的過程和一個”歸”的過程)關于函數的參數變量為實參數組元素為實參數組名為實參(一定要記住”共用存儲空間”這一特性!)再從兩個角度對變量進行研究(這些角度對程序值的影響!)從變量的作用域角度:全局和局部變量(內部與外部變量)從變量的生存期角度:動態存儲和靜態存儲auto; static; register; extern;內外部函數返回17示例:數組作為函數參數(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);注意:引進此例題的目的是要考察數組a和數組temp指向同一組空間.正是由于指向了同一段存儲空間,因此在子函數中對值的改變也將體現在主函數中!18示例:數組作為函數參數(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);返回一 , 此題使用選擇法排序,該法與冒泡法的異同點:1 冒泡法,在處理的時候,是兩個兩兩交換位置,換一個數,全部數的位置改變;2 選擇法,在處理的時候,是只有兩個數交換位置,換一個數,只有兩個數位置改變。但是,無論如何都必須使用循
16、環的嵌套,并且循環變量間有對應的關系!二 , 此題的引入同7.2比較,算法沒有變化,只是引進了數組作為參數的情況!注意:1 sort()函數的類型為void2 并且sort()中沒有輸出語句這是否可以給我們一個借鑒?通過子函數對主函數中相同空間的操作,在主函數中輸出19示例:遞歸函數執行情況分析#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 需要研究內在的執行過程,見圖8-1220示例:遞歸函數執行情況分析#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 需要研究內在的執行過程,見圖8-12原則:發生函數調用時,主調函數的執行在函數調用處暫時被掛起,程序控制離開主調函數轉入被調函數執行只有當被調函數執行完后,才返回到主調函數的調用點繼續向下執行,所以主調函數一定要在被調函數執行完后才能繼續執行并結束。變量的問題:每次調用就新生成新的變量空間(形參和局部變量)!21示例:Fibonacci數列求Fibonacci數列的前20項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等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年秋新人教版八年級上冊道德與法治教學課件 2.2 做更好的自己
- 專題:第16章二次根式綜合與實踐-“比大小”新探教學設計2024-2025學年人教版數學八年級下冊
- 采購合同風險財務風險財務風險咨詢重點基礎知識點
- 門診護士長年終總結
- 二零二五企業股東退股轉讓協議書范例
- 銀行對周邊商戶行業走訪
- 二零二五運輸公司員工聘用合同書
- 物流倉儲合同范本
- 顱內血腫清除護理常規
- 2025年成人高考《語文》語言邏輯能力提升題庫試題解析
- 2023年鄭州軌道工程職業學院單招職業適應性考試題庫及答案1套
- 2025年許昌職業技術學院單招職業技能測試題庫附答案
- 國家糧食和物資儲備局直屬聯系單位招聘筆試真題2024
- 2024年新食品安全法相關試題及答案
- 新疆阿克蘇地區拜城縣2023-2024學年七年級下學期數學期中考試試題(含答案)
- 攀枝花2025年四川攀枝花市仁和區事業單位春季引才(15人)筆試歷年參考題庫附帶答案詳解
- 2025-2030全球及中國煉油廠服務行業市場現狀供需分析及投資評估規劃分析研究報告
- 勞務派遣標書項目實施方案
- 手術安全管理課件圖文
- 2025年河南經貿職業學院高職單招職業技能考試題庫附答案解析
- 2025年《義務教育小學美術課程標準測試卷2022版》測試題庫及答案
評論
0/150
提交評論