分析C++程序設(shè)計(jì)教程_第1頁
分析C++程序設(shè)計(jì)教程_第2頁
分析C++程序設(shè)計(jì)教程_第3頁
分析C++程序設(shè)計(jì)教程_第4頁
分析C++程序設(shè)計(jì)教程_第5頁
已閱讀5頁,還剩21頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、分析C+程序設(shè)計(jì)教程C+程序設(shè)計(jì)教程(第二版)第五章 函數(shù)機(jī)制 Chapter 5 Function Mechanism 4/26/20222n函數(shù) C+的函數(shù)是完成既定任務(wù)的功能(過程)體,它涵蓋了數(shù)學(xué)函數(shù)和一般過程所以基于過程編程本質(zhì)上就是基于函數(shù)編程n函數(shù)機(jī)制 一是指程序運(yùn)行過程中對函數(shù)調(diào)用的數(shù)據(jù)管理和處理過程 二是指編程中函數(shù)的使用規(guī)范它包括函數(shù)參數(shù)的屬性和傳遞規(guī)則,函數(shù)返回類型的匹配與審查,函數(shù)名字的識別原則,函數(shù)體效率的選擇,函數(shù)體中數(shù)據(jù)的訪問權(quán)限等4/26/20223第五章內(nèi)容n 函數(shù)性質(zhì)函數(shù)性質(zhì)( Function Character ) n 指針參數(shù)指針參數(shù) ( Pointe

2、r Parameters ) n 棧機(jī)制棧機(jī)制 ( Stack Mechanism ) n 函數(shù)指針函數(shù)指針 ( Function Pointers )n main參數(shù)參數(shù) ( The mains Parameters ) n 遞歸函數(shù)遞歸函數(shù) ( Recursive Functions ) n 函數(shù)重載函數(shù)重載 ( unction Overload ) 4/26/202241. 函數(shù)性質(zhì)函數(shù)性質(zhì) ( Function Character )n函數(shù):對輸入?yún)?shù)負(fù)責(zé),埋頭做自己的事,最終返回結(jié)果n函數(shù)組織:通過在函數(shù)中進(jìn)行函數(shù)調(diào)用來擴(kuò)展運(yùn)行的規(guī)模,層層疊疊的函數(shù)構(gòu)成樹結(jié)構(gòu)n做法:將若干個函數(shù)組織

3、成文件,又將若干個文件構(gòu)成程序的辦法來進(jìn)行編程分工4/26/20225跨越數(shù)學(xué)函數(shù)的C+函數(shù),有四種形態(tài)n返回類型 func ( 參數(shù)列表 ) ;n返回類型 func ( ) ;nvoid func ( 參數(shù)列表 ) ;nvoid func ( ) ;4/26/20226黑盒原則:函數(shù)使用者應(yīng)關(guān)注性能,而少去左右實(shí)現(xiàn)細(xì)節(jié)int cost ( int n, int m ) return n*10; / 運(yùn)輸n次m斤int cost ( int n, int m ) return m*10; / 運(yùn)輸m次n斤/ 選擇下一個最好的int cost ( int n, int m ) return (n

4、m? m:n)*10; / 保證運(yùn)輸次數(shù)最少4/26/20227參數(shù)傳遞:形參是對實(shí)參的克隆,克隆必須遵守類型匹配規(guī)則void f(Type a); /a為形參為形參void g三三 Type x; f(x); /x為實(shí)參為實(shí)參a實(shí)體x實(shí)體復(fù)制Type類型Type類型4/26/20228. 指針參數(shù)指針參數(shù) ( Pointer Parameters )n傳遞指針:指針參數(shù)也是值傳遞的,指針值的真正用途是進(jìn)行數(shù)據(jù)間訪,以達(dá)到操作數(shù)據(jù)塊(大小由之)的目的n傳遞引用:引用參數(shù)本質(zhì)上也是值傳遞的,它表現(xiàn)為名字傳遞,即以形參的名字來代替實(shí)參名字如果實(shí)參不是實(shí)體名而是表達(dá)式,那么其表達(dá)式所對應(yīng)的臨時(shí)實(shí)體取

5、名為形參,并要求其為常量引用n意義:指針和引用參數(shù)的存在,使函數(shù)實(shí)際上可以訪問非局部的數(shù)據(jù)區(qū),函數(shù)的黑盒性便名存實(shí)亡但這并非一定壞事,指針是一把雙刃劍,或靈巧或邪惡引用是為了防范指針非安全的無意操作4/26/20229void mySort(int* b, int size);void f三三 int a = 3, 5, 7, 1, 8, 4, 9; mySort(a, sizeof(a)/sizeof(a0);傳遞指針須附帶傳遞單位數(shù)據(jù)的個數(shù)元素個數(shù)傳指針4/26/202210限制無意操作帶來的意外副作用vector add( / 向量加法 const vector& a, const ve

6、ctor& b) vector c(a.size三); for(unsigned i=0; ia.size三; +i) ci = ai + bi; return c;4/26/2022113. 棧機(jī)制棧機(jī)制 ( Stack Mechanism )運(yùn)行時(shí)內(nèi)存布局棧區(qū)進(jìn)程空間代碼區(qū)全局?jǐn)?shù)據(jù)區(qū)堆區(qū)4/26/202212未初始化局部數(shù)據(jù)的不確定性#includevoid f三 int b; / 未初始化 std:cout”b“n”;/-int main三 int a; / 未初始化 std:cout”a“n”; f三;/-/ 8804248/ 27880484/26/202213#includeint

