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

下載本文檔

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

文檔簡(jiǎn)介

第七章第1頁(yè)本章關(guān)鍵點(diǎn)函數(shù)概念函數(shù)定義與調(diào)用函數(shù)遞歸調(diào)用變量作用域函數(shù)作用域第2頁(yè)

主要內(nèi)容7.1函數(shù)概述7.2函數(shù)定義普通形式7.3函數(shù)參數(shù)和函數(shù)值7.4函數(shù)調(diào)用7.5函數(shù)嵌套調(diào)用

第3頁(yè)

主要內(nèi)容7.6函數(shù)遞歸調(diào)用7.7數(shù)組作為函數(shù)參數(shù)7.8變量作用域--局部變量和全局變量7.9變量存放方式和生存期7.10關(guān)于變量申明和定義7.11內(nèi)部函數(shù)和外部函數(shù)第4頁(yè)7.1函數(shù)概述

一個(gè)C程序可由一個(gè)主函數(shù)和若干個(gè)其它函數(shù)組成。一個(gè)較大程序可分為若干個(gè)程序模塊,每一個(gè)模塊用來實(shí)現(xiàn)一個(gè)特定功效。在高級(jí)語(yǔ)言中用子程序?qū)崿F(xiàn)模塊功效。子程序由函數(shù)來完成。函數(shù)間調(diào)用關(guān)系:由主函數(shù)調(diào)用其它函數(shù),其它函數(shù)也能夠相互調(diào)用。同一個(gè)函數(shù)能夠被一個(gè)或多個(gè)函數(shù)調(diào)用任意屢次。第5頁(yè)第6頁(yè)例7.1函數(shù)調(diào)用簡(jiǎn)單例子#include<stdio.h>voidmain(){voidprintstar();/*對(duì)printstar函數(shù)申明*/voidprint_message();/*對(duì)print_message函數(shù)申明*/printstar();/*調(diào)用printstar函數(shù)*/print_message();/*調(diào)用print_message函數(shù)*/printstar();/*調(diào)用printstar函數(shù)*/}第7頁(yè)voidprintstar()/*定義printstar函數(shù)*/{printf("****************\n");}voidprint_message()/*定義print_message函數(shù)*/{printf("Howdoyoudo!\n");}運(yùn)行情況以下:****************Howdoyoudo!****************第8頁(yè)說明:1.一個(gè)C程序由一個(gè)或多個(gè)程序模塊組成,每一個(gè)程序模塊作為一個(gè)源程序文件。對(duì)于較大程序,通常將程序內(nèi)容分別放在若干個(gè)源文件中,再由若干源程序文件組成一個(gè)C程序。這么便于分別編寫、分別編譯,提高調(diào)試效率。一個(gè)源程序文件可認(rèn)為多個(gè)C程序公用。第9頁(yè)

說明:

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

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

說明: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頁(yè)說明:5.從用戶使用角度看,函數(shù)有兩種:①

標(biāo)準(zhǔn)函數(shù),即庫(kù)函數(shù)。這是由系統(tǒng)提供,用戶無須自己定義這些函數(shù),能夠直接使用它們。不一樣C系統(tǒng)提供庫(kù)函數(shù)數(shù)量和功效會(huì)有一些不一樣,但許多基本函數(shù)是共同。②用戶自己定義函數(shù)。用以處理用戶專門需要。第13頁(yè)說明:6.從函數(shù)形式看,函數(shù)分兩類:①無參函數(shù)。無參函數(shù)普通用來執(zhí)行指定一組操作。在調(diào)用無參函數(shù)時(shí),主調(diào)函數(shù)不向被調(diào)用函數(shù)傳遞數(shù)據(jù)。②有參函數(shù)。主調(diào)函數(shù)在調(diào)用被調(diào)用函數(shù)時(shí),經(jīng)過參數(shù)向被調(diào)用函數(shù)傳遞數(shù)據(jù)。第14頁(yè)7.2函數(shù)定義普通形式

