歡迎來到裝配圖網(wǎng)! | 幫助中心 裝配圖網(wǎng)zhuangpeitu.com!
裝配圖網(wǎng)
ImageVerifierCode 換一換
首頁(yè) 裝配圖網(wǎng) > 資源分類 > PPTX文檔下載  

在結(jié)構(gòu)化程序設(shè)計(jì)中函數(shù)是將任務(wù)進(jìn)行模塊劃分的基本單位PPT學(xué)習(xí)教案

  • 資源ID:105275135       資源大小:587.16KB        全文頁(yè)數(shù):109頁(yè)
  • 資源格式: PPTX        下載積分:20積分
快捷下載 游客一鍵下載
會(huì)員登錄下載
微信登錄下載
三方登錄下載: 微信開放平臺(tái)登錄 支付寶登錄   QQ登錄   微博登錄  
二維碼
微信掃一掃登錄
下載資源需要20積分
郵箱/手機(jī):
溫馨提示:
用戶名和密碼都是您填寫的郵箱或者手機(jī)號(hào),方便查詢和重復(fù)下載(系統(tǒng)自動(dòng)生成)
支付方式: 支付寶    微信支付   
驗(yàn)證碼:   換一換

 
賬號(hào):
密碼:
驗(yàn)證碼:   換一換
  忘記密碼?
    
友情提示
2、PDF文件下載后,可能會(huì)被瀏覽器默認(rèn)打開,此種情況可以點(diǎn)擊瀏覽器菜單,保存網(wǎng)頁(yè)到桌面,就可以正常下載了。
3、本站不支持迅雷下載,請(qǐng)使用電腦自帶的IE瀏覽器,或者360瀏覽器、谷歌瀏覽器下載即可。
4、本站資源下載后的文檔和圖紙-無水印,預(yù)覽文檔經(jīng)過壓縮,下載后原文更清晰。
5、試題試卷類文檔,如果標(biāo)題沒有明確說明有答案則都視為沒有答案,請(qǐng)知曉。

在結(jié)構(gòu)化程序設(shè)計(jì)中函數(shù)是將任務(wù)進(jìn)行模塊劃分的基本單位PPT學(xué)習(xí)教案

