函數(shù)市公開課一等獎(jiǎng)省賽課微課金獎(jiǎng)?wù)n件_第1頁
函數(shù)市公開課一等獎(jiǎng)省賽課微課金獎(jiǎng)?wù)n件_第2頁
函數(shù)市公開課一等獎(jiǎng)省賽課微課金獎(jiǎng)?wù)n件_第3頁
函數(shù)市公開課一等獎(jiǎng)省賽課微課金獎(jiǎng)?wù)n件_第4頁
函數(shù)市公開課一等獎(jiǎng)省賽課微課金獎(jiǎng)?wù)n件_第5頁
已閱讀5頁,還剩33頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第4章函數(shù)學(xué)習(xí)目標(biāo)掌握函數(shù)申明和定義、函數(shù)調(diào)用及函數(shù)參數(shù)傳遞過程了解關(guān)鍵字inline含義與使用掌握遞歸函數(shù)定義及使用掌握函數(shù)重載定義及使用掌握函數(shù)模板定義及使用了解各類系統(tǒng)函數(shù),掌握慣用系統(tǒng)函數(shù)使用1/38程序模塊結(jié)構(gòu)化程序設(shè)計(jì),要求采取自頂向下方法,將功效復(fù)雜程序分解為若干個(gè)功效單一模塊功效單一即軟件理論中提及低耦合、高內(nèi)聚,即各個(gè)模塊之間沒有交叉功效,這么一個(gè)模塊錯(cuò)誤不會(huì)涉及到其它模塊,同時(shí)修改一個(gè)模塊功效也不會(huì)影響其它模塊將程序進(jìn)行模塊化,降低了大型程序編制難度,提升了程序復(fù)用度,同時(shí)也使編程人員之間分工、協(xié)作成為可能2/38函數(shù)概述C/C++語言中程序模塊經(jīng)過“函數(shù)”來實(shí)現(xiàn)。函數(shù)是一個(gè)命名程序代碼塊,是程序完成其操作場所,是將功效重復(fù)程序段抽象出來所形成一個(gè)獨(dú)立、可重復(fù)使用功效單元一個(gè)完整C/C++語言程序由若干個(gè)函數(shù)組成,其中有且只有一個(gè)main函數(shù),main函數(shù)是程序入口,由操作系統(tǒng)調(diào)用在main函數(shù)中能夠調(diào)用其它函數(shù),以完成指定功效,其它函數(shù)之間能夠相互調(diào)用,但不能調(diào)用main函數(shù)3/38簡單示例#include<iostream>usingnamespacestd;intadd(inti1,inti2){ inti; i=i1+i2; returni;}intmain(){inta,b,c;cout<<"pleaseinputtowintegers:";cin>>a>>b;c=add(a,b);cout<<a<<"+"<<b<<"="<<c<<endl;return0;}4/38函數(shù)定義C/C++語言中函數(shù),必須先定義,后使用。在一個(gè)函數(shù)內(nèi)部能夠調(diào)用其它函數(shù),但在一個(gè)函數(shù)內(nèi)部不能嵌套地定義另一個(gè)函數(shù)定義函數(shù)普通格式為:

返回類型函數(shù)名(數(shù)據(jù)類型1參數(shù)1,數(shù)據(jù)類型2參數(shù)2,…)

