C語(yǔ)言程序設(shè)計(jì) 課件 單元6 六函數(shù)_第1頁(yè)
C語(yǔ)言程序設(shè)計(jì) 課件 單元6 六函數(shù)_第2頁(yè)
C語(yǔ)言程序設(shè)計(jì) 課件 單元6 六函數(shù)_第3頁(yè)
C語(yǔ)言程序設(shè)計(jì) 課件 單元6 六函數(shù)_第4頁(yè)
C語(yǔ)言程序設(shè)計(jì) 課件 單元6 六函數(shù)_第5頁(yè)
已閱讀5頁(yè),還剩67頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

單元六

函數(shù)-分而治之,相互協(xié)作導(dǎo)學(xué)【問(wèn)題】什么是函數(shù)?

函數(shù)是可以執(zhí)行固定功能的代碼段,它在程序中的作用非常重要,充分體現(xiàn)了模塊化設(shè)計(jì)的思想。函數(shù)之間分而治之、相互協(xié)作可以實(shí)現(xiàn)代碼復(fù)用,提高程序的可擴(kuò)展性。關(guān)于函數(shù)的具體概念,以及如何應(yīng)用,這是本單元將要學(xué)習(xí)的內(nèi)容。函數(shù)的定義2函數(shù)的調(diào)用3函數(shù)的遞歸調(diào)用4函數(shù)的綜合應(yīng)用目錄1函數(shù)的定義-函數(shù)的概念

在程序中可以執(zhí)行固定功能的代碼段就稱為函數(shù)。

除此之外我們可以自定義函數(shù),實(shí)現(xiàn)特定的功能需求,main函數(shù)中根據(jù)需求調(diào)用函數(shù),這樣不僅可以簡(jiǎn)化程序設(shè)計(jì),還可以實(shí)現(xiàn)代碼的復(fù)用。

C語(yǔ)言中,Main函數(shù)是程序執(zhí)行的入口,除了Main函數(shù),還有大量的庫(kù)函數(shù),這些函數(shù)都被賦予了特定的功能,比如printf()、scanf()、putchar()、getchar()函數(shù)等,正確應(yīng)用庫(kù)函數(shù),可以簡(jiǎn)化程序代碼并提高效率。函數(shù)的定義-函數(shù)的定義格式

函數(shù)由函數(shù)頭和函數(shù)體組成,函數(shù)頭包括函數(shù)的返回值類型、函數(shù)名和參數(shù)列表三部分,具體定義格式如下:函數(shù)返回值類型函數(shù)名(參數(shù)列表){函數(shù)體;}函數(shù)的定義-函數(shù)的定義格式

(1)函數(shù)名:函數(shù)名的命名需要符合標(biāo)識(shí)符的命名規(guī)則,由字母、數(shù)字、下劃線組成,并且不能以數(shù)字開(kāi)頭。還應(yīng)該遵循一個(gè)開(kāi)發(fā)中默認(rèn)的原則:見(jiàn)名知義,最好函數(shù)的取名能夠在一定程度上代表函數(shù)實(shí)現(xiàn)的功能,這對(duì)于后續(xù)程序的擴(kuò)展和應(yīng)用是有現(xiàn)實(shí)意義的。

函數(shù)的定義-函數(shù)的定義格式

(2)函數(shù)的返回值類型:函數(shù)返回值的數(shù)據(jù)類型,可以是單元二中學(xué)習(xí)的任何數(shù)據(jù)類型,也可以是某個(gè)數(shù)據(jù)類型的指針,關(guān)于指針的概念,將在單元七中講授。

當(dāng)函數(shù)有返回值類型時(shí),函數(shù)體中必須有return語(yǔ)句,用來(lái)返回結(jié)果,注意返回的結(jié)果的數(shù)據(jù)類型必須與函數(shù)頭中的返回值類型一致;如果函數(shù)沒(méi)有返回值,返回值類型必須用void修飾。

函數(shù)的返回值類型,其實(shí)對(duì)應(yīng)著函數(shù)的執(zhí)行是否有輸出的結(jié)果。

函數(shù)的定義-函數(shù)的定義格式

(3)參數(shù)列表:函數(shù)名后面的小括號(hào)中,存放的是函數(shù)的參數(shù)列表,可以為空,也可以有多個(gè)參數(shù),多個(gè)參數(shù)之間以“,”分割。這里的參數(shù)稱為形式參數(shù),只有變量的聲明,調(diào)用函數(shù)時(shí),需要對(duì)應(yīng)形參,傳入實(shí)際參數(shù)的值,注意形參與實(shí)參的數(shù)據(jù)類型、個(gè)數(shù)必須完全對(duì)應(yīng)。

參數(shù)列表,其實(shí)對(duì)應(yīng)著函數(shù)的執(zhí)行是否需要有輸入的數(shù)據(jù)。函數(shù)的定義-函數(shù)的定義格式

