函數(shù)(0002)名師優(yōu)質(zhì)課賽課一等獎(jiǎng)市公開課獲獎(jiǎng)?wù)n件_第1頁
函數(shù)(0002)名師優(yōu)質(zhì)課賽課一等獎(jiǎng)市公開課獲獎(jiǎng)?wù)n件_第2頁
函數(shù)(0002)名師優(yōu)質(zhì)課賽課一等獎(jiǎng)市公開課獲獎(jiǎng)?wù)n件_第3頁
函數(shù)(0002)名師優(yōu)質(zhì)課賽課一等獎(jiǎng)市公開課獲獎(jiǎng)?wù)n件_第4頁
函數(shù)(0002)名師優(yōu)質(zhì)課賽課一等獎(jiǎng)市公開課獲獎(jiǎng)?wù)n件_第5頁
已閱讀5頁,還剩104頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第6章函數(shù)第1頁11、C語言函數(shù):C語言函數(shù)是子程序總稱,包含函數(shù)和過程。(有返回值、無返回值,教材中稱為:有返回值函數(shù),無返回值函數(shù))。C語言函數(shù)能夠分為庫函數(shù)、用戶自定義函數(shù)。庫函數(shù)由系統(tǒng)提供,程序員只需要使用(調(diào)用),用戶自定義函數(shù)需要程序員自己編制。2、C語言程序由函數(shù)組成,函數(shù)是C語言程序基本單位。6.1函數(shù)概述第2頁2C語言程序結(jié)構(gòu)如圖所表示。在每個(gè)程序中,主函數(shù)main是必須,它是全部程序執(zhí)行起點(diǎn),main函數(shù)只調(diào)用其它函數(shù),不能為其它函數(shù)調(diào)用。其它函數(shù)沒有主從關(guān)系,能夠相互調(diào)用。全部函數(shù)都能夠調(diào)用庫函數(shù)。程序總體功效經(jīng)過函數(shù)調(diào)用來實(shí)現(xiàn)。第3頁3第4頁43、使用函數(shù)意義(補(bǔ)充)①使用函數(shù)能夠控制任務(wù)規(guī)模②

使用函數(shù)能夠控制變量作用范圍③使用函數(shù),程序開發(fā)能夠由多人分工協(xié)作

④使用函數(shù),能夠重新利用已經(jīng)有、調(diào)式好、成熟程序模塊

第5頁54、函數(shù)一些概念(1)主函數(shù)、其它函數(shù)(2)主調(diào)函數(shù)(調(diào)用其它函數(shù)函數(shù))、被調(diào)函數(shù)(被其它函數(shù)調(diào)用函數(shù))(3)標(biāo)準(zhǔn)函數(shù)(庫函數(shù))和用戶自定義函數(shù)(4)無參函數(shù)、有參函數(shù)(5)無返回值函數(shù)、有返回值函數(shù)第6頁6例函數(shù)調(diào)用簡單例子#include<stdio.h>voidmain(){voidprintstar();/*對printstar函數(shù)申明*/voidprint_message();/*對print_message函數(shù)申明*/printstar();/*調(diào)用printstar函數(shù)*/print_message();/*調(diào)用print_message函數(shù)*/printstar();/*調(diào)用printstar函數(shù)*/}第7頁7voidprintstar()/*定義printstar函數(shù)*/{printf("****************\n");}voidprint_message()/*定義print_message函數(shù)*/{printf("Howdoyoudo!\n");}運(yùn)行情況以下:****************Howdoyoudo!****************第8頁8說明:1.一個(gè)C程序由一個(gè)或多個(gè)程序模塊組成,每一個(gè)程序模塊作為一個(gè)源程序文件。對于較大程序,通常將程序內(nèi)容分別放在若干個(gè)源文件中,再由若干源程序文件組成一個(gè)C程序。這么便于分別編寫、分別編譯,提高調(diào)試效率。一個(gè)源程序文件可認(rèn)為多個(gè)C程序公用。第9頁9

說明:

2.一個(gè)源程序文件由一個(gè)或多個(gè)函數(shù)以及其它相關(guān)內(nèi)容(如命令行、數(shù)據(jù)定義等)組成。一個(gè)源程序文件是一個(gè)編譯單位,在程序編譯時(shí)是以源程序文件為單位進(jìn)行編譯,而不是以函數(shù)為單位進(jìn)行編譯。第10頁10說明:

3.C程序執(zhí)行是從main函數(shù)開始,假如在main函數(shù)中調(diào)用其它函數(shù),在調(diào)用后流程返回到main函數(shù),在main函數(shù)中結(jié)束整個(gè)程序運(yùn)行。第11頁11

說明:4.全部函數(shù)都是平行,即在定義函數(shù)時(shí)是分別進(jìn)行,是相互獨(dú)立。一個(gè)函數(shù)并不隸屬于另一函數(shù),即函數(shù)不能嵌套定義。函數(shù)間能夠相互調(diào)用,但不能調(diào)用main函數(shù)。main函數(shù)是系統(tǒng)調(diào)用。第12頁12說明:5.從用戶使用角度看,函數(shù)有兩種:①