{

語句序列

}5/38關(guān)于函數(shù)定義(一)函數(shù)首部包含:返回類型、函數(shù)名稱、參數(shù)列表返回類型為函數(shù)返回值類型,能夠是系統(tǒng)任一基本數(shù)據(jù)類型或用戶自定義一個(gè)數(shù)據(jù)類型,它要求了函數(shù)執(zhí)行既定功效后return語句返回類型,又稱為該函數(shù)類型。當(dāng)一個(gè)函數(shù)不需要經(jīng)過return語句返回一個(gè)值時(shí),稱為無返回值函數(shù)或無類型函數(shù),此時(shí)需要使用void作為類型名函數(shù)名稱是用戶為函數(shù)所起名字,它是一個(gè)標(biāo)識(shí)符,應(yīng)符合C/C++標(biāo)識(shí)符普通命名規(guī)則,用戶經(jīng)過使用這個(gè)函數(shù)名傳遞參數(shù)以調(diào)用該函數(shù)6/38關(guān)于函數(shù)定義(二)參數(shù)列表能夠包含任意多項(xiàng)(能夠沒有),當(dāng)多于一項(xiàng)時(shí),前后兩個(gè)參數(shù)之間必須用逗號(hào)分開用花括號(hào)括起來語句序列組成了函數(shù)體,即函數(shù)所完成詳細(xì)操作,普通分為3部分:第1部分為定義部分,定義函數(shù)執(zhí)行過程中所需要一些常量或變量第2部分為函數(shù)功效部分,完成函數(shù)功效第3部分為返回值部分,返回函數(shù)結(jié)果注意:每個(gè)函數(shù)都是一個(gè)功效獨(dú)立模塊,絕不允許在一個(gè)函數(shù)體內(nèi)定義另一個(gè)函數(shù)7/38函數(shù)申明函數(shù)必須先定義后使用,假如需要在定義前使用函數(shù),則必須在使用前申明該函數(shù)函數(shù)申明格式為(兩種):

返回類型函數(shù)名(數(shù)據(jù)類型1參數(shù)1,數(shù)據(jù)類型2參數(shù)2,...);

返回類型函數(shù)名(數(shù)據(jù)類型1,數(shù)據(jù)類型2,...);

注意:

1)函數(shù)申明不包含函數(shù)體,最終必須以分號(hào)結(jié)束

2)函數(shù)定義只能夠一次,但申明能夠?qū)掖?/p>

3)返回類型、函數(shù)名稱、參數(shù)類型列表組成了函數(shù)原型(prototype)8/38函數(shù)調(diào)用函數(shù)定義/申明之后就能夠在需要時(shí)加以使用,即調(diào)用。函數(shù)調(diào)用格式為:

函數(shù)名(實(shí)際參數(shù)1,實(shí)際參數(shù)2,...)形式參數(shù)——函數(shù)定義中參數(shù),用來接收主調(diào)函數(shù)傳遞數(shù)據(jù),必須是左值。在調(diào)用前,并沒有給它們分配內(nèi)存實(shí)際參數(shù)——主調(diào)函數(shù)向被調(diào)函數(shù)傳遞數(shù)據(jù),能夠是右值,必須與形式參數(shù)一一對應(yīng),即個(gè)數(shù)相等且數(shù)據(jù)類型相容函數(shù)調(diào)用是一個(gè)表示式。表示式值就是被調(diào)函數(shù)返回值,它類型就是函數(shù)定義中指定函數(shù)返回值類型,即函數(shù)類型。假如函數(shù)返回值為void,說明該函數(shù)沒有返回值9/38調(diào)用過程與數(shù)據(jù)傳遞調(diào)用過程:主調(diào)函數(shù)調(diào)用被調(diào)函數(shù)執(zhí)行流程轉(zhuǎn)入被調(diào)函數(shù)函數(shù)體,執(zhí)行指定功效被調(diào)函數(shù)執(zhí)行完之后,返回到主調(diào)函數(shù),繼續(xù)執(zhí)行主調(diào)函數(shù)后續(xù)語句數(shù)據(jù)傳遞主調(diào)函數(shù)經(jīng)過參數(shù)向被調(diào)函數(shù)傳遞數(shù)據(jù),被調(diào)函數(shù)經(jīng)過return語句向主調(diào)函數(shù)返回結(jié)果10/38函數(shù)調(diào)用底層開銷在系統(tǒng)內(nèi)部,函數(shù)調(diào)用需要借用一個(gè)叫做“棧”數(shù)據(jù)結(jié)構(gòu)來進(jìn)行(棧顯著特征是數(shù)據(jù)入出次序:先進(jìn)后出)主調(diào)函數(shù)發(fā)出調(diào)用指令后,系統(tǒng)將主調(diào)函數(shù)中將要執(zhí)行下一條語句地址保留到棧中,同時(shí)還要保留主調(diào)函數(shù)中其它相關(guān)數(shù)據(jù)——保護(hù)現(xiàn)場被調(diào)函數(shù)執(zhí)行完成后,系統(tǒng)從棧中取出主調(diào)函數(shù)相關(guān)數(shù)據(jù)值、下一條語句地址——恢復(fù)現(xiàn)場

