函數(shù)(3)省公開課一等獎全國示范課微課金獎?wù)n件_第1頁
函數(shù)(3)省公開課一等獎全國示范課微課金獎?wù)n件_第2頁
函數(shù)(3)省公開課一等獎全國示范課微課金獎?wù)n件_第3頁
函數(shù)(3)省公開課一等獎全國示范課微課金獎?wù)n件_第4頁
函數(shù)(3)省公開課一等獎全國示范課微課金獎?wù)n件_第5頁
已閱讀5頁,還剩22頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第4章函數(shù)C++語言程序設(shè)計教程第4章函數(shù)制作人:沈顯君第1頁第4章函數(shù)1.掌握函數(shù)申明和定義、函數(shù)調(diào)用及函數(shù)參數(shù)傳遞過程;2.掌握關(guān)鍵字inline含義與使用;3.掌握遞歸函數(shù)使用;4.掌握函數(shù)重載使用方法; 5.掌握函數(shù)模板使用方法; 6.了解各類系統(tǒng)函數(shù),掌握慣用系統(tǒng)函數(shù)使用。學(xué)習(xí)目標(biāo)

C++語言程序設(shè)計教程第4章函數(shù)第2頁4.1函數(shù)定義和申明在C++程序中,使用函數(shù)前首先需要對函數(shù)原型進行申明,告訴編譯器函數(shù)名稱、類型和形式參數(shù)。在C++中,函數(shù)原型申明標(biāo)準(zhǔn)以下:(1)假如函數(shù)定義在先,調(diào)用在后,調(diào)用前能夠無須申明;

假如函數(shù)定義在后,調(diào)用在先,調(diào)用前必須申明。(2)在程序設(shè)計中,為了使程序設(shè)計邏輯結(jié)構(gòu)清楚,普通

將主要函數(shù)放在程序起始位置申明,這么也起到了

列函數(shù)目錄作用。注意事項見書上:P74C++語言程序設(shè)計教程第4章函數(shù)第3頁4.1函數(shù)定義和申明/***********************************p4_1.cpp**函數(shù)使用,對兩個數(shù)取大************************************/#include<iostream>usingnamespacestd;intmax(intx,inty)//假如函數(shù)定義在后,調(diào)用在先,調(diào)用前必須申明。voidmain(){inta,b;cin>>a>>b;cout<<max(a,b)<<endl;}intmax(intx,inty){intz;z=(x>y)?x:y;returnz;}123456789101112131415161718C++語言程序設(shè)計教程第4章函數(shù)函數(shù)原型申明主函數(shù)函數(shù)體:函數(shù)所完成詳細(xì)操作第4頁在C++中,函數(shù)原型申明標(biāo)準(zhǔn)以下:

(1)假如函數(shù)定義在先,調(diào)用在后,調(diào)用前能夠無須申明;假如函數(shù)定義在后,調(diào)用在先,調(diào)用前必須申明。(2)在程序設(shè)計中,為了使程序設(shè)計邏輯結(jié)構(gòu)清楚,普通將主要函數(shù)放在程序起始位置申明,這么也起到了列函數(shù)目錄作用。

申明函數(shù)原型形式以下:

比如:

intmax(intx,inty)

;intmax(int,int)

;C++語言程序設(shè)計教程第4章函數(shù)4.1.2函數(shù)原型申明返回類型

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

加上參數(shù)名會使函數(shù)功效和參數(shù)更清楚。第5頁內(nèi)聯(lián)函數(shù)定義形式以下:

C++語言程序設(shè)計教程第4章函數(shù)4.3內(nèi)聯(lián)函數(shù)

inline函數(shù)類型函數(shù)名(形式參數(shù)表){函數(shù)體;}內(nèi)聯(lián)函數(shù):

是經(jīng)過在編譯時將函數(shù)體代碼插入到函數(shù)調(diào)用處,將調(diào)用函數(shù)方式改為次序執(zhí)行方式來節(jié)約程序執(zhí)行時間開銷,這一過程叫做內(nèi)聯(lián)函數(shù)擴展。所以,內(nèi)聯(lián)函數(shù)實際上是一個用空間換時間方案。函數(shù)調(diào)用是什么樣子呢?(等我展示,見前例)在內(nèi)聯(lián)函數(shù)擴展時也進行了實參加形參結(jié)合過程:先將實參名(而不是實參值),將函數(shù)體中形參處處替換,然后搬到調(diào)用處。但從用戶角度看,調(diào)用內(nèi)聯(lián)函數(shù)和普通函數(shù)沒有任何區(qū)分。第6頁4.3內(nèi)聯(lián)函數(shù)