7.2.1.為何要定義函數(shù)C語(yǔ)言要求,在程序中用到全部函數(shù),必須“先定義,后使用”。定義函數(shù)包含以下幾個(gè)內(nèi)容:⒈指定函數(shù)名字,方便以后按名調(diào)用。⒉指定函數(shù)類型,函數(shù)值類型。⒊指定函數(shù)參數(shù)名字和類型,方便在調(diào)用函數(shù)時(shí)向它們傳遞數(shù)據(jù)。對(duì)無參函數(shù)不需要這項(xiàng)。⒋指定函數(shù)應(yīng)該執(zhí)行什么操作,也就是函數(shù)是做什么,即函數(shù)功效。這是最主要。第15頁(yè)7.2函數(shù)定義普通形式

7.2.1.為何要定義函數(shù)對(duì)于C編譯系統(tǒng)提供庫(kù)函數(shù),是由編譯系統(tǒng)事先定義好,程序設(shè)計(jì)者無須自已定義,只需#include命令把相關(guān)頭文件包含到本文件模塊中即可。比如,在程序中若用到數(shù)學(xué)函數(shù)(如sqrt,fabs,sin,cos等),就必須在本文件模塊開頭寫上:#include<math.h>第16頁(yè)7.2函數(shù)定義普通形式7.2.2怎樣定義無參函數(shù)定義無參函數(shù)普通形式為:類型標(biāo)識(shí)符函數(shù)名(){

申明部分

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

申明部分

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

第18頁(yè)7.2函數(shù)定義普通形式7.2.4定義空函數(shù)定義空函數(shù)普通形式為:類型標(biāo)識(shí)符函數(shù)名(){}比如:voiddummy(){}主調(diào)函數(shù)調(diào)用空函數(shù)時(shí),只表明這里要調(diào)用一個(gè)函數(shù),但函數(shù)本身什么工作也不做等,以后擴(kuò)充函數(shù)功效時(shí)補(bǔ)充上。第19頁(yè)7.3函數(shù)參數(shù)和函數(shù)值7.3.1形式參數(shù)和實(shí)際參數(shù)

形式參數(shù):函數(shù)名后面括弧中變量名稱為“形式參數(shù)”(簡(jiǎn)稱“形參”);實(shí)際參數(shù):主調(diào)函數(shù)中調(diào)用一個(gè)函數(shù)時(shí),函數(shù)名后面括弧中參數(shù)(能夠是一個(gè)表示式)稱為“實(shí)際參數(shù)”(簡(jiǎn)稱“實(shí)參”);函數(shù)返回值:return后面括弧中值作為函數(shù)帶回值(稱函數(shù)返回值)。第20頁(yè)主調(diào)函數(shù)和被調(diào)用函數(shù)之間有數(shù)據(jù)傳遞關(guān)系。在不一樣函數(shù)之間傳遞數(shù)據(jù),能夠使用方法有:參數(shù):經(jīng)過形式參數(shù)和實(shí)際參數(shù)返回值:用return語(yǔ)句返回計(jì)算結(jié)果全局變量:外部變量第21頁(yè)例7.2輸入兩個(gè)整數(shù),要求用一個(gè)函數(shù)求出其中大者,并在主函數(shù)中輸出此值。

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

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

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

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

is

第23頁(yè)經(jīng)過函數(shù)調(diào)用,可使兩個(gè)函數(shù)中數(shù)據(jù)發(fā)生聯(lián)絡(luò)。第24頁(yè)關(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í)參值賦給形參。第25頁(yè)3.在被定義函數(shù)中,必須指定形參類型。4.實(shí)參加形參類型應(yīng)相同或賦值兼容。5.實(shí)參向形參數(shù)據(jù)傳遞是單向“值傳遞”,只能由實(shí)參傳給形參,而不能由形參傳回來給實(shí)參。在調(diào)用函數(shù)時(shí),給形參分配存放單元,并將實(shí)參對(duì)應(yīng)值傳遞給形參,調(diào)用結(jié)束后,形參單元被釋放,實(shí)參單元仍保留并維持原值。第26頁(yè)7.3函數(shù)參數(shù)和函數(shù)值7.3.2函數(shù)返回值函數(shù)返回值是經(jīng)過函數(shù)調(diào)用使主調(diào)函數(shù)得到確實(shí)定值。比如:例8.2中,max(2,3)值是3,max(5,2)值是5。賦值語(yǔ)句將這個(gè)函數(shù)值賦給變量c。第27頁(yè)說明:

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

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