使用棧能夠確保函數(shù)逐層嵌套調(diào)用、逐層依次返回11/38定義/申明/調(diào)用練習(xí)定義一個(gè)函數(shù),用以實(shí)現(xiàn)數(shù)學(xué)上符號(hào)函數(shù),并在主函數(shù)中調(diào)用以測試它問題:假如函數(shù)定義代碼在main函數(shù)代碼之前、之中、之后會(huì)有什么情況?12/38參數(shù)值傳遞方式前述把實(shí)參表示式值傳送給對應(yīng)形參變量傳遞方式稱為按值傳遞,簡稱值傳遞(另外還有地址傳遞,在下一章介紹)使用值傳遞方式,即使實(shí)際參數(shù)是“左值”形式,形式參數(shù)值改變也不會(huì)造成實(shí)際參數(shù)所對應(yīng)變量值改變(在地址傳遞中,實(shí)際參數(shù)必須是“左值”形式,形式參數(shù)改變必會(huì)造成實(shí)際參數(shù)所對應(yīng)變量值改變)13/38值傳遞示例#include<iostream>usingnamespacestd;voidexchange(inti,intj){ inttemp; temp=i; i=j; j=temp;}intmain(){inta=10,b=20;cout<<"Beforeexchange:"<<a<<","<<b<<endl;exchange(a,b);cout<<"Afterexchange:"<<a<<","<<b<<endl;return0;}14/38函數(shù)嵌套調(diào)用C/C++語言中,函數(shù)定義是相互獨(dú)立,即函數(shù)和函數(shù)之間沒有隸屬關(guān)系,在一個(gè)函數(shù)內(nèi)部不能嵌套定義另一個(gè)函數(shù)不過,在一個(gè)函數(shù)內(nèi)部能夠調(diào)用另外一個(gè)函數(shù)(不能調(diào)用主函數(shù)),被調(diào)用函數(shù)又能夠調(diào)用其它函數(shù),甚至能夠調(diào)用函數(shù)本身,即函數(shù)調(diào)用能夠嵌套嵌套調(diào)用練習(xí):錄入、調(diào)試、運(yùn)行教材P76[例4-3]15/38函數(shù)遞歸調(diào)用在調(diào)用一個(gè)函數(shù)過程中又直接或間接地調(diào)用該函數(shù)本身現(xiàn)象,叫做函數(shù)遞歸調(diào)用。遞歸調(diào)用分為直接遞歸調(diào)用和間接遞歸調(diào)用兩種直接遞歸調(diào)用:在一個(gè)函數(shù)內(nèi)部直接調(diào)用函數(shù)本身間接遞歸調(diào)用:在一個(gè)函數(shù)內(nèi)部調(diào)用其它函數(shù),其它函數(shù)又反過來調(diào)用該函數(shù)16/38遞歸方法分析遞歸方法是從未知結(jié)果出發(fā),依據(jù)遞推關(guān)系,依據(jù)某個(gè)性質(zhì)相同、規(guī)模較小結(jié)果計(jì)算該結(jié)果,假如小規(guī)模結(jié)果也未知,重復(fù)遞推,直到小規(guī)模結(jié)果已知為止;然后,經(jīng)過遞推關(guān)系,反推出最終結(jié)果初值(遞推終止條件)+遞推關(guān)系是設(shè)計(jì)遞歸函數(shù)關(guān)鍵遞歸函數(shù)定義普通形式為:

函數(shù)類型遞歸函數(shù)名f(規(guī)模參數(shù)x,其它參數(shù))

