【優(yōu)選】c語言第六章函數(shù)PPT文檔_第1頁
【優(yōu)選】c語言第六章函數(shù)PPT文檔_第2頁
【優(yōu)選】c語言第六章函數(shù)PPT文檔_第3頁
【優(yōu)選】c語言第六章函數(shù)PPT文檔_第4頁
【優(yōu)選】c語言第六章函數(shù)PPT文檔_第5頁
已閱讀5頁,還剩89頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

六、函數(shù)教學(xué)目標(biāo):

函數(shù)的概念、定義、調(diào)用和返回帶自定義函數(shù)的程序設(shè)計(jì)遞推算法遞歸思想及算法實(shí)現(xiàn) 函數(shù)的參數(shù)傳遞方式1六、函數(shù)內(nèi)容要點(diǎn)函數(shù)的定義,實(shí)在參數(shù)與形式參數(shù),調(diào)用和返回值,與參數(shù)傳遞方式遞推算法的思路遞歸的概念和思路指針與函數(shù)函數(shù)返回指針指向函數(shù)的指針函數(shù)的參數(shù)傳遞2六、函數(shù)6.1函數(shù)任務(wù)6.1從鍵盤輸入一個(gè)正整數(shù)a,編一個(gè)程序判斷a是否為素?cái)?shù)??梢栽O(shè)計(jì)一個(gè)函數(shù)intcheckPrime(inta),讓該函數(shù)負(fù)責(zé)檢查a是否為素?cái)?shù),如果是,返回1,否則返回0.36.1函數(shù)6.1.1函數(shù)的說明在全局上,自定義函數(shù)應(yīng)該在主函數(shù)之前有一個(gè)說明,目的是告訴系統(tǒng)在程序中要用到一個(gè)自定義函數(shù),被主函數(shù)直接或間接調(diào)用。 intckeckPrim(inta);說明自變量只有一個(gè),是整型,函數(shù)的數(shù)值也是整型。函數(shù)的取值稱為函數(shù)的返回值。這里用1表示真,0表示假。46.1.2函數(shù)的定義方法類型標(biāo)志符函數(shù)名(形參列表){

參數(shù)定義

語句組}類型標(biāo)志符:表明函數(shù)返回值的類型。如果省略,系統(tǒng)則認(rèn)為是int型的。函數(shù)名:命名規(guī)則同變量名。用于調(diào)用該函數(shù)。形參列表:定義要傳值的局部變量,保存調(diào)用該函數(shù)時(shí)的輸入信息。形參多于一個(gè)時(shí),用逗號分隔。沒有形參時(shí),括號不能省略。形參列表的方式如下:類型標(biāo)志符參數(shù)名1,類型標(biāo)志符參數(shù)名2,

……函數(shù)體:該函數(shù)功能具體的實(shí)現(xiàn)過程。通常包括若干變量的定義和若干語句。函數(shù)體由一對大括號和其中包括的語句組構(gòu)成。參數(shù)定義指不傳值的局部變量定義,大括號內(nèi)可為空由類型標(biāo)識符、函數(shù)名和形參列表組成的部分稱為函數(shù)的首部。56.1.2函數(shù)的定義:例intMaxInt(intx,inty){intz;z=x>y?x:y;return(z);}類型標(biāo)志符:此處為int,表明該函數(shù)的返回值類型是int型的。函數(shù)名:為MaxInt。以后就使用這個(gè)名字調(diào)用該函數(shù)。形參列表:有2個(gè)形參,分別是int型變量x和int型變量y。它們用于保存調(diào)用該函數(shù)時(shí)傳遞進(jìn)來的輸入信息。函數(shù)體:實(shí)現(xiàn)該函數(shù)的功能。對由調(diào)用者傳遞進(jìn)來保存在形參中的數(shù)據(jù)進(jìn)行有關(guān)處理后,將結(jié)果通過return語句返回給調(diào)用者。66.1.2函數(shù)的定義:例//********************************//函數(shù)名字:Power *//主要功能:計(jì)算x的y次方的值 *//入口參數(shù):兩個(gè)整型數(shù)x和y *//函數(shù)返回:雙精度數(shù):x的y次方 *//*********************************doublePower(intx,inty){intn;doublep=1;for(n=1;n<=y;n++)p=p*x;return(p);}76.1.3函數(shù)的返回值函數(shù)一般是由主函數(shù)調(diào)用(當(dāng)然也可由別的函數(shù)或這個(gè)函數(shù)自已來調(diào)用),調(diào)用函數(shù)的目的是讓它計(jì)算某一函數(shù)的值,這個(gè)值通過return語句返回給調(diào)用它的函數(shù),格式為Return(表達(dá)式);或