標(biāo)準(zhǔn)函數(shù),即庫函數(shù)。這是由系統(tǒng)提供,用戶無須自己定義這些函數(shù),能夠直接使用它們。不一樣C系統(tǒng)提供庫函數(shù)數(shù)量和功效會(huì)有一些不一樣,但許多基本函數(shù)是共同。②用戶自己定義函數(shù)。用以處理用戶專門需要。第13頁136.2.1.定義函數(shù)普通形式C語言要求,在程序中用到全部函數(shù),必須“先定義,后使用”。定義函數(shù)包含以下幾個(gè)內(nèi)容:⒈指定函數(shù)名字,方便以后按名調(diào)用。⒉指定函數(shù)類型,函數(shù)值類型。⒊指定函數(shù)參數(shù)名字和類型,方便在調(diào)用函數(shù)時(shí)向它們傳遞數(shù)據(jù)。對無參函數(shù)不需要這項(xiàng)。⒋指定函數(shù)應(yīng)該執(zhí)行什么操作,也就是函數(shù)是做什么,即函數(shù)功效。這是最主要。6.2函數(shù)定義和調(diào)用第14頁14為何要定義函數(shù)對于C編譯系統(tǒng)提供庫函數(shù),是由編譯系統(tǒng)事先定義好,程序設(shè)計(jì)者無須自已定義,只需#include命令把相關(guān)頭文件包含到本文件模塊中即可。比如,在程序中若用到數(shù)學(xué)函數(shù)(如sqrt,fabs,sin,cos等),就必須在本文件模塊開頭寫上:#include<math.h>第15頁15函數(shù)應(yīng)該先定義,后調(diào)用

1、函數(shù)定義普通形式[函數(shù)類型]函數(shù)名([函數(shù)參數(shù)類型1函數(shù)參數(shù)名1][,…,函數(shù)參數(shù)類型2,函數(shù)參數(shù)名2]){[申明部分][執(zhí)行部分]}函數(shù)頭函數(shù)體第16頁162、函數(shù)頭(首部):說明了函數(shù)類型、函數(shù)名稱及參數(shù)。(1)函數(shù)類型:函數(shù)返回值數(shù)據(jù)類型,能夠是基本數(shù)據(jù)類型也能夠是結(jié)構(gòu)類型。假如省略默認(rèn)為int,假如不返回值,定義為void類型。(2)函數(shù)名:給函數(shù)取名字,以后用這個(gè)名字調(diào)用。函數(shù)名由用戶命名,命名規(guī)則同標(biāo)識(shí)符。

(3)函數(shù)名后面是參數(shù)表,無參函數(shù)沒有參數(shù)傳遞,但“()”號不能省略,這是格式要求。參數(shù)表說明參數(shù)類型和形式參數(shù)名稱,各個(gè)形式參數(shù)用“,”分隔。

第17頁173、函數(shù)體:函數(shù)首部下用一對{}括起來部分。假如函數(shù)體內(nèi)有多個(gè){},最外層是函數(shù)體范圍。函數(shù)體普通包含申明部分、執(zhí)行部分兩部分。(1)申明部分:在這部分定義本函數(shù)所使用變量和進(jìn)行相關(guān)申明(如函數(shù)申明)。(2)執(zhí)行部分:程序段,由若干條語句組成(能夠在其中調(diào)用其它函數(shù))。

第18頁184、函數(shù)定義舉例怎樣定義無參函數(shù)定義無參函數(shù)普通形式為:類型標(biāo)識(shí)符函數(shù)名(){

申明部分

語句部分}第19頁19怎樣定義有參函數(shù)定義有參函數(shù)普通形式為:類型標(biāo)識(shí)符函數(shù)名(形式參數(shù)表列){

申明部分

語句部分}比如:intmax(intx,inty){intz;/*函數(shù)體中申明部分*/z=x>y?x∶y;return(z);}

第20頁20定義空函數(shù)定義空函數(shù)普通形式為:類型標(biāo)識(shí)符函數(shù)名(){}比如:voiddummy(){}主調(diào)函數(shù)調(diào)用空函數(shù)時(shí),只表明這里要調(diào)用一個(gè)函數(shù),但函數(shù)本身什么工作也不做等,以后擴(kuò)充函數(shù)功效時(shí)補(bǔ)充上。第21頁21舉例:輸入三個(gè)整數(shù),求三個(gè)整數(shù)中最大值不使用函數(shù)(除main外)main(){intn1,n2,n3,nmax;scanf(“%d%d%d”,&n1,&n2,&n3);if(n1>n2)nmax=n1;elsenmax=n2;if(n3>max)max=n3;printf(“max=%d\n”,nmax);}

第22頁22使用函數(shù)intmax(int,int,int);main(){intn1,n2,n3,nmax;scanf(“%d%d%d”,&n1,&n2,&n3);nmax=max(n1,n2,n3);printf(“max=%d\n“,nmax);}

intmax(intx,inty,intz){intm;if(x>y)m=x;elsem=y;if(z>m)m=z;returnm;}像調(diào)用庫函數(shù)一樣調(diào)用函數(shù)定義第23頁236.2.2函數(shù)調(diào)用

1函數(shù)調(diào)用普通形式函數(shù)調(diào)用普通形式為:

函數(shù)名(實(shí)參表列)說明:1.假如是調(diào)用無參函數(shù),則“實(shí)參表列”能夠沒有,但括弧不能省略。2.假如實(shí)參表列包含多個(gè)實(shí)參,則各參數(shù)間用逗號隔開。實(shí)參加形參個(gè)數(shù)應(yīng)相等,類型應(yīng)匹配。實(shí)參加形參按次序?qū)?yīng),向形參傳遞數(shù)據(jù)。第24頁24假如實(shí)參表列包含多個(gè)實(shí)參,對實(shí)參求值順序并不是確定,有系統(tǒng)按自左至右次序求實(shí)參值,有系統(tǒng)則按自右至左次序。比如:printf(″%d,%d″,i,++i);若i原值為3,在VC++6.0環(huán)境下運(yùn)行結(jié)果不是“3,4”,而為“4,4”。因?yàn)榘醋杂叶蟠涡?,先?+i得4,再向左進(jìn)行,此時(shí)i已是4了。假如想輸出3和4,應(yīng)寫成:i=3;j=i++;printf(”%d,%d”,i,j);第25頁252、函數(shù)調(diào)用方式1.函數(shù)語句把函數(shù)調(diào)用作為一個(gè)語句。這時(shí)不要求函數(shù)帶回值,只要求函數(shù)完成一定操作。2.函數(shù)表示式函數(shù)出現(xiàn)在一個(gè)表示式中,這種表示式稱為函數(shù)表示式。這時(shí)要求函數(shù)帶回一個(gè)確定值以參加表示式運(yùn)算。比如:c=2*max(a,b);