會(huì)計(jì)學(xué)1 練習(xí):編寫程序,輸入x,根據(jù)下面y和x的關(guān)系,計(jì)算y值并輸出3x-11 (x10)x (x1)2x-1 (1xx; if(x1) y=x; else if(1=x10) y=2*x-1; else y=3*x-11; coutx; if(x1) y=x; else if(1=x&x10) y=2*x-1; else y=3*x-11; coutx; if(x1) y=x; else if(1x10) y=2*x-1; else y=3*x-11; coutx; x=10?y=3x-11:y=2x-1 coutx; if(x1) y=x; else if(x10) y=2*x-1; else y=3*x-11; couty;第4頁(yè)/共109頁(yè)3.1 函數(shù)的定義與調(diào)用 3. 5 作用域與標(biāo)識(shí)符的可見性 3.4 函數(shù)調(diào)用機(jī)制 3.3 全局變量和局部變量 3.2 函數(shù)的參數(shù)傳遞,返回值及函數(shù)聲明 3.10 編譯預(yù)處理 3.9 頭文件與多文件結(jié)構(gòu) 3.6 存儲(chǔ)類型與標(biāo)識(shí)符的生命期 3.8 函數(shù)的一些高級(jí)議題 3.7 函數(shù)的遞歸調(diào)用 第5頁(yè)/共109頁(yè)3.1.1 函數(shù)概述3.1.2 函數(shù)的定義3.1.3 函數(shù)的調(diào)用 第6頁(yè)/共109頁(yè)函數(shù)是C+程序的基本組成模塊。通過函數(shù),可以把一個(gè)復(fù)雜任務(wù)分解成為若干個(gè)易于解決的小任務(wù)。充分體現(xiàn)逐步細(xì)化的設(shè)計(jì)思想。組成C+程序的若干函數(shù)中,有一個(gè)稱為main()(Winmain())函數(shù),是程序執(zhí)行的入口,它可以調(diào)用其他函數(shù),但不可以被調(diào)用。而其他一般函數(shù)既可以調(diào)用也可以被調(diào)用。函數(shù)概念的引入:入口函數(shù):第7頁(yè)/共109頁(yè)main ( )fun2( )fun1( )fun3( )funa( )funb( )func( )圖3.1 函數(shù)調(diào)用層次關(guān)系第8頁(yè)/共109頁(yè)3.1.1結(jié)束庫(kù)函數(shù)和自定義函數(shù): 庫(kù)函數(shù)或標(biāo)準(zhǔn)函數(shù),是由編譯系統(tǒng)預(yù)定義的,如一些常用的數(shù)學(xué)計(jì)算函數(shù)、字符串處理函數(shù)、圖形處理函數(shù)、標(biāo)準(zhǔn)輸入輸出函數(shù)等。 庫(kù)函數(shù)都按功能分類,集中說明在不同的頭文件中。用戶只需在自己的程序中包含某個(gè)頭文件,就可直接使用該文件中定義的函數(shù)。 用戶根據(jù)需要將某個(gè)具有相對(duì)獨(dú)立功能的程序定義為函數(shù),稱自定義函數(shù)。四個(gè)要素:返回值類型,函數(shù)名,參數(shù)列表和函數(shù)體第9頁(yè)/共109頁(yè)無參函數(shù)定義格式為:數(shù)據(jù)類型函數(shù)名(void)函數(shù)體說明: 數(shù)據(jù)類型指函數(shù)返回值類型,可以是任一種數(shù)據(jù)類型。沒有返回值應(yīng)將返回值類型定義為void。 函數(shù)名采用合法標(biāo)識(shí)符表示。 對(duì)無參函數(shù),參數(shù)括號(hào)中的void通常省略,但括號(hào)不能省略。 函數(shù)體由一系列語句組成。函數(shù)體可以為空,稱為空函數(shù)。 第10頁(yè)/共109頁(yè)例: 打印一個(gè)表頭void TableHead ( ) cout*endl;cout* example *endl;cout*=b?a:b; return(x); 有參函數(shù)的參數(shù)表中列出所有形式參數(shù)的類型和參數(shù)名稱。各參數(shù)即使類型相同也必須分別加以說明。 形式參數(shù)簡(jiǎn)稱形參,只能是變量名,不允許是常量或表達(dá)式。 Why?第12頁(yè)/共109頁(yè)int f()string s;.return s;f2(int i).int f(int v1,int v2).double square(double x)return x*x;第13頁(yè)/共109頁(yè)問題:定義函數(shù)時(shí)究竟哪些變量應(yīng)當(dāng)作為函數(shù)的參數(shù)?哪些應(yīng)當(dāng)定義在函數(shù)體內(nèi)?原則:函數(shù)在使用時(shí)被看成 “黑匣子”,除了輸入輸出外,其他部分可不必關(guān)心。從函數(shù)的定義看出,函數(shù)頭正是用來反映函數(shù)的功能和使用接口,它所定義的是“做什么”。即明確了“黑匣子”的輸入輸出部分,輸出就是函數(shù)的返回值,輸入就是參數(shù)。因此,只有那些功能上起自變量作用的變量才必須作為參數(shù)定義在參數(shù)表中;函數(shù)體中具體描述“如何做”,因此除參數(shù)之外的為實(shí)現(xiàn)算法所需用的變量應(yīng)當(dāng)定義在函數(shù)體內(nèi)。 C+中不允許函數(shù)的嵌套定義,即在一個(gè)函數(shù)中定義另一個(gè)函數(shù)。第14頁(yè)/共109頁(yè)函數(shù)調(diào)用: 所謂函數(shù)調(diào)用,就是使程序轉(zhuǎn)去執(zhí)行函數(shù)體。 在C+中,除了主函數(shù)外,其他任何函數(shù)都不能單獨(dú)作為程序運(yùn)行。任何函數(shù)功能的實(shí)現(xiàn)都是通過被主函數(shù)直接或間接調(diào)用進(jìn)行的。 無參函數(shù)的調(diào)用格式: 函數(shù)名( ) 有參函數(shù)的調(diào)用格式: 函數(shù)名(實(shí)際參數(shù)表)其中實(shí)際參數(shù)簡(jiǎn)稱實(shí)參,用來將實(shí)際參數(shù)的值傳遞給形參,因此可以是常量、具有值的變量或表達(dá)式。【例3.1】 輸入兩個(gè)實(shí)數(shù),輸出其中較大的數(shù)第15頁(yè)/共109頁(yè) 函數(shù)的調(diào)用規(guī)則1、調(diào)用函數(shù)時(shí),函數(shù)名必須與調(diào)用處的函數(shù)名完全一致。2、實(shí)參的個(gè)數(shù)必須與形參的個(gè)數(shù)一致。3、函數(shù)必須先聲明或定義,后調(diào)用。4、函數(shù)可以直接或間接地自己調(diào)用自己,稱為遞歸調(diào)用。int main() int add(int x, int y); int a=100,b=200,c ; c =add(a,b); .int add (int x, int y ) int z ; z=x+y; return(z);錯(cuò)誤:c=ad(a,b);c=add(a);int add(int , int );第16頁(yè)/共109頁(yè) 321 函數(shù)的參數(shù)傳遞及傳值調(diào)用 323 函數(shù)聲明322 函數(shù)返回值 第17頁(yè)/共109頁(yè)參數(shù)傳遞: 函數(shù)調(diào)用首先要進(jìn)行參數(shù)傳遞,參數(shù)傳遞的方向是由實(shí)參傳遞給形參。 傳遞過程是,先計(jì)算實(shí)參表達(dá)式的值,再將該值傳遞給對(duì)應(yīng)的形參變量。一般情況下,實(shí)參和形參的個(gè)數(shù)和排列順序應(yīng)一一對(duì)應(yīng),并且對(duì)應(yīng)參數(shù)應(yīng)類型匹配(賦值兼容),即實(shí)參的類型可以轉(zhuǎn)化為形參類型。而對(duì)應(yīng)參數(shù)的參數(shù)名則不要求相同。傳值調(diào)用和引用調(diào)用:按照參數(shù)形式的不同,C+有兩種調(diào)用方式:傳值調(diào)用和引用調(diào)用。傳值調(diào)用傳遞的是實(shí)參的值,本章介紹傳值調(diào)用。第18頁(yè)/共109頁(yè)在調(diào)用函數(shù)時(shí),一般在主調(diào)函數(shù)和被調(diào)用函數(shù)之間有 信息傳遞 這是由函數(shù)中的參數(shù)來完成的。調(diào)用函數(shù)和被調(diào)用函數(shù)之間的參數(shù)傳遞實(shí)際參數(shù) 形式參數(shù)主調(diào)用函數(shù)中的參數(shù)被調(diào)用函數(shù)中的參數(shù)(實(shí)參)(形參)int main() int a=5,b=10, c ; c=max(a,b); printf(“c=%dn”, c); return 0;int max(int x, int y) int t; if (xy) t=x; else t=y; return(t); 第19頁(yè)/共109頁(yè)yxa5b10510ct101010int main() int a=5,b=10, c ; c=max(a,b); printf(“c=%dn”, c); return 0; int max(int x, int y) int t; if (xy) t=x; else t=y; return(t); 信息傳遞原則:實(shí)參到形參單向值傳遞特點(diǎn):實(shí)參與形參各占用不同的內(nèi)存單元第20頁(yè)/共109頁(yè)傳值調(diào)用:將實(shí)參的值復(fù)制給形參,在函數(shù)中參加運(yùn)算的是形參,而實(shí)參不會(huì)發(fā)生任何改變。傳值調(diào)用起了一種隔離作用?!纠?.2】 實(shí)參和形參對(duì)應(yīng)關(guān)系的示例。注意:【例1.3】中調(diào)用函數(shù)strcpy(s3, s2),卻實(shí)現(xiàn)了字符數(shù)組s2的內(nèi)容復(fù)制到字符數(shù)組s3中。這是因?yàn)閿?shù)組名實(shí)際上代表存儲(chǔ)數(shù)組的內(nèi)存的首地址,復(fù)制給形參的是實(shí)參數(shù)組的首地址,結(jié)果參加運(yùn)算的是實(shí)參數(shù)組。數(shù)組作為參數(shù),定義時(shí)形參用數(shù)組名加一對(duì)方括號(hào),調(diào)用時(shí)實(shí)參只用數(shù)組名 第21頁(yè)/共109頁(yè)100aFFC2200bFFC4int add (int x, int y) int z ; z=(+x)+(+y) ; return(z); int main() int a=100,b=200,c ; c =add(a,b); coutcendl; return 0; 100 xFFA2200yFFA4101201302z1094302cFFC6第22頁(yè)/共109頁(yè) 當(dāng)形參值在函 數(shù)中發(fā)生變化時(shí), 且不影響調(diào)用它的 實(shí)參值的變化。 用途 采用這種數(shù)據(jù)復(fù)制的參數(shù)傳遞方式,每次每個(gè)參數(shù)只能傳遞一個(gè)數(shù)據(jù)。缺點(diǎn)add (a , b) ;int add ( x, y )第23頁(yè)/共109頁(yè) A) 11 B) 20 C) 21 D) 31請(qǐng)寫出下列程序的運(yùn)行結(jié)果 main() int x=6,y=7,z=8,r ; r=f (x-,y+,x+y),z-); coutr=ry) t=x; else t=y; return(t); 第29頁(yè)/共109頁(yè) 下面是一個(gè)使用結(jié)構(gòu)化程序設(shè)計(jì)思想開發(fā)的企業(yè)管理報(bào)表程序的框架。它使用了函數(shù)聲明。void menu_print();void account_report();void engineering_report();void marketing_report();int main() int choice; do menu_print();cinchoice; while(choice=4); switch(choice) case 1: account_report(); break; case 2: engineering_report(); break; case 3: marketing_report(); break; return 0;第30頁(yè)/共109頁(yè)void menu_print() cout”系統(tǒng)功能:”endl; cout”1財(cái)務(wù)報(bào)表”endl; cout”2工程報(bào)表”endl; cout”3市場(chǎng)報(bào)表”endl; cout”選擇業(yè)務(wù)序號(hào):”; void account_report() /生成財(cái)務(wù)報(bào)表void engineering_report() /生成工程報(bào)表 void marketing_report() /生成市場(chǎng)報(bào)表;第31頁(yè)/共109頁(yè)【例3.4】 輸出所有滿足下列條件的正整數(shù)m:10m1000且m、m2、m3均為回文數(shù)。分析:回文指左右對(duì)稱的序列。如121、353等就是回文數(shù)。判斷整數(shù)是否回文數(shù)用函數(shù)實(shí)現(xiàn),其思想是將該數(shù)各位拆開后反向組成新的整數(shù),如果該整數(shù)與原數(shù)相等則為回文數(shù)。m m*m m*m*m11 121 1331101 10201 1030301111 12321 1367631 運(yùn)行結(jié)果:第32頁(yè)/共109頁(yè) 第33頁(yè)/共109頁(yè)自由存儲(chǔ)區(qū) (動(dòng)態(tài)數(shù)據(jù))棧區(qū)(函數(shù)局部數(shù)據(jù))(main()函數(shù)局部數(shù)據(jù))全局?jǐn)?shù)據(jù)區(qū)(全局、靜態(tài))代碼區(qū)(程序代碼) 操作系統(tǒng)為一個(gè)C+程序的運(yùn)行所分配的內(nèi)存分為四個(gè)區(qū)域,如圖3.3 所示:第34頁(yè)/共109頁(yè)存儲(chǔ)區(qū)域說明:(1)代碼區(qū)(Code area):存放程序代碼,即程序中各個(gè)函數(shù)的代碼塊;(2)全局?jǐn)?shù)據(jù)區(qū)(Data area):存放全局?jǐn)?shù)據(jù)和靜態(tài)數(shù)據(jù);分配該區(qū)時(shí)內(nèi)存全部清零,結(jié)果變量的所有字節(jié)自動(dòng)初始化為零。(3)棧區(qū)(Stack area):存放局部變量,如函數(shù)中的變量等;分配棧區(qū)時(shí)不處理內(nèi)存,即變量取隨機(jī)值。(4)自由存儲(chǔ)區(qū)(Free store area):存放與指針相關(guān)的動(dòng)態(tài)數(shù)據(jù)。分配自由存儲(chǔ)區(qū)時(shí)不處理內(nèi)存。參見第七章。第35頁(yè)/共109頁(yè)在所有函數(shù)之外定義的變量稱為全局變量。全局變量在編譯時(shí)建立在全局?jǐn)?shù)據(jù)區(qū),在未給出初始化值時(shí)系統(tǒng)自動(dòng)初始化為全0。全局變量可定義在程序開頭,也可定義在中間位置,該全局變量在定義處之后的任何位置都是可以訪問的,稱為可見的。【例3.5】 多個(gè)函數(shù)使用全局變量的例子。全局變量引入:第36頁(yè)/共109頁(yè)定義在函數(shù)內(nèi)或塊內(nèi)的變量稱為局部變量。程序中使用的絕大多數(shù)變量都是局部變量。局部變量在程序運(yùn)行到它所在的塊時(shí)建立在棧中,該塊執(zhí)行完畢局部變量占有的空間即被釋放。局部變量在定義時(shí)可加修飾詞auto,但通常省略。局部變量在定義時(shí)若未初始化,其值為隨機(jī)數(shù)。局部變量引入:【例3.6】 使用局部變量的例子。思考:如果定義一個(gè)對(duì)象/變量為全局模式還是局部模式?第37頁(yè)/共109頁(yè) 1、主函數(shù)中定義的變量也只用在主函數(shù)中有效;關(guān)于局部變量使用的幾點(diǎn)說明 2、不同函數(shù)中可以使用相同的變量名,且它們代 表不同的存儲(chǔ)單元,互不干擾; 3、形式參數(shù)也是局部變量。其它函數(shù)是不能調(diào)用 該形參的; 4、在一個(gè)函數(shù)內(nèi)部,可以在復(fù)合語句中定義變量 ,這些變量只能在本復(fù)合語句中有效。第38頁(yè)/共109頁(yè)局部變量占用的內(nèi)存是在程序執(zhí)行過程中“動(dòng)態(tài)”地建立和釋放的。這種“動(dòng)態(tài)”是通過棧由系統(tǒng)自動(dòng)管理進(jìn)行的。(1)建立棧空間;(6)恢復(fù)現(xiàn)場(chǎng):取主調(diào)函數(shù)運(yùn)行狀態(tài)及返回地址,釋放棧空間;(7)繼續(xù)主調(diào)函數(shù)后續(xù)語句。(5)釋放被調(diào)函數(shù)中局部變量占用的??臻g;(4)執(zhí)行被調(diào)函數(shù)函數(shù)體;(3)為被調(diào)函數(shù)中的局部變量分配空間,完成參數(shù)傳遞;(2)保護(hù)現(xiàn)場(chǎng):主調(diào)函數(shù)運(yùn)行狀態(tài)和返回地址入棧;調(diào)用過程:第39頁(yè)/共109頁(yè)void fun1(int, int);void fun2(float);int main() int x=1;y=2; fun1(x, y); return 0;void fun1(int a,int b) float x=3; fun2(x);void fun2(float y) int x; x棧頂棧頂棧底棧底y3fun2() fun1()運(yùn)行狀態(tài)及返回地址運(yùn)行狀態(tài)及返回地址x3b2a1fun1() main()運(yùn)行狀態(tài)及返回地址運(yùn)行狀態(tài)及返回地址y2x1main() 操作系統(tǒng)運(yùn)行狀態(tài)及返回地址操作系統(tǒng)運(yùn)行狀態(tài)及返回地址此圖例說明在程序執(zhí)行過程中怎樣通過?!皠?dòng)態(tài)”地建立和釋放局部變量占用的內(nèi)存的地址地址.0XFE8020X5984D0XFE154第40頁(yè)/共109頁(yè)3 文件作用域 2 函數(shù)聲明作用域 作用域:指標(biāo)識(shí)符能夠被使用的范圍。只有在作用域內(nèi)標(biāo)識(shí)符才可以被訪問(稱為可見)。本節(jié)重點(diǎn)討論局部域和文件域(全局域),其中局部域包括塊域和函數(shù)聲明域。任何標(biāo)識(shí)符作用域的起始點(diǎn)均為標(biāo)識(shí)符說明處。下面分別介紹:1 塊作用域 第41頁(yè)/共109頁(yè) 函數(shù)中定義的標(biāo)識(shí)符,包括形參和函數(shù)體中定義的局部變量,作用域都在該函數(shù)內(nèi),也稱作函數(shù)域。塊指一對(duì)大括號(hào)括起來的程序段。塊中定義的標(biāo)識(shí)符,作用域在塊內(nèi)。復(fù)合語句是一個(gè)塊。函數(shù)也是一個(gè)塊。復(fù)合語句中定義的標(biāo)識(shí)符,作用域僅在該復(fù)合語句中?!纠?.7】 輸入兩數(shù),按從大到小的順序保存。塊的引入:第42頁(yè)/共109頁(yè)由VC+平臺(tái)運(yùn)行,結(jié)果如下:輸入兩整數(shù):3 5調(diào)用前:實(shí)參a=3,b=5調(diào)用中交換前:形參a=3,b=5交換后:形參a=5,b=3調(diào)用后:實(shí)參a=3,b=5 交換失敗局部變量具有局部作用域使得程序在不同塊中可以使用同名變量。這些同名變量各自在自己的作用域中可見,在其它地方不可見?!纠?.8】設(shè)計(jì)函數(shù)完成兩數(shù)交換,用主函數(shù)進(jìn)行測(cè)試。第43頁(yè)/共109頁(yè) 對(duì)于塊中嵌套其它塊的情況,如果嵌套塊中有同名局部變量,服從局部?jī)?yōu)先原則,即在內(nèi)層塊中屏蔽外層塊中的同名變量,換句話說,內(nèi)層塊中局部變量的作用域?yàn)閮?nèi)層塊;外層塊中局部變量的作用域?yàn)橥鈱映グ兞康膬?nèi)層塊部分。如果塊內(nèi)定義的局部變量與全局變量同名,塊內(nèi)仍然局部變量?jī)?yōu)先,但與塊作用域不同的是,在塊內(nèi)可以通過域運(yùn)算符“:”訪問同名的全局變量?!纠?.9】 顯示同名變量可見性。第44頁(yè)/共109頁(yè) 函數(shù)聲明不是定義函數(shù),在作函數(shù)聲明時(shí),其中的形參作用域只在聲明中,即作用域結(jié)束于右括號(hào)。正是由于形參不能被程序的其他地方引用,所以通常只要聲明形參個(gè)數(shù)和類型,形參名可省略。第45頁(yè)/共109頁(yè)文件作用域也稱全局作用域。定義在所有函數(shù)之外的標(biāo)識(shí)符,具有文件作用域,作用域?yàn)閺亩x處到整個(gè)源文件結(jié)束。文件中定義的全局變量和函數(shù)都具有文件作用域。如果某個(gè)文件中說明了具有文件作用域的標(biāo)識(shí)符,該文件又被另一個(gè)文件包含,則該標(biāo)識(shí)符的作用域延伸到新的文件中。如cin和cout是在頭文件iostream中說明的具有文件作用域的標(biāo)識(shí)符,它們的作用域也延伸到嵌入iostream的文件中。第46頁(yè)/共109頁(yè)存儲(chǔ)類型(storage class)決定標(biāo)識(shí)符的存儲(chǔ)區(qū)域,即編譯系統(tǒng)在不同區(qū)域?yàn)椴煌鎯?chǔ)類型的標(biāo)識(shí)符分配空間。由于存儲(chǔ)區(qū)域不同,標(biāo)識(shí)符的生命期也不同。所謂生命期,指的是標(biāo)識(shí)符從獲得空間到空間釋放之間的期間,標(biāo)識(shí)符只有在生存期中、并且在其自己的作用域中才能被訪問。 第47頁(yè)/共109頁(yè)自動(dòng)變量為用auto說明的變量,通常auto缺省。局部變量都是自動(dòng)變量,生命期開始于塊的執(zhí)行,結(jié)束于塊的結(jié)束,其原因是自動(dòng)變量的空間分配在棧中,塊開始執(zhí)行時(shí)系統(tǒng)自動(dòng)分配空間,塊執(zhí)行結(jié)束時(shí)系統(tǒng)自動(dòng)釋放空間。故自動(dòng)變量的生命期和作用域是一致的。為提高程序運(yùn)行效率,可以將某些變量保存在寄存器中,即用register說明為寄存器變量,但不提倡使用。C+中關(guān)于存儲(chǔ)類型的說明符(storage class specifier)有四個(gè):auto、register、static和extern。其中用auto和register修飾的稱為自動(dòng)存儲(chǔ)類型,用static修飾的稱為靜態(tài)存儲(chǔ)類型,用extern修飾的稱為外部存儲(chǔ)類型。1 自動(dòng)存儲(chǔ)類型第48頁(yè)/共109頁(yè)static說明的變量稱為靜態(tài)變量。根據(jù)定義的位置不同,還分為局部靜態(tài)變量和全局靜態(tài)變量,也稱內(nèi)部靜態(tài)變量和外部靜態(tài)變量。靜態(tài)變量均存儲(chǔ)在全局?jǐn)?shù)據(jù)區(qū),如果程序未顯式給出初始化值,系統(tǒng)自動(dòng)初始化為全0,且初始化只進(jìn)行一次;靜態(tài)變量占有的空間要到整個(gè)程序執(zhí)行結(jié)束才釋放,故靜態(tài)變量具有全局生命期。局部靜態(tài)變量是定義在塊中的靜態(tài)變量,當(dāng)塊第一次被執(zhí)行時(shí),編譯系統(tǒng)在全局?jǐn)?shù)據(jù)區(qū)為其開辟空間并保存數(shù)據(jù),該空間一直到整個(gè)程序結(jié)束才釋放。局部靜態(tài)變量具有局部作用域,但卻具有全局生命期。【例3.10】 自動(dòng)變量與局部靜態(tài)變量的區(qū)別第49頁(yè)/共109頁(yè) int f( int a) auto int b=0; static int c=3; b=b+1;c=c+1; return(a+b+c); int main() int a=2, i ; for(i=0; i 3; i +) cout f(a)endl; 0b3c1舉例2a2a4701580691第50頁(yè)/共109頁(yè) fun(int a, int b) static int m, i=2; i+=m+1; m=i+a+b; return(m); int main() int k=4,m=1,p; p=fun(k,m); coutpendl; p=fun(k,m); coutpendl; 0m4k4a1m1b p2i388120178 17817第51頁(yè)/共109頁(yè)int main() fun(); fun(); void fun() static int a3=0,1,2; int i ; for(i =0; i 3; i +) ai +=ai ; for(i =0; i 3; i +) coutai ; coutendl; return; 0 12 a0 a1 a2024048第52頁(yè)/共109頁(yè)一個(gè)C+程序可以由多個(gè)源程序文件組成。多文件程序系統(tǒng)可以通過外部存儲(chǔ)類型的變量和函數(shù)來共享某些數(shù)據(jù)和操作。在一個(gè)程序文件中定義的全局變量和函數(shù)缺省為外部的,即其作用域可以延伸到程序的其他文件中。其他文件如果要使用這個(gè)文件中定義的全局變量和函數(shù),應(yīng)該在使用前用“extern”作外部聲明。外部聲明通常放在文件的開頭(函數(shù)總是省略extern)。外部變量聲明不同于全局變量定義,變量定義時(shí)編譯器為其分配存儲(chǔ)空間,而變量聲明則表示該全局變量已在其他地方定義過,編譯系統(tǒng)不再分配存儲(chǔ)空間。外部的全局變量或函數(shù)加上static修飾,就成為靜態(tài)全局變量或靜態(tài)函數(shù)。靜態(tài)的全局變量和函數(shù)作用域限制在本文件,其他文件即使使用外部聲明也無法使用該全局變量或函數(shù)。 【例3.11】外部存儲(chǔ)類型的例子第53頁(yè)/共109頁(yè)全局變量的static:如果程序是由多個(gè)源文件組成時(shí),此全局變量的作用域只限于本文件中。extern int x; int x;main() a1.cppstatic char cc; extern int x; a2.cpp extern char cc; a3.cpp第54頁(yè)/共109頁(yè)1. 靜態(tài)生命期 靜態(tài)生命期(Static extent或Static storage duration)指的是標(biāo)識(shí)符從程序開始運(yùn)行時(shí)就存在,具有存儲(chǔ)空間,到程序運(yùn)行結(jié)束時(shí)消亡,釋放存儲(chǔ)空間。具有靜態(tài)生命期的標(biāo)識(shí)符存放在全局?jǐn)?shù)據(jù)區(qū),如全局變量、靜態(tài)全局變量、靜態(tài)局部變量。具有靜態(tài)生命期的標(biāo)識(shí)符在未被用戶初始化的情況下,系統(tǒng)會(huì)自動(dòng)將其初始化為0。 函數(shù)駐留在代碼區(qū),也具有靜態(tài)生命期。所有具有文件作用域的標(biāo)識(shí)符都具有靜態(tài)生命期。第55頁(yè)/共109頁(yè)2. 局部生命期 在函數(shù)內(nèi)部或塊中定義的標(biāo)識(shí)符具有局部生命期(Automatic extent或Automatic storage duration),其生命期開始于執(zhí)行到該函數(shù)或塊的標(biāo)識(shí)符定義處,結(jié)束于該函數(shù)或塊的結(jié)束處。具有局部生命期的標(biāo)識(shí)符存放在棧區(qū)。具有局部生命期的標(biāo)識(shí)符如果未被初始化,其內(nèi)容是隨機(jī)的,不可引用。 具有局部生命期的標(biāo)識(shí)符必定具有局部作用域;但反之不然,靜態(tài)局部變量具有局部作用域,但卻具有靜態(tài)生命期。第56頁(yè)/共109頁(yè)具有動(dòng)態(tài)生命期(dynamic extent或dynamic storage duration)的標(biāo)識(shí)符存放在自由存儲(chǔ)區(qū),由特定的函數(shù)調(diào)用或運(yùn)算來創(chuàng)建和釋放,如用new運(yùn)算符(或調(diào)用malloc()函數(shù))為變量分配存儲(chǔ)空間時(shí),變量的生命期開始,而用delete運(yùn)算符(或調(diào)用free()函數(shù))釋放空間或程序結(jié)束時(shí),變量生命期結(jié)束。關(guān)于new運(yùn)算符和delete運(yùn)算符將在第七章中介紹。3. 動(dòng)態(tài)生命期第57頁(yè)/共109頁(yè)1n 1)!-(n*n1n 1 0n 1 n! 遞歸是一種描述問題的方法,或稱算法。遞歸的思想可以簡(jiǎn)單地描述為“自己調(diào)用自己”。例如用如下方法定義階乘:可以看出是用階乘定義階乘,這種自己定義自己的方法稱為遞歸定義。遞歸的引入:第58頁(yè)/共109頁(yè)遞歸定義的階乘函數(shù):fac(int n)if (n=0|n=1) return 1;else return n*fac(n-1);只要設(shè)計(jì)主函數(shù)調(diào)用階乘函數(shù),即可實(shí)現(xiàn)計(jì)算階乘?!纠?.12】 求4!運(yùn)行結(jié)果:4321126244!=24說明:cout”n4!=”fac(4)=0&ch=9?1:0;int main() char ch; while(cin.get(ch), ch!= n) if (IsNumber(ch) cout是數(shù)字字符 endl; else cout不是數(shù)字字符 endl; return 0;因使用頻度很高,說明為內(nèi)聯(lián)函數(shù)。第71頁(yè)/共109頁(yè)3.9.1 頭文件標(biāo)準(zhǔn)庫(kù)頭文件:考慮標(biāo)識(shí)符在其他文件中的可見性。使用頭文件是很有效的方法。如:#includeusing namespace std; 其中的iostream是在標(biāo)準(zhǔn)名字空間域std中定義的頭文件。對(duì)應(yīng)的傳統(tǒng)方式的文件名為,頭文件以“.h”為后綴。 系統(tǒng)定義的頭文件中定義了一些常用的公用標(biāo)識(shí)符和函數(shù),用戶只要將頭文件包含進(jìn)自己的文件,就可使頭文件中定義的標(biāo)識(shí)符在用戶文件中變得可見,也就可以直接使用頭文件中定義的標(biāo)識(shí)符和函數(shù)。 第72頁(yè)/共109頁(yè)3.9.1 頭文件自定義頭文件:除了系統(tǒng)定義的頭文件外,用戶還可以自定義頭文件。對(duì)于具有外部存儲(chǔ)類型的標(biāo)識(shí)符,可以在其他任何一個(gè)源程序文件中經(jīng)聲明后引用,因此用戶完全可以將一些具有外部存儲(chǔ)類型的標(biāo)識(shí)符的聲明放在一個(gè)頭文件中。具體地說,頭文件中可以包括:用戶構(gòu)造的數(shù)據(jù)類型(如枚舉類型),外部變量,外部函數(shù)、常量和內(nèi)聯(lián)函數(shù)等具有一定通用性或常用的量,而一般性的變量和函數(shù)定義不宜放在頭文件中。第73頁(yè)/共109頁(yè)3.9.2 多文件結(jié)構(gòu) 在開發(fā)較大程序時(shí),通常將其分解為多個(gè)源程序文件,每個(gè)較小的程序用一個(gè)源程序文件建立。程序經(jīng)過建立、編譯、連接,成為一個(gè)完整的可執(zhí)行程序。多文件結(jié)構(gòu)通過工程進(jìn)行管理,在工程中建立若干用戶定義的頭文件.h和源程序文件.cpp。頭文件中定義用戶自定義的數(shù)據(jù)類型,所有的程序?qū)崿F(xiàn)則放在不同的源程序文件中。編譯時(shí)每個(gè)源程序文件單獨(dú)編譯,如果源程序文件中有編譯預(yù)處理指令,則首先經(jīng)過編譯預(yù)處理生成臨時(shí)文件存放在內(nèi)存,之后對(duì)臨時(shí)文件進(jìn)行編譯生成目標(biāo)文件.obj,編譯后臨時(shí)文件撤銷。所有的目標(biāo)文件經(jīng)連接器連接最終生成一個(gè)完整的可執(zhí)行文件.exe。 圖3.11是一個(gè)多文件系統(tǒng)的開發(fā)過程。第74頁(yè)/共109頁(yè)3.9.2 多文件結(jié)構(gòu)多文件結(jié)構(gòu)編譯 預(yù)編譯編譯 預(yù)編譯 預(yù)編譯編譯圖3.11 C+程序開發(fā)過程file1.hfile1.cppfile2.hfile2.cppfilen.hfilen.cpp臨時(shí)文件1臨時(shí)文件2臨時(shí)文件nfile1.objfile2.objfilen.objFilename.exe.libC+標(biāo)準(zhǔn)類庫(kù)連接運(yùn)行第75頁(yè)/共109頁(yè)3.10.1 宏定義指令 3.10.2 文件包含指令 3.10.3 條件編譯指令 第76頁(yè)/共109頁(yè)1 不帶參宏定義用來產(chǎn)生與一個(gè)字符串對(duì)應(yīng)的常量字符串,格式為:#define 宏名 常量串 預(yù)處理后文件中凡出現(xiàn)該字符串處均用其對(duì)應(yīng)的常量串代替。替換過程稱為宏替換或宏展開。例如,如果使用指令#define PI 3.1415926則程序中可以使用標(biāo)識(shí)符PI,編譯預(yù)處理后產(chǎn)生一個(gè)中間文件,文件中所有PI被替換為3.1415926。宏替換只是字符串和標(biāo)識(shí)符之間的簡(jiǎn)單替換,預(yù)處理本身不做任何數(shù)據(jù)類型和合法性檢查,也不分配內(nèi)存單元。第77頁(yè)/共109頁(yè)2 帶參數(shù)的宏定義帶參宏定義的形式很象定義一個(gè)函數(shù),格式為:#define 宏名 ( 形參表 ) 表達(dá)式串 例如作如下宏定義:#define S(a,b) (a)*(b)/2程序中可使用S(a,b),預(yù)處理后產(chǎn)生中間文件,其中S(a,b)被替換成(a)*(b)/2。注意,宏定義時(shí)形參通常要用括號(hào)括起來,否則容易導(dǎo)致邏輯錯(cuò)誤。例如,如果定義:#define S(a,b) a*b/2那么程序中的S(3+5,4+2)就會(huì)被宏展開為3+5*4+2/2,不符合定義的真正的意圖。帶參宏定義形式上象定義函數(shù),但它與函數(shù)的本質(zhì)不同,宏定義仍然只是產(chǎn)生字符串替代,不存在分配內(nèi)存和參數(shù)傳遞。 第78頁(yè)/共109頁(yè)文件包含用#include指令,預(yù)處理后將指令中指明的源程序文件嵌入到當(dāng)前源程序文件的指令位置處。格式為:#include 或#include 文件名第一種方式稱為標(biāo)準(zhǔn)方式,預(yù)處理器將在include子目錄下搜索由文件名所指明的文件。這種方式適用于嵌入C+提供的頭文件,因?yàn)檫@些頭文件一般都存在C+系統(tǒng)目錄的include子目錄下。而第二種方式編譯器將首先在當(dāng)前文件所在目錄下搜索,如果找不到再按標(biāo)準(zhǔn)方式搜索。這種方式適用于嵌入用戶自己建立的頭文件。第79頁(yè)/共109頁(yè)一個(gè)被包含的頭文件中還可以有#include指令,即include指令可以嵌套,但是,如果同一個(gè)頭文件在同一個(gè)源程序文件中被重復(fù)包含,就會(huì)出現(xiàn)標(biāo)識(shí)符重復(fù)定義的錯(cuò)誤。例如:頭文件f2.h中包含了f1.h,如果文件f3.cpp中既包含f1.h,又包含f2.h,那么編譯將提示錯(cuò)誤,原因是f1.h被包含了兩次,那么其中定義的標(biāo)識(shí)符在f3.cpp中就被重復(fù)定義。避免重復(fù)包含可以用條件編譯指令。第80頁(yè)/共109頁(yè)1 用宏名作為編譯的條件格式為:#ifdef#else#endif2 表達(dá)式的值作為編譯條件格式為:#if #else#endif當(dāng)希望在不同條件下編譯程序的不同部分。這種情況就要使用條件編譯指令。 其中程序段可以是程序也可以是編譯預(yù)處理指令??梢酝ㄟ^在該指令前面安排宏定義來控制編譯不同的程序段。第81頁(yè)/共109頁(yè)例:在調(diào)試程序時(shí)常常要輸出調(diào)試信息,而調(diào)試完后不需要輸出這些信息,則可以把輸出調(diào)試信息的語句用條件編譯指令括起來。形式如下:#ifdef DEBUGcouta=atx=xendl;#endif在程序調(diào)試期間,在該條件編譯指令前增加宏定義:#define DEBUG調(diào)試好后,刪除DEBUG宏定義,將源程序重新編譯一次。條件編譯指令包括:#if、#else、#ifdef、#ifndef、#endif、#undef等。#ifndef與#ifdef作用一樣,只是選擇的條件相反。#undef指令用來取消#define指令所定義的符號(hào),這樣可以根據(jù)需要打開和關(guān)閉符號(hào)。第82頁(yè)/共109頁(yè)謝謝!第83頁(yè)/共109頁(yè)【例例3.1】main( )函數(shù)調(diào)用max(2.5,4.7 )函數(shù)max(2.5,4.7 )return 4.7 主程序后續(xù)語句【例3.1】 輸入兩個(gè)實(shí)數(shù),輸出其中較大的數(shù)。其中求兩個(gè)實(shí)數(shù)中的較大數(shù)用函數(shù)完成。程序如下:#include using namespace std;float max(float a,float b)return(a=b?a:b);int main()float x,y;cout輸入兩個(gè)實(shí)數(shù):xy;c o u t x 和 y 中 較 大 數(shù) 為max(x,y)endl;return 0;形式參數(shù)實(shí)際參數(shù)第84頁(yè)/共109頁(yè)【例例3.2】調(diào)用power(4.6,3 )函數(shù)power(4.6,3 )return 97.336 主程序后續(xù)語句n= 3x= 4.6c= a【例3.2】 實(shí)參和形參對(duì)應(yīng)關(guān)系的示例。float power(float x,int n) /求x的n次冪float p=1;while(n-) p*=x;return p; int main()int n=3;float x=4.6;char c=a;coutpower(x,n)=power(x,n)endl;coutpower(c,n)=power(c,n)endl;coutpower(n,x)=power(n,x)endl;return 0;第85頁(yè)/共109頁(yè)【例例3.2】調(diào)用power(a,3 )函數(shù)power(97,3 )return 912673 主程序后續(xù)語句n= 3x= 4.6c= a【例32】 實(shí)參和形參對(duì)應(yīng)關(guān)系。float power(float x,int n) /求x的n次冪float p=1;while(n-) p*=x;return p; int main()int n=3;float x=4.6;char c=a;coutpower(x,n)=power(x,n)endl;coutpower(c,n)=power(c,n)endl;coutpower(n,x)=power(n,x)endl;return 0;第86頁(yè)/共109頁(yè)【例例3.2】調(diào)用power(3,4.6 )函數(shù)power(3,4)return 81 主程序后續(xù)語句n= 3x=4.6c= a【例32】 實(shí)參和形參對(duì)應(yīng)關(guān)系。float power(float x,int n) /求x的n次冪float p=1;while(n-) p*=x;return p; int main()int n=3;float x=4.6;char c=a;coutpower (x,n)=power(x,n)endl;coutpower (c,n)=power(c,n)endl;coutpower (n,x)=power(n,x)endl;return 0;第87頁(yè)/共109頁(yè)【例3.3】程序:float TriangleArea(float a, float b, float c) if (a+b=c)|(a+c=b)|(b+c=a) return -1; float s; s=(a+b+c)/2; /海倫公式 return sqrt(s*(s-a)*(s-b)*(s-c) ;int main() float a,b,c,area; cout輸入三角形三邊a,b,c:abc; area=TriangleArea(a,b,c); if(area=-1) cout(a,b, c )不能構(gòu)成三角形!endl; elsecout三角形(a,b,c )面積為:areaendl; return 0;第88頁(yè)/共109頁(yè)bool palindrome(int); /函數(shù)聲明int main() int m;coutsetw(10)msetw(20)m*m“setw(20)m*m*mendl;for(m=11;m1000;m+)if(palindrome(m)&palindrome(m*m) &palindrome(m*m*m)coutsetw(10)msetw(20)m*msetw(20)m*m*0);for(int j=0;ji;j+) n=n*10+digitj;return (n=m);【例例3.43.4】 輸出回文數(shù)輸出回文數(shù)第90頁(yè)/共109頁(yè)【例例3.5】打印200調(diào)用func( )函數(shù)func( )200*2=400打印400n=100n=100*2=200【例3.5】 多個(gè)函數(shù)使用全局變量的例子。int n=100;void func()n*=2; int main()n*=2;coutnendl;func();coutnendl; return 0;思考:C+為什么引入全局變量?第91頁(yè)/共109頁(yè)打印main()中的t=3.5調(diào)用fun( )函數(shù)fun( )打印fun()中的t=5 打印main()中的t=3.5t= 3.5t = 5【例3.6】 使用局部變量的例子。void fun()auto int t=5;/ fun()中的局部變量,auto可省略coutfun()中的t=tendl;int main()float t=3.5;/main()函數(shù)中的局部變量coutmain()中的t=tendl;fun();coutmain()中的t=tendl;return 0;第92頁(yè)/共109頁(yè)【例3.7】 a= 3 b= 535a=3 b=5a=5 b=3【例3.7】 輸入兩數(shù),按從大到小的順序保存,并輸出結(jié)果。結(jié)果棧t = 3 int main() int a,b; /具有函數(shù)域 cout輸入兩整數(shù):ab; cout“a=atb=b=a)int t; /具有塊域 t=a; a=b; b=t; /交換a,b的值 couta=atb=bendl; return 0;上述程序若在最后一個(gè)cout語句處增加:couttendl;則編譯時(shí)會(huì)提示錯(cuò)誤,因?yàn)樽兞縯的作用域只在if語句中,其它地方不可見。第93頁(yè)/共109頁(yè)【例3.8】設(shè)計(jì)函數(shù)完成兩數(shù)交換,用主函數(shù)進(jìn)行測(cè)試。void swap(int,int);int main() int a,b; /a,b作用域?yàn)閙ain() cout輸入兩整數(shù):ab; cout調(diào)用前:實(shí)參a=a, b=bendl; swap(a,b); /傳值 cout調(diào)用后:實(shí)參a=a,b=bendl; return 0;void swap(int a,int b) /a,b作用域?yàn)閟wap() cout調(diào)用中endl; cout交換前:形參a=“ a,b=bendl; int t; t=a; a=b; b=t;/交換swap()中的a,b的值 cout交換后:形參a=a,b=bendl;第94頁(yè)/共109頁(yè)全局全局n= 100100 200 300內(nèi) i= 500內(nèi) j= 600內(nèi)n=500+600 =11001100 500 600100200+300=500500 500 200 300外部 i=200外部 j=300【例3.9】 顯示同名變量可見性。int n=100;#include int main() int i=200,j=300;cout ntitjendl; /內(nèi)部塊 int i=500,j=600,n; n=i+j; cout ntitj endl; /輸出局部變量n cout:nendl;/輸出全局變量n n=i+j;/修改全局變量cout ntitj endl;return 0;第95頁(yè)/共109頁(yè)【例3.10】 自動(dòng)變量與局部靜態(tài)變量的區(qū)別 int st() static int t=100; /局部靜態(tài)變量 t+; return t;int at() int t=100; /自動(dòng)變量 t+;return t;int main() int i; for(i=0;i5;i+) coutat()t; coutendl; for(i=0;i5;i+) coutst()t; coutendl; return 0;i= 0t= 1001 2 3 4 5101101101101101第96頁(yè)/共109頁(yè)i= 0t=1001 21013 4 5102103104105【例3.10】 自動(dòng)變量與局部靜態(tài)變量的區(qū)別 int st() static int t=100; /局部靜態(tài)變量 t+; return t;int at() int t=100; /自動(dòng)變量 t+;return t;int main() int i; for(i=0;i5;i+) coutat()=t; coutendl; for(i=0;i5;i+) coutst()t; coutendl; return 0;第97頁(yè)/共109頁(yè)【例3.11】外部存儲(chǔ)類型的例子。假定程序包含兩個(gè)源程序文件Ex4_11_1.cpp和Ex4_11_2.cpp,程序結(jié)構(gòu)如下:/* Ex4_11_1.cpp ,由main()組成*/void fun2(); /外部函數(shù)聲明,等價(jià)于extern void fun2();int n; /全局變量定義int main() n=1; fun2(); / fun2()定義在文件Ex4_11_2.cpp中 coutn=nendl; return 0;/* Ex4_11_2.cpp,由fun2()組成*/extern int n; /外部變量聲明,n定義在文件Ex4_11_1.cpp中void fun2() /fun2()被文件Ex4_11_1.cpp中的函數(shù)調(diào)用n=3; 運(yùn)行結(jié)果:n=3第98頁(yè)/共109頁(yè)【例3.12】 求4!#include int fac(int n)int y; coutnt;if(n=0|n=1) y=1; else y=n*fac(n-1);coutyt;return y;int main()coutn4!=fac(4)endl;return o; n=4cout4;y=4*fac(3);fac(4)=cout2;y=2*fac(1); n=2cout1;y=1;cout1;return 1; n=1 n=3cout3;y=3*fac(2);cout24;return 24;cout6;return 6;cout2;return 2;24第99頁(yè)/共109頁(yè)【例3.13】 漢諾塔問題。有A、B、C三根柱子,A柱上有n個(gè)大小不等的盤子,大盤在下,小盤在上。要求將所有盤子由A柱搬動(dòng)到C柱上,每次只能搬動(dòng)一個(gè)盤子,搬動(dòng)過程中可以借助任何一根柱子,但必須滿足大盤在下,小盤在上。打印出搬動(dòng)的步驟。 A柱B柱C柱第100頁(yè)/共109頁(yè)分析:1 A柱只有一個(gè)盤子的情況: A柱C柱;2 A柱有兩個(gè)盤子的情況:小盤A柱B柱,大盤A柱C柱,小盤B柱C柱。3 A柱有n個(gè)盤子的情況:將此問題看成上面n-1個(gè)盤子和最下面第n個(gè)盤子的情況。n-1個(gè)盤子A柱B柱,第n個(gè)盤子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è)盤子。A柱B柱C柱第101頁(yè)/共109頁(yè)算法:1 n-1個(gè)盤子A柱B柱,借助于C柱;2 第n個(gè)盤子A柱C柱;3 n-1個(gè)盤子B柱C柱,借助于A柱;其中步驟1和步驟3繼續(xù)遞歸下去,直至搬動(dòng)一個(gè)盤子為止。由此,可以定義兩個(gè)函數(shù),一個(gè)是遞歸函數(shù),命名為hanoi(int n, char source, char temp, char target),實(shí)現(xiàn)將n個(gè)盤子從源柱source借助中間柱temp搬到目標(biāo)柱target;另一個(gè)命名為move(char source, char target),用來輸出搬動(dòng)一個(gè)盤子的提示信息。第102頁(yè)/共109頁(yè)void move(char source,char target) coutsourcetargetendl;void hanoi(int n,char source,char temp,char target) if(n=1) move(source,target); elsehanoi(n-1,source,target,temp); /將n-1個(gè)盤子搬到中間柱 move(source,target); /將最后一個(gè)盤子搬到目標(biāo)柱hanoi(n-1,temp,source,target); /將n-1個(gè)盤子搬到目標(biāo)柱 int main()int n;cout輸入盤子數(shù):n;hanoi(n,A,B,C);return 0;第103頁(yè)/共109頁(yè)【例3.14】 輸入一個(gè)整數(shù),用遞歸算法將整數(shù)倒序輸出。分析:在遞歸過程的遞推步驟中用求余運(yùn)算將整數(shù)的各個(gè)位分離,并打印出來。void backward(int n)coutn%10;if(n10) return; else backward(n/10);void main()int n;cout輸入整數(shù):n;cout原整數(shù):nendl反向數(shù):;backward(n);coutendl;return 0;第104頁(yè)/共109頁(yè)n=247cout7;backward(24); n=2cout2;return;n=24cout4;backward(2);backward(247) return; return; coutendl; 求余總是取當(dāng)前整數(shù)的最右一位,所以先輸出余數(shù)后遞歸可實(shí)現(xiàn)倒序輸出。如果先遞歸后輸出余數(shù),則是在回歸的過程中輸出,實(shí)現(xiàn)的就是正序輸出。第105頁(yè)/共109頁(yè)【例3.15】采用遞推法求解Fibonacii數(shù)列,本例的遞歸調(diào)用過程參見圖3.10。int fib(int n)if(n=0) return 0;else if(n=1) return 1;else return fib(n-1)+fib(n-2);int main()int i;for(i=0;i=19;i+) /將19改為69,可以看出計(jì)算到后面越來越緩慢。if(i%5=0) coutendl;coutsetw(6)fib(i);coutendl; return 0;第106頁(yè)/共109頁(yè)【例例3.16】3+5=調(diào)用sum(3,5 )函數(shù)sum(3,5 )return 8 2.2+5.6=調(diào)用sum(2.2,5.6 )函數(shù)double sum(2.2,5.6 )return 7.8 3.5+4+8=調(diào)用sum(3.5, 4, 8 )函數(shù)float sum(3.5, 4.0, 8.0 )return 15.5 結(jié)束87.815.5【例3.16】 重載函數(shù)的應(yīng)用。int sum(int a,int b) return a+b;Double sum(double a,double b)return a+b;float sum(float a,float b,float c)return a+b+c;int main()cout3+5=sum(3,5) endl;cout2.2+5.6=“ sum(2.2,5.6)endl;cout3.5+4+8=“ sum(3.5,4,8)0; loops-); int main()delay(3);cout“延時(shí)3個(gè)時(shí)間單位endl;delay();/等同于delay(5)cout“延時(shí)5個(gè)時(shí)間單位endl; return 0;【例例3.163.16】123延時(shí)3個(gè)時(shí)間單位12345延時(shí)5個(gè)時(shí)間單位第108頁(yè)/共109頁(yè)

注意事項(xiàng)

本文(在結(jié)構(gòu)化程序設(shè)計(jì)中函數(shù)是將任務(wù)進(jìn)行模塊劃分的基本單位PPT學(xué)習(xí)教案)為本站會(huì)員(英***)主動(dòng)上傳,裝配圖網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)上載內(nèi)容本身不做任何修改或編輯。 若此文所含內(nèi)容侵犯了您的版權(quán)或隱私,請(qǐng)立即通知裝配圖網(wǎng)(點(diǎn)擊聯(lián)系客服),我們立即給予刪除!

溫馨提示:如果因?yàn)榫W(wǎng)速或其他原因下載失敗請(qǐng)重新下載,重復(fù)下載不扣分。




關(guān)于我們 - 網(wǎng)站聲明 - 網(wǎng)站地圖 - 資源地圖 - 友情鏈接 - 網(wǎng)站客服 - 聯(lián)系我們

copyright@ 2023-2025  zhuangpeitu.com 裝配圖網(wǎng)版權(quán)所有   聯(lián)系電話:18123376007

備案號(hào):ICP2024067431號(hào)-1 川公網(wǎng)安備51140202000466號(hào)


本站為文檔C2C交易模式,即用戶上傳的文檔直接被用戶下載,本站只是中間服務(wù)平臺(tái),本站所有文檔下載所得的收益歸上傳人(含作者)所有。裝配圖網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)上載內(nèi)容本身不做任何修改或編輯。若文檔所含內(nèi)容侵犯了您的版權(quán)或隱私,請(qǐng)立即通知裝配圖網(wǎng),我們立即給予刪除!