{

if(x==初值)

結(jié)果=初值;

else

結(jié)果=含f(x-1)表示式;//x-1表示相鄰較小規(guī)模

返回結(jié)果;

}17/38遞歸函數(shù)練習(xí)錄入、調(diào)試、運(yùn)行教材P77[例4-4]問題:教材中程序能計(jì)算0!嗎?假如不能怎么改?該問題遞推終止條件是什么?遞推關(guān)系表示式是什么?由已知結(jié)果反推最終止果,編程時(shí)需要編寫與該過程對應(yīng)代碼嗎?遞歸函數(shù)執(zhí)行分哪兩個(gè)階段?18/38作業(yè)教材P921.填空題之(1)(2)(3)(6)19/38漢諾塔問題有三根針A、B、C,A針從上到下穿有從小到大n個(gè)盤,B、C兩針為空。要求借助B針,把A針上盤移到C針上。規(guī)則是:每次只能移動(dòng)一個(gè)盤,且在移動(dòng)過程中,每個(gè)針上必須保持盤從上到下、從小到大狀態(tài)例解:n=1時(shí),A->Cn=2時(shí),A->B,A->C,B->Cn=3時(shí),A->C,A->B,C->B,A->C,B->A,B->C,A->Cn=4時(shí),?分析:對于n個(gè)盤,假如n-1個(gè)盤移動(dòng)步驟已知,則只要借助C將上面n-1個(gè)盤從A移動(dòng)到B,接著將最大盤從A移動(dòng)到C,最終再借助A盤,將n-1個(gè)盤從B移動(dòng)到C20/38漢諾塔遞歸方案圖解21/38漢諾塔遞歸實(shí)現(xiàn)//a為原始位置,b為輔助位置,c為目標(biāo)位置voidhanoi(intn,chara,charb,charc){if(n==1)cout<<a<<"->"<<c<<endl;else{hanoi(n-1,a,c,b);cout<<a<<"->"<<c<<endl;hanoi(n-1,b,a,c);}}22/38漢諾塔遞歸函數(shù)測試//從‘A’借助‘B’到‘C’intmain(){ intn; cout<<"Pleaseinputthenumber:"; cin>>n; hanoi(n,'A','B','C'); return0;}23/38內(nèi)聯(lián)函數(shù)在定義函數(shù)時(shí),在函數(shù)首部前面加上關(guān)鍵字inline,則該函數(shù)就為內(nèi)聯(lián)函數(shù)

inline函數(shù)類型函數(shù)名(形式參數(shù)列表)

{

語句序列

}對于內(nèi)聯(lián)函數(shù),編譯器將函數(shù)體代碼插入到函數(shù)調(diào)用處,將調(diào)用函數(shù)方式改為直接執(zhí)行方式,這叫內(nèi)聯(lián)函數(shù)擴(kuò)展內(nèi)聯(lián)函數(shù)節(jié)約了程序調(diào)用時(shí)間開銷,所以實(shí)際上是一個(gè)以空間換時(shí)間方案從函數(shù)使用者角度看,調(diào)用內(nèi)聯(lián)函數(shù)和普通函數(shù)沒有任何區(qū)分24/38內(nèi)聯(lián)函數(shù)說明一個(gè)函數(shù)定義為內(nèi)聯(lián)函數(shù),只是請求而不是命令編譯器對它進(jìn)行擴(kuò)展,是否對一個(gè)內(nèi)聯(lián)函數(shù)進(jìn)行擴(kuò)展,完全由編譯器自行決定。假如將一個(gè)較復(fù)雜函數(shù)定義為內(nèi)聯(lián)函數(shù),大多數(shù)編譯器會(huì)自動(dòng)地將其作為非內(nèi)聯(lián)函數(shù)處理假如僅在申明函數(shù)原型時(shí)加上關(guān)鍵字inline,并不能到達(dá)內(nèi)聯(lián)效果內(nèi)聯(lián)函數(shù)定義必須出現(xiàn)在對該函數(shù)調(diào)用之前25/38帶默認(rèn)形參值函數(shù)C/C++語言允許在函數(shù)說明或函數(shù)定義中為形參預(yù)賦一個(gè)默認(rèn)值,這么函數(shù)就叫做帶有默認(rèn)形參值函數(shù)在調(diào)用帶有默認(rèn)參數(shù)值函數(shù)時(shí),若為對應(yīng)形參指定了實(shí)參,則形參將使用實(shí)參值;不然形參將使用其默認(rèn)值比如:

intsub(intx=8,inty=3)

{

returnx-y;

}

voidmain()