按函數(shù)在程序中出現(xiàn)位置來分,能夠有以下三種函數(shù)調(diào)用方式:

第26頁263.函數(shù)參數(shù)函數(shù)調(diào)用作為一個(gè)函數(shù)實(shí)參。比如:m=max(a,max(b,c));其中max(b,c)是一次函數(shù)調(diào)用,它值作為max另一次調(diào)用實(shí)參。m值是a、b、c三者中最大者。第27頁27

3、對被調(diào)用函數(shù)申明和函數(shù)原型在一個(gè)函數(shù)中調(diào)用另一函數(shù)(即被調(diào)用函數(shù))需要具備哪些條件呢?1.首先被調(diào)用函數(shù)必須是已經(jīng)存在函數(shù)(是庫函數(shù)或用戶自己定義函數(shù))。但光有這一條件還不夠。第28頁283.假如使用用戶自己定義函數(shù),而該函數(shù)位置在調(diào)用它函數(shù)(即主調(diào)函數(shù))后面,應(yīng)該在主調(diào)函數(shù)中對被調(diào)用函數(shù)作申明。2.假如使用庫函數(shù),還應(yīng)該在本文件開頭用#include命令將調(diào)用相關(guān)庫函數(shù)時(shí)所需用到信息“包含”到本文件中來。

第29頁294、函數(shù)申明位置。1)在全部函數(shù)定義之前。這是最清楚一個(gè)表示方法,便于查找、管理,如程序1所表示。因?yàn)樵谖募^部,第1至3行對f1、f2和f3函數(shù)事先作了說明,所以編譯系統(tǒng)從申明中已經(jīng)知道函數(shù)相關(guān)信息,所以無須在以后各主調(diào)函數(shù)中再進(jìn)行申明。2)在全部函數(shù)外部(或者說在函數(shù)與函數(shù)之間)、被調(diào)用函數(shù)之前,如程序2所表示。3)在調(diào)用函數(shù)內(nèi)部說明部分,如程序3所表示。申明函數(shù)可與同類變量寫在同一行。第30頁30例對被調(diào)用函數(shù)作申明#include<stdio.h>voidmain(){floatadd(floatx,floaty);

/*對被調(diào)用函數(shù)add申明*/floata,b,c;scanf("%f,%f",&a,&b);c=add(a,b);printf("sumis%f\n",c);}floatadd(floatx,floaty)/*函數(shù)首部*/{floatz;/*函數(shù)體*/z=x+y;return(z);}運(yùn)行情況以下:3.6,6.5↙Sumis10.100000第31頁31函數(shù)原型普通形式為:1.函數(shù)類型函數(shù)名(參數(shù)類型1,參數(shù)類型2……);2.函數(shù)類型函數(shù)名(參數(shù)類型1,參數(shù)名1,參數(shù)類型2,參數(shù)名2……);申明作用是把函數(shù)名、函數(shù)參數(shù)個(gè)數(shù)和參數(shù)類型等信息通知編譯系統(tǒng),方便在碰到函數(shù)調(diào)用時(shí),編譯系統(tǒng)能正確識(shí)別函數(shù)并檢驗(yàn)調(diào)用是否正當(dāng)。第32頁32注意:函數(shù)“定義”和“申明”不是一回事。函數(shù)定義是指對函數(shù)功效確實(shí)立,包含指定函數(shù)名,函數(shù)值類型、形參及其類型、函數(shù)體等,它是一個(gè)完整、獨(dú)立函數(shù)單位。函數(shù)申明作用則是把函數(shù)名字、函數(shù)類型以及形參類型、個(gè)數(shù)和次序通知編譯系統(tǒng),方便在調(diào)用該函數(shù)時(shí)系統(tǒng)按此進(jìn)行對照檢驗(yàn)。它不包含函數(shù)體。

第33頁33說明:

(1)假如被調(diào)用函數(shù)定義出現(xiàn)在主調(diào)函數(shù)之前,能夠無須加以申明。(2)假如已在文件開頭(在全部函數(shù)之前),已對本文件中所調(diào)用函數(shù)進(jìn)行了申明,則在各函數(shù)中無須對其所調(diào)用函數(shù)再作申明。