(4)函數(shù)體:函數(shù)要執(zhí)行的功能代碼放在函數(shù)體中。函數(shù)的定義-如何定義函數(shù)

【例6-1】定義一個(gè)函數(shù),打印6個(gè)*型。

【解題思路】該函數(shù)需要打印6個(gè)*型,功能簡(jiǎn)單明確,沒(méi)有需要輸入給函數(shù)的數(shù)據(jù),因此沒(méi)有參數(shù);函數(shù)中直接打印圖形,沒(méi)有需要返回的結(jié)果,因此函數(shù)沒(méi)有返回值,用void修飾。

(1)無(wú)返回值、無(wú)參數(shù)的函數(shù)的定義

【源代碼】voidprint(){printf(“******”);}函數(shù)的定義-如何定義函數(shù)

【例6-2】定義一個(gè)函數(shù),實(shí)現(xiàn)兩個(gè)整數(shù)的加法運(yùn)算,函數(shù)中打印運(yùn)算結(jié)果。

【解題思路】該函數(shù)要求實(shí)現(xiàn)兩個(gè)整數(shù)的加法運(yùn)算,兩個(gè)整數(shù)是未知的,是需要輸入給函數(shù)的數(shù)據(jù),因此,可以將兩個(gè)整數(shù)作為函數(shù)的形式參數(shù);函數(shù)中要求打印運(yùn)算結(jié)果,因此函數(shù)沒(méi)有輸出的結(jié)果,也就沒(méi)有返回值類型,用void修飾。

【源代碼】voidsum(inta,intb){printf(“%d+%d=%d”,a,b,a+b);}(2)無(wú)返回值、有參數(shù)的函數(shù)的定義。函數(shù)的定義-如何定義函數(shù)

【例6-3】定義一個(gè)函數(shù),實(shí)現(xiàn)圓的周長(zhǎng)和面積的運(yùn)算,函數(shù)中打印運(yùn)算結(jié)果,保留兩位小數(shù)。

【解題思路】該函數(shù)要求計(jì)算圓的周長(zhǎng)和面積,半徑是未知的,,因此,可以將半徑作為函數(shù)的形式參數(shù);函數(shù)中要求打印運(yùn)算結(jié)果,因此函數(shù)沒(méi)有輸出的結(jié)果,也就沒(méi)有返回值類型,用void修飾。

(2)無(wú)返回值、有參數(shù)的函數(shù)的定義。

【源代碼】voidcal(doubler){printf(“圓的半徑為:%.2f”,3.14*r*r);printf(“圓的周長(zhǎng)為:%.2f”,3.14*2*r);}函數(shù)的定義-如何定義函數(shù)

【例6-4】定義一個(gè)函數(shù),判斷一個(gè)整數(shù)的奇偶,打印出結(jié)果。

【解題思路】該函數(shù)要求判斷整數(shù)的奇偶,該整數(shù)是未知的,因此,可以將整數(shù)作為函數(shù)的形式參數(shù);函數(shù)中要求打印運(yùn)算結(jié)果,因此沒(méi)有輸出的結(jié)果,也就沒(méi)有返回值類型,用void修飾。(2)無(wú)返回值、有參數(shù)的函數(shù)的定義。

【源代碼】voidjudge(inta){ if(a%2==0){ printf("%d是偶數(shù)",a); } else{ printf("%d是奇數(shù)",a); }}函數(shù)的定義-如何定義函數(shù)

【例6-5】定義一個(gè)函數(shù),實(shí)現(xiàn)對(duì)一個(gè)整數(shù)數(shù)字的加密,加密規(guī)則為:(整數(shù)*8+256)/5-整數(shù)/2,并將加密結(jié)果以整數(shù)的形式返回。

【解題思路】函數(shù)要求對(duì)一個(gè)整數(shù)進(jìn)行加密,該整數(shù)是未知的,可以將整數(shù)作為函數(shù)的參數(shù);函數(shù)要求將加密運(yùn)算的結(jié)果以整數(shù)的形式返回,因此函數(shù)有返回值,返回的結(jié)果要求是整數(shù),返回值類型確定為整數(shù)類型。

(3)有返回值、有參數(shù)的函數(shù)的定義。

【源代碼】intencrypt(intnum){ intresult=(num*8+256)/5-num/2; returnresult;}函數(shù)的定義-如何定義函數(shù)

【例6-6】定義一個(gè)函數(shù),實(shí)現(xiàn)對(duì)學(xué)生成績(jī)等級(jí)的判斷。小于60分的為’D’;60-70之間的為’C’;70-90之間的為’B’;90分以上的為’A’,并將等級(jí)以字符的形式返回。

【解題思路】函數(shù)要求根據(jù)學(xué)生的成績(jī)判斷等級(jí),成績(jī)是未知的,可以將成績(jī)作為函數(shù)的參數(shù);最后需要將判斷得到的等級(jí)以字符的形式返回,因此函數(shù)有返回值,返回的結(jié)果是字符,返回值類型確定為字符類型。(3)有返回值、有參數(shù)的函數(shù)的定義。函數(shù)的定義-如何定義函數(shù)

