課件-第04章函數(shù)在結(jié)構(gòu)化程序設(shè)計(jì)中是將任務(wù)進(jìn)行模塊劃分基_第1頁
課件-第04章函數(shù)在結(jié)構(gòu)化程序設(shè)計(jì)中是將任務(wù)進(jìn)行模塊劃分基_第2頁
課件-第04章函數(shù)在結(jié)構(gòu)化程序設(shè)計(jì)中是將任務(wù)進(jìn)行模塊劃分基_第3頁
課件-第04章函數(shù)在結(jié)構(gòu)化程序設(shè)計(jì)中是將任務(wù)進(jìn)行模塊劃分基_第4頁
課件-第04章函數(shù)在結(jié)構(gòu)化程序設(shè)計(jì)中是將任務(wù)進(jìn)行模塊劃分基_第5頁
已閱讀5頁,還剩89頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第四 函在結(jié)構(gòu)化程序設(shè)計(jì)中,函數(shù)是將任務(wù)進(jìn)行模塊劃分的本單位在 象的程序設(shè)計(jì)中,對數(shù)據(jù)的操作總是封裝函數(shù)中,一個(gè)函數(shù)描述一種操作。不要完全按模塊。也是讓學(xué)生處于 象程序設(shè)計(jì)的氛圍中。這樣第章的教學(xué)會順利一些 制,以及與此相關(guān)的內(nèi)存分配機(jī)制、變量生命期和作用域本章還將介紹關(guān)于函數(shù)重載的概念,介紹遞歸算理、工程文件的概念和運(yùn)行庫函數(shù)。函數(shù)的參函數(shù)的參數(shù)傳遞返回4.4.146函數(shù)的遞歸調(diào)44.7函數(shù)的一些高級議4.4.3全局變量和局部變48C++4.4.44.9頭文件與多文件結(jié)4.4.5作用域 類4.10編譯預(yù)處4.1.14.1.14.1.24.1.2函數(shù)的定4.1.34.1.3函數(shù)的調(diào) 函數(shù)概函數(shù)是C++程序的基本組成模通過函數(shù),可以把一個(gè)復(fù)雜任務(wù)分解成為若干個(gè)易于解決的小任務(wù)。充分體現(xiàn)結(jié)構(gòu)化程序設(shè)計(jì)由組成C++程序的若干函數(shù)中,有一個(gè)稱為(Winmain())函數(shù),是程序執(zhí)行的,它可以調(diào)main(fun2_1(main(fun2_1(fun1_1(fun1_1(fun1(fun2_2(fun3(fun2(圖4.1層次 函數(shù)概函數(shù)按其是否系統(tǒng)預(yù)定義分為兩類函數(shù)按是否帶有參數(shù)無參函數(shù)和有參函 無參函有參函11《數(shù)據(jù)類型》函數(shù)名(《void》){函數(shù)體例:下面函數(shù)的功能是打印一voidTableHead() }《數(shù)據(jù)類型》函數(shù)名《數(shù)據(jù)類型》函數(shù)名(參數(shù)類型形式參數(shù)2,…》{函數(shù)體形式參數(shù)1《,參數(shù)類型2例:下面函數(shù)的功能是返回兩個(gè)整數(shù)中較大一個(gè)max(inta,intb){}提定義函數(shù)時(shí)可能會涉及若干個(gè)變量,究竟哪些變量應(yīng)當(dāng)作為一個(gè)相對獨(dú)立的模塊,函數(shù)在使用時(shí)完全可以被看成“黑匣子”,除了輸入輸出外,其他部分可不必關(guān)心。從函它所定義的是“做什么”,在這部分必須明確“黑匣子”的輸入輸出部分,輸出就是函數(shù)的返回值,輸入就是參數(shù)此,只有那些功能上起自變量作用的變量才必須作為參數(shù)定如何做”,因此除參數(shù)之外的為實(shí)現(xiàn)算法所需用的變量應(yīng)當(dāng)定義在函數(shù)體內(nèi)。C++中不允許函數(shù)的嵌套定義,即在一個(gè)個(gè)函數(shù) 在C++中,除了主函數(shù)外,其他任何函數(shù)都不能單獨(dú)作為程序運(yùn)行。任何函數(shù)功能的實(shí)現(xiàn)都是通過被主函數(shù)直接或間接函數(shù)名()有參函數(shù)的調(diào)用格式為函數(shù)名(實(shí)際其中實(shí)際參數(shù)簡稱實(shí)參,用來將實(shí)際參數(shù)的值傳遞給形參,因此可以是常量、具有值的變量或表達(dá)式。【例4.1】輸入兩個(gè)實(shí)數(shù),輸出其中較大的數(shù)。其中求兩個(gè)main(main(floatfloatmax(floatx,floatvoidreturnmax(2.5,4.7returnmax(2.5,4.7max(2.5,4.7cout<<x<<"和"<<y<<"中較大數(shù)為}4.2.4.2.1函數(shù)的參數(shù)傳遞及傳值調(diào)函數(shù)返回函函數(shù)原型說4.2.1函數(shù)的參數(shù)傳遞及傳值調(diào)傳遞給形參。傳遞過程是,先計(jì)算實(shí)參表達(dá)式的值,再將該值傳遞給對應(yīng)的形參變量。一般情況下,個(gè)數(shù)和排列順序應(yīng)一一對應(yīng),并且對應(yīng)參數(shù)應(yīng)類型匹配(賦值兼容),即實(shí)參的類型可以轉(zhuǎn)化為形參類型應(yīng)參數(shù)的參數(shù)名則不要求相同和調(diào)用。顧名思義,傳值調(diào)用傳遞的是實(shí)參的值,本章主要介紹傳值調(diào)用。關(guān)于調(diào)用,將在第五章類4.2.1函數(shù)的參數(shù)傳遞及傳值調(diào)【例4.2】說明實(shí)參和形參 x= x= floatpower(floatx,intfloatpower(floatx,intfloatpow=1;while(n--)pow*=x;returnpow;}intn=3;floatx=4.6;charc='a';power(4.6,3power(4.6,3void}4.2.1函數(shù)的參數(shù)傳遞及傳值調(diào)【例4.2】說明實(shí)參和形參 x= x= floatpower(floatx,intfloatpower(floatx,int//求x的nfloatpow=1;while(n--)pow*=x;returnpow;power('a',3power('a',3句voidmain(){intn=3;floatx=4.6;charc='a';句}4.2.1函數(shù)的參數(shù)傳遞及傳值調(diào)【例4.2】說明實(shí)參和形參 floatpower(floatx,intfloatpower(floatx,int//求x的nfloatpow=1;while(n--)pow*=x;returnpow;power(3,4.6power(3,4.6句voidmain(){intn=3;floatx=4.6;charc='a';句cout<<"power("<<x<<','<<n<<")="<<power(x,n)<<endl;cout<<"power("<<c<<','<<n<<")="<<power(c,n)<<endl;cout<<"power}return語句的一般格式為return表達(dá)式函數(shù)的計(jì)算結(jié)果通過該語句傳遞回主調(diào)函數(shù)【例4.3】設(shè)計(jì)函數(shù),根據(jù)三角形的三邊長求面果不能構(gòu)成三角形,給出提示信息若不能構(gòu)成三角形則返回1。設(shè)計(jì)一個(gè)主函數(shù)完成函數(shù)測試。根據(jù)返回值情況輸出相應(yīng)結(jié)果。程序見下頁floatTriangleArea(floata,floatb,floatif((a+b<=c)||(a+c<=b)||(b+c<=a))return-floats;returnsqrt(s*(s-a)*(s-b)*(s-c));}voidmain(){floatif(area==- cout<<'('<<a<<','<<b<<','<<')'<<"不能構(gòu)成三角形elsecout<<"三角形<<")面積為函數(shù)可以有返回值,也可以沒有返回值。對將返回值類型定義為void數(shù)體內(nèi)可以沒有return語句,當(dāng)需要在程序指定位置退出時(shí),可return

函數(shù)原型說語法上對程序文件中函數(shù)的排列次序是沒有固定要求的,函數(shù)原型說函數(shù)原型是一條以分號結(jié)束的語句,實(shí)際上《函數(shù)返回值類型》函數(shù)名(《形參表其中形參表可以逐個(gè)列出每個(gè)參數(shù)的類型和參數(shù)名,參數(shù)名可省略,各形參之間函數(shù)名、形參個(gè)數(shù)和類型及次序等方面完全對應(yīng)一致,否則將導(dǎo)致編譯錯(cuò)誤。下面是一個(gè)使用結(jié)構(gòu)化程序設(shè)計(jì)思想開發(fā)的企業(yè)管理報(bào)表程序的框架。它使用了函數(shù)原型說明。#include voidaccount_report();voidengineering_report();voidmarketing_report();voidmain(){intcase1:account_report();case2:engineering_report();case3:marketing_report(); } _print()cout<<”1財(cái)務(wù)報(bào)表”<<endl;cout<<”2工程報(bào)表”<<endl;cout<<”3市場報(bào)表”<<endl;}void//}void//生成工程報(bào)}void//生成市場}函數(shù)原型說【例44】輸出所有滿足下列條件的函數(shù)原型說10<m<1000且m、m2、m3分析:回文指左右對稱的序列。如123等就是回文數(shù)。判斷整數(shù)是否回文數(shù)用函數(shù)實(shí)現(xiàn),其思想是將該數(shù)各位拆開后反向組成新的整數(shù),如果該整數(shù)與原數(shù)相等則為回文數(shù)。boolpalindrome(int);//函數(shù)原voidcout<<setw(10)<<'m'<<setw(20)<<"m*mfor(intm=11;m<1000;m++)boolpalindrome(intintdigit[10];intm=n,i=0;digit[i]=n%10;for(intj=0;j<i;j++)returnm運(yùn)行結(jié)m 全局變量和局部變量 機(jī)制與C++的內(nèi)存布變量 機(jī)制與C++的內(nèi)存布操作系統(tǒng)為一個(gè)C++程序的運(yùn)行所分配的內(nèi)存分為四個(gè)區(qū)域,如圖4.3程序在內(nèi)存中的棧區(qū)(函數(shù)局部數(shù)據(jù)(main()函數(shù)局部數(shù)據(jù)全局?jǐn)?shù)據(jù)區(qū)(全局、靜代碼區(qū)(程序代碼變量 機(jī)制與C++的內(nèi)存布代碼區(qū)(Codearea):存放程序代碼,全局?jǐn)?shù)據(jù)區(qū)(Dataarea):存放全局?jǐn)?shù)棧區(qū)(Stackarea):存放局部變量,如堆區(qū)(Heaparea):存放與指針相全局變在所有函數(shù)之外定義的變量稱為全局變量全局變量可定義在程序開頭,也可定義在中間位置,該全局變量在定義處之后的任何位置都是可以的,稱為可見的。請看下例全局變【例4.5】多個(gè)函數(shù)使用全局變量的例intn=100;voidfunc(func(void

func( }局部變定義在函數(shù)內(nèi)或塊內(nèi)的變量稱為局部變量局部變量在程序運(yùn)行到它所在的塊時(shí)建立在棧中, 局部變量在定義時(shí)可加修飾詞auto,但通常省略。程序中使用的絕大多數(shù)變量都是局部變局部變【例4.9使用局部變量的例子autointautointt=//fun()中的局部變量,auto打印中打印中的cout<<"fun()中的fun(floatfun(float//main()函數(shù)中的局部變cout<<"main()中的;cout<<"main()中的fun(中的中的打印中的打印} 函數(shù)調(diào)用機(jī)局部變量占用的內(nèi)存是在程序執(zhí)行過程中“動(dòng)態(tài)”地建立和的。這種“動(dòng)態(tài)”是通過棧由系統(tǒng)自動(dòng)管理進(jìn)行的。當(dāng)任何一個(gè)函數(shù)調(diào)用發(fā)生時(shí),系統(tǒng)都要作以下工作:建立??臻g為被調(diào)函數(shù)中的局部變量分配空間,完成參數(shù)傳遞執(zhí)行被調(diào)函數(shù)函數(shù)體被調(diào)函數(shù)中局部變量占用的棧空間恢復(fù)現(xiàn)場:取主調(diào)函數(shù)運(yùn)行狀態(tài)及返回地址 ??臻g函數(shù)調(diào)用機(jī)此圖例說明在程序執(zhí)行過程中怎樣通過?!皠?dòng)態(tài)”地建立局部變量占用的內(nèi)voidfun1(int,xy3xy3fun1()運(yùn)行狀態(tài)及返回地321main()運(yùn)行狀態(tài)及返回地21操作系統(tǒng)運(yùn)行狀態(tài)及返回地棧voidintfun1(x,}voidfun1(inta,intb){floatx=3;}voidfun2(floaty)int 棧…}作用域 類 變量 類外 類型與靜 類生命期與可見作用域指標(biāo)識符能夠被使用的范圍。只有在作用域內(nèi)標(biāo)識符才可以被稱為可見。本節(jié)只局部域和文件域(全局域),其中局部域包括塊域和函數(shù)原型域。任何標(biāo)識符作用域的起下面分別介紹塊作用

函數(shù)原型作用

文件作用1.1.塊指一對大括號括起來的程序段。塊中定義的標(biāo)函數(shù)也是一個(gè)塊。函數(shù)中定義的標(biāo)識符,包括參和函數(shù)體中定義的局部變量,作用域都在該函數(shù)內(nèi),1.塊【例4.7】輸入兩數(shù),按從大到小的順序保存 a= int //具有函數(shù) cout<<"輸入兩整int

//具有塊 結(jié)t=aa=b //交換a,b的值} }【例4.8】設(shè)計(jì)函數(shù)完成兩數(shù)交換,用主函數(shù) 試voidswap(int,int);voidmain(){inta,b; cout<<"調(diào)用前:實(shí)參a="<<a<<','swap(a,b);//傳cout<<"調(diào)用后:實(shí)參voidswap(inta,intb){ cout<<"交換前:形參a=a<<','<<"b="<<b<<endl;intt;t=aa=b //交換swap()中的a,b的cout<<"交換后:形參13調(diào)用前:實(shí)參調(diào)用中1可以通過域運(yùn)算符“::”同名的全局變量【例4.9顯示同變量intvoidintcout<<intcout<<n<<'\t'<<i<<'\t'<<j<<intcout<<n<<'\t'<<i<<'\t'<<j<<}cout<<n<<'\t'<<i<<'\t'<<j<<//修改全局cout<<n<<'\t'<<i<<'\t'<<j<<}

函數(shù)原型作用函數(shù)原型不是定義函數(shù),在作函數(shù)原型 時(shí),其中的形參作用域只在原型 中,即作用域結(jié)束于右括號。正是由于形參不能被程序的其他地方 ,所以通常只要聲明形參個(gè)數(shù)和類型,形參名可省略3文件作用域也稱全局作用域。定義在所有函數(shù)之外的標(biāo)識符,具有文件作用域,作用域?yàn)閺亩x處到整個(gè)3如果某個(gè)文件中說明了具有文件作用域的標(biāo)識符,該文件又被另一個(gè)文件包含,則該標(biāo)識符的作用域延伸到新的文件中。如cin和cout是在頭文件iostream.h中說明的具有文件作用域的標(biāo)識符,它們的作用域也延伸變量 類類型決定了變量的生命期,變量生命期指從獲得空間到空間之間的時(shí)期。類型的說明符有四個(gè):auto,register,static和本節(jié)重點(diǎn)掌握saic和xtrn這兩種類型的使用和區(qū)別。具體說,區(qū)分局部變量和靜態(tài)局部變量,全局變量和靜態(tài)全局變量。 變量 類auto:前面提到的局部變量都是自動(dòng)類型。其空間分配于塊始,空間于塊終,且由系統(tǒng)自動(dòng)進(jìn)行。自動(dòng)變量保存在棧中,且是在程序運(yùn)行過程中獲得空間,未初始化時(shí)值為隨機(jī)register:為提高程序運(yùn)行效率,可以將某些變量保存在static:靜態(tài)變量。根據(jù)被修飾變量的位置不同,分為局部()靜態(tài)變量和全局(外部)靜態(tài)變量。所有靜態(tài)變量均存放在全局?jǐn)?shù)據(jù)區(qū),編譯時(shí)獲得存局部靜態(tài)變局部靜態(tài)變量的作用域?yàn)閴K域,但生命期為整個(gè)文件。即當(dāng)塊結(jié)束時(shí),局部靜態(tài)變量空間仍然保持,直到整個(gè)程序文件結(jié)束時(shí)該局部靜態(tài)變量空間才 生命期結(jié)束。【例4.10】自動(dòng)變量與局部靜態(tài)變量的區(qū)別。(演 變量 staticint staticintt=100;局部靜t=}t++;t=}intt=100;自動(dòng)t++;return}voidintfor(i=0;i<5;i++)for(i=0;i<5;i++)}變量 i=i=staticintt=100;局部靜態(tài)變=tt++;return=t}intt=100;自動(dòng)變t++;return}voidintfor(i=0;i<5;i++)for(i=0;i<5;i++)}全局靜態(tài)變?nèi)朱o態(tài)變量是指用static修飾的全局 類型中介紹。外 類型與靜 類將這若干個(gè)文件連接在一起,產(chǎn)生可執(zhí)行程序。 外 類靜 類 外 類外部類型包括外部變量和外部函數(shù)。在由多個(gè)源程序文件組成的程序中,如果一個(gè)文件要使用另一個(gè)文件中定義的全局變量或函數(shù),這些源程序文件之間通過外部類型的變量和函數(shù)。用“extern”作外部,外部通常放在文件的開頭。變量定義時(shí)編譯器為其分配空間,而變量指明該全局變量已在其他地方說明過,編譯系統(tǒng)不再分配空函數(shù)缺省為外部的,因此修飾詞extern通常省略外 類【例4.11】外 類型的例子。假定程序包含兩個(gè)源程序文Ex4_11_1.cpp和Ex4_11_2.cpp,程序結(jié)構(gòu)如下/*Ex4_11_1.cpp,由main()組成*/#include<iostream.h>voidfun2(); ,等價(jià)于externvoidfun2();intn; void //fun2()定義在文件Ex4_11_2.cpp/*Ex4_11_2.cpp,由fun2()組成externint //外部變 ,n定義在文Ex4_11_1.cppvoidfun2(){//fun2()被文件Ex4_11_1.cpp中的函數(shù)調(diào)用n=3;}運(yùn)行結(jié)果:n=3靜 類靜態(tài)類型包括靜態(tài)全局變量和靜態(tài)函數(shù)。在定義全局變量或函數(shù)時(shí)加說明符static,就成為靜態(tài)變量或靜態(tài)函數(shù)。靜態(tài)類型的作用域與外部類型相反,一旦定義為靜態(tài)類型,就限制該變量或函數(shù)只能在定義它的文件中使用。靜態(tài)全局變量在編譯時(shí)分配空間,如果定義時(shí)不指定初值,則編譯系統(tǒng)將其初始化為全0。一個(gè)全局變量和一個(gè)靜態(tài)全局變量在使用上是不同的,其他文件通過外部變量可以使用一個(gè)全局變量,但卻無法使用靜態(tài)全局變量,的文件所獨(dú)享。函數(shù)與靜態(tài)函數(shù)之間的區(qū)別是相同的。4.5.44.5.4生命可見1生命生命期(Lifetime)也叫生存期。生命期 區(qū)域相關(guān)生命期分為靜態(tài)生命期、局部生命期和動(dòng)態(tài)生命期。靜態(tài)生命靜態(tài)生命靜態(tài)生命期指的是標(biāo)識符從程序開始運(yùn)行時(shí) 空間,到程序運(yùn)行結(jié)束時(shí)消亡, 空間。具有靜態(tài)生命期的標(biāo)識符存放在靜態(tài)數(shù)據(jù)區(qū),屬于靜態(tài) 靜態(tài)全局變量、靜態(tài)局部變量。具有靜態(tài)生命期的標(biāo)識符在未被用戶初始化的情況下,系統(tǒng)會自函數(shù)駐留在代碼區(qū),也具有靜態(tài)生命期。所局部生命在函數(shù)或塊中定義的標(biāo)識符具有局部生命期,其生命期開始于執(zhí)行到該函數(shù)或塊的標(biāo)識符聲明處,結(jié)束于該函數(shù)或塊的結(jié)束處。具有局部生命期的標(biāo)識符存放在棧區(qū)。具有局部生命期的標(biāo)識符如果未被初始化,其內(nèi)容是隨機(jī)的,不可用。但反之不然,靜態(tài)局部變量具有局部作用域,但卻動(dòng)態(tài)生命 可見可見性作用域具有一定的一致性。標(biāo)識符的作用域包含可見范圍,可見范圍不會超過作用域??梢娦栽诶斫馔麡?biāo)識符的作用域嵌套塊定義了同名標(biāo)識符的,在外層作用域中,內(nèi)層所定義的標(biāo)識符是不可見的,即外層的標(biāo)識符;同樣,在內(nèi)層作用域中,外層的標(biāo)識符將被內(nèi)層的同名標(biāo)識符,變得不可見,即外層中同圖4.顯示下面程序段中變量的作用域與可見性。22intm,floatx作用intm,floatx作用intm可見floatm不可見floatm作用域floatm可見intm不可見可見intm=1;floatx;{float}函數(shù)的遞歸調(diào)遞歸是一種描述問題的方法,或稱算法。遞歸的思想可以簡單地描述為“自己調(diào)用自己”。nnn*(n-nnn 函數(shù)的遞歸調(diào)在函數(shù)調(diào)用中,有這樣兩種情況,一種是在函的定義中有調(diào)用函數(shù)的語句,即自己調(diào)用自己;另一種是函數(shù)的定義中出現(xiàn)調(diào)用函數(shù)B的語句,而函數(shù)B的定義中也出現(xiàn)調(diào)用函數(shù)的語句,即相 用。前者稱直接遞歸,后者稱間接遞歸。本節(jié)只介紹直接遞歸。遞歸函數(shù)必須定義遞歸終止條件(top condition),避免無窮遞歸(nfniteRcuion)。遞歸定義的階乘算法用函數(shù)描述為fac(intif(n==0||n==1)return1;elsereturnn*fac(n-1);}只要設(shè)計(jì)主函數(shù)調(diào)用階乘函數(shù),即可實(shí)現(xiàn)計(jì)算【例4.12】求4!#include<iostream.h>intfac(intn){inty;if(n==0||n==1) elsey=n*fac(n-returny;}voidreturnreturnreturnreturnreturn 函數(shù)的遞歸調(diào)遞歸函數(shù)的執(zhí)行分為“遞推”和“回歸”兩個(gè)過,這兩個(gè)過程由遞歸終止條件控制,即逐層遞推,直至,然后逐層回歸。每次調(diào)用發(fā)生時(shí)都首先判斷遞歸終止條件。遞歸調(diào)用同普通的函數(shù)調(diào)用一樣,每當(dāng)調(diào)用發(fā)生時(shí),在棧中分配單元保調(diào)用不同的是,由于遞推的過程是一個(gè)逐層調(diào)用的至遇到遞歸終止條件時(shí),才開始回歸,這時(shí)才逐層??臻g,返回到上一層,直至最后返回到主調(diào)【例4.3】漢諾塔問題。有、B、C三根柱子,柱上有n個(gè)大小不等的盤子,大盤在下,小盤在上。要求將所有盤子由A柱搬動(dòng)到C柱上,每次只能搬動(dòng)一個(gè)盤子,搬動(dòng)過程中可以借助任何一根柱子,但必須滿足大盤在下,小盤在上。打印出搬動(dòng)的步驟。BB 函數(shù)的函數(shù)的遞歸調(diào)A柱只有一個(gè)盤子的情況:A柱C柱A柱有兩個(gè)盤子的情況:小盤A柱B柱,大盤A柱C柱,小盤B柱CA柱有n個(gè)盤子的情況:將此問題看成上面n-1個(gè)盤子和最下面第n個(gè)盤子的情況。n-個(gè)盤子A柱,第n子A柱C柱,n-1個(gè)盤子B柱C柱。問題轉(zhuǎn)化成搬動(dòng)n-1個(gè)盤子的問題,同樣,將n-1個(gè)盤子看成上面n-2個(gè)盤子和下面第n-1個(gè)盤子的情況,進(jìn)一步轉(zhuǎn)化為搬動(dòng)n-2個(gè)盤子的問題,……,類推下去,一直到最后成為搬動(dòng)一個(gè)盤子的問題。這是一個(gè)典型的遞歸問題,遞歸結(jié)束于只搬動(dòng)一個(gè)盤子。 函數(shù)的遞歸調(diào)算法可以描述n-1個(gè)盤子A柱B柱,借助于C柱第n個(gè)盤子A柱C柱n-1個(gè)盤子B柱C柱,借助于A柱函數(shù),命名為hanoi(intn,charsource,chartemp,char 個(gè)命名為move(charsource,char #includevoidmove(char cout<<source<<"- voidhanoi(intn,charsource,char if(n==1)move(source, hanoi(n- //將n-1個(gè)盤子搬到中間 );//將最后一個(gè)盤子搬到目標(biāo)柱 );}}voidmain(){int【例4.14】輸入一個(gè)整數(shù),用遞歸算法將整數(shù)倒序輸出。離,并打印出來。voidbackward(intn){if(n<10)return;else}voidint}從以上幾例可以看出,遞歸算法一般不需要借助循環(huán),但過不斷遞推和回歸的過程實(shí)現(xiàn)了其他算法用循環(huán)完成的功。因此,遞歸的終止條件非常重要,否則將會無休止地遞下去,陷入死循環(huán)狀態(tài) 函數(shù)的遞歸調(diào)【例4.15】在【例3.1】中采用遞推法求解Fbonaci數(shù)列,.11。#includ<iotamh>intfib(intn){if(n==0)returnelseif(n==1)returnelsereturnfib(n-1)+fib(n-2);}voidmain(){for(intif(i%5==0)cout<<endl;cout<<endl;圖4.11遞歸求解斐波那契數(shù)列調(diào)用同其他算法相比,用遞歸算法編制的程序非常簡潔易讀,但占用大量棧空間,且連續(xù)的調(diào)用返回操作占用較多CPU時(shí)間。因此是否選擇使用遞歸算法取決于所解決的問題及應(yīng)用的場合。4.74.74.74.7.1函數(shù)重4.7.24.7.3函數(shù)重在C++中,如果需要定義幾個(gè)功能相數(shù),那么這樣的幾個(gè)函數(shù)可以使用相同的函數(shù)名,這就是函數(shù)重載。例如求和函數(shù),對應(yīng)不同的參數(shù)類型,可以定義如下幾個(gè)重載函數(shù):intsum(inta,intb);floatsum(inta,intb)doublesum(doublea,doublefloatsum(floata,floatb,float對應(yīng)地調(diào)用相應(yīng)的函數(shù)。匹配過程按如下步驟進(jìn)行:參 轉(zhuǎn)換后如果匹配,調(diào)用該函數(shù)型不同是不行的。函數(shù)重載的好處在于,可以用相同的函數(shù)名來定義一組功能相同或類似的函數(shù),程序的可讀性增強(qiáng)。3+5= 函3+5=sum(3,5【例4.16】重載函數(shù)sum(3,5sum(3,5sum(3,5sum(inta,intreturnDoublesum(doubleDoublesum(doublea,doublereturn}82.2+5.6=floatsum(floata,floatb,floatsum(2.2,5.6sum(2.2,5.6

函數(shù)sum(2.2,5.63.5+4+8=3.5+4+8=voidsum(3.54sum(3.548sum(3.5,4,8結(jié)結(jié)缺省參缺省參缺省參數(shù)指在定義函數(shù)時(shí)為形參指定缺省值(默認(rèn)值。這樣的函數(shù)在調(diào)用時(shí),對于缺省參數(shù),可以給出實(shí)參值,也調(diào)用,如果不給出實(shí)參,則按缺省值進(jìn)行調(diào)用。是常量表被重新求值。但表達(dá)式必須有意義;缺省【例4.20】缺省變元voiddelay(intloops=5){for(;loops>0;loops--);}void

延時(shí)3 延時(shí)5cout<<"延時(shí)3個(gè)時(shí)間單位"<<endl; cout<<"延時(shí)5個(gè)時(shí)間單位"<<endl;}缺省參缺省參數(shù)通過表達(dá)式給出,所以可以使用函數(shù)調(diào)用,如intfun1(int參數(shù)a缺省時(shí),可由隨機(jī)數(shù)發(fā)生函數(shù)當(dāng)場產(chǎn)生,調(diào)什么函數(shù)缺省參數(shù)可以有多個(gè),但所有缺省參數(shù)必須放在參數(shù)表的右側(cè),即先定義所有的非缺省參數(shù),再定義缺省參數(shù)。這參數(shù)自左向右逐個(gè)匹配,當(dāng)實(shí)參和形參個(gè)數(shù)不一致時(shí)才不會產(chǎn)生二義性。一個(gè)參數(shù)只能在一個(gè)文件被指定一次缺省實(shí)參,上,缺省參數(shù)在公共頭文件包含的函數(shù)中指定,否則缺省intfun2(int,int=10,int=20);voidfun1(){…}intfun2(inta,intbintc){…}//定義中不再給出缺省內(nèi)聯(lián)函當(dāng)程序執(zhí)行函數(shù)調(diào)用時(shí),系統(tǒng)要建立??臻g,保護(hù)現(xiàn)時(shí)間和空間的開銷。當(dāng)函數(shù)功能簡單,使用頻率很高,為了提高效率,直接將重復(fù)書寫,二是程序可讀性往往沒有使用函數(shù)的好。 內(nèi)聯(lián)函請看如下程序段,讀入一行字符串,逐個(gè)判斷是否為數(shù)字字符#includeinlineIsNumber(charch)return}voidcharwhile(cin.get(ch),ch!=ifIsNumber(ch))cout<<″是數(shù)字字″<<endl;elsecout<<″不是數(shù)字字符″<<endl;}}因使用頻度很高,說明為內(nèi)聯(lián)函數(shù)4.8C++的系統(tǒng)庫函C++提供了一個(gè)很大的常用函數(shù)庫,該函數(shù)庫本身并不是C++語言的組成部分,所有庫中的函數(shù)用戶都可以自己定義,但直接使用庫函數(shù)能給編程帶來很大方便。實(shí)際上是一系列源程序文件數(shù)及標(biāo)識符,具有相同或相似功能的函數(shù)和標(biāo)識符集中放在一個(gè)文件中。這些文件均以的形式命名,存放在系統(tǒng)的include 下。例如文件iostream.h中定義了與控athh中定義了大量數(shù)學(xué)函數(shù),tingh中定義了大量與字符串操作相關(guān)的函數(shù)。4.9頭文件與多文件結(jié)4.9頭文件與多文件結(jié)考慮標(biāo)識符在其他文件中的可見性。使用頭文件有效的方法。#其中的iorea.是系統(tǒng)定義的一個(gè)文件,這種以“.h中文件包含進(jìn)自己的文件,就可使頭文件中定義的標(biāo)識中定義的標(biāo)識符和函數(shù)。4.9頭文件與多文件結(jié)除了系統(tǒng)定義的頭文件外,用戶還可以自定義頭文。對于具有外部一個(gè)源程序文件中經(jīng)后將一些具有外部類型的標(biāo)識符的放在一個(gè)頭數(shù)據(jù)類型(如枚舉類型),量和內(nèi)聯(lián)函數(shù)等具有一定通用性或常用的量,而一般性的變量和函數(shù)定義不宜放在頭文件中。在開發(fā)較大程序時(shí),通常將其分解為多個(gè)源程序文件,每個(gè)較小的程序用一個(gè)源程序文件建立。程序經(jīng)過建立、編譯、連接,成為一個(gè)完整的可執(zhí)行程序。多文件結(jié)構(gòu)通過工程進(jìn)行管理,在工程中建立若干用戶定義的頭文件h和源程序文件.cpp。頭文件中定義用戶自定義

溫馨提示

  • 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

提交評論