第34頁34例(對上例改寫)#include<stdio.h>floatadd(floatx,floaty)/*函數(shù)首部*/{floatz;z=x+y;return(z);}voidmain(){/*無須再對add函數(shù)作申明*/ floata,b,c;scanf("%f,%f",&a,&b);c=add(a,b);printf("sumis%f\n",c);}第35頁35編寫一函數(shù),求xn次方值,其中n是整數(shù)分析:(1)求任意n個(gè)x乘積,可把x和n作為函數(shù)形參,數(shù)據(jù)從主調(diào)函數(shù)里傳遞,以增加程序靈活性,其程序流程圖如圖6-2所表示。(2)用循環(huán)結(jié)構(gòu)來實(shí)現(xiàn)該算法。第36頁36形參x,n取得值i=0,p=1.0定義變量i<np=p*x;i++返回pNY第37頁37#include<stdio.h>doublepower(double,int);/*函數(shù)申明*/main()/*主調(diào)用函數(shù)*/{doublex,f;intn;printf("Entertwonumbers:x,n!\n");scanf("%lf,%d",&x,&n);f=power(x,n);/*函數(shù)調(diào)用*/printf("Value=%6.2lf\n",f);}第38頁38/*函數(shù)定義*/doublepower(doublex,intn)/*函數(shù)頭*/{/*函數(shù)體*/inti=0;doublep=1.0;while(i<n){p=p*x;i++;}return(p);}注意:x,f定義為double類型,它格式控制符為%lf,不要寫成%f,以防止犯錯(cuò)。第39頁39形式參數(shù):函數(shù)名后面括弧中變量名稱為“形式參數(shù)”(簡稱“形參”);實(shí)際參數(shù):主調(diào)函數(shù)中調(diào)用一個(gè)函數(shù)時(shí),函數(shù)名后面括弧中參數(shù)(能夠是一個(gè)表示式)稱為“實(shí)際參數(shù)”(簡稱“實(shí)參”);函數(shù)返回值:return后面括弧中值作為函數(shù)帶回值(稱函數(shù)返回值)。6.2.3函數(shù)參數(shù)和函數(shù)值第40頁40主調(diào)函數(shù)和被調(diào)用函數(shù)之間有數(shù)據(jù)傳遞關(guān)系。在不一樣函數(shù)之間傳遞數(shù)據(jù),能夠使用方法有:參數(shù):經(jīng)過形式參數(shù)和實(shí)際參數(shù)返回值:用return語句返回計(jì)算結(jié)果全局變量:外部變量第41頁41例輸入兩個(gè)整數(shù),要求用一個(gè)函數(shù)求出其中大者,并在主函數(shù)中輸出此值。

#include<stdio.h>voidmain(){intmax(intx,inty);

/*對max函數(shù)申明*/inta,b,c;scanf("%d,%d",&a,&b);c=max(a,b);printf("Maxis%d",c);}

第42頁42intmax(intx,inty)/*定義有參函數(shù)max*/{intz;z=x>y?x∶y;return(z);}

運(yùn)行情況以下:7,8↙Max

is

第43頁43經(jīng)過函數(shù)調(diào)用,可使兩個(gè)函數(shù)中數(shù)據(jù)發(fā)生聯(lián)絡(luò)。第44頁44關(guān)于形參加實(shí)參說明:1.在定義函數(shù)中指定形參,在未出現(xiàn)函數(shù)調(diào)用時(shí),它們并不占內(nèi)存中存放單元。只有在發(fā)生函數(shù)調(diào)用時(shí),函數(shù)max中形參才被分配內(nèi)存單元。在調(diào)用結(jié)束后,形參所占內(nèi)存單元也被釋放。2.實(shí)參能夠是常量、變量或表示式,比如:max(3,a+b);但要求它們有確定值。在調(diào)用時(shí)將實(shí)參值賦給形參。第45頁453.在被定義函數(shù)中,必須指定形參類型。4.實(shí)參加形參類型應(yīng)相同或賦值兼容。5.實(shí)參向形參數(shù)據(jù)傳遞是單向“值傳遞”,只能由實(shí)參傳給形參,而不能由形參傳回來給實(shí)參。在調(diào)用函數(shù)時(shí),給形參分配存放單元,并將實(shí)參對應(yīng)值傳遞給形參,調(diào)用結(jié)束后,形參單元被釋放,實(shí)參單元仍保留并維持原值。第46頁462函數(shù)返回值函數(shù)返回值是經(jīng)過函數(shù)調(diào)用使主調(diào)函數(shù)得到確實(shí)定值。比如:例8.2中,max(2,3)值是3,max(5,2)值是5。賦值語句將這個(gè)函數(shù)值賦給變量c。第47頁47說明:

1.函數(shù)返回值是經(jīng)過函數(shù)中return語句取得。一個(gè)函數(shù)中能夠有一個(gè)以上return語句,執(zhí)行到哪一個(gè)return語句,哪一個(gè)語句起作用。return語句后面括弧也能夠不要比如:

“returnz;”等價(jià)于“return(z);”return后面值能夠是一個(gè)表示式。比如:

max(intx,inty){

return(x>y?x:y);

}第48頁482.函數(shù)返回值應(yīng)該屬于某一個(gè)確定類型,在定義函數(shù)時(shí)指定函數(shù)返回值類型。比如:下面是3個(gè)函數(shù)首行:int

max(floatx,floaty)/*函數(shù)值為整型*/char

letter(charc1,charc2)/*函數(shù)值為字符型*/

double

min(intx,inty)/*函數(shù)值為雙精度型

*/

注意:凡不加類型說明函數(shù),自動(dòng)按整型處理。第49頁493.在定義函數(shù)時(shí)指定函數(shù)類型普通應(yīng)該和return語句中表示式類型一致。假如函數(shù)值類型和return語句中表示式值不一致,則以函數(shù)類型為準(zhǔn)。對數(shù)值型數(shù)據(jù),能夠自動(dòng)進(jìn)行類型轉(zhuǎn)換。即函數(shù)類型決定返回值類型。4.對于不帶回值函數(shù),應(yīng)該用“void”定義函數(shù)為“無類型”(或稱“空類型”)。此時(shí)在函數(shù)體中不得出現(xiàn)return語句。

第50頁50例返回值類型與函數(shù)類型不一樣#include<stdio.h>voidmain(){intmax(floatx,floaty);floata,b;intc;scanf("%f,%f,",&a,&b);c=max(a,b);printf("Maxis%d\n",c);}intmax(floatx,floaty){floatz;/*z為實(shí)型變量*/z=x>y?x∶y;return(z);}運(yùn)行情況以下:1.5,2.5↙Maxis2