【例6-6】【源代碼】charlevelJudge(doublescore){ if(score<60&&score>=0){ return'D'; } elseif(score>=60&&score<70){ return'C'; } elseif(score>=70&&score<90){ return'B'; } elseif(score>=90&&score<=100){ return'A'; } else{ return'N'; }}(3)有返回值、有參數(shù)的函數(shù)的定義。函數(shù)的定義-函數(shù)的聲明

函數(shù)的聲明與函數(shù)的定義的區(qū)別是,函數(shù)的聲明沒(méi)有函數(shù)體,函數(shù)頭后面直接“;”結(jié)束。具體格式如下:

函數(shù)返回值類型函數(shù)名(參數(shù)列表);

【例6-7】聲明一個(gè)函數(shù)實(shí)現(xiàn)兩個(gè)數(shù)的減法。

voidminus(inta,intb);函數(shù)的定義-函數(shù)的聲明

注意:

(1)函數(shù)聲明的作用是把函數(shù)的相關(guān)信息告知編譯系統(tǒng),編譯程序時(shí),編譯系統(tǒng)檢查被調(diào)用函數(shù)是否存在。與變量一樣,函數(shù)也是需要先聲明再使用。

(2)正是因?yàn)楹瘮?shù)聲明的作用,當(dāng)函數(shù)的定義放在調(diào)用之前時(shí),可以不進(jìn)行函數(shù)聲明;如果函數(shù)的定義放在調(diào)用之后,最好在調(diào)用之前進(jìn)行聲明,否則可能會(huì)因?yàn)檎{(diào)用函數(shù)時(shí)找不到函數(shù),發(fā)生編譯錯(cuò)誤。

(3)函數(shù)聲明中函數(shù)頭的格式必須與函數(shù)定義中保持一致。

(4)函數(shù)的聲明中,參數(shù)列表可以沒(méi)有變量名,而只有數(shù)據(jù)類型的聲明。

例如上面【6-7】實(shí)例中可以寫為如下格式;

voidminus(int,int);函數(shù)的定義2函數(shù)的調(diào)用3函數(shù)的遞歸調(diào)用4函數(shù)的綜合應(yīng)用目錄1函數(shù)的調(diào)用-函數(shù)調(diào)用格式

函數(shù)聲明定義完畢,并不能執(zhí)行功能,只有使用函數(shù),才能發(fā)揮函數(shù)的作用。使用函數(shù)的過(guò)程稱為函數(shù)的調(diào)用。調(diào)用函數(shù)的格式為:

函數(shù)名(實(shí)際參數(shù)列表);函數(shù)的調(diào)用-函數(shù)調(diào)用格式

(1)函數(shù)如果有形式參數(shù),調(diào)用函數(shù)需要傳入實(shí)際參數(shù),也就是形式參數(shù)的值,實(shí)參與形參必須一一對(duì)應(yīng)。

如果沒(méi)有形式參數(shù),調(diào)用時(shí)也為空參。

例如上一個(gè)任務(wù)中,例【6-1】、【6-2】定義的函數(shù),調(diào)用格式為:print();

sum(2,3);

(2)函數(shù)如果有返回值類型,說(shuō)明函數(shù)有輸出的結(jié)果,這個(gè)結(jié)果可以繼續(xù)進(jìn)行其他操作,比如直接打印,或者進(jìn)行運(yùn)算等等。

如果沒(méi)有返回值類型,直接調(diào)用即可。函數(shù)的調(diào)用-函數(shù)調(diào)用格式函數(shù)中調(diào)用另一個(gè)函數(shù)的過(guò)程如下圖6-1所示。fun1()函數(shù)執(zhí)行過(guò)程中,調(diào)用fun2()函數(shù),fun2()執(zhí)行完畢,返回fun1()繼續(xù)向下執(zhí)行。函數(shù)的調(diào)用-函數(shù)參數(shù)傳遞

有參數(shù)的函數(shù),定義時(shí)的參數(shù)為形式參數(shù),簡(jiǎn)稱形參。形參只是變量的聲明,沒(méi)有實(shí)際的數(shù)據(jù),因此不占用內(nèi)存。調(diào)用函數(shù)的時(shí)候需要對(duì)應(yīng)形參,傳入實(shí)際的參數(shù),實(shí)參可以是常量、變量或者表達(dá)式等,但是必須有確定的值,而且形參與實(shí)參的數(shù)據(jù)類型、個(gè)數(shù)、順序必須完全一致。

以上所述,對(duì)應(yīng)函數(shù)定義的形參,調(diào)用時(shí)傳入實(shí)參的過(guò)程稱為參數(shù)的傳遞。

函數(shù)的調(diào)用-函數(shù)調(diào)用的應(yīng)用

【例6-8】定義一個(gè)函數(shù),打印出1到100之間的所有自然數(shù),主函數(shù)中調(diào)用該函數(shù)。

【解題思路】該函數(shù)直接打印確定范圍內(nèi)的自然數(shù),不需要輸入數(shù)據(jù),也沒(méi)有返回結(jié)果,因此,函數(shù)的定義沒(méi)有返回值類型、沒(méi)有形式參數(shù)。主函數(shù)直接調(diào)用即可。1.沒(méi)有返回值、沒(méi)有形參的函數(shù)的調(diào)用。

【源代碼】#include<stdio.h>voidprint(){ inti; for(i=1;i<=100;i++){ printf("%d",i); }}intmain(){ print(); //調(diào)用自定義的print()函數(shù)return0;}函數(shù)的調(diào)用-函數(shù)調(diào)用的應(yīng)用1.沒(méi)有返回值、沒(méi)有形參的函數(shù)的調(diào)用。

【運(yùn)行結(jié)果】123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100函數(shù)的調(diào)用-函數(shù)調(diào)用的應(yīng)用

【例6-9】定義一個(gè)函數(shù),打印出兩個(gè)小數(shù)四則運(yùn)算的各個(gè)結(jié)果。主函數(shù)中調(diào)用該函數(shù)。

【解題思路】該函數(shù)需要計(jì)算兩個(gè)小數(shù)的運(yùn)算結(jié)果,兩個(gè)小數(shù)是未知的,需要輸入給函數(shù),作為形式參數(shù);函數(shù)直接打印結(jié)果,因此沒(méi)有返回值,也就沒(méi)有返回值類型。主函數(shù)調(diào)用時(shí),需要對(duì)應(yīng)形參,傳入實(shí)參。2.沒(méi)有返回值、有形參的函數(shù)的調(diào)用。

函數(shù)的調(diào)用-函數(shù)調(diào)用的應(yīng)用2.沒(méi)有返回值、有形參的函數(shù)的調(diào)用。

【源代碼】voidcal(doublea,doubleb){ printf("%.2f+%.2f=%.2f\n",a,b,a+b); printf("%.2f-%.2f=%.2f\n",a,b,a-b); printf("%.2f*%.2f=%.2f\n",a,b,a*b); printf("%.2f/%.2f=%.2f\n",a,b,a/b);

}intmain(){//調(diào)用自定義函數(shù)cal(doublea,doubleb) //注意:實(shí)參的順序、個(gè)數(shù)、數(shù)據(jù)類型需要與形參一致//形參是兩個(gè)double類型的小數(shù),實(shí)參也必須是兩個(gè)double類型的小數(shù) cal(2.8,9.6);return0;}

【運(yùn)行結(jié)果】2.80+9.60=12.402.80-9.60=-6.802.80*9.60=26.882.80/9.60=0.29函數(shù)的調(diào)用-函數(shù)調(diào)用的應(yīng)用

【例6-10】自定義一個(gè)函數(shù),實(shí)現(xiàn)n行,m列,某種符號(hào)的打印,n、m和具體符號(hào)未知,主函數(shù)中調(diào)用。

【解題思路】行、列、符號(hào)未知,因此函數(shù)需要輸入三個(gè)數(shù)據(jù),有三個(gè)形式參數(shù);函數(shù)中直接打印,沒(méi)有返回結(jié)果,函數(shù)定義沒(méi)有返回值類型。主函數(shù)調(diào)用時(shí),傳入對(duì)應(yīng)的實(shí)參。2.沒(méi)有返回值、有形參的函數(shù)的調(diào)用。

函數(shù)的調(diào)用-函數(shù)調(diào)用的應(yīng)用2.沒(méi)有返回值、有形參的函數(shù)的調(diào)用。

【源代碼】voidpr(inta,intb,charc){ inti,j; for(i=0;i<a;i++){ for(j=0;j<b;j++){

printf("%c",c); } printf("\n"); }}intmain(){//調(diào)用自定義函數(shù)pr(inta,intb,charc)//注意:實(shí)參的順序、個(gè)數(shù)、數(shù)據(jù)類型需要與形參一致

pr(5,3,’$’);return0;}【運(yùn)行結(jié)果】$$$$$$$$$$$$$$$函數(shù)的調(diào)用-函數(shù)調(diào)用的應(yīng)用

【例6-11】自定義一個(gè)函數(shù),計(jì)算圓的面積,返回結(jié)果,主函數(shù)中調(diào)用,打印面積的值。

【解題思路】該函數(shù)要計(jì)算圓的面積,需要知道半徑的值,半徑是未知的,函數(shù)需要輸入數(shù)據(jù),因此半徑可以作為函數(shù)的形式參數(shù);函數(shù)最終返回面積的結(jié)果,因此有返回值類型,類型是面積的數(shù)據(jù)類型。主函數(shù)調(diào)用時(shí)需要傳入對(duì)應(yīng)的實(shí)參,并且接收函數(shù)的結(jié)果,進(jìn)行打印。3.有返回值、有形參的函數(shù)的調(diào)用。

函數(shù)的調(diào)用-函數(shù)調(diào)用的應(yīng)用3.有返回值、有形參的函數(shù)的調(diào)用。

【源代碼】doublecalArea(intr){ return3.14*r*r;}intmain(){ //調(diào)用函數(shù)doublecalArea(intr) //傳入對(duì)應(yīng)的實(shí)參, //形參為一個(gè)int類型的整數(shù),實(shí)參是一個(gè)int類型的整數(shù)值 //函數(shù)有返回值類型double,需要用一個(gè)相同數(shù)據(jù)類型的double變量接收函數(shù)調(diào)用的結(jié)果 doublere=calArea(2); printf("圓的面積為:%.2f",re);//打印計(jì)算結(jié)果return0;}

【運(yùn)行結(jié)果】

圓的面積為:12.56函數(shù)的調(diào)用-函數(shù)調(diào)用的應(yīng)用

在一個(gè)函數(shù)調(diào)用另一個(gè)函數(shù)的過(guò)程中又調(diào)用另一個(gè)函數(shù),這叫做函數(shù)的嵌套調(diào)用。

例如:自定義兩個(gè)函數(shù)fun1()、fun2(),fun2()中調(diào)用fun1(),主函數(shù)中調(diào)用fun2()。voidfun1(){}voidfun2(){fun1();}intmain(){fun2();}

調(diào)用過(guò)程如下圖6-2所示。4.函數(shù)的嵌套調(diào)用

圖6-2函數(shù)嵌套調(diào)用的執(zhí)行過(guò)程函數(shù)的調(diào)用-函數(shù)調(diào)用的應(yīng)用

【例6-12】自定義一個(gè)函數(shù)visit(),遍歷數(shù)組,打印元素的值;自定義一個(gè)函數(shù)showArray(),生成一個(gè)整型數(shù)組,然后調(diào)用visit()函數(shù)遍歷數(shù)組。主函數(shù)調(diào)用showArray()函數(shù)。4.函數(shù)的嵌套調(diào)用

【源代碼】#include<stdio.h>voidvisit(inta[]){ inti; for(i=0;i<10;i++){

printf("%d",a[i]);

} }voidshowArray(){ inta[10],i; for(i=0;i<10;i++){

a[i]=i;

}

visit(a);}intmain(){

showArray();return0;}【運(yùn)行結(jié)果】0123456789函數(shù)的調(diào)用-宏定義函數(shù)

如果一個(gè)函數(shù)的功能可以用一個(gè)公式表達(dá)式來(lái)實(shí)現(xiàn),比如求圓的面積、正方形周長(zhǎng)、四則運(yùn)算等,可以使用帶參數(shù)的宏定義函數(shù)來(lái)簡(jiǎn)化代碼?!纠?-13】用帶參數(shù)的宏定義計(jì)算圓的面積。【源代碼】#include<stdio.h>#definePI3.14#defineS(r)PI*r*rintmain(){ doubler; printf("請(qǐng)輸入圓的半徑"); scanf("%lf",&r); doubles=S(r); printf("圓的面積為:%.2f",s);return0;}【運(yùn)行結(jié)果】請(qǐng)輸入圓的半徑2圓的面積為:12.56函數(shù)的調(diào)用-宏定義函數(shù)1.帶參數(shù)宏定義的格式:#define宏名(形式參數(shù)列表)字符串注意:宏名與常量一樣,一般用大寫字母表示;形式參數(shù)列表可以空參也可以由多個(gè)參數(shù),多個(gè)參數(shù)之間用“,”分割;字符串需要使用參數(shù)列表中的各個(gè)形參。2.帶參宏調(diào)用的一般形式宏名(實(shí)際參數(shù)列表);注意:宏調(diào)用時(shí),對(duì)實(shí)參表達(dá)式不做任何計(jì)算,而是直接用實(shí)參原樣替代形參,形成新的表達(dá)式,然后再進(jìn)行計(jì)算。函數(shù)的調(diào)用-宏定義函數(shù)【例6-14】用帶參數(shù)的宏定義計(jì)算長(zhǎng)方形的面積。【源代碼】#include<stdio.h>#defineL(a,b)a*bintmain(){ doublea,b; printf("請(qǐng)輸入長(zhǎng)方形兩個(gè)邊長(zhǎng):"); scanf("%lf%lf",&a,&b); doublel=L(a,b); printf("長(zhǎng)方形面積為:%.2f/n",l);

printf("將兩個(gè)邊長(zhǎng)各加上2,再次計(jì)算長(zhǎng)方形面積"); l=L(a+2,b+2); printf("長(zhǎng)方形面積為:%.2f/n",l);return0;}【運(yùn)行結(jié)果】請(qǐng)輸入長(zhǎng)方形兩個(gè)邊長(zhǎng):23長(zhǎng)方形面積為:6.00將兩個(gè)邊長(zhǎng)各加上2,再次計(jì)算長(zhǎng)方形面積長(zhǎng)方形面積為:10.00函數(shù)的調(diào)用-宏定義函數(shù)