return表達(dá)式;如果不需返回?cái)?shù)值,則用return;有調(diào)用就要有返回,函數(shù)中一定要有return出現(xiàn),注意養(yǎng)成這個(gè)好習(xí)慣。86.1.4函數(shù)的調(diào)用函數(shù)一經(jīng)定義,以其名為標(biāo)記的一片內(nèi)存地址就被該函數(shù)所占有。在這片地址中存儲著相關(guān)的一系列指令。因此在程序中出現(xiàn)該函數(shù)名,就意味著程序轉(zhuǎn)到這一片內(nèi)存地址,調(diào)用這個(gè)函數(shù),執(zhí)行了相關(guān)的一系列程序指令。96.1.4函數(shù)的調(diào)用函數(shù)的調(diào)用方式(1)對于有返回值的函數(shù),可視其為表達(dá)式,可放在任何可放的地方。比如任務(wù)6.1中的checkPrime函數(shù)就放在if語句的表達(dá)式中。(2)對于沒有返回值的函數(shù),一般在程序中作為獨(dú)立一條語句出現(xiàn),不以表達(dá)式形式出現(xiàn)。如return(a);10函數(shù)調(diào)用的一般形式為:函數(shù)名(實(shí)參列表);如果是無參函數(shù),則沒有實(shí)參列表,但是括號不能省略;如果實(shí)參多于一個(gè),則用逗號分隔。6.1.4函數(shù)的調(diào)用調(diào)用一個(gè)函數(shù)時(shí),一定要保證實(shí)參和形參的一致,即在參數(shù)數(shù)量、類型和順序上都要一致。調(diào)用一個(gè)函數(shù)時(shí),要發(fā)生由實(shí)參到形參的“單向值傳遞”的參數(shù)傳遞過程。?為什么用函數(shù)名就可以調(diào)用一個(gè)函數(shù)因?yàn)楹瘮?shù)名中包含了該函數(shù)的入口地址信息,即函數(shù)名是一個(gè)指向函數(shù)入口地址的常量指針。11函數(shù)參數(shù)的作用用于在調(diào)用某個(gè)函數(shù)時(shí)由調(diào)用者向該被調(diào)用函數(shù)傳遞信息。6.1.5函數(shù)的參數(shù)對函數(shù)的進(jìn)一步理解可以把一個(gè)函數(shù)理解為一個(gè)“黑箱”,使用者使用該“黑箱”時(shí),提供了加工的信息輸入到“黑箱”中,該“黑箱”按照預(yù)先設(shè)計(jì)的功能對接收到的這些符合預(yù)定要求的輸入信息進(jìn)行加工,然后返回輸出信息給使用者。函數(shù)輸入

信息輸出

信息

可見,要想形成一個(gè)函數(shù),必須要設(shè)計(jì)好它可以接收什么樣的輸入信息,又輸出什么樣的信息,即必須設(shè)計(jì)好函數(shù)的接口。