{

sub(20,15);//傳遞給形參x,y值分別為20和15

sub(10);//傳遞給形參x,y值分別為10和3

sub();//傳遞給形參x,y值分別為8和3

}26/38帶默認(rèn)形參值函數(shù)說明(一)假如函數(shù)是先使用后定義,則必須在使用前進(jìn)行申明。這種情況下,只能在申明時(shí)使用帶默認(rèn)值參數(shù)假如需要屢次申明函數(shù),則每次申明能夠?qū)?shù)指定不一樣默認(rèn)值申明時(shí)指定參數(shù)默認(rèn)值,一樣能夠省略變量名。比如:

intsub(int=8,int=3);27/38帶默認(rèn)形參值函數(shù)說明(二)若函數(shù)含有多個(gè)形參,則缺省形參值必須自右向左連續(xù)地定義,即在一個(gè)帶默認(rèn)值形參右邊,不能有未指定默認(rèn)值形參調(diào)用一個(gè)函數(shù)時(shí),假如省去了某個(gè)實(shí)參,則直到最右端實(shí)參都要省去28/38函數(shù)重載(overload)函數(shù)重載就是兩個(gè)以上函數(shù),取相同函數(shù)名,不過它們形參個(gè)數(shù)或類型不一樣編譯時(shí)依據(jù)實(shí)參和形參類型及個(gè)數(shù)最正確匹配,自動(dòng)決定調(diào)用哪一個(gè)函數(shù)比如:

intmax(int,int);

intmax(int,int,int);

floatmax(float,float);

floatmax(float,float,float);函數(shù)重載練習(xí):閱讀、錄入、運(yùn)行教材P85[例4-7]29/38函數(shù)重載說明各個(gè)重載函數(shù)返回類型能夠相同,也能夠不一樣。但假如函數(shù)名相同、形參表也相同,僅僅是返回類型不一樣,則是非法確定調(diào)用哪個(gè)重載函數(shù)過程稱為綁定(binding)。綁定優(yōu)先次序?yàn)椋簻?zhǔn)確匹配、對實(shí)參類型向高類型轉(zhuǎn)換后匹配、實(shí)參類型向低類型及相容類型轉(zhuǎn)換后匹配有兩個(gè)重載函數(shù),編譯器不知道進(jìn)行哪種類型轉(zhuǎn)換、與哪個(gè)函數(shù)綁定,這種現(xiàn)象就叫綁定二義性(應(yīng)該防止)30/38函數(shù)模板函數(shù)模板能夠用來創(chuàng)建一個(gè)通用函數(shù)框架,以支持參數(shù)個(gè)數(shù)相同,參數(shù)類型、返回類型不一樣函數(shù)函數(shù)模板定義后,使用前需要實(shí)例化該模板,以生成一個(gè)詳細(xì)函數(shù)(稱為模板函數(shù))。實(shí)例化過程實(shí)際上就是將模板參數(shù)表中參數(shù)化類型替換成指定詳細(xì)類型31/38函數(shù)模板定義函數(shù)模板定義形式為:

template<class

類型名1,class

類型名2,...>//class也能夠是typename

返回類型函數(shù)名(形參表)

{

語句序列

}比如

//將add函數(shù)定義成了一個(gè)函數(shù)模板

template<classT>

Tadd(Tx,Ty)

{

returnx+y;

}32/38函數(shù)模板使用函數(shù)模板使用前必須進(jìn)行實(shí)例化,實(shí)例化有兩種形式顯式實(shí)例化——調(diào)用時(shí)明確傳遞類型參數(shù)。比如:

add<double>(8,9)//將模板中全部T類型替換為double隱式實(shí)例化——調(diào)用時(shí)不傳遞類型參數(shù),只是經(jīng)過實(shí)際參數(shù)類型來確定類型參數(shù)。比如:

add(8.0f,9.0f)//依據(jù)“8.0f,9.0f”推斷模板中全部T類型為float,并進(jìn)行替換33/38函數(shù)模板完整示例#include<iostream>usingnamespacestd;template<classT1,classT2>T1plus(T1x,T2y){cout<<sizeof(T1)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(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ǔ)空間,僅對用戶上傳內(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

提交評論