




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第7章用函數(shù)實(shí)現(xiàn)模塊化程序設(shè)計(jì)-I函數(shù)概述函數(shù)的聲明函數(shù)的定義與返回值函數(shù)的參數(shù)函數(shù)的調(diào)用函數(shù)的遞歸調(diào)用1函數(shù)概述問題程序功能模塊的分解程序中某些功能的反復(fù)執(zhí)行多人合作寫程序方法:用模塊化程序設(shè)計(jì)的思路采用“組裝”的辦法簡化程序設(shè)計(jì)的過程事先編好一批實(shí)現(xiàn)各種不同功能的函數(shù)把它們保存在函數(shù)庫中,需要時(shí)直接用2函數(shù)的概述k!n!+m!3f=1;for(i=1;i<=n;i++)f=f*i;scanf("%d%d%d",&m,&n,&k);fk=1;for(i=1;i<=k;i++)fk=fk*i;fm=1;for(i=1;i<=m;i++)fm=fm*i;fn=1;for(i=1;i<=n;i++)fn=fn*i;printf("%f\n",fm/(fn+fk));反復(fù)使用的代碼段函數(shù)的概述#include<stdio.h>voidmain(){intk,m,n;floatfk,fm,fn;scanf("%d%d%d",&m,&n,&k);fk=1;for(i=1;i<=k;i++)fk=fk*i;fm=1;for(i=1;i<=m;i++)fm=fm*i;fn=1;for(i=1;i<=n;i++)fn=fn*i;printf("%f\n",fm/(fn+fk));}4#include<stdio.h>floatfact(intn);voidmain(){intk,m,n;floatfk,fm,fn;scanf("%d%d%d",&m,&n,&k);fm=fact(m);fn=fact(n);fk=fact(k);printf("%f\n",fm/(fn+fk));}floatfact(intn){inti;floatf=1;for(i=1;i<=n;i++)f=f*i;returnf;}函數(shù)聲明函數(shù)定義函數(shù)的概述模塊化程序設(shè)計(jì)
將大程序拆分成若干個(gè)獨(dú)立的小功能塊,每個(gè)獨(dú)立的功能塊利用函數(shù)完成,在組裝成一個(gè)整體。5大程序功能1功能2……功能nmain主函數(shù)子函數(shù)1子函數(shù)2……子函數(shù)n子函數(shù)2-1子函數(shù)2-n函數(shù)的概述關(guān)于函數(shù)的幾點(diǎn)說明:一個(gè)源程序文件:一個(gè)或多個(gè)函數(shù),C語言的一個(gè)編譯單位一個(gè)C程序:一個(gè)或多個(gè)源程序文件。優(yōu)點(diǎn):分別編寫,分別編譯,提高調(diào)試效率C程序:起點(diǎn):main函數(shù)
終點(diǎn):main函數(shù)C程序有且僅有一個(gè)main函數(shù)函數(shù):相互獨(dú)立,平行,相互調(diào)用,多次調(diào)用在程序設(shè)計(jì)中要善于利用函數(shù),可以減少重復(fù)編寫程序段的工作量,同時(shí)可以方便地實(shí)現(xiàn)模塊化的程序設(shè)計(jì)。6函數(shù)的概述函數(shù)分類從用戶使用的角度標(biāo)準(zhǔn)函數(shù)——系統(tǒng)提供的,較為通用的自定義函數(shù)——用戶根據(jù)需要,自己編寫的,專用的從函數(shù)的形式有參函數(shù)無參函數(shù)說明:參數(shù)——函數(shù)的輸入信息;返回值——函數(shù)的輸出信息。7函數(shù)的概述#include<stdio.h>floatfact(intn);voidmain(){intk,m,n;floatfk,fm,fn;scanf("%d%d%d",&m,&n,&k);
fm=fact(m);fn=fact(n);fk=fact(k);printf("%f\n",fm/(fn+fk));}floatfact(intn){inti;floatf=1;for(i=1;i<=n;i++)f=f*i;
returnf;}8mainscanfprintffact庫函數(shù)自定義函數(shù)庫函數(shù)main主調(diào)函數(shù)fact被調(diào)用函數(shù)調(diào)用定義函數(shù)的聲明C語言要求,在程序中用到的所有函數(shù),必須“先定義,后使用”指定函數(shù)名字、函數(shù)返回值類型、函數(shù)實(shí)現(xiàn)的功能以及參數(shù)的個(gè)數(shù)與類型,將這些信息通知編譯系統(tǒng)。作用:
僅告訴系統(tǒng)有這樣一個(gè)用戶自定義函數(shù)聲明格式:<返回類型>函數(shù)名稱(<函數(shù)參數(shù)信息>);9注意:分號不能少,否則編譯錯(cuò)誤函數(shù)定義定義的一般形式:<類型標(biāo)識符>函數(shù)名稱(<函數(shù)參數(shù)信息>) {
變量聲明; 功能實(shí)現(xiàn)的執(zhí)行語句組;
}說明類型標(biāo)識符:函數(shù)值的類型,定義了函數(shù)的運(yùn)算結(jié)果類型,也就是函數(shù)返回值的類型。如果沒有返回值,則返回類型為void。int可以省略函數(shù)名稱:與標(biāo)識符的命名規(guī)則相同;不能與變量重復(fù)參數(shù)信息:以逗號間隔的“<類型>變量名”組,指明函數(shù)需要輸入的信息10函數(shù)體函數(shù)定義例如: intmax(intx,inty) { intc; if(x>y) c=x; else c=y; returnc; }11返回值c函數(shù)的返回值返回語句: return[<表達(dá)式>];
將表達(dá)式的值計(jì)算出來,并返回到上一層說明:如果函數(shù)不需要返回值,即為void類型,則return后面的<表達(dá)式>可以省略,甚至可以省略該return語句。如果函數(shù)值類型與return語句中表達(dá)式值不一致,則以函數(shù)類型為準(zhǔn)return語句可以用于從函數(shù)的任意位置返回到主調(diào)函數(shù)。例如: voidmax(intx,inty) { if(x>y) printf(“Themaxis:%d\n”,x); else printf(“Themaxis:%d\n”,y); return; //可省略 }12函數(shù)的參數(shù)形式參數(shù)和實(shí)際參數(shù)形式參數(shù):定義或者聲明時(shí)出現(xiàn)的參數(shù)如:intswap(intx,inty);實(shí)際參數(shù):函數(shù)調(diào)用時(shí)出現(xiàn)的參數(shù)如:for(i=0;i<10;i++)sum+=fun(i);形式參數(shù)和實(shí)際參數(shù)具有各自獨(dú)立的內(nèi)存空間實(shí)參必須有確定的值,可以是常量、變量或表達(dá)式。C語言中函數(shù)參數(shù)傳值是單向的:實(shí)際參數(shù)——>形式參數(shù)13函數(shù)的參數(shù)實(shí)參
14voidmain(){intx,y,z;scanf(“%d%d”,&x,&y);z=max(x,y);printf(“%d”,z)}intmax(inta,intb){intc;c=a>b?a:b;returnc;}常量變量表達(dá)式形參:變量函數(shù)的參數(shù)15voidmain(){intx,y,z;scanf(“%d%d”,&x,&y);z=max(x,y);printf(“%d”,z)}intmax(inta,intb){intc;c=a>b?a:b;returnc;}x3y5zabc5355x3y5zabc5355函數(shù)的參數(shù)實(shí)參與形參:個(gè)數(shù)相同、類型一致、按順序傳遞實(shí)參->形參,值傳遞是單向的,因此形參值的變化不會影響實(shí)參的值實(shí)參和形參可以同名16voidmain(){intx,y,z;scanf(“%d%d”,&x,&y);z=max(x,y);printf(“%d”,z)}intmax(inta,intb){intc;c=a>b?a:b;returnc;}閱讀程序voidmain(){intx,y;
scanf("%d%d",&x,&y);swap(x,y);printf("%d%d",x,y);}17voidswap(intx,inty){intt;t=x;x=y;y=t;}輸入35輸出35函數(shù)調(diào)用調(diào)用的一般形式:
函數(shù)名(<實(shí)參列表>);調(diào)用的方式:1、作為一條語句:此時(shí)函數(shù)無返回值,或者返回值忽略
例如:max(4,5); printf(“Helloworld”);2、作為表達(dá)式的一部分:等價(jià)于函數(shù)的具體返回值
例如:c=2*max(x,y); c=max(max(x,y),z);18函數(shù)調(diào)用函數(shù)調(diào)用的說明被調(diào)用函數(shù)必須是已經(jīng)存在的函數(shù)調(diào)用庫函數(shù)時(shí),一般應(yīng)該在文件開頭用#include命令將用到的庫函數(shù)信息包含到本文件中。調(diào)用自定義函數(shù)時(shí),應(yīng)該在調(diào)用函數(shù)前對函數(shù)進(jìn)行聲明當(dāng)主調(diào)函數(shù)和被調(diào)函數(shù)在同一個(gè)文件中,在主調(diào)函數(shù)前聲明或者定義被調(diào)函數(shù)當(dāng)主調(diào)函數(shù)和被調(diào)函數(shù)在不同文件中,在文件開頭用#include命令包含被調(diào)函數(shù)的信息。19函數(shù)舉例問題1:s=1!+2!+……+n!20算法:k=1tons=s+ff=k!k++s=0;for(k=1;k<=n;k++){f=fact(k);s=s+f;}floatfact(intn){inti;floatf=1;for(i=1;i<=n;i++)f=f*i;return(f);}函數(shù)舉例問題2輸出100~200間所有素?cái)?shù)21算法:m=100to200ifm是素?cái)?shù)printmintprime(intm){ inti,n=sqrt(m); for(i=2;i<=n;i++) if(m%i==0)break; if(i>n)return1; elsereturn0;}for(m=100;m<=200;m++){if(prime(m))printf("%d",m)}prime(m)ifm是素?cái)?shù),返回1否則,返回0遞歸函數(shù)遞歸函數(shù)概述遞歸函數(shù)只針對于子函數(shù),不用于主函數(shù)
所謂遞歸:定義函數(shù)時(shí),自己調(diào)用自己遞歸函數(shù)的形式:直接調(diào)用;間接調(diào)用22間接遞歸調(diào)用:functionA(parameters){ …… functionB(realParameters); ……}functionB(parameters){ …… functionA(realParameters); ……} 直接遞歸調(diào)用:functionA(parameters){……functionA(realParameters);……}遞歸函數(shù)23直接遞歸調(diào)用:f1(parameters){……f1(realParameters);……}間接遞歸調(diào)用:f1(parameters){ …… f2(realParameters); ……}f2(parameters){ …… f1(realParameters); ……} f函數(shù)調(diào)用f函數(shù)直接調(diào)用本函數(shù)f2函數(shù)調(diào)用f1函數(shù)f1函數(shù)調(diào)用f2函數(shù)間接調(diào)用本函數(shù)遞歸的前提條件問題可以劃分成 1)簡單的不需遞歸即可結(jié)束的:結(jié)束遞歸的條件 2)遞推形式,即類似情況:問題類似 例如:求f=n!;分成兩種情況: 1)n<=1時(shí),f=1; 2)n>1時(shí),f=n*[(n-1)!] ;注意:(n-1)!的求解與n!的求解類似
這樣得到程序?yàn)椋?4longfun(intn){ if(n<=1) return1; else return(n*fun(n-1));}遞歸函數(shù)的執(zhí)行過程25以上面的fun為例,如果在main中出現(xiàn)調(diào)用fun(4)則:fun(intn)11fun(intn)2fun(1)2*fun(1)2fun(intn)3fun(2)3*fun(2)6mainfun(4)fun(intn)4fun(3)4*fun(3)24main結(jié)束,程序結(jié)束,結(jié)果為24遞歸函數(shù)例題Hanoi(漢諾)塔問題。古代有一個(gè)梵塔,塔內(nèi)有3個(gè)座A、B、C,開始時(shí)A座上有64個(gè)盤子,盤子大小不等,大的在下,小的在上。有一個(gè)老和尚想把這64個(gè)盤子從A座移到C座,但規(guī)定每次只允許移動一個(gè)盤,且在移動過程中在3個(gè)座上都始終保持大盤在下,小盤在上。在移動過程中可以利用B座。要求編程序輸出移動一盤子的步驟。26ABC僧侶們預(yù)言,當(dāng)所有的盤子移動好時(shí)即為世界末日。要把64個(gè)盤子從A座移動到C座,需要移動大約264
次盤子。假設(shè)每次移動需1秒,則總共需要約5845.54億年。解題思路:老和尚會這樣想:假如有另外一個(gè)和尚能有辦法將上面63個(gè)盤子從一個(gè)座移到另一座。那么,問題就解決了。此時(shí)老和尚只需這樣做:解題思路:(1)命令第2個(gè)和尚將63個(gè)盤子從A座移到B座(2)自己將1個(gè)盤子(最底下的、最大的盤子)從A座移到C座(3)再命令第2個(gè)和尚將63個(gè)盤子從B座移到C座ABC……將63個(gè)從A到B第1個(gè)和尚的做法……ABC將63個(gè)從A到B第1個(gè)和尚的做法……ABC將1個(gè)從A到C第1個(gè)和尚的做法……ABC將1個(gè)從A到C第1個(gè)和尚的做法……ABC將63個(gè)從B到C第1個(gè)和尚的做法……ABC將63個(gè)從B到C第1個(gè)和尚的做法ABC……將62個(gè)從A到C第2個(gè)和尚的做法ABC……將62個(gè)從A到C第2個(gè)和尚的做法ABC……將1個(gè)從A到B第2個(gè)和尚的做法ABC……將1個(gè)從A到B第2個(gè)和尚的做法ABC……將62個(gè)從C到B第2個(gè)和尚的做法ABC……將62個(gè)從C到B第2個(gè)和尚的做法第3個(gè)和尚的做法第4個(gè)和尚的做法第5個(gè)和尚的做法第6個(gè)和尚的做法第7個(gè)和尚的做法……第63個(gè)和尚的做法第64個(gè)和尚僅做:將1個(gè)從A移到CABC將3個(gè)盤子從A移到C的全過程將2個(gè)盤子從A移到BABC將3個(gè)盤子從A移到C的全過程將2個(gè)盤子從A移到BABC將3個(gè)盤子從A移到C的全過程將1個(gè)盤子從A移到CABC將3個(gè)盤子從A移到C的全過程將1個(gè)盤子從A移到CABC將3個(gè)盤子從A移到C的全過程將2個(gè)盤子從B移到CABC將3個(gè)盤子從A移到C的全過程將2個(gè)盤子從B移到CABC將2個(gè)盤子從A移到B的過程將1個(gè)盤子從A移到CABC將2個(gè)盤子從A移到B的過程將1個(gè)盤子從A移到CABC將2個(gè)盤子從A移到B的過程將1個(gè)盤子從A移到BABC將2個(gè)盤子從A移到B的過程將1個(gè)盤子從A移到BABC將2個(gè)盤子從A移到B的過程將1個(gè)盤子從C移到BABC將2個(gè)盤子從A移到B的過程將1個(gè)盤子從C移到BABC將2個(gè)盤子從B移到C的過程ABC將2個(gè)盤子從B移到C的過程ABC將2個(gè)盤子從B移到C的過程ABC將2個(gè)盤子從B移到C的過程由上面的分析可知:將n個(gè)盤子從A座移到C座可以分解為以下3個(gè)步驟:(1)將A上n-1個(gè)盤借助C座先移到B座上(2)把A座上剩下的一個(gè)盤移到C座上(3)將n-1個(gè)盤從B座借助于A座移到C座上可以將第(1)步和第(3)步表示為:將“one”座上n-1個(gè)盤移到“two”座(借助“three”座)。在第(1)步和第(3)步中,one、two、three和A、B、C的對應(yīng)關(guān)系不同。對第(1)步,對應(yīng)關(guān)系是one對應(yīng)A,two對應(yīng)B,three對應(yīng)C。對第(3)步,對應(yīng)關(guān)系是one對應(yīng)B,two對應(yīng)C,three對應(yīng)A。把上面3個(gè)步驟分成兩類操作:(1)將n-1個(gè)盤從一個(gè)座移到另一個(gè)座上(n>1)。這就是大和尚讓小和尚做的工作,它是一個(gè)遞歸的過程,即和尚將任務(wù)層層下放,直到第64個(gè)和尚為止。(2)將1個(gè)盤子從一個(gè)座上移到另一座上。這是大和尚自己做的工作。編寫程序。用hanoi函數(shù)實(shí)現(xiàn)第1類操作(即模擬小和尚的任務(wù))用move函數(shù)實(shí)現(xiàn)第2類操作(模擬大和尚自己移盤)函數(shù)調(diào)用hanoi(n,one,two,three)表示將n個(gè)盤子從“one”座移到“three”座的過程(借助“two”座)函數(shù)調(diào)用move(x,y)表示將1個(gè)盤子從x座移到y(tǒng)座的過程。x和y是代表A、B、C座之一,根據(jù)每次不同情況分別取A、B、C代入#include<stdio.h>intmain(){voidhanoi(intn,charone,chartwo,charthree);intm;printf(“thenumberofdiskes:");scanf("%d",&m);printf("move%ddiskes:\n",m);
hanoi(m,'A','B','C');}voidhanoi(intn,charone,chartwo,charthree){voidmove(charx,chary);if(n==1)
move(one,three);else{hanoi(n-1,one,three,two);
move(one,three);
hanoi(n-1,two,one,three);}}voidmove(charx,chary){printf("%c-->%c\n",x,y);}數(shù)組為函數(shù)參數(shù)數(shù)組作為函數(shù)參數(shù)數(shù)組元素作為函數(shù)參數(shù)與普通變量作為函數(shù)參數(shù)的原理一樣數(shù)組名作為函數(shù)參數(shù)實(shí)參和形參都必須為數(shù)組名例如:intfun(inta[]);……intnum[10],temp;…….temp=fun(num);65數(shù)組為函數(shù)參數(shù)一維數(shù)組作為函數(shù)參數(shù)的說明實(shí)參數(shù)組與形參數(shù)組類型應(yīng)一致,如不一致,結(jié)果將出錯(cuò)實(shí)參向形參傳遞的是數(shù)組的首地址,因此,不再是一種簡單的值傳遞舉例:請編寫一個(gè)函數(shù)計(jì)算10個(gè)數(shù)的平均值,其中10個(gè)數(shù)據(jù)在主函數(shù)隨機(jī)生成。請編寫一個(gè)函數(shù),對10個(gè)隨機(jī)生成的整數(shù)按從小到大排序。其
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 合股開餐廳合同范本
- 衛(wèi)生清潔合同范本
- 勞務(wù)派遣合同范本2003
- 個(gè)人供貨客戶合同范本
- 合股認(rèn)購合同范本
- 合伙協(xié)議書范本合同范本
- 叉車工聘用合同范本
- 員工合同范例送水
- 傳單兼職人員合同范本
- 劇組財(cái)務(wù)合同范本
- 精神病醫(yī)院管理制度
- 化工廠中控DCS系統(tǒng)崗位職責(zé)
- 唯物史觀指導(dǎo)初中歷史教學(xué)
- 2023年同等學(xué)力研究生考試教育學(xué)試卷附詳細(xì)答案
- 出口貨物稅收函調(diào)系統(tǒng)課件
- 初中物理教育科學(xué)八年級下冊第八章力與運(yùn)動-力的合成PPT
- 消渴病中醫(yī)護(hù)理的方案課件
- 抗抑郁藥物神經(jīng)遞質(zhì)的藥理課件
- 特殊兒童教育與康復(fù)課件
- 水質(zhì)分析題庫
- 深靜脈血栓形成的診斷和治療指南(第三版)解讀資料講解課件
評論
0/150
提交評論