max(intx,inty){

return(x>y?x:y);

}第28頁(yè)2.函數(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)按整型處理。第29頁(yè)3.在定義函數(shù)時(shí)指定函數(shù)類型普通應(yīng)該和return語(yǔ)句中表示式類型一致。假如函數(shù)值類型和return語(yǔ)句中表示式值不一致,則以函數(shù)類型為準(zhǔn)。對(duì)數(shù)值型數(shù)據(jù),能夠自動(dòng)進(jìn)行類型轉(zhuǎn)換。即函數(shù)類型決定返回值類型。4.對(duì)于不帶回值函數(shù),應(yīng)該用“void”定義函數(shù)為“無類型”(或稱“空類型”)。此時(shí)在函數(shù)體中不得出現(xiàn)return語(yǔ)句。

第30頁(yè)例7.3返回值類型與函數(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

第31頁(yè)7.4函數(shù)調(diào)用

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

函數(shù)名(實(shí)參表列)說明:1.假如是調(diào)用無參函數(shù),則“實(shí)參表列”能夠沒有,但括弧不能省略。2.假如實(shí)參表列包含多個(gè)實(shí)參,則各參數(shù)間用逗號(hào)隔開。實(shí)參加形參個(gè)數(shù)應(yīng)相等,類型應(yīng)匹配。實(shí)參加形參按次序?qū)?yīng),向形參傳遞數(shù)據(jù)。第32頁(yè)假如實(shí)參表列包含多個(gè)實(shí)參,對(duì)實(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);第33頁(yè)7.4函數(shù)調(diào)用7.4.2函數(shù)調(diào)用方式1.函數(shù)語(yǔ)句把函數(shù)調(diào)用作為一個(gè)語(yǔ)句。這時(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)用方式:

第34頁(yè)3.函數(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三者中最大者。第35頁(yè)7.4函數(shù)調(diào)用

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

第37頁(yè)例7.4對(duì)被調(diào)用函數(shù)作申明#include<stdio.h>voidmain(){floatadd(floatx,floaty);

/*對(duì)被調(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第38頁(yè)函數(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)。第39頁(yè)注意:函數(shù)“定義”和“申明”不是一回事。函數(shù)定義是指對(duì)函數(shù)功效確實(shí)立,包含指定函數(shù)名,函數(shù)值類型、形參及其類型、函數(shù)體等,它是一個(gè)完整、獨(dú)立函數(shù)單位。函數(shù)申明作用則是把函數(shù)名字、函數(shù)類型以及形參類型、個(gè)數(shù)和次序通知編譯系統(tǒng),方便在調(diào)用該函數(shù)時(shí)系統(tǒng)按此進(jìn)行對(duì)照檢驗(yàn)。它不包含函數(shù)體。

第40頁(yè)說明:

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

第41頁(yè)例7.5(例7.4改寫)#include<stdio.h>floatadd(floatx,floaty)/*函數(shù)首部*/{floatz;z=x+y;return(z);}voidmain(){/*無須再對(duì)add函數(shù)作申明*/ floata,b,c;scanf("%f,%f",&a,&b);c=add(a,b);printf("sumis%f\n",c);}第42頁(yè)

7.5函數(shù)嵌套調(diào)用嵌套定義就是在定義一個(gè)函數(shù)時(shí),其函數(shù)體內(nèi)又包含另一個(gè)函數(shù)完整定義。第43頁(yè)在主函數(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é)果。方法:例7.6輸入4個(gè)整數(shù),找出其中最大數(shù)。用函數(shù)嵌套調(diào)用來處理。第44頁(yè)#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;第45頁(yè)

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ù)定義*/intmax_2(a,b){if(a>b)returna;elsereturnb;/*函數(shù)返回值是a和b中大者*/}運(yùn)行情況以下:Pleaseenter4intergernumbers:1145–540↙max=45第46頁(yè)7.6函數(shù)遞歸調(diào)用

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

intf(intx){inty,z;z=f(y);/*在執(zhí)行f函數(shù)過程中又要調(diào)用f函數(shù)*/return(2*z);}第47頁(yè)例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歲。請(qǐng)問第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)第48頁(yè)能夠用一個(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));}第49頁(yè)例7.8用遞歸方法求n!

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

