




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1、課程進程,過程化編程之函數(shù)機制,C+語言程序設(shè)計,任課教師:馬彥卓,函數(shù)和函數(shù)機制,函數(shù) C+的函數(shù)是完成既定任務(wù)的功能(過程)體,它涵蓋了數(shù)學(xué)函數(shù)和一般過程所以基于過程編程本質(zhì)上就是基于函數(shù)編程。 函數(shù)機制 一是指程序運行過程中對函數(shù)調(diào)用的數(shù)據(jù)管理和處理過程 二是指編程中函數(shù)的使用規(guī)范它包括 函數(shù)參數(shù)的屬性和傳遞規(guī)則 函數(shù)返回類型的匹配與審查 函數(shù)名字的識別原則 函數(shù)體效率的選擇 函數(shù)體中數(shù)據(jù)的訪問權(quán)限 等,第五章 函數(shù)機制 Chapter 5 Function Mechanism,Contents,5.main參數(shù) ( The mains Parameters ),1.函數(shù)性質(zhì)( Func
2、tion Character ),2.指針參數(shù) ( Pointer Parameters ),3.棧機制 ( Stack Mechanism ),4.函數(shù)指針 ( Function Pointers ),6.遞歸函數(shù) ( Recursive Functions ),7.函數(shù)重載 ( Function Overload ),函數(shù)機制,函數(shù)性質(zhì) ( Function Character ),函數(shù): 對輸入?yún)?shù)負(fù)責(zé),埋頭做自己的事,最終返回結(jié)果 函數(shù)組織: 通過在函數(shù)中進行函數(shù)調(diào)用來擴展運行的規(guī)模,層層疊疊的函數(shù)構(gòu)成樹結(jié)構(gòu) 做法: 將若干個函數(shù)組織成文件,又將若干個文件構(gòu)成程序的辦法來進行編程分工,
3、函數(shù)性質(zhì) ( Function Character ),跨越數(shù)學(xué)函數(shù)的C+函數(shù),有四種形態(tài) P135 返回類型 func ( 參數(shù)列表 ) ; 返回類型 func ( ) ; void func ( 參數(shù)列表 ) ; void func ( ) ;,函數(shù)性質(zhì) ( Function Character ),黑盒原則:函數(shù)使用者應(yīng)關(guān)注性能,而少去左右實現(xiàn)細(xì)節(jié) (P136例5.1),int cost ( int n, int m ) return n*10; / 運輸n次m斤 int cost ( int n, int m ) return m*10; / 運輸m次n斤 / 選擇一個最好的 int
4、cost ( int n, int m ) return (nm? m:n)*10; / 保證運輸次數(shù)最少 ,void f(Type a); /a為形參 void g() Type x; f(x); /x為實參 ,函數(shù)性質(zhì) ( Function Character ),傳值參數(shù):形參是對實參的克隆,克隆必須遵守類型匹配規(guī)則 (P138),a實體,x實體,復(fù)制,Type類型,Type類型,. 指針參數(shù) ( Pointer Parameters ),當(dāng)一個函數(shù)對大量數(shù)據(jù)進行處理時,將所有數(shù)據(jù)作為實參進行復(fù)制內(nèi)存空間和計算資源的大量浪費! 解決方法:利用指針或引用作為參數(shù)來傳遞數(shù)據(jù)信息。 該方法優(yōu)點
5、:高效 該方法風(fēng)險:破壞黑盒性 綜合評定:值得使用,但要謹(jǐn)慎,. 指針參數(shù) ( Pointer Parameters ),傳遞指針: 指針參數(shù)也是值傳遞的,指針值的真正用途是進行數(shù)據(jù)間訪,以達到操作數(shù)據(jù)塊(大小由之)的目的 傳遞引用: 引用參數(shù)本質(zhì)上也是值傳遞的,它表現(xiàn)為名字傳遞,即以形參的名字來代替實參名字 如果實參不是實體名而是表達式,那么其表達式所對應(yīng)的臨時實體取名為形參,并要求其為常量引用 意義: 指針和引用參數(shù)的存在,使函數(shù)實際上可以訪問非局部的數(shù)據(jù)區(qū),函數(shù)的黑盒性便名存實亡 但這并非一定壞事,指針是一把雙刃劍,或靈巧或邪惡 引用是為了防范指針非安全的無意操作,void mySort
6、(int* b, int size); void f() int a = 3, 5, 7, 1, 8, 4, 9; mySort(a, sizeof(a)/sizeof(a0); ,. 指針參數(shù) ( Pointer Parameters ),傳遞指針須附帶傳遞單位數(shù)據(jù)的個數(shù),元素個數(shù),傳指針,. 指針參數(shù) ( Pointer Parameters ),通過常量性質(zhì)限制無意操作帶來的意外副作用 (P143),vector add( / 向量加法 const vector ,棧機制 ( Stack Mechanism ),運行時內(nèi)存布局 P145,執(zhí)行代碼 全局?jǐn)?shù)據(jù)、靜態(tài)數(shù)據(jù) 動態(tài)內(nèi)存 函數(shù)數(shù)據(jù)(
7、局部數(shù)據(jù)),棧機制 ( Stack Mechanism ),未初始化局部數(shù)據(jù)的不確定性,#include void f() int b; / 未初始化 std:cout”a“n”; f(); /-,A=8804248 B=2788048,棧機制 ( Stack Mechanism ),指針的無約束性,#include int a=5; int b=6; int main() int* ap=(int*)4202660; *ap=8; std:couta“n”; std:coutint( ,5,6,4202660,4202664,a,b,4202660,ap,8 4202664,函數(shù)指針 ( F
8、unction Pointers ),函數(shù)類型: 函數(shù)類型因參數(shù)類型、個數(shù)和排列順序的不同而不同,也因返回類型的不同而不同 函數(shù)指針: 指向代碼區(qū)中函數(shù)體代碼的指針.不同的函數(shù)類型,其函數(shù)指針也不同 用法: 函數(shù)指針經(jīng)常用作函數(shù)參數(shù),以傳遞連函數(shù)本身都不知道的處理過程(函數(shù)),函數(shù)指針 ( Function Pointers ),函數(shù)指針與指針函數(shù) 指向函數(shù)的指針簡稱函數(shù)指針 定義: int (*gp)(int) 初始化: int g(int); int (*gp)(int)=g; 指針函數(shù):返回指針類型的函數(shù) int *gp(int a) int* gp(int a),函數(shù)指針 ( Func
9、tion Pointers ),不同的函數(shù)指針,不能相互賦值 P151,int g(int); int (*gp)(int) = g; / right void f(); void (*fp)(); fp = f; / right gp = fp; / error,不同類型的函數(shù),函數(shù)指針 ( Function Pointers ),函數(shù)指針作為參數(shù)傳遞 (函數(shù)名看作是函數(shù)指針),bool lessThanBitSum(int a, int b) int suma=0, sumb=0; for(int x=a; x; x/=10) suma += x%10; for(int x=b; x; x
10、/=10) sumb += x%10; return suma sumb; int main() int a = 33, 61, 12, 19, 14, 71, 78, 59; sort(aa, aa+8, lessThanBitSum); for(int i=0; i8; +i) coutaai ; coutn; ,12 14 33 61 71 19 59 78,函數(shù)指針 ( Function Pointers ),指定函數(shù)指針類型,定義函數(shù)指針數(shù)組,typedef void (*MenuFun)(); /p154 f0507 void f1() coutgood!n; void f2()
11、coutbetter!n; void f3() coutbest!n; MenuFun fun=f1,f2,f3;,函數(shù)指針類型名,main參數(shù) ( The mains Parameters ),程序運行: 操作系統(tǒng)讀入命令以啟動程序 重定向命令: 操作系統(tǒng)讀入命令后,識別并自我消化的參數(shù) main函數(shù)參數(shù): 操作系統(tǒng)讀入命令后,不能識別參數(shù),將其直接傳遞給所啟動的程序,main參數(shù) ( The mains Parameters ),命令重定向 (P158),/ f0509.cpp #include using namespace std; int main() for(int a,b; ci
12、nab;) couta+b”n”; ,17 21 357,main參數(shù) ( The mains Parameters ),main函數(shù)參數(shù) (P159),#include using anmespace std; int main(int argc, char* argv) for(int i=0; iargc; +i) coutargviendl; ,f0510 a1 a2 a3 a1 a2 a3,遞歸函數(shù) ( Recursive Functions ),形式上: 一個正在執(zhí)行的函數(shù)調(diào)用了自身(直接遞歸).或者,一個函數(shù)調(diào)用了另一個函數(shù),而另一個函數(shù)卻調(diào)用了本函數(shù)(間接遞歸) 本質(zhì)上: 程序
13、在運行中調(diào)用了相同代碼實體的函數(shù),卻在函數(shù)棧中重新復(fù)制了該函數(shù)的整套數(shù)據(jù),由于每套數(shù)據(jù)中的參數(shù)也許不同,導(dǎo)致了計算條件發(fā)生變化,使得函數(shù)得以逐步逼近終極目標(biāo)而運行 遞歸的條件 P163,遞歸函數(shù) ( Recursive Functions ),遞歸函數(shù)可以轉(zhuǎn)換為非遞歸函數(shù)例如,求最大公約數(shù),long gcd1(int a, int b) / 遞歸版 if(a%b=0) return b; return gcd(b, a%b); /- long gcd2(int a, int b) / 非遞歸版 for(int temp; b; a=b, b=temp) temp = a%b; return a
14、; /-,函數(shù)重載 ( Function Overload ),函數(shù)重載: 一組概念相同,處理對象(參數(shù))不同的過程,出于方便編程的目的,用同一個函數(shù)名字來命名的技術(shù)稱為函數(shù)重載 參數(shù)默認(rèn): 一個函數(shù),既可以嚴(yán)謹(jǐn)和地道的調(diào)用,也可以省略參數(shù),輕靈地調(diào)用,達到此種方便編程目的的技術(shù)稱為參數(shù)默認(rèn) 重載與參數(shù)默認(rèn): 它們都是通過參數(shù)的變化來分辨處理任務(wù)的不同如果參數(shù)決定了不同的處理過程,則應(yīng)重載,否則參數(shù)默認(rèn)更簡捷一些,函數(shù)重載 ( Function Overload ),重載是不同的函數(shù),以參數(shù)的類型,個數(shù)和順序來分辨P167,void print(double); void print(int)
15、; void func() print(1); / void print(int); print(1.0); / void print(double); print(a); / void print(int); print(3.1415f); / void pirnt(double); ,函數(shù)重載 ( Function Overload ),參數(shù)默認(rèn)是通過不同參數(shù)來分辨一個函數(shù)調(diào)用中的行為差異,void delay(int a = 2); / 函數(shù)聲明時 int main() delay(); / 默認(rèn)延遲秒 delay(2); / 延遲秒 delay(5); / 延遲秒 void delay
16、(int a) / 函數(shù)定義時 int sum=0; for(int i=1; i=a; +i) for(int j=1; j3500; +j) for(int k=1; k100000; +k) sum+; ,函數(shù)重載 ( Function Overload ),默認(rèn)參數(shù)的規(guī)則 P169 默認(rèn)參數(shù)值總是在函數(shù)聲明時描述的,聲明定義同時存在時,默認(rèn)參數(shù)只能置身于聲明中 函數(shù)參數(shù)默認(rèn)值只能從后往前設(shè)置 調(diào)用時的實參按位置解析,默認(rèn)實參只能從后往前逐個替換尾部的缺漏,函數(shù)重載 ( Function Overload ),無名參數(shù) 函數(shù)聲明和定義中,都可以省略形參名稱。P170,void point
17、(int a, int); /聲明時省略了第二個形參名 void point(int a, int ) countaendl; /定義時省略,第二個參數(shù)形同虛設(shè),函數(shù)重載 ( Function Overload ),重載VS參數(shù)默認(rèn) 定義方法不同,效果類似,本章小結(jié),函數(shù)是程序的基本組成 本質(zhì)上基于過程程序設(shè)計就是以函數(shù)為基本過程化單位的 函數(shù)的靈活多樣性會導(dǎo)致副作用,反映在參數(shù)的指針和引用傳遞上。 函數(shù)的黑盒化程序設(shè)計規(guī)范化 函數(shù)機制靠棧結(jié)構(gòu)來支撐 函數(shù)指針開拓了程序運行所覆蓋的計算機系統(tǒng)空間 對于包含多個函數(shù)的文件的組織問題 main函數(shù)是操作系統(tǒng)調(diào)用的函數(shù),返回類型都是int型,否則是不
18、標(biāo)準(zhǔn)的,但其返回語句允許省略。 main函數(shù)所帶的參數(shù)規(guī)定了操作系統(tǒng)對它數(shù)據(jù)傳遞的形式重定向是操作系統(tǒng)啟動命令的功能之一。 函數(shù)可以重載,即重名,但必須有不同的參數(shù)類型、個數(shù)或順序。函數(shù)參數(shù)可以默認(rèn),效果類似于重載,但使用時有一些差別。,作業(yè),第1、2、5題 其中第5題將(e)放在(c)前 第五題中可以結(jié)合使用命令行重定向、main()參數(shù)、函數(shù)重載、函數(shù)指針等新學(xué)知識。 10月17日晚24點之前,學(xué)號為單號的同學(xué)交作業(yè) 其他同學(xué)可選交,Thank You !,Any question?,上次作業(yè)點評,1.注意1/2這樣的表達式值為0,想要得到正確結(jié)果需要進行格式轉(zhuǎn)換,隱式、顯式均可。 2.函數(shù)調(diào)用時,無須
溫馨提示
- 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)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 油氣田智能化開發(fā)與管理系統(tǒng)建設(shè)方案
- 機場貴賓廳吧臺設(shè)計與施工合同范本
- 美食廣場經(jīng)營權(quán)轉(zhuǎn)讓合同
- 知識產(chǎn)權(quán)采購合同中專利授權(quán)及糾紛解決條款
- 車輛掛名權(quán)益保障及免責(zé)責(zé)任明確協(xié)議
- 彩鋼結(jié)構(gòu)簡易搭建與環(huán)保評估合同
- 環(huán)保產(chǎn)業(yè)財務(wù)合同環(huán)保技術(shù)投資與運營管理合同
- 出租車企業(yè)智能化調(diào)度司機合作協(xié)議
- 經(jīng)銷白酒招商方案
- 企業(yè)四新培訓(xùn)課件
- 山西省晉中市左權(quán)縣多校2023-2024學(xué)年七年級上學(xué)期期末數(shù)學(xué)試題(含答案)
- 2023年泉州中遠(yuǎn)學(xué)校高考質(zhì)量分析報告
- 重癥肌無力的護理課件
- 金屬與石材幕墻工程技術(shù)規(guī)范JGJ
- 世界母乳喂養(yǎng)周母乳喂養(yǎng)健康宣教課件
- 臨床靜脈導(dǎo)管維護操作專家共識
- 《建筑結(jié)構(gòu)檢測與加固》課件 第1-3章 緒論、建筑結(jié)構(gòu)的檢測與鑒定、混凝土結(jié)構(gòu)的加固
- 2024年全國小學(xué)生英語競賽初賽(低年級組)試題及參考答案
- 《病歷書寫基本規(guī)范》課件
- GB/T 2881-2023工業(yè)硅
- 混凝土外加劑凝結(jié)時間-自做
評論
0/150
提交評論