第51頁51嵌套定義就是在定義一個(gè)函數(shù)時(shí),其函數(shù)體內(nèi)又包含另一個(gè)函數(shù)完整定義。6.3函數(shù)嵌套調(diào)用和遞歸調(diào)用

6.3.1函數(shù)嵌套調(diào)用第52頁52在主函數(shù)中調(diào)用一個(gè)max_4函數(shù)來求4個(gè)整數(shù)中最大數(shù)。然后在max_4函數(shù)中再調(diào)用一個(gè)max_2函數(shù)來求2個(gè)整數(shù)中最大數(shù)。最終在主函數(shù)中輸出結(jié)果。方法:例輸入4個(gè)整數(shù),找出其中最大數(shù)。用函數(shù)嵌套調(diào)用來處理。第53頁53#include<stdio.h>voidmain(){intmax_4(inta,intb,intc,intd);/*max_4函數(shù)申明*/inta,b,c,d,max;printf("Pleaseenter4intergernumbers:");scanf("%d%d%d%d",&a,&b,&c,&d);max=max_4(a,b,c,d);/*調(diào)用max_4函數(shù)*/printf("max=%d\n",max);}intmax_4(inta,intb,intc,intd)/*max_4函數(shù)定義*/{intmax_2(int,int);/*max_2函數(shù)申明*/intm;第54頁54

m=max_2(a,b);/*調(diào)用max_2函數(shù)*/m=max_2(m,c);/*調(diào)用max_2函數(shù)*/m=max_2(m,d);/*調(diào)用max_2函數(shù)*/return(m);/*函數(shù)返回值是4個(gè)數(shù)中最大者*/}intmax_2(a,b)/*max_4函數(shù)定義*/{if(a>b)returna;elsereturnb;/*函數(shù)返回值是a和b中大者*/}運(yùn)行情況以下:Pleaseenter4intergernumbers:1145–540↙max=45第55頁55

6.3.2遞歸調(diào)用在調(diào)用一個(gè)函數(shù)過程中又出現(xiàn)直接或間接地調(diào)用該函數(shù)本身,稱為函數(shù)遞歸調(diào)用。C語言特點(diǎn)之一就在于允許函數(shù)遞歸調(diào)用。比如:

intf(intx){inty,z;z=f(y);/*在執(zhí)行f函數(shù)過程中又要調(diào)用f函數(shù)*/return(2*z);}第56頁56例7.7:有5個(gè)人坐在一起,問第5個(gè)人多少歲?他說比第4個(gè)人大2歲。問第4個(gè)人歲數(shù),他說比第3個(gè)人大2歲。問第3個(gè)人,又說比第2個(gè)人大2歲。問第2個(gè)人,說比第1個(gè)人大2歲。最終問第1個(gè)人,他說是10歲。請問第5個(gè)人多大。age(5)=age(4)+2age(4)=age(3)+2age(3)=age(2)+2age(2)=age(1)+2age(1)=10能夠用數(shù)學(xué)公式表述以下:age(n)=10(n=1)age(n-1)+2(n>1)第57頁57能夠用一個(gè)函數(shù)來描述上述遞歸過程:intage(intn)/*求年紀(jì)遞歸函數(shù)*/{intc;/*c用作存放函數(shù)返回值變量*/if(n==1)c=10;elsec=age(n-1)+2;return(c);}運(yùn)行結(jié)果以下:18用一個(gè)主函數(shù)調(diào)用age函數(shù),求得第5人年紀(jì)。#include<stdio.h>voidmain(){printf(″%d″,age(5));}第58頁58例7.8用遞歸方法求n!

求n!也能夠用遞歸方法,即5!等于4!×5,而4!=3!×4…1?。剑薄?捎孟旅孢f歸公式表示:n!︳

=1(n=0,1)

︳=n·(n-1)!(n>1)第59頁59程序以下:#include<stdio.h>voidmain(){longfac(intn);/*對fac函數(shù)申明*/intn;longy;printf("inputanintegernumber:");scanf("%d",&n);y=fac(n);printf("%d!=%ld\n",n,y);}第60頁60longfac(intn)/*定義fac函數(shù)*/{longf;if(n<0) printf("n<0,dataerror!");elseif(n==0,n==1) f=1;elsef=fac(n-1)*n;return(f);}運(yùn)行情況以下:inputanintegernunber:10↙10!=3628800第61頁61例7.9Hanoi(漢諾塔)問題:第62頁62由上面分析可知:將n個(gè)盤子從A座移到C座能夠分解為以下3個(gè)步驟:1.將A上n-1個(gè)盤借助C座先移到B座上。2.把A座上剩下一個(gè)盤移到C座上。3.將n-1個(gè)盤從B座借助于A座移到C座上。第63頁63程序以下:#include<stdio.h>voidmain(){voidhanoi(intn,charone,chartwo,charthree);

/*對hanoi函數(shù)申明*/intm;printf("inputthenumberofdiskes:");scanf(“%d”,&m);printf("Thesteptomoveing%ddiskes:\n",m);hanoi(m,'A','B','C');}第64頁64voidhanoi(intn,charone,chartwo,charthree)

/*定義hanoi函數(shù),將n個(gè)盤從one座借助two座,移到three座*/{voidmove(charx,chary);/*對move函數(shù)申明*/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)/*定義move函數(shù)*/{printf(“%c-->%c\n",x,y);}第65頁65運(yùn)行情況以下:inputthenumberofdiskes:3↙Thestepstonoving3diskes:A-->CA-->BC-->BA-->CB-->AB-->CA-->C

第66頁66補(bǔ)充數(shù)組作為函數(shù)參數(shù)1數(shù)組元素作函數(shù)實(shí)參

因?yàn)閷?shí)參能夠是表示式,而數(shù)組元素能夠是表示式組成部分,所以數(shù)組元素能夠作為函數(shù)實(shí)參,與用變量作實(shí)參一樣,是單向傳遞,即“值傳送”方式。第67頁67例