12定義函數(shù)時(shí)出現(xiàn)在函數(shù)名后括號中的參數(shù)即是形式參數(shù)。之所以稱為形式參數(shù),是因?yàn)樵诙x函數(shù)時(shí)這些參數(shù)并不具有具體的值,而只是代表某個(gè)數(shù)據(jù)類型的一個(gè)變量。函數(shù)的形式參數(shù)函數(shù)形參的作用形參就是函數(shù)的輸入接口:使用者在調(diào)用該函數(shù)時(shí)提供的輸入信息被傳遞給相應(yīng)的形式參數(shù),然后函數(shù)按照預(yù)先設(shè)計(jì)的程序?qū)π螀⑦M(jìn)行處理,實(shí)際上就是對傳遞進(jìn)來的數(shù)據(jù)進(jìn)行處理。在函數(shù)未被調(diào)用時(shí),系統(tǒng)不對形參分配內(nèi)存單元。在函數(shù)調(diào)用時(shí),系統(tǒng)立刻給形參分配內(nèi)存單元;調(diào)用結(jié)束后,再釋放形式參數(shù)所占的內(nèi)存單元。因此形式參數(shù)屬于局部變量,其作用域限定在它所在的函數(shù)體內(nèi)編寫一個(gè)函數(shù)時(shí)很重要一個(gè)工作就是要確定形參(數(shù)量、類型、意義、作用)。13調(diào)用函數(shù)時(shí)出現(xiàn)在函數(shù)名后括號中的參數(shù)即是實(shí)際參數(shù)。之所以稱為實(shí)際參數(shù),是因?yàn)樵谡{(diào)用函數(shù)時(shí)這些參數(shù)必須具有實(shí)際的值,才能用于去調(diào)用函數(shù)。實(shí)參可以使常量、變量或表達(dá)式。實(shí)際參數(shù)是一個(gè)具有確定值的表達(dá)式。函數(shù)調(diào)用時(shí),要將實(shí)際參數(shù)賦給形式參數(shù)。函數(shù)的實(shí)際參數(shù)調(diào)用函數(shù)時(shí)給出的實(shí)參必須和形參一致實(shí)參必須和形參在數(shù)量、順序、類型上一致才能正確調(diào)用。14intfunc(intx,inty,charop){intz;switch(op){case‘+’: z=x+y;break;case‘-’: z=x-y; break;case‘*’: z=x*y; break;case‘/’: z=x/y; break;}return(z);}函數(shù)的參數(shù):例result=func(3,5,‘*’);定義函數(shù)時(shí)的參數(shù)是形式參數(shù)。調(diào)用函數(shù)時(shí)的參數(shù)是實(shí)際參數(shù)。15函數(shù)調(diào)用的內(nèi)部過程是:出現(xiàn)函數(shù)調(diào)用時(shí),主調(diào)函數(shù)的執(zhí)行過程暫時(shí)停止,在進(jìn)行了必要的“現(xiàn)場”保存工作后,轉(zhuǎn)去執(zhí)行被調(diào)用函數(shù)的代碼,待被調(diào)用函數(shù)執(zhí)行完畢返回后,首先恢復(fù)剛才保存的“現(xiàn)場”,然后繼續(xù)主調(diào)函數(shù)的執(zhí)行。6.1.6函數(shù)的調(diào)用和返回主調(diào)函數(shù)被調(diào)函數(shù)函數(shù)調(diào)用被調(diào)函數(shù)開始被調(diào)函數(shù)結(jié)束(傳遞參數(shù))(返回函數(shù)值)1617成功調(diào)用函數(shù)的條件函數(shù)原型:函數(shù)首部帶分號函數(shù)調(diào)用語句之前的程序行,被調(diào)用函數(shù)已經(jīng)定義;或者被調(diào)用函數(shù)的原型已經(jīng)聲明,并且后面的程序行有被調(diào)用函數(shù)的定義進(jìn)行函數(shù)原型聲明的目的在于:讓主調(diào)函數(shù)知道被調(diào)函數(shù)的名字、形式參數(shù)(數(shù)量、類型和順序)以及函數(shù)返回值類型。如果調(diào)用的是系統(tǒng)庫函數(shù),則必須加上相應(yīng)的頭文件,其中有庫函數(shù)的原型聲明;(2)如果調(diào)用的是用戶自定義函數(shù),則必須在調(diào)用之前對被調(diào)函數(shù)進(jìn)行函數(shù)原型聲明。聲明應(yīng)該放在所有函數(shù)外面源程序文件開頭的地方。18函數(shù)原型聲明的方法函數(shù)返回值類型函數(shù)名(形參列表);形參列表可以只是形參類型列表,不指出形參的名字函數(shù)原型聲明的方法和位置函數(shù)原型聲明的位置:放在所有函數(shù)外面,源程序文件開頭的地方。優(yōu)點(diǎn):凡是在該聲明之后定義的函數(shù),無需再進(jìn)行函數(shù)原型聲明即可調(diào)用該函數(shù)。19intfunc(intx,inty,charop){……}函數(shù)原型聲明:例intfunc(intx,inty,charop);voidmain(){inta=3,b=5,result;……result=func(a,b,‘*’);……}在所有函數(shù)之外,源程序文件開頭進(jìn)行函數(shù)原型聲明。注意:有分號注意:沒有分號206.1.7帶自定義函數(shù)的程序設(shè)計(jì)任務(wù)6.2N名裁判給某歌手打分(假定分?jǐn)?shù)都為整數(shù))。評分原則是去掉一個(gè)最高分,去掉一個(gè)最低分,剩下分?jǐn)?shù)的平均值即為該歌手的最終得分。裁判給分的范圍是60到100。裁判人數(shù)為N=10。請編寫一個(gè)程序,每個(gè)裁判所給的分?jǐn)?shù)由鍵盤輸入,要求屏幕輸出歌手的最終得分。(程序6_2.cpp)21(1)構(gòu)造一個(gè)名為max()的函數(shù),用于計(jì)算兩個(gè)參數(shù)中的大者。(2)構(gòu)造一個(gè)名為min()的函數(shù),用于計(jì)算兩個(gè)參數(shù)中的小者。(3)定義整型變量maxScore,用于保存N個(gè)數(shù)中的最大值,初始化時(shí)賦為0(4)定義整型變量minScore,用于保存N個(gè)數(shù)中的最小值,初始化時(shí)賦為0(5)定義一個(gè)整型變量sum用于累加,初始為0(6)采用for循環(huán)結(jié)構(gòu),從1到N逐個(gè)輸入每位裁判的打分,隨時(shí)記錄輸入過程中的最大值和最小值及累加總分。(7)最終得分用下面的公式計(jì)算(sum-maxScore-minScore)/(N-2)226.1.7帶自定義函數(shù)的程序設(shè)計(jì)問題:編程求解(程序6_3.cpp)n,k由鍵盤輸入解題思路(1)定義一個(gè)函數(shù)power(i,k)=ik;(2)再定義一個(gè)函數(shù)SOP(m,l)用于計(jì)算power(1,l)+power(2,l)+…+power(m,l)讓m=n,i=k,即可得解236.2遞推遞推是計(jì)算機(jī)數(shù)值計(jì)算中的一個(gè)重要算法。思路是通過數(shù)學(xué)推導(dǎo),將復(fù)雜的運(yùn)算化解為若干重復(fù)的簡單運(yùn)算,以充分發(fā)揮計(jì)算機(jī)長于重復(fù)計(jì)算的特點(diǎn)。任務(wù)6.3A,B,C,D,E合伙夜間捕魚,凌晨時(shí)都疲憊不堪,各自在河邊的樹叢中找地方睡著了。日上三竿,A第一個(gè)醒來,他將魚平分成5份,把多余的一條扔回湖中,拿自己的一份回家去了;B第二個(gè)醒來,也將魚平分為5份,扔掉多余的一條,只拿走自己的一份;接著C,D,E依次醒來,也都按同樣的辦法分魚。問5人至少合伙捕到多少條魚?每個(gè)人醒來后看到的魚數(shù)是多少條?24