=1(n=0,1)

︳=n·(n-1)!(n>1)第50頁(yè)程序以下:#include<stdio.h>voidmain(){longfac(intn);/*對(duì)fac函數(shù)申明*/intn;longy;printf("inputanintegernumber:");scanf("%d",&n);y=fac(n);printf("%d!=%ld\n",n,y);}第51頁(yè)longfac(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第52頁(yè)例7.9Hanoi(漢諾塔)問題:第53頁(yè)由上面分析可知:將n個(gè)盤子從A座移到C座能夠分解為以下3個(gè)步驟:1.將A上n-1個(gè)盤借助C座先移到B座上。2.把A座上剩下一個(gè)盤移到C座上。3.將n-1個(gè)盤從B座借助于A座移到C座上。第54頁(yè)程序以下:#include<stdio.h>voidmain(){voidhanoi(intn,charone,chartwo,charthree);

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

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

第57頁(yè)7.7數(shù)組作為函數(shù)參數(shù)7.7.1數(shù)組元素作函數(shù)實(shí)參

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

有兩個(gè)數(shù)組a和b,各有10個(gè)元素,將它們對(duì)應(yīng)地逐一相比(即a[0]與b[0]比,a[1]與b[1]比……)。假如a數(shù)組中元素大于b數(shù)組中對(duì)應(yīng)元素?cái)?shù)目多于b數(shù)組中元素大于a數(shù)組中對(duì)應(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ù)組對(duì)應(yīng)元素大于、等于、小于次數(shù)。第59頁(yè)#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;}第60頁(yè)printf("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);}第61頁(yè)運(yùn)行情況以下:

enterarraya:

1357986420↙enterarrayb∶

5389–1–35604↙a[i]>b[i]4timesa[i]=b[i]1timesa[i]<b[i]5timesarrayaissmallerthannarrayb第62頁(yè)7.7數(shù)組作為函數(shù)參數(shù)7.7.2數(shù)組名作函數(shù)參數(shù)

能夠用數(shù)組名作函數(shù)參數(shù),此時(shí)形參應(yīng)該用數(shù)組名或用指針變量。例7.11有一個(gè)一維數(shù)組score,內(nèi)放10個(gè)學(xué)生成績(jī),求平均成績(jī)。第63頁(yè)#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);}第64頁(yè)floataverage(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