運(yùn)行結(jié)果中,將兩個(gè)邊長(zhǎng)各加上2后,計(jì)算的面積是錯(cuò)誤的。因?yàn)楹暾{(diào)用時(shí)先原樣替換再計(jì)算,因此L(a+2,b+2),傳參后的表達(dá)式由a*b變成a+2*b+2,如果運(yùn)行時(shí)輸入兩個(gè)邊長(zhǎng)2和3,帶入到新的表達(dá)式,運(yùn)算結(jié)果為2+2*3+2=10。

想要執(zhí)行正確的運(yùn)算,只需要在宏定義的參數(shù)處加上小括號(hào)即可。

#defineL(a,b)(a)*(b)函數(shù)的定義2函數(shù)的調(diào)用3函數(shù)的遞歸調(diào)用4函數(shù)的綜合應(yīng)用目錄1函數(shù)的遞歸調(diào)用-遞歸函數(shù)

一個(gè)計(jì)算過(guò)程,如果每一步的運(yùn)算都需要用到前一步或前幾步的結(jié)果,這個(gè)過(guò)程稱為遞歸過(guò)程。用遞歸過(guò)程定義的函數(shù)為遞歸函數(shù)。遞歸函數(shù)的調(diào)用與普通函數(shù)不同,它會(huì)直接或者間接地調(diào)用自身。

使用遞歸函數(shù)解決問(wèn)題,首先需要明確遞歸關(guān)系,也就是在什么條件下,如何實(shí)現(xiàn)自身的調(diào)用;其次就是找出遞歸結(jié)束的條件,即何時(shí)停止自身的調(diào)用。函數(shù)的遞歸調(diào)用-遞歸函數(shù)從計(jì)算1-n自然數(shù)之和的例子,來(lái)學(xué)習(xí)遞歸的原理和使用。

定義一個(gè)函數(shù)求1+2+3+...+n的和,編寫程序如下。intsum(intn){ inti,sum=0; for(i=1;i<=n;i++){ sum+=i; } returnsum;}或者直接按照數(shù)學(xué)公式,計(jì)算出總和。intsum(intn){ returnn*(n+1)/2;}函數(shù)的遞歸調(diào)用-遞歸函數(shù)換一種思路,1+2+3+...+n=1+2+3+...+(n-1)+n,其實(shí)就是前n-1項(xiàng)的和再加上n。sum(n)是計(jì)算1+2+3+...+n,那么前n-1項(xiàng)的和就是sum(n-1),因此得出結(jié)論sum(n)=sum(n-1)+n,但是這個(gè)公式是有應(yīng)用條件的,也就是只有n>1的時(shí)候才成立,當(dāng)n=1的時(shí)候,sum(1)=1。整理一下,求和過(guò)程可以描述為:函數(shù)的遞歸調(diào)用-遞歸函數(shù)由此,sum()函數(shù)的定義為如下形式:intsum(intn){ if(n==1){ return1; } else{ returnsum(n-1)+n; }}

在這個(gè)函數(shù)中,出現(xiàn)了returnsum(n-1)+n;該語(yǔ)句實(shí)現(xiàn)了對(duì)sum函數(shù)自身的調(diào)用,這就是函數(shù)的遞歸調(diào)用,這樣定義的sum函數(shù)就是一個(gè)遞歸函數(shù)。函數(shù)的遞歸調(diào)用-遞歸函數(shù)

完整代碼描述如下。#include<stdio.h>intsum(intn){ if(n==1){ return1; } else{ returnsum(n-1)+n; }}intmain(){ printf("%d",sum(4));return0;}運(yùn)行結(jié)果:10函數(shù)的遞歸調(diào)用-遞歸函數(shù)分析一下函數(shù)的執(zhí)行過(guò)程。當(dāng)n=4時(shí),開(kāi)始遞歸調(diào)用:sum(4)=sum(3)+4;sum(3)=sum(2)+3;sum(2)=sum(1)+2;sum(1)=1;當(dāng)n遞歸到1,計(jì)算sum(1)=1,再將上述過(guò)程反推回去:sum(2)=sum(1)+2=1+2=3;sum(3)=sum(2)+3=3+3=6;sum(4)=sum(3)+4=6+4=10;函數(shù)的遞歸調(diào)用-遞歸函數(shù)遞歸函數(shù)在實(shí)際開(kāi)發(fā)中,用來(lái)解決某些數(shù)學(xué)問(wèn)題非常簡(jiǎn)單方便。連續(xù)的運(yùn)算,前后結(jié)果有關(guān)聯(lián)、有規(guī)律可循,都可以使用遞歸解決。遞歸的代碼比循環(huán)簡(jiǎn)潔,但是效率低于循環(huán)。下面通過(guò)兩個(gè)典型的案例,進(jìn)一步學(xué)習(xí)遞歸函數(shù)的應(yīng)用。函數(shù)的遞歸調(diào)用-遞歸函數(shù)

【例6-15】計(jì)算n!?!窘忸}思路】n!=1*2*3*...n=1*2*3...(n-1)*n,計(jì)算前n項(xiàng)的乘積,其實(shí)就是計(jì)算前n-1項(xiàng)的乘積再乘以n。定義一個(gè)函數(shù)fac(intn)來(lái)計(jì)算n!,fac(n)=fac(n-1)*n。但是在n>1的時(shí)候才可以應(yīng)用此公式,當(dāng)n=1時(shí),fac(1)=1*1=1。函數(shù)的遞歸調(diào)用-遞歸函數(shù)