7、 a=5;int b=6;int main三 int* ap=(int*)4202660; *ap=8; std:couta“n”; std:coutint(&b)“n”;/ 8/ 4202664 指針的無約束性5642026604202664ab4202660ap4/26/2022144. 函數(shù)指針函數(shù)指針 ( Function Pointers )n函數(shù)類型:函數(shù)類型因參數(shù)類型、個數(shù)和排列順序的不同而不同,也因返回類型的不同而不同n函數(shù)指針:指向代碼區(qū)中函數(shù)體代碼的指針.不同的函數(shù)類型,其函數(shù)指針也不同n用法:函數(shù)指針經(jīng)常用作函數(shù)參數(shù),以傳遞連函數(shù)本身都不知道的處理過程(函數(shù))4/26/2

8、02215不同的函數(shù)指針,不能相互賦值int g(int);int (*gp)(int) = g;void f三三;void (*fp)三三;fp = f;gp = fp; / error不同的函數(shù)4/26/202216函數(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) sumb += x%10; return suma sumb;int main三三 int a = 33,

9、 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 784/26/202217指定函數(shù)指針類型,定義函數(shù)指針數(shù)組typedef void (*MenuFun)三三;void f1三三 coutgood!n; void f2三三 coutbetter!n; void f3三三 coutbest!n; MenuFun fun=f1,f2,f3;指針類型名4/26/2022185. main參數(shù)參數(shù) ( The

10、mains Parameters )n程序運(yùn)行:操作系統(tǒng)讀入命令以啟動程序n重定向命令:操作系統(tǒng)讀入命令后,識別并自我消化的參數(shù)nmain函數(shù)參數(shù):操作系統(tǒng)讀入命令后,不能識別參數(shù),將其直接傳遞給所啟動的程序4/26/202219命令重定向/ #includeusing namespace std;int main三 for(int a,b; cinab;) couta+bf0509 abc.txt17213578 99 1212 345abc.txt4/26/202220main函數(shù)參數(shù)/ #includeusing anmespace std;int main(int argc, char

11、* argv) for(int i=0; iargc; +i) coutargvif0510 a1 a2 a3f0510a1a2a34/26/2022216. 遞歸函數(shù)遞歸函數(shù) ( Recursive Functions )n形式上:一個正在執(zhí)行的函數(shù)調(diào)用了自身(直接遞歸).或者,一個函數(shù)調(diào)用了另一個函數(shù),而另一個函數(shù)卻調(diào)用了本函數(shù)(間接遞歸)n本質(zhì)上:程序在運(yùn)行中調(diào)用了相同代碼實(shí)體的函數(shù),卻在函數(shù)棧中重新復(fù)制了該函數(shù)的整套數(shù)據(jù),由于每套數(shù)據(jù)中的參數(shù)也許不同,導(dǎo)致了計(jì)算條件發(fā)生變化,使得函數(shù)得以逐步逼近終極目標(biāo)而運(yùn)行4/26/202222遞歸函數(shù)可以轉(zhuǎn)換為非遞歸函數(shù)例如,求最大公約數(shù)long

12、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;/-4/26/2022237. 函數(shù)重載函數(shù)重載 ( Function Overload )n函數(shù)重載:一組概念相同,處理對象(參數(shù))不同的過程,出于方便編程的目的,用同一個函數(shù)名字來命名的技術(shù)稱為函數(shù)重載n參數(shù)默認(rèn):一個函數(shù),既可以嚴(yán)謹(jǐn)和地道的調(diào)用,也可以省略參數(shù),輕靈地調(diào)用,達(dá)到此種方便編程目的的技

13、術(shù)稱為參數(shù)默認(rèn)n重載與參數(shù)默認(rèn):它們都是通過參數(shù)的變化來分辨處理任務(wù)的不同如果參數(shù)決定了不同的處理過程,則應(yīng)重載,否則參數(shù)默認(rèn)更簡捷一些4/26/202224重載是不同的函數(shù),以參數(shù)的類型,個數(shù)和順序來分辨void print(double);void print(int);void func三三 print(1); / void print(int); print(1.0); / void print(double); print(a); / void print(int); print(3.1415f); / void pirnt(double); 4/26/202225參數(shù)默認(rèn)是通過不同參數(shù)來分辨一個函數(shù)調(diào)用中的行為差異void delay(int a = 2); / 函數(shù)聲

溫馨提示

  • 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論