第65頁(yè)例7.12編寫一個(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));}第66頁(yè)floataverage(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第67頁(yè)例7.13用選擇法對(duì)數(shù)組中10個(gè)整數(shù)按由小到大排序。所謂選擇法就是先將10個(gè)數(shù)中最小數(shù)與a[0]對(duì)換;再將a[1]到a[9]中最小數(shù)與a[1]對(duì)換……每比較一輪,找出一個(gè)未經(jīng)排序數(shù)中最小一個(gè)。共比較9輪。第68頁(yè)未排序時(shí)情況:a[0]a[1]a[2]a[3]a[4]36194將5個(gè)數(shù)中最小數(shù)1與a[0]對(duì)換:16394將余下4個(gè)數(shù)中最小數(shù)3與a[1]對(duì)換13694將余下3個(gè)數(shù)中最小數(shù)4與a[2]對(duì)換13496將余下2個(gè)數(shù)中最小數(shù)6與a[3]對(duì)換,至此完成排序13469第69頁(yè)程序?qū)嵗?include<stdio.h>voidmain(){voidsort(intarray[],intn);inta[10],i;printf(″e(cuò)nterthearray\n″);for(i=0;i<10;i++=scanf(″%d″,&a[i]);sort(a,10);printf(″thesortedarray∶\n″);for(i=0;i<10;i++=printf(″%d″,a[i]);printf(″\n″);}第70頁(yè)voidsort(intarray[],intn){inti,j,k,t;for(i=0;i<n-1;i++){k=i;for(j=i+1;j<n;j++)if(array[j]<array[k]=k=j;t=array[k];array[k]=array[i];array[i]=t}}運(yùn)行結(jié)果以下:enterarray:57–321–436732133510↙Thesortedarray:–43–305721335167321第71頁(yè)7.7數(shù)組作為函數(shù)參數(shù)7.7.3用多維數(shù)組名作函數(shù)參數(shù)多維數(shù)組元素能夠作函數(shù)參數(shù),這點(diǎn)與用一維數(shù)組元素作函數(shù)參數(shù)情況類似。也能夠用多維數(shù)組名作為函數(shù)實(shí)參和形參,在被調(diào)用函數(shù)中對(duì)形參數(shù)組定義時(shí)能夠指定每一維大小,也能夠省略第一維大小說明。例7.14有一個(gè)3×4二維數(shù)組,設(shè)計(jì)一個(gè)函數(shù),用來求二維數(shù)組中全部元素中最大值。第72頁(yè)程序以下:#include<stdio.h>voidmain(){max_value(intarray[][4]);int[3][4]={{1,3,5,7},{2,4,6,8},{15,17,34,12}};printf(″maxvalueis%d\n″,max_value(a));}

算法:先使變量max初值為二維數(shù)組中第一個(gè)元素值,然后將二維數(shù)組中各個(gè)元素值與max相比,每次比較后都把“大者”存放在max中,全部元素比較完后,max值就是全部元素最大值。第73頁(yè)max_value(intarray[][4]){inti,j,k,max;max=array[0][0];for(i=0;i<3;i++)for(j=0;j<4;j++=if(array[i][j]>max)max=array[i][j];return(max);}

運(yùn)行結(jié)果以下:Maxvalueis34第74頁(yè)7.8變量作用域--局部變量和全局變量7.8.1局部變量

在一個(gè)函數(shù)內(nèi)部定義變量是內(nèi)部變量,它只在本函數(shù)范圍內(nèi)有效,也就是說只有在本函數(shù)內(nèi)才能使用它們,在此函數(shù)以外是不能使用這些變量。這稱為“局部變量”。第75頁(yè)floatf1(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有效}

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

第78頁(yè)7.8變量作用域--局部變量和全局變量7.8.2全局變量在函數(shù)內(nèi)定義變量是局部變量,而在函數(shù)之外定義變量稱為外部變量,外部變量是全局變量(也稱全程變量)。全局變量可認(rèn)為本文件中其他函數(shù)所共用。它有效范圍為從定義變量位置開始到根源文件結(jié)束。第79頁(yè)intp=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;…}第80頁(yè)例7.15有一個(gè)一維數(shù)組,內(nèi)放10個(gè)學(xué)生成績(jī),寫一個(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);}第81頁(yè)floataverage(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

第82頁(yè)第83頁(yè)提議不在必要時(shí)不要使用全局變量,原因以下:①全局變量在程序全部執(zhí)行過程中都占用存放單元,而不是僅在需要時(shí)才開辟單元。②使用全局變量過多,會(huì)降低程序清楚性。在各個(gè)函數(shù)執(zhí)行時(shí)都可能改變外部變量值,程序輕易犯錯(cuò)。所以,要限制使用全局變量。第84頁(yè)③它降低函數(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ò)外,沒有其它渠道。第85頁(yè)例7.16外部變量與局部變量同名#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

第86頁(yè)

7.9變量存放方式和生存期

從變量作用域(即從空間)角度來分,能夠分為全局變量和局部變量。從變量值生存期(即存在時(shí)間)角度來分,又能夠分為靜態(tài)存放方式和動(dòng)態(tài)存放方式。第87頁(yè)

7.9變量存放方式和生存期

所謂靜態(tài)存放方式是指在程序運(yùn)行期間由系統(tǒng)分配固定存放空間方式。動(dòng)態(tài)存放方式則是在程序運(yùn)行期間依據(jù)需要進(jìn)行動(dòng)態(tài)分配存放空間方式。這個(gè)存放空間能夠分為三部分:

1.程序區(qū)2.靜態(tài)存放區(qū)3.動(dòng)態(tài)存放區(qū)在C語(yǔ)言中每一個(gè)變量和函數(shù)有兩個(gè)屬性:數(shù)據(jù)類型和數(shù)據(jù)存放類別。第88頁(yè)7.9變量存放方式和生存期7.9.1局部變量存放類別1.auto變量:函數(shù)中局部變量,如不專門申明static存放類別,都是動(dòng)態(tài)地分配存放空間,數(shù)據(jù)存放在動(dòng)態(tài)存放區(qū)中。函數(shù)中形參和在函數(shù)中定義變量(包含在復(fù)合語(yǔ)句中定義變量),都屬這類,在調(diào)用該函數(shù)時(shí)系統(tǒng)會(huì)給它們分配存放空間,在函數(shù)調(diào)用結(jié)束時(shí)就自動(dòng)釋放這些存放空間。所以這類局部變量稱為自動(dòng)變量。自動(dòng)變量用關(guān)鍵字auto作存放類別申明。比如:intf(inta)/*定義f函數(shù),a為形參*/{autointb,c=3;/*定義b、c為自動(dòng)變量*/…}第89頁(yè)2.靜態(tài)局部變量:當(dāng)函數(shù)中局部變量值在函數(shù)調(diào)用結(jié)束后不消失而保留原值時(shí),該變量稱為靜態(tài)局部變量。用關(guān)鍵字static進(jìn)行申明。7.9變量存放方式和生存期7.9.1局部變量存放類別第90頁(yè)例7.17考查靜態(tài)局部變量值#include<stdio.h>voidmain(){intf(int);inta=2,i;for(i=0;i<3;i++=printf(″%d″,f(a));}intf(inta){autointb=0;staticc=3;b=b+1;c=c+1;return(a+b+c);}第91頁(yè)對(duì)靜態(tài)局部變量說明:1.靜態(tài)局部變量屬于靜態(tài)存放類別,在靜態(tài)存放區(qū)內(nèi)分配存放單元。在程序整個(gè)運(yùn)行期間都不釋放。而自動(dòng)變量(即動(dòng)態(tài)局部變量)屬于動(dòng)態(tài)存放類別,占動(dòng)態(tài)存放區(qū)空間而不占靜態(tài)存放區(qū)空間,函數(shù)調(diào)用結(jié)束后即釋放。2.對(duì)靜態(tài)局部變量是在編譯時(shí)賦初值,即只賦初值一次,在程序運(yùn)行時(shí)它已經(jīng)有初值。以后每次調(diào)用函數(shù)時(shí)不再重新賦初值而只是保留上次函數(shù)調(diào)用結(jié)束時(shí)值。第92頁(yè)3.如在定義局部變量時(shí)不賦初值話,則對(duì)靜態(tài)局部變量來說,編譯時(shí)自動(dòng)賦初值0(對(duì)數(shù)值型變量)或空字符(對(duì)字符變量)。而對(duì)自動(dòng)變量來說,假如不賦初值則它值是一個(gè)不確定值。4.即使靜態(tài)局部變量在函數(shù)調(diào)用結(jié)束后依然存在,但其它函數(shù)不能引用它。第93頁(yè)例7.18輸出1到5階乘值#include<stdio.h>voidmain(){intfac(intn);inti;for(i=1;i<=5;i++)printf(″%d!=%d\n″,i,fac(i));}Intfac(intn){staticintf=1;f=f*n;return(f);}第94頁(yè)

3.存放器變量(register):變量值是存放在內(nèi)存中。當(dāng)程序中用到哪一個(gè)變量值時(shí),由控制器發(fā)出指令將內(nèi)存中該變量值送到運(yùn)算器中。經(jīng)過運(yùn)算器進(jìn)行運(yùn)算,假如需要存數(shù),再?gòu)倪\(yùn)算器將數(shù)據(jù)送到內(nèi)存存放。7.9變量存放方式和生存期7.9.1局部變量存放類別第95頁(yè)假如有一些變量使用頻繁,則為存取變量值要花費(fèi)不少時(shí)間。為提升執(zhí)行效率,C語(yǔ)言允許將局部變量值放在CPU中存放器中,需要用時(shí)直接從存放器取出參加運(yùn)算,無須再到內(nèi)存中去存取。因?yàn)閷?duì)存放器存取速度遠(yuǎn)高于對(duì)內(nèi)存存取速度,所以這么做能夠提升執(zhí)行效率。這種變量叫做存放器變量,用關(guān)鍵字register作申明。7.9變量存放方式和生存期7.9.1局部變量存放類別說明:三種局部變量存放位置是不一樣:自動(dòng)變量存放在動(dòng)態(tài)存放區(qū);靜態(tài)局部變量存放在靜態(tài)存放區(qū);存放器存放在CPU中存放器中。第96頁(yè)7.9變量存放方式和生存期7.9.2全局變量存放類別全局變量都是存放在靜態(tài)存放區(qū)中。所以它們生存期是固定,存在于程序整個(gè)運(yùn)行過程。一般來說,外部變量是在函數(shù)外部定義全局變量,它作用域是從變量定義處開始,到本程序文件末尾。在此作用域內(nèi),全局變量可認(rèn)為程序中各個(gè)函數(shù)所引用。但有時(shí)程序設(shè)計(jì)人員希望能擴(kuò)展外部變量作用域。方法有以下幾個(gè):第97頁(yè)1.在一個(gè)文件內(nèi)擴(kuò)展外部變量作用域例7.19調(diào)用函數(shù),求3個(gè)整數(shù)中大者。