注意,該程序中的運(yùn)算結(jié)果用int類型的變量存儲(chǔ),注意n的范圍,當(dāng)n的值大于31時(shí),1*2*3*...*n的結(jié)果將超過(guò)int類型的表數(shù)范圍,程序運(yùn)行會(huì)出現(xiàn)異常?!驹创a】#include<stdio.h>intfac(intn){ if(n==1){ return1; } else{ returnfac(n-1)*n; }}intmain(){ printf("%d",fac(4));return0;}【運(yùn)行結(jié)果】:24函數(shù)的遞歸調(diào)用-遞歸函數(shù)

【例6-16】一只青蛙一次可以跳上一級(jí)臺(tái)階,也可以跳上2級(jí),求該青蛙跳上10級(jí)的臺(tái)階總共有多少種跳法。【解題思路】臺(tái)階為1級(jí)時(shí),有1種跳法;臺(tái)階為2級(jí)時(shí),有2種跳法;臺(tái)階為3級(jí)時(shí),有3種跳法;臺(tái)階為4級(jí)時(shí),有5種跳法;臺(tái)階為5級(jí)時(shí),有8種跳法;臺(tái)階為6級(jí)時(shí),有13種跳法;臺(tái)階為7級(jí)時(shí),有21種跳法;...總結(jié)規(guī)律:發(fā)現(xiàn)從3級(jí)臺(tái)階開(kāi)始,跳法都是前面兩種臺(tái)階的跳法之和。函數(shù)的遞歸調(diào)用-遞歸函數(shù)定義函數(shù)cal(intn)函數(shù)的遞歸調(diào)用-遞歸函數(shù)【源代碼】#include<stdio.h>intjump(intn){ if(n==1){ return1; } elseif(n==2){ return2; } else{ return jump(n-1)+jump(n-2); }}intmain(){ printf("%d",jump(10));return0;}【運(yùn)行結(jié)果】89函數(shù)的遞歸調(diào)用-變量的作用域變量是存儲(chǔ)數(shù)據(jù)的基本單位,每個(gè)變量都有作用范圍,稱為變量的作用域。變量的作用域由其定義的位置決定,作用域之外訪問(wèn)變量是無(wú)效的。根據(jù)作用域的不同,變量可以分為局部變量和全局變量。函數(shù)的遞歸調(diào)用-變量的作用域