有兩個(gè)數(shù)組a和b,各有10個(gè)元素,將它們對應(yīng)地逐一相比(即a[0]與b[0]比,a[1]與b[1]比……)。假如a數(shù)組中元素大于b數(shù)組中對應(yīng)元素?cái)?shù)目多于b數(shù)組中元素大于a數(shù)組中對應(yīng)元素?cái)?shù)目(比如,a[i]>b[i]6次,b[i]>a[i]3次,其中i每次為不一樣值),則認(rèn)為a數(shù)組大于b數(shù)組,并分別統(tǒng)計(jì)出兩個(gè)數(shù)組對應(yīng)元素大于、等于、小于次數(shù)。第68頁68#include<stdio.h>voidmain(){intlarge(intx,inty);/*函數(shù)申明*/inta[10],b[10],i,n=0,m=0,k=0;printf(″e(cuò)nterarraya∶\n″);for(i=0;i<10;i++)scanf(″%d″,&a[i]);printf(″\n″);printf(″e(cuò)nterarrayb∶\n″);for(i=0;i<10;i++)scanf(″%d″,&b[i]);printf(″\n″);for(i=0;i<10;i++){if(large(a[i],b[i])==1)n=n+1;elseif(large(a[i],b[i])==0)m=m+1;elsek=k+1;}第69頁69printf("a[i]>b[i]%dtimes\na[i]=b[i]%dtimes\na[i]<b[i]%dtimes\n",n,m,k);if(n>k)printf("arrayaislargerthanarrayb\n");elseif(n<k)printf("arrayaissmallerthanarrayb\n");elseprintf("arrayaisequaltoarrayb\n");}large(intx,inty){intflag;if(x>y)flag=1;elseif(x<y)flag=-1;elseflag=0;return(flag);}第70頁70運(yùn)行情況以下:

enterarraya:

1357986420↙enterarrayb∶

5389–1–35604↙a[i]>b[i]4timesa[i]=b[i]1timesa[i]<b[i]5timesarrayaissmallerthannarrayb第71頁712數(shù)組名作函數(shù)參數(shù)

能夠用數(shù)組名作函數(shù)參數(shù),此時(shí)形參應(yīng)該用數(shù)組名或用指針變量。例有一個(gè)一維數(shù)組score,內(nèi)放10個(gè)學(xué)生成績,求平均成績。第72頁72#include<stdio.h>voidmain(){floataverage(floatarray[10]);/*函數(shù)申明*/floatscore[10],aver;inti;printf(″input10scores:\n″);for(i=0;i<10;i++=scanf(″%f″,&score[i]);printf(″\n″);aver=average(score);printf(″averagescoreis%5.2f\n″,aver);}第73頁73floataverage(floatarray[10]){inti;floataver,sum=array[0];for(i=1;i<10;i++=)sum=sum+array[i];aver=sum/10;return(aver);}運(yùn)行情況以下:input10scores:

100567898.576879967.57597↙averagescoreis83.40

第74頁74例2編寫一個(gè)函數(shù),用來分別求數(shù)組score_1和數(shù)組score_2各元素平均值。

#include<stdio.h>voidmain(){floataverage(floatarray[],intn)floatscore_1[5]={98.5,97,91.5,60,55};floatscore_2[10]={67.5,89.5,99,69.5,77,89.5,76.5,54,60,99.5};printf(“theaverageofclassAis%6.2f\n”,average(score_1,5));printf(“theaverageofclassBis%6.2f\n”,average(score_2,10));}第75頁75floataverage(floatarray[],intn){inti;floataver,sum=array[0];for(i=1;i<n;i++=sum=sum+array[i];aver=sum/n;return(aver);}運(yùn)行結(jié)果以下:theaverageofclassAis80.40TheaverageofclassBis78.20第76頁76說明:1、實(shí)參數(shù)組和形參數(shù)組類型應(yīng)保持一致。2、在被調(diào)用函數(shù)中申明數(shù)組大小是不起任何作用。因?yàn)镃編譯系統(tǒng)對形參數(shù)組大小不作檢驗(yàn),形參數(shù)組名只代表一個(gè)地址,在調(diào)用時(shí)將實(shí)參數(shù)組首地址傳到形參數(shù)組名,也就是說,形參數(shù)組并不在內(nèi)存中重新申請數(shù)組空間,而是和實(shí)參數(shù)組共占存放單元。第77頁776.4.1局部變量

在一個(gè)函數(shù)內(nèi)部定義變量是內(nèi)部變量,它只在本函數(shù)范圍內(nèi)有效,也就是說只有在本函數(shù)內(nèi)才能使用它們,在此函數(shù)以外是不能使用這些變量。這稱為“局部變量”。6.4局部變量和全局變量第78頁78floatf1(inta)/*函數(shù)f1*/{intb,c;…a、b、c有效}charf2(intx,inty)/*函數(shù)f2*/{inti,j;x、y、i、j有效}voidmain()/*主函數(shù)*/{intm,n;…m、n有效}

第79頁79主函數(shù)中定義變量只在主函數(shù)中有效,而不因?yàn)樵谥骱瘮?shù)中定義而在整個(gè)文件或程序中有效。主函數(shù)也不能使用其它函數(shù)中定義變量。(2)不一樣函數(shù)中能夠使用相同名字變量,它們代表不一樣對象,互不干擾。(3)形式參數(shù)也是局部變量。(4)在一個(gè)函數(shù)內(nèi)部,能夠在復(fù)合語句中定義變量,這些變量只在本復(fù)合語句中有效,這種復(fù)合語句也稱為“分程序”或“程序塊”。第80頁80voidmain(){inta,b;…{intc;c=a+b;c在此范圍內(nèi)有效a,b在此范圍內(nèi)有效…}…}