//***********************************p4_6.cpp**內(nèi)聯(lián)函數(shù)使用***********************************/#include<iostream>usingnamespacestd;inlinedoubleCirArea(doubleradius){return3.14*radius*radius;}voidmain(){doubler1(1.0),r2(2);cout<<CirArea(r1)<<endl;cout<<CirArea(r1+r2+4)<<endl;}12345678910111213141516C++語言程序設(shè)計教程第4章函數(shù)內(nèi)聯(lián)函數(shù)定義內(nèi)聯(lián)函數(shù)調(diào)用運行結(jié)果:12↙479001600

第7頁C++語言程序設(shè)計教程第4章函數(shù)4.3內(nèi)聯(lián)函數(shù)注意:假如僅在申明函數(shù)原型時加上關(guān)鍵字inline,并不能到達內(nèi)聯(lián)效果。內(nèi)聯(lián)函數(shù)定義必須出現(xiàn)在對該函數(shù)調(diào)用之前,因為編譯器在

對函數(shù)調(diào)用語句進行替換時,必須事先知道替換該語句代碼是

什么。這也是僅在申明函數(shù)原型時加上關(guān)鍵字inline,并不能到達

內(nèi)聯(lián)效果原因。

因為計算機資源總是有限,使用內(nèi)聯(lián)函數(shù)即使節(jié)約了程序運行時間開銷,但卻增大了代碼占用內(nèi)存空間開銷。所以在詳細(xì)編程時應(yīng)仔細(xì)地權(quán)衡時間開銷與空間開銷之間矛盾,以確定是否采取內(nèi)聯(lián)函數(shù)。與處理register變量相同,是否對一個內(nèi)聯(lián)函數(shù)進行擴展完全由編譯器自行決定。所以,說明一個內(nèi)聯(lián)函數(shù)只是請求而不是命令編譯器對它進行擴展。實際上,假如將一個較復(fù)雜函數(shù)定義為內(nèi)聯(lián)函數(shù),大多數(shù)編譯器會自動地將其作為普通函數(shù)處理。第8頁比如:C++語言程序設(shè)計教程第4章函數(shù)4.4帶默認(rèn)形參值函數(shù)