【例6-18】#include<stdio.h>intmain(){ inta=10; { intb=20; } printf("%d",b); printf("%d",a);return0;}

1.局部變量這個(gè)程序的main函數(shù)中定義了兩個(gè)變量a,b,打印輸出a和b的值,運(yùn)行結(jié)果報(bào)錯(cuò),原因是雖然兩個(gè)變量都定義在main函數(shù)中,但是b又定義在了一個(gè)函數(shù)內(nèi)部的代碼塊中,在代碼塊外部無(wú)法訪問(wèn)b。因此,局部變量的作用域?qū)嵸|(zhì)上是距離它最近的一對(duì)大括號(hào)。只有在這一對(duì)大括號(hào)中,才可以訪問(wèn)該變量。函數(shù)的遞歸調(diào)用-變量的作用域

【例6-19】#include<stdio.h>intmain(){inta=10;{inta=20;printf("代碼段中的變量a的值為%d\n",a);} printf("main函數(shù)中的變量a的值為%d\n",a);return0;}【運(yùn)行結(jié)果】代碼段中的變量a的值為20main函數(shù)中的變量a的值為10

1.局部變量main函數(shù)中定義了一個(gè)變量a,賦值10,該變量的作用域是整個(gè)main函數(shù)。函數(shù)中有一個(gè)代碼段,代碼段中又定義了一個(gè)變量a,賦值20,該變量的作用域是距離它最近的大括號(hào),也就是這一個(gè)代碼段。在各自的范圍打印輸出了各自的值。這說(shuō)明,不同作用域的變量可以重名。函數(shù)的遞歸調(diào)用-變量的作用域