第81頁816.4.2全局變量在函數(shù)內(nèi)定義變量是局部變量,而在函數(shù)之外定義變量稱為外部變量,外部變量是全局變量(也稱全程變量)。全局變量可認(rèn)為本文件中其他函數(shù)所共用。它有效范圍為從定義變量位置開始到根源文件結(jié)束。第82頁82全局變量:在函數(shù)之外定義變量。(全部函數(shù)前,各個(gè)函數(shù)之間,全部函數(shù)后)全局變量作用域:從定義全局變量位置起到根源程序結(jié)束為止。在引用全局變量時(shí)假如使用“extern”申明全局變量,能夠擴(kuò)大全局變量作用域。比如,擴(kuò)大到整個(gè)源文件(模塊),對于多源文件(模塊)能夠擴(kuò)大到其它源文件(模塊)。全局變量和局部變量同名“屏蔽”。參見P172.第83頁83intp=1,q=5;/*外部變量*/floatf1(inta)/*定義函數(shù)f1*/{intb,c;…}charc1,c2;/*外部變量*/charf2(intx,inty)/*定義函數(shù)f2*/{inti,j;全局變量p,q作用范圍…全局變量c1,c2作用范圍}voidmain()/*主函數(shù)*/{intm,n;…}第84頁84例有一個(gè)一維數(shù)組,內(nèi)放10個(gè)學(xué)生成績,寫一個(gè)函數(shù),求出平均分、最高分和最低分。#include<stdio.h>floatMax=0,Min=0;/*全局變量*/voidmain(){floataverage(floatarray[],intn);floatave,score[10];inti;for(i=0;i<10;i++)scanf(″%f″,&score[i]);ave=average(score,10);printf(“max=%6.2f\nmin=%6.2f\naverage=%6.2f\n“,Max,Min,ave);}第85頁85floataverage(floatarray[],intn)

/*定義函數(shù),形參為數(shù)組*/{inti;floataver,sum=array[0];Max=Min=array[0];for(i=1;i<n;i++){if(array[i]>Max)Max=array[i];elseif(array[i]<Min)Min=array[i];sum=sum+array[i];}aver=sum/n;return(aver);}運(yùn)行情況以下:9945789710067.589926643↙max=100.00min=43.00average=77.65

第86頁86第87頁87提議不在必要時(shí)不要使用全局變量,原因以下:①全局變量在程序全部執(zhí)行過程中都占用存放單元,而不是僅在需要時(shí)才開辟單元。②使用全局變量過多,會(huì)降低程序清楚性。在各個(gè)函數(shù)執(zhí)行時(shí)都可能改變外部變量值,程序輕易犯錯(cuò)。所以,要限制使用全局變量。第88頁88③它降低函數(shù)通用性,因?yàn)楹瘮?shù)在執(zhí)行時(shí)要依賴于其所在外部變量。假如將一個(gè)函數(shù)移到另一個(gè)文件中,還要將相關(guān)外部變量及其值一起移過去。但若該外部變量與其它文件變量同名時(shí),就會(huì)出現(xiàn)問題,降低了程序可靠性和通用性。普通要求把C程序中函數(shù)做成一個(gè)封閉體,除了能夠經(jīng)過“實(shí)參——形參”渠道與外界發(fā)生聯(lián)絡(luò)外,沒有其它渠道。第89頁89例外部變量與局部變量同名#include<stdio.h>inta=3,b=5;/*a,b為外部變量*/a,b作用范圍voidmain(){inta=8;/*a為局部變量*/局部變量a作用范圍printf(″%d″,max(a,b));全局變量b作用范圍}max(inta,intb)/*a,b為局部變量*/

{intc;c=a>b?a∶b;形參a、b作用范圍return(c);

}運(yùn)行結(jié)果為8

第90頁90

