版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
本章關(guān)鍵點(diǎn)函數(shù)概念函數(shù)定義與調(diào)用函數(shù)遞歸調(diào)用變量作用域函數(shù)作用域第8章函數(shù)逐步分解,分而治之,模塊化程序設(shè)計(jì)方法!第1頁(yè)
主要內(nèi)容
8.1概述8.2函數(shù)定義普通形式
8.3函數(shù)參數(shù)和函數(shù)值8.4函數(shù)調(diào)用8.5函數(shù)嵌套調(diào)用8.6函數(shù)遞歸調(diào)用
8.7數(shù)組作為函數(shù)參數(shù)8.8局部變量和全局變量8.9變量存放類別8.10內(nèi)部函數(shù)和外部函數(shù)第2頁(yè)
8.1概述
程序由一個(gè)主函數(shù)main()和若干其它函數(shù)組成。主函數(shù)main():執(zhí)行過(guò)程開始,執(zhí)行結(jié)束處。主調(diào)函數(shù)與被調(diào)函數(shù):調(diào)用其它函數(shù)函數(shù)稱為主調(diào)函數(shù);被其它函數(shù)調(diào)用函數(shù)稱為被調(diào)函數(shù).main()函數(shù)只能是主調(diào)函數(shù),其它函數(shù)之間可相互調(diào)用。全部函數(shù)都是平行、相互獨(dú)立,單獨(dú)定義,不可嵌套定義,但可嵌套調(diào)用第3頁(yè)函數(shù)設(shè)計(jì)標(biāo)準(zhǔn):1、界面清楚。函數(shù)處理任務(wù)明確,之間數(shù)據(jù)傳遞越少越好。2、大小適中。第4頁(yè)概念函數(shù)函數(shù)定義、函數(shù)調(diào)用主調(diào)函數(shù)、被調(diào)函數(shù)函數(shù)功效函數(shù)參數(shù)函數(shù)參數(shù)輸入、函數(shù)參數(shù)輸出、函數(shù)間數(shù)據(jù)傳遞用戶函數(shù)、系統(tǒng)函數(shù)(標(biāo)準(zhǔn)函數(shù)、庫(kù)函數(shù))、有參函數(shù)、無(wú)參函數(shù)有返回值函數(shù)、無(wú)返回值函數(shù)外部函數(shù)、內(nèi)部函數(shù)第5頁(yè)例8.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ù)*/}voidprintstar()/*定義printstar函數(shù)*/{printf("****************\n");}voidprint_message()/*定義print_message函數(shù)*/{printf("Howdoyoudo!\n");}第6頁(yè)運(yùn)行情況以下:****************Howdoyoudo!****************第7頁(yè)
8.2函數(shù)定義普通形式
8.2.1無(wú)參函數(shù)定義普通形式
定義無(wú)參函數(shù)普通形式為:類型標(biāo)識(shí)符函數(shù)名(){
申明部分
語(yǔ)句部分}voidprintstar()/*定義printstar函數(shù)*/{printf("****************\n");}第8頁(yè)
8.2.2有參函數(shù)定義普通形式
定義有參函數(shù)普通形式為:類型標(biāo)識(shí)符函數(shù)名(形式參數(shù)表列){
申明部分
語(yǔ)句部分}比如:intmax(intx,inty){intz;/*函數(shù)體中申明部分*/z=x>y?x∶y;return(z);}
第9頁(yè)
8.2.3空函數(shù)
定義空函數(shù)普通形式為:類型標(biāo)識(shí)符函數(shù)名(){}比如:dummy(){}主調(diào)函數(shù)調(diào)用空函數(shù)時(shí),只表明這里要調(diào)用一個(gè)函數(shù),但函數(shù)本身什么工作也不做等,以后擴(kuò)充函數(shù)功效時(shí)補(bǔ)充上。
第10頁(yè)
8.3函數(shù)參數(shù)和函數(shù)值
8.3.1形式參數(shù)和實(shí)際參數(shù)
形式參數(shù):函數(shù)名后面括號(hào)中變量名稱為“形式參數(shù)”(簡(jiǎn)稱“形參”)。實(shí)際參數(shù):主調(diào)函數(shù)中調(diào)用一個(gè)函數(shù)時(shí),函數(shù)名后面括號(hào)中參數(shù)(能夠是一個(gè)表示式)稱為“實(shí)際參數(shù)”(簡(jiǎn)稱“實(shí)參”)。函數(shù)返回值:return后面括號(hào)中值作為函數(shù)帶回值(稱函數(shù)返回值)。第11頁(yè)
主調(diào)函數(shù)和被調(diào)用函數(shù)之間有數(shù)據(jù)傳遞關(guān)系。在不一樣函數(shù)之間傳遞數(shù)據(jù),能夠使用方法有:參數(shù):經(jīng)過(guò)形式參數(shù)和實(shí)際參數(shù)返回值:用return語(yǔ)句返回計(jì)算結(jié)果全局變量:外部變量第12頁(yè)例8.2調(diào)用函數(shù)時(shí)數(shù)據(jù)傳遞#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);}intmax(intx,inty)/*定義有參函數(shù)max*/{intz;z=x>y?x:y;return(z);}運(yùn)行情況以下:7,8↙Max
is
8
第13頁(yè)經(jīng)過(guò)函數(shù)調(diào)用,可使兩個(gè)函數(shù)中數(shù)據(jù)發(fā)生聯(lián)絡(luò)。第14頁(yè)關(guān)于形參加實(shí)參說(shuō)明:(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í)參值賦給形參。第15頁(yè)(3)在被定義函數(shù)中,必須指定形參類型。(4)實(shí)參加形參類型應(yīng)相同或賦值兼容。(5)值傳遞:實(shí)參向形參數(shù)據(jù)傳遞是單向“值傳遞”,只能由實(shí)參傳給形參,而不能由形參傳回來(lái)給實(shí)參。
在調(diào)用函數(shù)時(shí),給形參分配存放單元,并將實(shí)參對(duì)應(yīng)值傳遞給形參,調(diào)用結(jié)束后,形參單元被釋放,實(shí)參單元仍保留并維持原值。實(shí)參加形參必須個(gè)數(shù)相同、類型一致!第16頁(yè)
8.3.2函數(shù)返回值
函數(shù)返回值是經(jīng)過(guò)函數(shù)調(diào)用使主調(diào)函數(shù)得到確實(shí)定值。比如:例8.2中,max(2,3)值是3,max(5,2)值是5。賦值語(yǔ)句將這個(gè)函數(shù)值賦給變量c。第17頁(yè)說(shuō)明:
(1)函數(shù)返回值是經(jīng)過(guò)函數(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);}第18頁(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ù)值為雙精度型
*/
注意:凡不加類型說(shuō)明函數(shù),自動(dòng)按整型處理。第19頁(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ù)為“無(wú)類型”(或稱“空類型”)。此時(shí)在函數(shù)體中不得出現(xiàn)return語(yǔ)句。
第20頁(yè)例8.3返回值類型與函數(shù)類型不一樣運(yùn)行情況以下:1.5,2.5↙
Maxis2
#include<stdio.h>voidmain(){intmax(floatx,floaty);/*對(duì)max函數(shù)申明*/floata,b;intc;scanf("%f,%f",&a,&b);c=max(a,b);printf("Maxis%d",c);}intmax(floatx,floaty)/*定義有參函數(shù)max*/{floatz;z=x>y?x:y;return(z);}第21頁(yè)
8.4函數(shù)調(diào)用
8.4.1函數(shù)調(diào)用普通形式函數(shù)調(diào)用普通形式為:
函數(shù)名(實(shí)參表列)說(shuō)明:(1)假如是調(diào)用無(wú)參函數(shù),則“實(shí)參表列”能夠沒(méi)有,但括弧不能省略。第22頁(yè)(3)假如實(shí)參表列包含多個(gè)實(shí)參,對(duì)實(shí)參求值次序并不是確定,有系統(tǒng)按自左至右次序求實(shí)參值,有系統(tǒng)則按自右至左次序。(2)假如實(shí)參表列包含多個(gè)實(shí)參,則各參數(shù)間用逗號(hào)隔開。實(shí)參加形參個(gè)數(shù)應(yīng)相等,類型應(yīng)匹配。實(shí)參加形參按次序?qū)?yīng),一一傳遞數(shù)據(jù)。第23頁(yè)例8.4實(shí)參求值次序
#include<stdio.h>voidmain(){intf(inta,intb);/*函數(shù)申明*/inti=2,p;p=f(i,++i);/*函數(shù)調(diào)用*/printf("%d\n",p);}intf(inta,intb)/*函數(shù)定義*/{intc;if(a>b)c=1;elseif(a==b)c=0;elsec=-1;return(c);}結(jié)果:0第24頁(yè)假如按自左至右次序求實(shí)參值,則函數(shù)調(diào)用相當(dāng)于f(2,3)
假如按自右至左次序求實(shí)參值,則函數(shù)調(diào)用相當(dāng)于f(3,3)
對(duì)于函數(shù)調(diào)用
inti=2,p;p=f(i,++i);看書page162第25頁(yè)
8.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)位置來(lái)分,能夠有以下三種函數(shù)調(diào)用方式:
第26頁(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三者中最大者。第27頁(yè)8.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ù))。但光有這一條件還不夠。2.假如使用庫(kù)函數(shù),還應(yīng)該在本文件開頭用#include命令將調(diào)用相關(guān)庫(kù)函數(shù)時(shí)所需用到信息“包含”到本文件中來(lái)。
3.假如使用用戶自己定義函數(shù),而該函數(shù)位置在調(diào)用它函數(shù)(即主調(diào)函數(shù))后面,應(yīng)該在主調(diào)函數(shù)中對(duì)被調(diào)用函數(shù)作申明。第28頁(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)。第29頁(yè)注意:
函數(shù)“定義”和“申明”區(qū)分:函數(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)。
第30頁(yè)例8.5對(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);}第31頁(yè)例8.5對(duì)被調(diào)用函數(shù)作聲明#include<stdio.h>floatadd(floatx,floaty)/*函數(shù)首部*/{floatz;/*函數(shù)體*/z=x+y;return(z);}voidmain(){floata,b,c;scanf("%f,%f",&a,&b);c=add(a,b);printf("sumis%f\n",c);}看書page165~167什么情況下可省略函數(shù)申明!第32頁(yè)
8.5函數(shù)嵌套調(diào)用嵌套調(diào)用就是在調(diào)用一個(gè)函數(shù)時(shí),其函數(shù)體內(nèi)又包含對(duì)另一個(gè)函數(shù)調(diào)用。第33頁(yè)函數(shù)嵌套調(diào)用#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ù)*/}voidprintstar()/*定義printstar函數(shù)*/{printf("****************\n");}voidprint_message()/*定義print_message函數(shù)*/{printf("Howdoyoudo!\n");printstar();/*調(diào)用printstar函數(shù)*/}第34頁(yè)例8.6用弦截法求方程f(x)=x3-5x2+16x-80=0根
第35頁(yè)1.取兩個(gè)不一樣點(diǎn)x1,x2,假如f(x1)和f(x2)符號(hào)相反,則(x1,x2)區(qū)間內(nèi)必有一個(gè)根。假如f(x1)與f(x2)同符號(hào),則應(yīng)改變x1,x2,直到f(x1)、f(x2)異號(hào)為止。注意x1、x2值不應(yīng)差太大,以確保(x1,x2)區(qū)間內(nèi)只有一個(gè)根。
2.連接(x1,f(x1))和(x2,f(x2))兩點(diǎn),此線(即弦)交x軸于x。方法:第36頁(yè)3.若f(x)與f(x1)同符號(hào),則根必在(x,x2)區(qū)間內(nèi),此時(shí)將x作為新x1。假如f(x)與f(x2)同符號(hào),則表示根在(x1,x)區(qū)間內(nèi),將x作為新x2。4.重復(fù)步驟(2)和(3),直到|f(x)|<ε為止,ε為一個(gè)很小數(shù),比如10-6\.此時(shí)認(rèn)為f(x)≈0。第37頁(yè)N-S流程圖
第38頁(yè)實(shí)現(xiàn)各部分功效幾個(gè)函數(shù):1.用函數(shù)f(x)代表x函數(shù):x3-5x2+16x-80。2.用函數(shù)調(diào)用xpoint(x1,x2)來(lái)求(x1,f(x1))和(x2,f(x2))連線與x軸交點(diǎn)x坐標(biāo)。3.用函數(shù)調(diào)用root(x1,x2)來(lái)求(x1,x2)區(qū)間那個(gè)實(shí)根。顯然,執(zhí)行root函數(shù)過(guò)程中要用到函數(shù)xpoint,而執(zhí)行xpoint函數(shù)過(guò)程中要用到f函數(shù)。第39頁(yè)#include<stdio.h>#include<math.h>floatf(floatx){floaty;y=((x-5.0)*x+16.0)*x-80.0;return(y);}floatxpoint(floatx1,floatx2){floaty;y=(x1*f(x2)-x2*f(x1))/(f(x2)-f(x1));return(y);}floatroot(floatx1,floatx2){floatx,y,y1;y1=f(x1);do{x=xpoint(x1,x2);y=f(x);if(y*y1>0) {y1=y; x1=x;}elsex2=x;}while(fabs(y)>=0.0001);return(x);}第40頁(yè)運(yùn)行情況以下:inputx1,x2:2,6Arootofequationis5.0000voidmain(){floatx1,x2,f1,f2,x;do{printf("inputx1,x2:\n");scanf("%f,%f",&x1,&x2);f1=f(x1);f2=f(x2);}while(f1*f2>=0);x=root(x1,x2);printf("Arootofequationis%8.4f\n",x);}第41頁(yè)第42頁(yè)函數(shù)遞歸調(diào)用是指,一個(gè)函數(shù)在它函數(shù)體,直接或間接地調(diào)用它本身。C語(yǔ)言特點(diǎn)之一就是允許函數(shù)遞歸調(diào)用。為了預(yù)防遞歸調(diào)用無(wú)終止地進(jìn)行,必須在函數(shù)內(nèi)有終止遞歸調(diào)用伎倆。慣用方法是加條件判斷,滿足某種條件后就不再作遞歸調(diào)用,然后逐層返回。
8.6函數(shù)遞歸調(diào)用
第43頁(yè)例8.7:有5個(gè)人坐在一起,問(wèn)第5個(gè)人多少歲?他說(shuō)比第4個(gè)人大2歲。問(wèn)第4個(gè)人歲數(shù),他說(shuō)比第3個(gè)人大2歲。問(wèn)第3個(gè)人,又說(shuō)比第2個(gè)人大2歲。問(wèn)第2個(gè)人,說(shuō)比第1個(gè)人大2歲。最終問(wèn)第1個(gè)人,他說(shuō)是10歲。請(qǐng)問(wèn)第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)=age(n-1)+2(n>1)第44頁(yè)能夠用一個(gè)函數(shù)來(lái)描述上述遞歸過(guò)程:運(yùn)行結(jié)果以下:18用一個(gè)主函數(shù)調(diào)用age函數(shù),求得第5人年紀(jì)。intage(intn)/*求年紀(jì)遞歸函數(shù)*/{intc;if(n==1)c=10;elsec=age(n-1)+2;return(c);}#include<stdio.h>voidmain(){printf("%d\n",age(5));}第45頁(yè)例8.8用遞歸方法求n!
求n!也能夠用遞歸方法,即5!等于4!×5,而4?。剑?!×4…1!=1??捎孟旅孢f歸公式表示:n!=1(n=0,1)n·(n-1)!(n>1)有效遞歸條件1、遞歸終止2、遞歸表示式第46頁(yè)#include<stdio.h>voidmain(){floatfac(intn);intn;floaty;printf("inputanintegernumber:");scanf("%d",&n);
y=fac(n);printf("%d!=%10.0f\n",n,y);}floatfac(intn)
{floatf;if(n<0)printf("dataerror!");elseif(n==0||n==1)f=1;elsef=fac(n-1)*n;return(f);}第47頁(yè)例8.9Hanoi(漢諾塔)問(wèn)題:用遞歸方法實(shí)現(xiàn)經(jīng)典范例第48頁(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座上。第49頁(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');}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);}第50頁(yè)運(yùn)行情況以下:inputthenumberofdiskes:3↙
Thestepstonoving3diskes:A-->CA-->BC-->BA-->CB-->AB-->CA-->C
第51頁(yè)
8.7數(shù)組作為函數(shù)參數(shù)1、數(shù)組元素作函數(shù)參數(shù):?jiǎn)蜗蛑祩鬟f2、數(shù)組名作為函數(shù)參數(shù):地址傳遞(雙向)3、多維數(shù)組名作為函數(shù)參數(shù)第52頁(yè)
8.7.1數(shù)組元素作函數(shù)實(shí)參
因?yàn)閷?shí)參能夠是表示式,而數(shù)組元素能夠是表示式組成部分,所以數(shù)組元素能夠作為函數(shù)實(shí)參,與用變量作實(shí)參一樣,是單向傳遞,即“值傳送”方式。
第53頁(yè)例8.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ù)。第54頁(yè)#include<stdio.h>voidmain(){intlarge(intx,inty);/*函數(shù)申明*/inta[10],b[10],i,n=0,m=0,k=0;printf("enterarraya∶\n");for(i=0;i<10;i++)scanf("%d",&a[i]);printf("\n");printf("enterarrayb∶\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;}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");}第55頁(yè)運(yùn)行情況以下:
enterarraya:
1357986420↙
enterarrayb∶
5389–1–35604↙
a[i]>b[i]4timesa[i]=b[i]1timesa[i]<b[i]5timesarrayaissmallerthannarrayblarge(intx,inty){intflag;if(x>y)flag=1;elseif(x<y)flag=-1;elseflag=0;return(flag);}第56頁(yè)
8.7.2數(shù)組名作函數(shù)參數(shù)
用數(shù)組名作函數(shù)參數(shù)時(shí),此時(shí)形參應(yīng)該用數(shù)組名或用指針變量。地址傳遞!例8.11有一個(gè)一維數(shù)組score,內(nèi)放10個(gè)學(xué)生成績(jī),求平均成績(jī)。第57頁(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);}floataverage(floatarray[10]){inti;floataver,sum=array[0];for(i=1;i<10;i++) sum=sum+array[i];aver=sum/10;return(aver);}第58頁(yè)例8.12形參數(shù)組不定義長(zhǎng)度#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));}floataverage(floatarray[],intn){inti;floataver,sum=array[0];for(i=1;i<n;i++) sum=sum+array[i];aver=sum/n;return(aver);}第59頁(yè)例8.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輪。第60頁(yè)程序:#include<stdio.h>voidmain(){voidsort(intarrar[],intn);inta[10],i;printf("enterthearray\n");for(i=0;i<10;i++) scanf("%d",&a[i]);sort(a,10);printf("thesortedarray∶\n");for(i=0;i<10;i++) printf("%5d",a[i]); printf("\n");}第61頁(yè)void
sort(intarray[],intn)/*排序函數(shù)*/{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;}}第62頁(yè)
8.7.3.多維數(shù)組名作函數(shù)參數(shù)例8.14一個(gè)3×4二維數(shù)組,求全部元素中最大值
用多維數(shù)組名作為函數(shù)實(shí)參和形參。在被調(diào)函數(shù)中對(duì)形參數(shù)組定義時(shí)能夠指定每一維大小。第63頁(yè)運(yùn)行結(jié)果以下:Maxvalueis34voidmain(){intmax_value(intarray[][4]);inta[3][4]={{1,3,5,7},{2,4,6,8},{15,17,34,12}};printf("maxvalueis%d\n",max_value(a));}intmax_value(intarray[][4]){inti,j,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);}第64頁(yè)變量作用域與存放方式作用域:作用范圍,有效范圍。局部變量全局變量外部變量extern說(shuō)明存放方式:在內(nèi)存中存放方式(auto、static、register、extern)靜態(tài)存放動(dòng)態(tài)存放第65頁(yè)
8.8局部變量和全局變量
8.8.1局部變量?jī)?nèi)部變量:在一個(gè)函數(shù)內(nèi)部定義變量稱內(nèi)部變量。它只在本函數(shù)范圍內(nèi)有效,即:只有在本函數(shù)內(nèi)才能使用這些變量,故稱為“局部變量”。第66頁(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有效*/}第67頁(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ǔ)句也稱為“分程序”或“程序塊”。第68頁(yè)voidmain(){inta,b;…{intc;c=a+b;c在此范圍內(nèi)有效a,b在此范圍內(nèi)有效…}…}
第69頁(yè)8.8.2全局變量外部變量:函數(shù)之外定義變量稱為外部變量。外部變量能夠?yàn)楸疚募衅渌瘮?shù)所共用。它有效范圍為從定義變量位置開始到根源文件結(jié)束。所以也稱全程變量。第70頁(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;…}
第71頁(yè)例8.15計(jì)算10個(gè)學(xué)生成績(jī)平均分、最高分和最低分。#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);}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);}第72頁(yè)運(yùn)行情況以下:9945789710067.589926643↙max=100.00min=43.00average=77.65
平均分:調(diào)用函數(shù)average()最高分、最低分:利用全局變量Max、Min第73頁(yè)第74頁(yè)提議:無(wú)須要時(shí)不要使用全局變量,原因以下:
1、全局變量在程序全部執(zhí)行過(guò)程中都占用存放單元,而不是僅在需要時(shí)才開辟單元。2、使用全局變量過(guò)多,會(huì)降低程序清楚性。在各個(gè)函數(shù)執(zhí)行時(shí)都可能改變外部變量值,程序輕易犯錯(cuò)。所以,要限制使用全局變量。3、使用全局變量過(guò)多,會(huì)降低函數(shù)通用性。第75頁(yè)例8.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
第76頁(yè)
8.9變量存放類別
8.9.1動(dòng)態(tài)存放方式與靜態(tài)存放方式
從變量作用域(即從空間)角度來(lái)分,能夠分為全局變量和局部變量。從變量值存在時(shí)間角度來(lái)分,又能夠分為靜態(tài)存放方式和動(dòng)態(tài)存放方式。靜態(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ū)第77頁(yè)變量和函數(shù)有兩個(gè)屬性:數(shù)據(jù)類型和數(shù)據(jù)存放類別。存放類別指是數(shù)據(jù)在內(nèi)存中存放方式。存放方式分為兩大類:靜態(tài)存放類和動(dòng)態(tài)存放類。包含:自動(dòng)(auto);靜態(tài)(static);存放器(register);外部(extern)。
依據(jù)變量存放類別,能夠知道變量作用域和生存期。
第78頁(yè)8.9.2auto變量自動(dòng)變量auto:默認(rèn)存放類別函數(shù)中形參和在函數(shù)中定義變量(包含在復(fù)合語(yǔ)句中定義變量),都屬這類。自動(dòng)變量用關(guān)鍵字auto作存放類別申明。比如:intf(inta)/*定義f函數(shù),a為形參*/{autointb,c=3;/*定義b、c為自動(dòng)變量*/…}第79頁(yè)8.9.3用static申明局部變量
當(dāng)函數(shù)中局部變量值在函數(shù)調(diào)用結(jié)束后不消失而保留原值時(shí),該變量稱為靜態(tài)局部變量。用關(guān)鍵字static進(jìn)行申明。第80頁(yè)例8.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);}輸出結(jié)果789第81頁(yè)對(duì)靜態(tài)局部變量說(shuō)明:(1)靜態(tài)局部變量屬于靜態(tài)存放類別,在靜態(tài)存放區(qū)內(nèi)分配存放單元。在程序整個(gè)運(yùn)行期間都不釋放。(2)對(duì)靜態(tài)局部變量是在編譯時(shí)賦初值,即只賦初值一次,在程序運(yùn)行時(shí)它已經(jīng)有初值。以后每次調(diào)用函數(shù)時(shí)不再重新賦初值而只是保留上次函數(shù)調(diào)用結(jié)束時(shí)值。第82頁(yè)(3)如在定義局部變量時(shí)不賦初值話,則對(duì)靜態(tài)局部變量來(lái)說(shuō),編譯時(shí)自動(dòng)賦初值0(對(duì)數(shù)值型變量)或空字符(對(duì)字符變量)。而對(duì)自動(dòng)變量來(lái)說(shuō),假如不賦初值則它值是一個(gè)不確定值。(4)即使靜態(tài)局部變量在函數(shù)調(diào)用結(jié)束后依然存在,但其它函數(shù)不能引用它。第83頁(yè)例8.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);}第84頁(yè)8.9.4register變量
變量值是存放在內(nèi)存中。當(dāng)程序中用到哪一個(gè)變量值時(shí),由控制器發(fā)出指令將內(nèi)存中該變量值送到運(yùn)算器中。經(jīng)過(guò)運(yùn)算器進(jìn)行運(yùn)算,假如需要存數(shù),再?gòu)倪\(yùn)算器將數(shù)據(jù)送到內(nèi)存存放。
第85頁(yè)
假如有一些變量使用頻繁,則為存取變量值要花費(fèi)不少時(shí)間。為提升執(zhí)行效率,C語(yǔ)言允許將局部變量值放在CPU中存放器中,需要用時(shí)直接從存放器取出參加運(yùn)算,無(wú)須再到內(nèi)存中去存取。因?yàn)閷?duì)存放器存取速度遠(yuǎn)高于對(duì)內(nèi)存存取速度,所以這么做能夠提升執(zhí)行效率。這種變量叫做存放器變量,用關(guān)鍵字register作申明。第86頁(yè)例8.19使用存放器變量#include<stdio.h>voidmain(){longfac(long);longi,n;scanf("%ld",&n);for(i=1;i<=n;i++)printf("%ld!=%ld\n",i,fac(i));}longfac(longn){registerlongi,f=1;/*定義存放器變量*/for(i=1;i<=n;i++)f=f*i;return(f);}看p192說(shuō)明第87頁(yè)8.9.5用extern申明外部變量
外部變量是在函數(shù)外部定義全局變量,它作用域是從變量定義處開始,到本程序文件末尾。在此作用域內(nèi),全局變量能夠?yàn)槌绦蛑懈鱾€(gè)函數(shù)所引用。編譯時(shí)將外部變量分配在靜態(tài)存放區(qū)。用extern來(lái)申明外部變量,以擴(kuò)展外部變量作用城。1、在一個(gè)文件內(nèi)申明外部變量2、在多文件程序中申明外部變量第88頁(yè)1.在一個(gè)文件內(nèi)申明外部變量例8.20用extern申明外部變量,擴(kuò)展它在程序文件中作用域#include<stdio.h>voidmain(){intmax(int,int);externA,B;/*外部變量申明*/printf("%d\n",max(A,B));}intA=13,B=-8;/*定義外部變量*/intmax(intx,inty)/*定義max函數(shù)*/{intz;z=x>y?x:y;return(z);}運(yùn)行結(jié)果13第89頁(yè)2.在多文件程序中申明外部變量例8.21用extern將外部變量作用域擴(kuò)展到其它文件。本程序作用是給定b值,輸入a和m,求a×b和am值。文件file1.c中內(nèi)容為:#include<stdio.h>intA;/*定義外部變量*/voidmain(){intpower(int);/*函數(shù)申明*/intb=3,c,d,m;printf("enterthenumberaanditspowerm:\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);}第90頁(yè)文件file2.c中內(nèi)容為:externA;/*申明A為一個(gè)已定義外部變量*/intpowre(intn){inti,y=1;for(i=1;i<=n;i++) y*=A;return(y);}第91頁(yè)8.9.6用static申明外部變量在程序設(shè)計(jì)中,一些外部變量只限于被本文件引用,而不能被其它文件引用。這時(shí)能夠在定義外部變量時(shí)加一個(gè)staitic申明。比如:file1.cfile2.cstaticintA;externintA;voidmain()voidfun(intn){{……A=A*n;}第92頁(yè)8.9.7關(guān)于變量申明和定義定義性申明:需要建立存放空間(如:inta;)申明。引用性申明:不需建立存放空間申明(externa;)。注意:申明包含定義,但并非全部申明都是定義。對(duì)“inta;”而言,它既是申明,又是定義。而對(duì)“externa;”而言,它是申明而不是定義。第93頁(yè)
8.9.8存放類別小結(jié)從作用域角度分,有局部變量和全局變量。它們采取存放類別以下:局部變量包含:自動(dòng)變量、靜態(tài)局部變量、存放器變量。形式參數(shù)能夠定義為自動(dòng)變量或存放器變量。全局變量包含:靜態(tài)外部變量、外部變量。第94頁(yè)(2)從變量存在時(shí)間來(lái)區(qū)分,有動(dòng)態(tài)存放和靜態(tài)存放兩種類型。靜態(tài)存放是程序整個(gè)運(yùn)行時(shí)間都存在,而動(dòng)態(tài)存放則是在調(diào)用函數(shù)時(shí)暫時(shí)分配單元。
動(dòng)態(tài)存放:自動(dòng)變量、存放器變量、形式參數(shù)。靜態(tài)存放:態(tài)局部變量、靜態(tài)外部變量、外部變量。第95頁(yè)(3)從變量值存放位置來(lái)區(qū)分,可分為:內(nèi)存中靜態(tài)存放區(qū):靜態(tài)局部變量、靜態(tài)外部變量、外部變量。內(nèi)存中動(dòng)態(tài)存放區(qū):自動(dòng)變量和形式參數(shù)。CPU中存放器:存放器變量。第96頁(yè)(4)static對(duì)局部變量和全局變量作用不一樣。對(duì)局部變量來(lái)說(shuō),它使變量由動(dòng)態(tài)存放方式改變?yōu)殪o態(tài)存放方式。而對(duì)全局變量來(lái)說(shuō),它使變量局部化,但仍為靜態(tài)存放方式。從作用域角度看,凡有static申明,其作用域都是局限,或者是局限于本函數(shù)內(nèi),或者局限于本文件內(nèi)。第97頁(yè)8.10內(nèi)部函數(shù)、外部函數(shù)內(nèi)部函數(shù):在一個(gè)源文件中定義函數(shù),只能被本文件中函數(shù)調(diào)用。外部函數(shù):在函數(shù)定義時(shí),若沒(méi)有加static,或冠以extern,表示是外部函數(shù)。系統(tǒng)函數(shù):#include<stdio.h>#include<math.h>第98頁(yè)內(nèi)部函數(shù)和外部函數(shù)
依據(jù)函數(shù)能否被其它源文件調(diào)用,將函數(shù)區(qū)分為內(nèi)部函數(shù)和外部函數(shù)。8.10.1內(nèi)部函數(shù)假如一個(gè)函數(shù)只能被本文件中其它函數(shù)所調(diào)用,它稱為內(nèi)部函數(shù)。在定義內(nèi)部函數(shù)時(shí),在函數(shù)名和函數(shù)類型前面加static。即static類型標(biāo)識(shí)符函數(shù)名(形參表)比如:staticintfun(inta,intb)第99頁(yè)8.10.2外部函數(shù)(1)定義函數(shù)時(shí),假如在函數(shù)首部最左端加關(guān)鍵字extern,則表示此函數(shù)是外部函數(shù),可供其它文件調(diào)用。比如,函數(shù)首部能夠?qū)憺閑xternintfun(inta,intb),這么,函數(shù)fun就能夠?yàn)槠渌募{(diào)用。假如在定義函數(shù)時(shí)省略extern,則隱含為外部函數(shù)。(2)在需要調(diào)用此函數(shù)文件中,用extern對(duì)函數(shù)作申明,表示該函數(shù)是在其它文件中定義外部函數(shù)。第100頁(yè)例8.22有一個(gè)若干字符字符串,今輸入一個(gè)字符,要求程序?qū)⒆址性撟址麆h去。用外部函數(shù)實(shí)現(xiàn)。File.c(文件1)#include<stdio.h>voidmain(){externvoidenter_string(charstr[]);externvoiddelete_string(charstr[],charch);externvoidprint_string(charstr[]);charc;charstr[80];printf("pleaseinputastring:");enter_string(str);printf("pleaseacharacterfordeleted:");scanf("%c",&c);delete_string(str,c);print_string(str);}第101頁(yè)file2.c(文件2)#include<stdio.h>#include<string.h>voidenter_string(charstr[]){gets(str);}file3.c(文件3)voiddelete_string(charstr[],charch){inti,j;for(i=j=0;str[i]!='\0';i++) if(str[i]!=ch) str[j++]=str[i];str[j]='\0';}第102頁(yè)file4.c(文件4)#include<stdio.h>voidprint_string(charstr[]){printf("%s\
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年大學(xué)建筑構(gòu)造(理論應(yīng)用)試題及答案
- 2025年中職醫(yī)療器械維護(hù)與管理(設(shè)備性能測(cè)試)試題及答案
- 2025年中職第一學(xué)年(商務(wù)禮儀)職場(chǎng)禮儀規(guī)范階段測(cè)試題及答案
- 2025年高職地理(自然地理應(yīng)用)試題及答案
- 2025年中職(口腔醫(yī)學(xué)技術(shù))口腔修復(fù)材料專業(yè)技能測(cè)試試題及答案
- 金融產(chǎn)品借貸話術(shù)
- 肥胖與心血管疾病共識(shí)解讀總結(jié)2026
- 2025四川瀘州市龍馬高中學(xué)校面向社會(huì)招聘?jìng)淇碱}庫(kù)及答案詳解1套
- 2025南平建陽(yáng)法院招聘信息技術(shù)人員1名備考題庫(kù)及答案詳解一套
- 【試卷】廣東省潮州市饒平縣2025-2026學(xué)年七年級(jí)上學(xué)期期末質(zhì)量檢測(cè)地理試題
- 北師大版八年級(jí)數(shù)學(xué)下冊(cè)課件【全冊(cè)】
- 關(guān)于提高護(hù)士輸液時(shí)PDA的掃描率的品管圈PPT
- GB/T 30564-2023無(wú)損檢測(cè)無(wú)損檢測(cè)人員培訓(xùn)機(jī)構(gòu)
- 中華人民共和國(guó)汽車行業(yè)標(biāo)準(zhǔn)汽車油漆涂層QC-T484-1999
- XGDT-06型脈動(dòng)真空滅菌柜4#性能確認(rèn)方案
- GB/T 96.2-2002大墊圈C級(jí)
- 第九章-第一節(jié)-美洲概述
- GB/T 13004-2016鋼質(zhì)無(wú)縫氣瓶定期檢驗(yàn)與評(píng)定
- GB/T 12060.5-2011聲系統(tǒng)設(shè)備第5部分:揚(yáng)聲器主要性能測(cè)試方法
- GB/T 11945-2019蒸壓灰砂實(shí)心磚和實(shí)心砌塊
- 下肢深靜脈血栓形成的診斷和治療課件
評(píng)論
0/150
提交評(píng)論