【例6-20】#include<stdio.h>voidfun(inta){ printf("%d",a);}intmain(){fun(5);return0;}自定義函數(shù)fun(inta),有一個(gè)形式參數(shù),該參數(shù)也是局部變量,作用域是整個(gè)fun()函數(shù)。

1.局部變量函數(shù)的遞歸調(diào)用-變量的作用域總結(jié):①定義在函數(shù)中的變量是局部變量,作用域?yàn)榫嚯x它最近的一對(duì)大括號(hào)。②不同作用域的變量可以重名。③自定義函數(shù)中的形式參數(shù)也是局部變量,作用域?yàn)檎麄€(gè)函數(shù)。

1.局部變量函數(shù)的遞歸調(diào)用-變量的作用域在所有函數(shù)外面定義的變量稱為全局變量,它屬于整個(gè)源程序,作用域?yàn)槎x的位置開(kāi)始到源程序結(jié)束?!纠?-21】#include<stdio.h>inta=10;//全局變量aintmain(){ printf("變量a的值為%d\n",a);return0;}【運(yùn)行結(jié)果】變量a的值為102.全局變量函數(shù)的遞歸調(diào)用-變量的作用域

【例6-22】#include<stdio.h>inta=10; //全局變量aintmain(){ inta=20; //局部變量a printf("變量a的值為%d\n",a);return0;}【運(yùn)行結(jié)果】變量a的值為20說(shuō)明:當(dāng)全局變量與局部變量重名時(shí),局部變量的值會(huì)覆蓋全局變量。2.全局變量函數(shù)的遞歸調(diào)用-變量的作用域C語(yǔ)言中,可以用static關(guān)鍵字修飾局部變量和全局變量,稱為靜態(tài)變量。靜態(tài)變量在編譯時(shí)分配存儲(chǔ)空間,若不進(jìn)行初始化,默認(rèn)初始值為1。靜態(tài)局部變量的作用域與普通變量相同,都是距離它定義最近的一對(duì)大括號(hào)。但是存儲(chǔ)周期不同,靜態(tài)局部變量的值具有繼承性,定義靜態(tài)局部變量的函數(shù)被多次調(diào)用時(shí),該變量的初值是上次調(diào)用函數(shù)結(jié)束時(shí)變量的值。3.static關(guān)鍵字函數(shù)的遞歸調(diào)用-變量的作用域【例6-23】#include<stdio.h>voidfunc(){ staticintnum1=0; intnum2=0; printf("num1=%d,num2=%d\n",++num1,++num2);}intmain(){ func(); func(); func();return0;}【運(yùn)行結(jié)果】num1=1,num2=1num1=2,num2=1num1=3,num2=13.static關(guān)鍵字函數(shù)的定義2函數(shù)的調(diào)用3函數(shù)的遞歸調(diào)用4函數(shù)的綜合應(yīng)用目錄1函數(shù)的綜合應(yīng)用