解題思路假定A,B,C,D,E的編號為1,2,3,4,5,整數(shù)數(shù)組fish[k]表示第k個(gè)人所看到的魚數(shù)。顯然:fish[1]=5人合伙捕到的總魚數(shù)fisk[2]=(fish[1]-1)*4/5fish[3]=(fish[2]-1)*4/5fish[4]=(fish[3]-1)*4/5fish[5]=(fish[4]-1)*4/5即fish[I]=(fish[I-1]-1)*4/5,且fish[I-1]%5==1或fish[I-1]=fish[I]*5/4+1,且fish[I]%4==0(I>1)25解題思路(續(xù))按題意要求5人合伙捕魚的最少魚數(shù),可以從小到大枚舉。取fish[5]的值為6,11,16,21,…依次計(jì)算fish[4],fish[3],fish[2],fish[1]的值,并比較其是否滿足fish[I+1]%4==0(I=4,3,2,1),如果某次計(jì)算不能滿足,則退出本次循環(huán),繼續(xù)從下一個(gè)fish[5]開始進(jìn)行計(jì)算,如果所有的fish[I]均滿足條件,則退出循環(huán),得到結(jié)果。26任務(wù)6.3的程序框圖(NS圖)276.2.1遞推數(shù)列的定義一個(gè)數(shù)列從某一項(xiàng)起,它的任何一項(xiàng)都可以用它前面的若干項(xiàng)來確定,這樣的數(shù)列稱為遞推數(shù)列,表示某項(xiàng)與其前面的若干項(xiàng)的關(guān)系就稱為遞推公式。如1!,2!,3!,…,n!就是一個(gè)遞推數(shù)列,其遞推公式為:設(shè)fact(n)表示n!fact(n)=n*fact(n-1) (通項(xiàng)公式)fact(0)=1 (邊界條件)286.2.2遞推算法的程序?qū)崿F(xiàn)有了通項(xiàng)公式和邊界條件后,采用循環(huán)結(jié)構(gòu),從邊界條件出發(fā),利用通項(xiàng)公式通過若干步遞推過程就可以求出解來。例:編寫一個(gè)程序intfact(intn),用于計(jì)算n!的值。intfact(intn){ intI,prod=1; //通過邊界條件賦初值 for(I=1;I<=n;I++) prod=prod*I;//通項(xiàng)公式 returnprod;}296.2.2遞歸算法的程序?qū)崿F(xiàn)任務(wù)6.5王小二自夸刀工不錯(cuò),有人放一張大的煎餅在砧板上,問他:“餅不許離開砧板,切100刀最多能分成多少塊?”。編程思路: 這道題在編程之前要先找到規(guī)律。30編程思路:令Q(n)為切n刀能分成的塊數(shù),從上圖可見Q(1)=1+1=2Q(2)=1+1+2=4Q(3)=1+1+2+3=7Q(4)=1+1+2+3+4=11在切法上是讓每兩條線都有交點(diǎn),用歸納法可以證明Q(n)=Q(n-1)+n (通項(xiàng)公式)Q(0)=1 (邊界條件)316.3遞歸及其實(shí)現(xiàn)遞歸算法在可計(jì)算性理論中占有重要地位,是算法設(shè)計(jì)的有力工具,對于拓展編程思路非常有用。任務(wù)6.5用遞歸算法求n!。算法思路:定義函數(shù)fact(n)=n!fact(n-1)=(n-1)!則有fact(n)=n*fact(n-1) 通項(xiàng)公式已知fact(1)=1

邊界條件32算法思路(續(xù))(1)或結(jié)點(diǎn)結(jié)點(diǎn)依不同的條件會有不同的取值。33算法思路(續(xù))(2)與結(jié)點(diǎn)A的最終取值為C的值,但為了求C的值,得先求出B的值,C是B的函數(shù)343536求n!的遞歸函數(shù)intfact(intn){ if(n>1) returnn*fact(n-1); else return1;}37下面畫出了調(diào)用和返回的遞歸示意圖383940使用遞推求3!fact(1)=1 初始條件fact(2)=2*fact(1)=2fact(3)=3*fact(2)=6intfact(intn){ intprod=1,I; for(I=1;I<=n;I++) prod=prod*I; returnprod;}41遞推與遞歸的比較遞推的過程相當(dāng)于從菜心推到外層,其出發(fā)點(diǎn)放在初始條件上。遞歸的出發(fā)點(diǎn)放在求解的目標(biāo)上,逐步調(diào)用本身,直到遞歸的邊界條件為止。當(dāng)問題不能或不容易找到遞推關(guān)系時(shí),使用遞歸更符合人的思維方式,邏輯性強(qiáng),函數(shù)的可讀性好,易于理解。426.3遞歸及其實(shí)現(xiàn)例6.1漢諾塔問題:相傳在古代印度的一座神廟中,有位僧人整天把3根柱子上的金盤倒來倒去,原來他是想把64個(gè)一個(gè)比一個(gè)小的金盤從一根柱子上移到另一根柱子上去。移動過程中恪守下述規(guī)則:每次只允許移動一只盤,且大盤不得擺在小盤上面,如下圖。43漢諾塔問題算法思路:從最簡單的情況分析起(1)在A柱上只有一只盤子,見下圖,假定盤號為1,這時(shí)只需將該盤從A直接搬到C,一次完成,記為move1fromAtoC44漢諾塔問題算法思路(續(xù))(2)在A柱上只有兩只盤子時(shí),將1號盤從A移至B,這是為了讓2號盤能移動,記為“將1從A移至B”將2號盤從A移至C,“將2從A移至C”將1號盤從B移至C,“將1從B移至C”45漢諾塔問題算法思路(續(xù))(3)在A柱上有三只盤子時(shí),將盤1,2視為一個(gè)整體,移到B,記為move(2,A,C,B),意思是將上面的兩個(gè)盤子作為整體從A借助C移到B將3號盤從A移至C,即“將3從A移至C”將1,2作為一個(gè)整體,從B移到C,記為move(2,B,A,C),意思是將上面的兩個(gè)盤子作為整體,從B借助A移到C46漢諾塔問題47漢諾塔問題(4)在將1、2號盤從A移至B的過程中,move(2,A,C,B)可分為如下3步:將1從A移至C將2從A移至B將1從C移到Bmove(2,B,A,C)可分為如下3步:將1從B移至A將2從B移至C將1從A移至C48漢諾塔問題(5)將n次盤子從A移到C,可分為三步:將1,2,3…n-1作為一個(gè)整體從A借助C移到B將n從A移到C將1,2,3…n-1作為一個(gè)整體從B借助A移到C即move(n,A,C,B)中需作如下操作:move(n-1,A,C,B)將n從A移至Cmove(n-1,B,A,C)49漢諾塔問題(6)定義函數(shù)move(n,A,B,C),用于將前n號盤子從A借助B移到C,由上面的分析知,搬移過程如下:50漢諾塔問題(7)3個(gè)盤子的遞歸與或圖這個(gè)圖很象一顆倒置著的樹,結(jié)點(diǎn)move(3,A,B,C)是樹根,與結(jié)點(diǎn)是樹的分枝,葉子都是直接可解結(jié)點(diǎn)。51漢諾塔問題函數(shù)實(shí)現(xiàn)(程序6_6.cpp)voidmove(intn,charA,charB,charC){ if(n==1) cout<<“將”<<n<<“從”<<A <<“移至”<<C<<endl; else{ move(n-1,A,C,B); cout<<“將”<<n<<“從”<<A <<“移至”<<C<<endl; move(n-1,B,A,C); }}52漢諾塔問題53漢諾塔問題下面來看看移動n只盤子的總移動次數(shù)設(shè)S(n)為移動n只盤子所需的移動次數(shù),則 S(n)=2*S(n-1)+1 S(1)=1由歸納法可得: S(n)=2n-1。如果n=64,則S(n)=2^64-1>1019如果僧人一秒移動一只盤子,則需5800億年。546.3遞歸及其實(shí)現(xiàn)例6.2從樓上走到樓下共有h個(gè)臺階,每一步有三種走法走一個(gè)臺階;走二個(gè)臺階;走三個(gè)臺階。問可走出多少種方案,希望用遞歸思想來編程。55例6.2算法分析(續(xù))定義:tryit(i,s)——站在第i級臺階上往下試走第s步的過程j=1,2,3——在每一步可以試著走的臺階數(shù)take[s]——存儲第s步走過的臺階數(shù)i<j——說明第i級臺階已比要走的j級臺階小,j不可取i>j——說明站在第i級臺階上可試走j個(gè)臺階為一步i==j——說明這一步走完后已到了樓下,這時(shí)一條下樓方案已試成,即可輸出這一方案了56思路:1、用枚舉的方法,試著一步一步地走,從高到低,讓i先取h值從樓上走到樓下,每走一步i的值會減去每一步所走的臺階數(shù)j,即i=h(初值),以后i=i-j,(j=1,2,3),當(dāng)i=0時(shí),說明已走到樓下。2、枚舉時(shí),每一步都要試j或者是為1,或是為2,或是為3。這時(shí)可用for循環(huán)結(jié)構(gòu)。3、每一步走法都用相同的策略,故可以用遞歸算法。57見圖輸出Atryit(i,s)i<j1j=3F2LpLpLpHQBEGPCDtryit(i-j,s+1)什么也不做i>=jtake[s]=ji==ji>j58在上圖中,A結(jié)點(diǎn)是被遞歸調(diào)用的結(jié)點(diǎn),形式參數(shù)為i,s,A結(jié)點(diǎn)為一個(gè)與結(jié)點(diǎn),進(jìn)入B結(jié)點(diǎn)時(shí)的三個(gè)參數(shù)為i,s,j=3;進(jìn)入C結(jié)點(diǎn)的參數(shù)為i,s,j=2;進(jìn)入D結(jié)點(diǎn)的參數(shù)為i,s,j=1。Lp是三個(gè)結(jié)點(diǎn)都可用的循環(huán)體Lp。Lp是一個(gè)分支結(jié)構(gòu)的或結(jié)點(diǎn)。59(1)當(dāng)i<j時(shí),說明第i級已經(jīng)比一步該走的臺階數(shù)小了。這是一個(gè)直接可解結(jié)點(diǎn)E,什么也不做。(2)當(dāng)i>=j時(shí),要做相關(guān)聯(lián)的G和H,G是直接可解結(jié)點(diǎn),將第s步走過的臺階數(shù)j記入take數(shù)組,即take[s]=j;接著做H,H為或結(jié)點(diǎn),有兩個(gè)分支:其一是:當(dāng)i==j時(shí),說明經(jīng)過第s步,已走到樓下,輸出該下樓行走方案,并將方案號加1;其二是:當(dāng)i>j時(shí),說明經(jīng)過第s步,尚未走到樓下,尚需再試第s+1步的走法,注意這時(shí)站在第i-j級臺階上。因此要調(diào)用tryit(i-j,s+1)。60

for(j=3;j>0;j=j-1)

T

F

i<j

take[s]=j;

i==j

T

F

num=num+1;

輸出第num方案下的從第1步到第s步的走法

tryit(i-j,s+1);

參考程序61在C語言中,不能直接從鍵盤讀入結(jié)構(gòu)類型的變量,也不能直接輸出,所以需使用函數(shù)來進(jìn)行處理intfact(intn)printf(“a=%d,b=%d\n”,*pa,*pb);形參列表:定義要傳值的局部變量,保存調(diào)用該函數(shù)時(shí)的輸入信息。p1和p2釋放單元,但a和b的值已經(jīng)交換i<j——說明第i級臺階已比要走的j級臺階小,j不可取函數(shù)名:命名規(guī)則同變量名。在這片地址中存儲著相關(guān)的一系列指令。inta=3,b=5,result;已知fact(1)=1 邊界條件其一是:當(dāng)i==j時(shí),說明經(jīng)過第s步,已走到樓下,輸出該下樓行走方案,并將方案號加1;case‘+’: z=x+y;break;case‘*’: z=x*y; break;return(z);complexdivComplex(complexx,complexy){intn;doublep=1;出現(xiàn)函數(shù)調(diào)用時(shí),主調(diào)函數(shù)的執(zhí)行過程暫時(shí)停止,在進(jìn)行了voidS*p1,int*p2)626.4指針與函數(shù)指針與函數(shù)關(guān)系密切。在函數(shù)中可以使用指針作為函數(shù)的參數(shù),也可以定義函數(shù)返回值是指針類型,即函數(shù)返回一個(gè)內(nèi)存地址,還可以定義指針指向函數(shù)??傊莒`活,很有用。636.4.1指向變量的指針變量做函數(shù)參數(shù)?為什么要引入指針變量?指針變量的用途到底是什么?指針變量的用途存儲地址值,可以表示動態(tài)分配的構(gòu)造型數(shù)據(jù),處理字符串,等等,其中一個(gè)用途是做函數(shù)的參數(shù)。回憶一下:以前的函數(shù),都是用普通變量做形參和實(shí)參。由于函數(shù)調(diào)用時(shí)參數(shù)的傳遞過程是由“實(shí)參→形參”的“單向值傳遞”,函數(shù)接收到的只是實(shí)參的值(準(zhǔn)確的說,是實(shí)參的拷貝),所以在函數(shù)中我們無法改變實(shí)參的值。但是:如果我們能把要修改的變量的地址傳給函數(shù),而函數(shù)又能接收到這個(gè)地址,那么在函數(shù)中,我們就可以改變這個(gè)地址所指向的單元,而這個(gè)單元實(shí)際上就是要修改的變量的單元,那么就達(dá)到了修改該變量的目的。64#include<iostream.h>voidS*p1,int*p2){inttemp;temp=*p1;*p1=*p2;*p2=temp;}voidmain(){inta,b;int*pa,*pb;a=100;b=200;pa=&a;pb=&b;cout<<“a=“<<*pa<<“,b=”<<*pb<<endl;S,pb); cout<<“a=“<<a<<“,b=”<<b<<endl;}用指針變量作實(shí)參用指針變量作形參交換兩個(gè)形參指針變量所指向的內(nèi)存單元的值也可以直接用變量的地址作實(shí)參,即:S,&b);65指針變量做函數(shù)參數(shù)的執(zhí)行過程&apaa100&bpb200b&ap1&bp2調(diào)用函數(shù)之前:調(diào)用函數(shù)開始:pa和pb分別單向值傳遞給p1和p2調(diào)用函數(shù)返回:p1和p2釋放單元,但a和b的值已經(jīng)交換&apaa200&bpb100b然后交換p1和p2所指向的內(nèi)存單元(實(shí)際上就是a和b)的值20010066指針變量做函數(shù)參數(shù):例#include“stdio.h”voidS*,int*);voidmain(){inta,b;int*pa,*pb;a=100;b=200;pa=&a;pb=&b;printf(“a=%d,b=%d\n”,*pa,*pb);S,pb);printf(“a=%d,b=%d\n”,a,b);}voidS*p1,int*p2){inttemp;temp=*p1;*p1=*p2;*p2=temp;}可見,用指針變量作函數(shù)的參數(shù)可以達(dá)到在某個(gè)函數(shù)中改變其它函數(shù)中的變量值的目的。實(shí)現(xiàn)方法就是:把要改變的變量的地址傳遞給該函數(shù)。67錯(cuò)誤的Swap函數(shù)#include<iostream.h>voidS,int);voidmain(){inta=100,b=200cout<<"a="<<a<<",b="<<b<<endl;Swap(a,b);cout<<"a="<<a<<",b="<<b<<endl;}voidSp1,intp2){inttemp;temp=p1;p1=p2;p2=temp;}用普通變量作實(shí)參用普通變量作形參交換兩個(gè)形參變量的值考慮一下:如果不用指針變量做參數(shù),仍然用普通變量做參數(shù)實(shí)現(xiàn)Swap函數(shù),能否達(dá)到交換兩個(gè)變量值的目的?68錯(cuò)誤的Swap函數(shù)的執(zhí)行過程100a200b100p1200p2調(diào)用函數(shù)之前:調(diào)用函數(shù)開始:a和b分別單向值傳遞給p1和p2調(diào)用函數(shù)返回:p1和p2釋放單元,但a和b的值卻沒有變化,因?yàn)樾螀⒉粫阎祩骰亟o實(shí)參。a100200b然后交換兩個(gè)形參變量p1和p2的值200100696.4.2函數(shù)返回指針程序說明:(1)在函數(shù)名max前加*號,表明該函數(shù)的返回值為指針,該指針?biāo)赶虻牡刂分械淖兞款愋蜑閐ouble,(2)函數(shù)的形式參數(shù)p,q均為指向double型變量的指針(3)在函數(shù)體中定義了一個(gè)指針變量r,也是指向double型的指針706.4.2函數(shù)返回指針(4)在主函數(shù)中定義x,y為double型變量,還定義了一個(gè)指向double型的指針,用于存儲函數(shù)的返回(5)主函數(shù)中最關(guān)鍵的語句是 s=max(&x,&y)它將x和y的地址賦給形式參數(shù)p和q并將max返回的最大數(shù)的地址賦給s716.4.2函數(shù)返回指針(6)假如從鍵盤輸入x=3.1416,y=2.7182,子函數(shù)max(*p,*q)被調(diào)用后,指向關(guān)系如下:726.4.2函數(shù)返回指針(7)子函數(shù)中的returnr;是將指針r作為max函數(shù)的返回值,再賦給s(8)輸出兩數(shù)中的大數(shù)*s736.4.3幾種參數(shù)傳遞方式的比較下面這部分內(nèi)容是讓同學(xué)自己練習(xí)讀程序的。教學(xué)目標(biāo)是能掌握參數(shù)傳遞方式有什么不同。重點(diǎn)放在:(1)主函數(shù)用什么樣的實(shí)參調(diào)用子函數(shù)(2)子函數(shù)中的形參是什么(3)子函數(shù)執(zhí)行之后的結(jié)果能否影響主函數(shù)變量,為什么741.傳地址,修改指針指向的值voidswap1(int*p,int*q){ inttemp; temp=*p; *p=*q; *q=temp; cout<<"子函數(shù)中:*p="<<*p <<",*q="<<*q<<endl;}752.傳值voidswap2(intx,inty){ inttemp; temp=x; x=y; y=temp; cout<<"子函數(shù)中:x="<<x <<",y="<<y<<endl;}763.傳地址,修改指針voidswap3(int*p,int*q){ int*temp; temp=p; p=q; q=temp; cout<<"子函數(shù)中:*p="<<*p <<",*q="<<*q<<endl;}776.5程序舉例例4:復(fù)數(shù)的表示和處理C語言本身并沒有復(fù)數(shù)這一數(shù)據(jù)類型,但在數(shù)學(xué)中,我們經(jīng)常需要處理復(fù)數(shù)。對復(fù)數(shù)的處理一般是將復(fù)數(shù)定義為一個(gè)結(jié)構(gòu)類型,其中有兩個(gè)成員,分別存儲復(fù)數(shù)的實(shí)部和虛部 structcomplex{ doublere; doubleim; };78例4:復(fù)數(shù)的表示和處理在程序設(shè)計(jì)中,對結(jié)構(gòu)變量的賦常數(shù)值,一般采用構(gòu)造函數(shù),而不直接在主程序中對結(jié)構(gòu)的成員挨個(gè)進(jìn)行賦值。用于生成復(fù)數(shù)變量的構(gòu)造函數(shù):complexmkComplex(doubere,doubleim){ complexc; c.re=re; c.im=im; returnc;}使用c=mkComplex(1,1)即可對復(fù)數(shù)c賦值為1+i。79例4:復(fù)數(shù)的表示和處理輸入函數(shù)complexinputComplex(){ complexc; cout<<“實(shí)部:”; cin>>c.re; cout<<“虛部:”; cin>>c.im; returnc;}輸出函數(shù)voidoutputComplex(complexc){ cout<<c.re<<“+” <<c.im<<“i”;}在C語言中,不能直接從鍵盤讀入結(jié)構(gòu)類型的變量,也不能直接輸出,所以需使用函數(shù)來進(jìn)行處理80例4:復(fù)數(shù)的表示和處理復(fù)數(shù)的四則運(yùn)算也需使用函數(shù)實(shí)現(xiàn)復(fù)數(shù)加法complexaddComplex(complexx,complexy){ returnmkComplex(x.re+y.re,x.im+y.im);}復(fù)數(shù)減法complexsubComplex(complexx,complexy){ returnmkComplex(x.re-y.re,x.im-y.im);}81例4:復(fù)數(shù)的表示和處理復(fù)數(shù)乘法complexmultiComplex(complexx,complexy){ returnmkComplex(x.re*y.re-x.im*y.im, x.re*y.im+x.im*y.re);}復(fù)數(shù)除法complexdivComplex(complexx,complexy){ doubleden=y.re*y.re+y.im*y.im; if(fabs(den)<1e-6) { cout<<“除零錯(cuò)誤!”<<endl; returnmkComplex(0,0); } returnmkComplex((x.re*y.re+x.im*y.im)/den, (x.im*y.re-x.re*y.im)/den);}826.5程序舉例例5:用直接插入排序法對多個(gè)整數(shù)按從小到大的順序排序。此例我們在第四章中已經(jīng)做過,現(xiàn)在我們用函數(shù)對直接排序算法進(jìn)行封裝,以方便使用。本例,我們使用數(shù)組存儲元素,以下標(biāo)i處的數(shù)組元素存儲第i個(gè)元素。83算法思路:從最簡單的情況分析起函數(shù)的原型已經(jīng)聲明,并且后面的程序行有被調(diào)用函數(shù)的定義voidmain()算法思路:從最簡單的情況分析起case‘+’: z=x+y;break;int*temp;之所以稱為形式參數(shù),是因?yàn)樵诙x函數(shù)時(shí)這些參數(shù)并不具有具體的值,而只是代表某個(gè)數(shù)據(jù)類型的一個(gè)變量。voidS*p1,int*p2)調(diào)用函數(shù)時(shí)給出的實(shí)參必須和形參一致指針變量的用途存儲地址值,可以表示動態(tài)分配的構(gòu)造型數(shù)據(jù),處理字符

溫馨提示

  • 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

提交評論