#include<stdio.h>voidmain(){intmax();/*函數(shù)申明*/externintA,B,C;/*外部變量申明*/printf("Pleaseenterthreeintegernumbers:");scanf("%d%d%d",&A,&B,&C);/*輸入外部變量值*/printf("maxis%d\n",max());}第98頁(yè)1.在一個(gè)文件內(nèi)擴(kuò)展外部變量作用域intA,B,C;/*定義外部變量*/intmax(){intm;m=A>B?A:B;if(C>m)m=C;return(m);}運(yùn)行結(jié)果為:Pleaseenterthreeintegernumbers:34–2178↙

maxis78第99頁(yè)2.將外部變量作用域擴(kuò)展到其它文件

#include<stdio.h>intA;/*定義外部變量*/voidmain(){intpower(int);/*函數(shù)申明*/intb=3,c,d,m;printf(″e(cuò)nterthenumberaanditspowerm:\n″);scanf(″%d,%d″,&A,&m);c=A*b;printf(″%d*%d=%d\n″,A,b,c);d=power(m);printf(″%d**%d=%d\n″,A,m,d);

}例7.20用extern將外部變量作用域擴(kuò)展到其它文件。本程序作用是給定b值,輸入a和m,求a×b和am值。文件file1.c中內(nèi)容為:第100頁(yè)文件file2.c中內(nèi)容為:externA;/*申明A為一個(gè)已定義外部變量*/intpower(intn);{inti,y=1;for(i=1;i<=n;i++)y*=A;return(y);}第101頁(yè)3.將外部變量作用域限制在本文件中