【例6-24】自定義函數(shù)實(shí)現(xiàn)如下功能:(1)用戶輸入n個(gè)數(shù)字,計(jì)算n個(gè)數(shù)字的總和(2)返回計(jì)算結(jié)果主函數(shù)中調(diào)用該函數(shù),運(yùn)行實(shí)現(xiàn)功能。【解題思路】要求用戶輸入n個(gè)數(shù)字,n是未知的,可以作為函數(shù)的輸入,抽取為形式參數(shù)。函數(shù)中將計(jì)算結(jié)果返回,因此函數(shù)有返回值類型。函數(shù)的綜合應(yīng)用【源代碼】#include<stdio.h>doublesum1(intn){ doublesum=0;//定義總和 inti;//循環(huán)次數(shù) doublenum;//定義變量存儲(chǔ)輸入的數(shù)字 for(i=0;i<n;i++){//循環(huán)輸入數(shù)字 scanf("%lf",&num); sum+=num;//每次輸入數(shù)字加到總和sum中 } returnsum;//返回sum的值}intmain(){ printf("%.2f",sum1(3));

return0;}函數(shù)的綜合應(yīng)用

【例6-25】計(jì)算班級(jí)學(xué)生的C語(yǔ)言程序設(shè)計(jì)課程考試成績(jī)的平均分。

【解題思路】首先需要確定班級(jí)人數(shù),可以將班級(jí)人數(shù)作為函數(shù)的形式參數(shù),也可以在函數(shù)中使用scanf()函數(shù),讓用戶輸入班級(jí)人數(shù),我們采用第二種方式。班級(jí)人數(shù)輸入之后,就確定了輸入學(xué)生成績(jī)的次數(shù),每輸入一個(gè)成績(jī),就加到總成績(jī)中,循環(huán)結(jié)束,總成績(jī)確定,最后計(jì)算平均成績(jī),返回結(jié)果。函數(shù)的綜合應(yīng)用【源代碼】#include<stdio.h>doubleavgScore(){ printf("請(qǐng)輸入班級(jí)人數(shù):"); intnum;//定義變量存儲(chǔ)班級(jí)人數(shù) scanf("%d",&num); printf("請(qǐng)輸入成績(jī):\n"); doublescore,sum=0,avg;//定義變量存儲(chǔ)學(xué)生成績(jī)、總成績(jī)、平均分 inti=0; while(i<num)

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論