intsub(intx=8,inty=3){returnx-y;}voidmain(void){sub(20,15);//傳遞給形參x,y值分別為20和15sub(10);//傳遞給形參x,y值分別為10和3sub();//傳遞給形參x,y值分別為8和3}

C++語言允許在函數(shù)說明或函數(shù)定義中為形參預(yù)賦一個默認(rèn)值,這么函數(shù)就叫做帶有默認(rèn)形參值函數(shù)。在調(diào)用帶有默認(rèn)參數(shù)值函數(shù)時,若為對應(yīng)形參指定了實參,則形參將使用實參值;不然,形參相使用其默認(rèn)值。這就大大地方便了函數(shù)使用。第9頁C++語言程序設(shè)計教程第4章函數(shù)4.4帶默認(rèn)形參值函數(shù)intf(inta,floatb=5.0,charc='.',intd=10);//正確intf(inta=1,floatb=5.0,charc='.',intd);//錯誤,d未給值intf(inta=1,floatb,charc='.',intd=10);//錯誤,b未給值

(1)若函數(shù)含有多個形參,則缺省形參值必須自右向左連續(xù)地定義,而且在一個缺省形參值右邊不能有未指定缺省值參數(shù)。這是因為C++語言在函數(shù)調(diào)用時參數(shù)是自右至左入棧這一約定所決定。比如:假如有以下申明:intf(inta,floatb=5.0,charc='.',intd=10);采取以下調(diào)用形式是錯誤:f(8,,,4);//語法錯誤(2)

在調(diào)用一個函數(shù)時,假如省去了某個實參,則直到最右端實參都要省去(當(dāng)然,與它們對應(yīng)形參都要有缺省值)。比如:

第10頁C++語言程序設(shè)計教程第4章函數(shù)4.4帶默認(rèn)形參值函數(shù)intsub(intx=8,inty=3);//缺省形參值在函數(shù)原型中給出voidmain(void){sub(20,15);//20-15sub(10);//10-3sub();//8-3}intsub(intx,inty)//缺省形參值沒有在函數(shù)定義時給出{returnx-y;}(3)缺省形參值說明必須出現(xiàn)在函數(shù)調(diào)用之前。這就是說,假如存在函數(shù)原型,則形參缺省值應(yīng)在函數(shù)原型中指定;不然在函數(shù)定義中指定。另外,若函數(shù)原型中已給出了形參缺省值,則在函數(shù)定義中不得重復(fù)指定,即使所指定缺省值完全相同也不行。比如:

第11頁C++語言程序設(shè)計教程第4章函數(shù)4.4帶默認(rèn)形參值函數(shù)intf(inta,floatb,char,intd=10);intf(inta,floatb,charc='.',intd=10);//錯誤:企圖再次定義缺省參數(shù)c和d(4)在同一個作用域,一旦定義了缺省形參值,就不能再定義它。比如:intf(inta=6,floatb=5.0,charc='.',intd=10);voidmain(void){intf(inta=3,floatb=2.0,charc='n',intd=20);cout<<f()<<endl;//f函數(shù)使用局部缺省參數(shù)值}(5)假如幾個函數(shù)說明出現(xiàn)在不一樣作用域內(nèi),則允許分別為它們提供不一樣缺省形參值。比如:第12頁C++語言程序設(shè)計教程第4章函數(shù)4.4帶默認(rèn)形參值函數(shù)//d參數(shù)缺省值是函數(shù)調(diào)用。intf(inta,floatb=5.0,charc='.',intd=sub(20,15));

(6)

對形參缺省值指定能夠是初始化表示式,甚至能夠包含函數(shù)調(diào)用。比如:

intf(int,float=5.0,char=’.’,int=sub(20,15));

(7)在函數(shù)原型給出了形參缺省值時,形參名能夠省略。比如:第13頁C++語言程序設(shè)計教程第4章函數(shù)4.5函數(shù)重載

intmax(int,int);intmax(int,int,int);floatmax(float,float);doublemax(double,double);函數(shù)重載:

就是兩個以上函數(shù),取相同函數(shù)名,不過形參個數(shù)和類型不一樣,編譯器依據(jù)實參和形參類型及個數(shù)最正確匹配,自動決定調(diào)用哪一個函數(shù)。

比如:第14頁/*******************************p4_7.cpp**函數(shù)重載********************************/#include<iostream>usingnamespacestd;intadd(intx,inty)

{cout<<"(int,int)\t";returnx+y;}doubleadd(doublex,doubley){cout<<"(double,double)\t";returnx+y;}intadd(intx,doubley){cout<<"(int,double)\t";returnint(x+y);}123456789101112131415161718192021C++語言程序設(shè)計教程第4章函數(shù)函數(shù)重載函數(shù)重載函數(shù)重載第15頁doubleadd(doublex,inty)

{cout<<"(double,int)\t";returnx+y;}voidmain(){cout<<add(9,8)<<endl;cout<<add(9.0,8.0)<<endl;cout<<add(9,8.0)<<endl;cout<<add(9.0,8)<<endl;}212223242526272829303132C++語言程序設(shè)計教程第4章函數(shù)函數(shù)重載運行結(jié)果:(int,int)17(double,double)17(int,double)17(double,int)17重載函數(shù)調(diào)用第16頁C++語言程序設(shè)計教程第4章函數(shù)4.5函數(shù)重載//C++無法區(qū)分這兩個函數(shù)。因為在沒有確定函數(shù)調(diào)用是對哪一個重載函數(shù)之前,

//返回類型是不知道。intadd(inti1,inti2);floatadd(intf1,intf2);注意:(1)各個重載函數(shù)返回類型能夠相同,也能夠不一樣。但假如函數(shù)名相同、形參表也相同,僅僅是返回類型不一樣,則是非法。在編譯時會認(rèn)為是語法錯誤。//將char型轉(zhuǎn)換成int型,然后與add(int,int)綁定。add('A','A'+'0');//函數(shù)實參向(double,double)轉(zhuǎn)換,然后與add(double,double)綁定。add(float(8),float(9));//實參類型為(longdouble,int),向低類型轉(zhuǎn)化。不過轉(zhuǎn)換既能夠向add(int,int)又能夠向add(double,int)轉(zhuǎn)換,輕易引發(fā)二義性。add(longdouble(8),9);

(2)確定對重載函數(shù)哪個函數(shù)進行調(diào)用過程稱為綁定(binding),綁定優(yōu)先次序為準(zhǔn)確匹配、對實參類型向高類型轉(zhuǎn)換后匹配、實參類型向低類型及相容類型轉(zhuǎn)換后匹配。第17頁C++語言程序設(shè)計教程第4章函數(shù)4.5函數(shù)重載

消除這種二義性方法有:①添加重載函數(shù)定義,使調(diào)用取得準(zhǔn)確匹配。如:增加定義add(longdouble,int)②將函數(shù)實參進行強制類型轉(zhuǎn)換,使調(diào)用取得準(zhǔn)確匹配。比如:

調(diào)用形式可改為add(double(longdouble(8)),9),但改為add(longdouble(8),longdouble(9))一樣出現(xiàn)綁定二義性。綁定(匹配)二義性

兩個重載函數(shù),編譯器不知道進行哪種類型轉(zhuǎn)換,與哪個函數(shù)綁定,這種現(xiàn)象就叫綁定(匹配)二義性。注意:重載函數(shù)與帶默認(rèn)形參值函數(shù)一起使用時,有可能引發(fā)二義性。比如:voidadd(intx,inty,intz=0);當(dāng)調(diào)用add(8,9)時,不知與add(int,int)還是add(int,int,int=0)綁定。消除這種二義性方法是增加或降低實參個數(shù)。第18頁C++語言程序設(shè)計教程第4章函數(shù)4.6函數(shù)模板

template<class類型名1,class類型名2,...>

返回類型函數(shù)名(形參表){函數(shù)體;}函數(shù)模板:

能夠用來創(chuàng)建一個通用功效函數(shù),以支持各種不一樣形參,深入簡化重載函數(shù)函數(shù)體設(shè)計。函數(shù)模板定義形式為:

模板參數(shù)表意義:對于功效完全一樣,只是參數(shù)類型不一樣函數(shù),能寫一段通用代碼適合用于各種不一樣數(shù)據(jù)類型,會使代碼可重用性大大提升,從而提升軟件開發(fā)效率。

第19頁C++語言程序設(shè)計教程第4章函數(shù)4.6函數(shù)模板(見P88)//將add函數(shù)定義成了一個函數(shù)模板:template<classT>Tadd(Tx,Ty){returnx+y;}比如:

注意:template關(guān)鍵字表示申明是模板。<>中是模板參數(shù)表,能夠有一項或多項,其中類型名稱為參數(shù)化類型,是一個抽

象類型或可變類型。class是類型關(guān)鍵字,也能夠用typename作為關(guān)鍵字。函數(shù)返回值類型能夠是普通類型,也能夠是模板參數(shù)表中指定類型。模板參數(shù)表中參數(shù)類型能夠是普通類型。第20頁C++語言程序設(shè)計教程第4章函數(shù)4.6函數(shù)模板說明:依據(jù)<>中給出詳細(xì)類型,用類似于函數(shù)調(diào)用實參加形參結(jié)合方式,將模板參數(shù)表中參數(shù)化類型一一實例化成詳細(xì)類型,函數(shù)中參數(shù)化類型也一一實例化。假如模板參數(shù)表中有形式參數(shù),還需要用常量表示式去初始化。比如:使用add<double>(8,9)將Tadd(Tx,Ty)實例化成:doubleadd(double,double)使用sum<int,100>將Tsum()實例化成:intsum(),size取得初值100;

函數(shù)模板定義后,就能夠用它生成各種詳細(xì)函數(shù)(稱為模板函數(shù))。在函數(shù)調(diào)用時,用函數(shù)模板生成模板函數(shù)實際上就是將模板參數(shù)表中參數(shù)化類型依據(jù)實參實例化(詳細(xì)化)成詳細(xì)類型。這個過程稱為模板實例化。函數(shù)模板實例化分為顯式實例化與隱式實例化。(1)

顯式實例化

函數(shù)名<詳細(xì)類型名1,詳細(xì)類型名2,...,常量表示式>(實參表)第21頁C++語言程序設(shè)計教程第4章函數(shù)4.6函數(shù)模板比如:

使用add(‘A’,‘B’)將Tadd(Tx,Ty)實例化成:charadd(char,char)(2)

隱式實例化:隱式實例化格式為函數(shù)調(diào)用式,實例化過程是在實參加形參結(jié)合時,用實參類型實例化形參對應(yīng)參數(shù)化類型。

注意:使用隱式實例化無法初始化模板參數(shù)表中普通類型形參,假如模板參數(shù)表中使用普通類型參數(shù),必須使用顯式初始化。第22頁4.6函數(shù)模板//*******************************p4_8.cpp**函數(shù)模板********************************/#include<iostream>usingnamespacestd;template<classT1,classT2>T1add(T1x,T2y){cout<<"("<<sizeof(T1)<<","<<sizeof(T2)<<")\t";returnx+y;}voidmain(){cout<<add(9,8)<<endl;cout<<add(9.0,8.0)<<endl;cout<<add(9,8.0)<<endl;cout<<add(9.0,8)<<endl;cout<<add('A','A'-'0')<<endl;cout<<add(longdouble(8),9)<<endl;}123456789101112131415161718192021C++語言程序設(shè)計教程第4章函數(shù)函數(shù)模板定義模板函數(shù)調(diào)用運行結(jié)果:(4,4)17(8,8)17(4,8)17(8,4)17(1,4)R(8,4)17第23頁C++語言程序設(shè)計教程第4章函數(shù)4.7C++系統(tǒng)函數(shù)

C++不但允許我們依據(jù)自己需要定義函數(shù),C++系統(tǒng)為我們提供了大量標(biāo)準(zhǔn)庫函數(shù),這些函數(shù)原型在對應(yīng)頭文件中,使用時要包含對應(yīng)頭文件。

C++函數(shù)分類表

分別求x正弦值、余弦值、正切值;x為弧度數(shù)doublesin(doublex)doublecos(doublex)doubletan(doublex)lnx即logexlog10xdoublelog(doublex)doublelog10(doublex)xy次冪ex次冪doublepow(doublex,doubley)doubleexp(doublex)分別求整型數(shù)、長整型、浮點數(shù)絕對值intabs(inti)longlabs(longn)doublefabs(doublex)math.hcmath求x平方根doublesqrt(doublex)數(shù)學(xué)C式頭文件C++頭文件功效簡述

原型

類別

第24頁C++語言程序設(shè)計教程第4章函數(shù)C式頭文件C++頭文件功效簡述

原型

類別

將整數(shù)v按x進制轉(zhuǎn)成字符串schar*itoa(intv,char*s,intx)time.hctime返回1970/1/1零點到當(dāng)前秒數(shù)time_ttime(time_t*timer)時間

設(shè)置隨機數(shù)種子

產(chǎn)生0-RAND_MAX隨機數(shù)rand(unsignedseed)intrand()stdlib.hiostream將字符串轉(zhuǎn)化成整數(shù)intatoi(char*s)類型轉(zhuǎn)換memory.hiostream將s指向內(nèi)存區(qū)域c個字節(jié)拷貝到d指向區(qū)域void*memcpy(void*d,void*s,intc)內(nèi)存操作unsignedstrlen(char*str)unsignedstrlen(char*str)其它字符串

字符stdlib.hiostream終止正在執(zhí)行程序exit(int)string.hiostreamchar*strcpy(char*s1,char*s2)char*strcpy(char*s1,char*s2)將c轉(zhuǎn)換成小寫、大寫字母inttolower(intc),inttoupper(intc)ctype.hiostreamc是否是字母,c是否是數(shù)字intisalpha(intc),intisdigit(intc)math.hcmath分別求x反正弦值、反余弦值、反正切值doubleasin(doublex)doubleacos(doublex)doubleatan(doublex)數(shù)學(xué)注意:在C++中,舊式C格調(diào)頭文件去掉了后綴.h,加上了前綴C,如stdlib.h在C++中變成了Cstdlib。當(dāng)使用了:#include<iostream>

usingnamespacestd;時,許多頭文件不需要包含了。在上面表中,用iostream表示不再需要包含對應(yīng)C++格調(diào)頭文件。4.7C++系統(tǒng)函數(shù)

第25頁4.7C++系統(tǒng)函數(shù)/**********************************************p4_9.cpp**利用系統(tǒng)函數(shù)rand()隨機產(chǎn)生學(xué)生成績********

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論