在程序設(shè)計(jì)中,一些外部變量只限于被本文件引用,而不能被其它文件引用。這時(shí)能夠在定義外部變量時(shí)加一個(gè)static申明。比如:file1.cfile2.cstaticintA;externintA;voidmain()voidfun(intn){{……A=A*n;}第102頁(yè)7.9.2全局變量存放類別用static申明一個(gè)變量作用是:(1)對(duì)局部變量用static申明,把它分配在靜態(tài)存放區(qū),該變量在整個(gè)程序執(zhí)行期間不釋放,其所分配空間一直存在。(2)對(duì)全局變量用static申明,則該變量作用域只限于本文件模塊(即被申明文件中)。注意:用auto、register、static申明變量時(shí),是在定義變量基礎(chǔ)上加上這些關(guān)鍵字,不能單獨(dú)使用。下面使用方法不對(duì):inta;/*先定義整型變量a*/statica;/*再對(duì)變量a申明為靜態(tài)變量*/第103頁(yè)7.9變量存放方式和生存期7.9.3存放類別小結(jié)從作用域角度分,有局部變量和全局變量。它們采取存放類別以下:局部變量包含:自動(dòng)變量、靜態(tài)局部變量、存放器變量。形式參數(shù)能夠定義為自動(dòng)變量或存放器變量全局變量包含:靜態(tài)外部變量、外部變量第104頁(yè)(2)從變量存在時(shí)間來區(qū)分,有動(dòng)態(tài)存放和靜態(tài)存放兩種

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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)論