6.5變量存放類別從變量作用域(即從空間)角度來分,能夠分為全局變量和局部變量。從變量值生存期(即存在時(shí)間)角度來分,又能夠分為靜態(tài)存放方式和動(dòng)態(tài)存放方式。所謂靜態(tài)存放方式是指在程序運(yùn)行期間分配固定存放空間方式。而動(dòng)態(tài)存放方式則是在程序運(yùn)行期間依據(jù)需要進(jìn)行動(dòng)態(tài)分配存放空間方式。第91頁91變量生存期是指變量在內(nèi)存中占據(jù)存放空間時(shí)間。有些變量在程序運(yùn)行期間一直占據(jù)內(nèi)存空間,而有些變量只在程序運(yùn)行時(shí)某段時(shí)間內(nèi)占據(jù)存放空間。前者是分配在靜態(tài)存放區(qū)中變量,后者是分配在動(dòng)態(tài)存放區(qū)或CPU存放器中變量。(1)靜態(tài)存放變量分配在內(nèi)存靜態(tài)存放區(qū)中變量稱為靜態(tài)存放變量。對于這類變量,如全局變量,編譯時(shí)系統(tǒng)在靜態(tài)存放區(qū)給它分配固定存放空間。在程序運(yùn)行期間變量值一直存在,程序運(yùn)行結(jié)束時(shí),靜態(tài)存放變量所占存放空間才被釋放。所以,靜態(tài)存放區(qū)中變量其生存期是整個(gè)程序執(zhí)行期。假如在定義靜態(tài)存放變量時(shí)沒賦初值,編譯系統(tǒng)給靜態(tài)變量賦初值為0。第92頁92(2)動(dòng)態(tài)存放變量分配在內(nèi)存動(dòng)態(tài)存放區(qū)中變量稱為動(dòng)態(tài)存放變量。對于這類變量,經(jīng)典例子是函數(shù)形式參數(shù),系統(tǒng)是在函數(shù)被調(diào)用時(shí)在內(nèi)存動(dòng)態(tài)存放區(qū)中為其分配存放空間,函數(shù)執(zhí)行結(jié)束,它們所占存放空間即刻釋放,也就不能再引用這些變量了。假如一個(gè)函數(shù)被屢次調(diào)用,則重復(fù)分配和釋放形參變量存放單元。所以,這類變量生存期是函數(shù)執(zhí)行期。假如在定義變量時(shí)沒賦初值,則初值不確定。2、變量存放類別C語言中每一個(gè)變量都有兩個(gè)屬性:變量數(shù)據(jù)類型和變量存放類別。第93頁93C語言共有4種存放類別標(biāo)識(shí)符:auto:自動(dòng)變量register:存放器變量extern:外部變量static:靜態(tài)變量自動(dòng)變量和存放器變量屬于動(dòng)態(tài)存放方式,外部變量和靜態(tài)變量屬于靜態(tài)存放方式。在介紹了變量存放類別之后,能夠知道對一個(gè)變量說明不但應(yīng)說明其數(shù)據(jù)類型,還應(yīng)說明其存放類別。存放類別說明符數(shù)據(jù)類型說明符變量名1[,變量名2…];比如:staticinta,b;/*說明a,b為靜態(tài)整型變量*/autocharc1,c2;/*說明c1,c2為自動(dòng)字符變量*/staticinta[5]={1,2,3,4,5};/*說明a為靜態(tài)數(shù)組變量*/externintx,y;/*說明x,y為外部整型變量第94頁946.5.1自動(dòng)存放類型自動(dòng)變量類型說明符為auto,這種存放類型是C語言程序中使用最廣泛一個(gè)類型。自動(dòng)變量普通為函數(shù)或復(fù)合語句內(nèi)定義變量(包含形參)。C語言要求,函數(shù)內(nèi)凡未加存放類別說明變量均視為自動(dòng)變量,也就是說自動(dòng)變量可省去說明符auto。autointx,y;等價(jià)于:intx,y;自動(dòng)變量含有以下特點(diǎn):(1)自動(dòng)變量是局部變量,作用域僅限于函數(shù)或復(fù)合語句內(nèi)。在函數(shù)中定義自動(dòng)變量,只在該函數(shù)內(nèi)有效,在復(fù)合語句中定義自動(dòng)變量只在該復(fù)合語句中有效。(2)自動(dòng)變量屬于動(dòng)態(tài)存放方式,只有在定義該變量函數(shù)被調(diào)用時(shí)才給它分配存放單元,開始它生存期,函數(shù)調(diào)用結(jié)束,釋放存放單元,結(jié)束生存期。所以函數(shù)調(diào)用結(jié)束之后,自動(dòng)變量值不能保留。第95頁95(3)因?yàn)樽詣?dòng)變量作用域和生存期都局限于定義它個(gè)體內(nèi)(函數(shù)或復(fù)合語句內(nèi)),所以不一樣個(gè)體中允許使用同名變量而不會(huì)混同。即使在一個(gè)函數(shù)內(nèi)定義自動(dòng)變量也能夠與該函數(shù)內(nèi)部復(fù)合語句中定義自動(dòng)變量同名。(4)在對自動(dòng)變量賦值之前,它值是不確定。定義變量時(shí)若沒給自動(dòng)變量賦初值,變量初值不確定;假如賦初值,則每次函數(shù)被調(diào)用時(shí)執(zhí)行一次賦值操作第96頁966.5.2存放器存放類型C語言提供了另一個(gè)變量,即存放器變量。這種變量值存放在CPU存放器中,使用時(shí)不需要訪問內(nèi)存,存放器讀寫速度比內(nèi)存讀寫速度快,所以,能夠?qū)⒊绦蛑惺褂妙l率高變量(如控制循環(huán)次數(shù)變量)定義為存放器變量,這么可提升程序執(zhí)行速度。存放器變量用關(guān)鍵字register作存放類別標(biāo)識(shí)符。對存放器變量還要說明以下幾點(diǎn):1)只有局部自動(dòng)變量和形式參數(shù)才能夠定義存放器變量,因?yàn)榇娣牌髯兞繉儆趧?dòng)態(tài)存放方式。凡需要采取靜態(tài)存放方式變量不能定義為存放器變量。第97頁97(2)因?yàn)镃PU中存放器個(gè)數(shù)有限,所以,一個(gè)程序中能夠定義存放器變量數(shù)目也是有限。當(dāng)存放器沒有空閑時(shí),系統(tǒng)將存放器變量看成自動(dòng)變量處理。所以,存放器變量生存期與自動(dòng)變量相同。在TurboC、MSC下使用C語言,實(shí)際上把存放器變量當(dāng)自動(dòng)變量處理,允許使用存放器變量只是為了與標(biāo)準(zhǔn)C保持一致。(3)有些系統(tǒng)受存放器長度限制,存放器變量普通是char、int和指針類型變量第98頁986.5.3外部存放類型外部變量〔即全局變量〕是在函數(shù)外部定義,它作用域?yàn)閺淖兞慷x處開始,到本程序文件末尾。在此作用域內(nèi),全局變量可認(rèn)為程序中各個(gè)函數(shù)所引用。編譯時(shí)將外部變量分配在靜態(tài)存放區(qū)。用extern聲明外部變量。

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(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

提交評論