7.C語言函數(shù)省公開課一等獎全國示范課微課金獎?wù)n件_第1頁
7.C語言函數(shù)省公開課一等獎全國示范課微課金獎?wù)n件_第2頁
7.C語言函數(shù)省公開課一等獎全國示范課微課金獎?wù)n件_第3頁
7.C語言函數(shù)省公開課一等獎全國示范課微課金獎?wù)n件_第4頁
7.C語言函數(shù)省公開課一等獎全國示范課微課金獎?wù)n件_第5頁
已閱讀5頁,還剩61頁未讀, 繼續(xù)免費(fèi)閱讀

付費(fèi)下載

下載本文檔

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

文檔簡介

第七章函數(shù)第1頁函數(shù)是什么?經(jīng)過學(xué)習(xí)前幾章,我們已經(jīng)能夠編寫一些簡單C程序了,但是假如程序功效比較多,規(guī)模比較大,把全部程序代碼都寫在一個主函數(shù)中,就會使主函數(shù)變得龐雜、頭緒不清,使閱讀和維護(hù)程序變得困難。另外,有時程序中要屢次實(shí)現(xiàn)某一功能,就需要屢次重復(fù)編寫實(shí)現(xiàn)此功效程序代碼,這會使程序冗長,不精練。所以,人們自然會想到采取“組裝”方法來簡化程序設(shè)計過程。如同組裝計算機(jī)一樣,事先生產(chǎn)好各種部件,在最終組裝計算機(jī)時,用到什么就從倉庫里取出什么,直接裝上就能夠了。人們決不會采取手工業(yè)方式,在用到電源時暫時去生產(chǎn)一個電源,用到主板時暫時生產(chǎn)一個主板。這就是模塊化程序設(shè)計。第2頁7.1概述模塊化程序設(shè)計基本思想:將一個大程序按功效分割成一些小模塊,特點(diǎn):各模塊相對獨(dú)立、功效單一、結(jié)構(gòu)清楚控制了程序設(shè)計復(fù)雜性防止程序開發(fā)重復(fù)勞動易于維護(hù)和功效擴(kuò)充開發(fā)方法:自上向下,逐步分解,分而治之第3頁C是模塊化程序設(shè)計語言C程序結(jié)構(gòu)第4頁例先舉一個函數(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ù)*/}第5頁voidprintstar()/*定義printstar函數(shù)*/{printf("****************\n");}voidprint_message()/*定義print_message函數(shù)*/{printf("Howdoyoudo!\n");}運(yùn)行情況以下:****************Howdoyoudo!****************第6頁

說明:

(1)一個C程序由一個或多個程序模塊組成,每一個程序模塊作為一個源程序文件。對于較大程序,通常將程序內(nèi)容分別放在若干個源文件中,再由若干源程序文件組成一個C程序。這么便于分別編寫、分別編譯,提高調(diào)試效率。一個源程序文件能夠?yàn)槎鄠€C程序公用。(2)一個源程序文件由一個或多個函數(shù)以及其它相關(guān)內(nèi)容(如命令行、數(shù)據(jù)定義等)組成。一個源程序文件是一個編譯單位,在程序編譯時是以源程序文件為單位進(jìn)行編譯,而不是以函數(shù)為單位進(jìn)行編譯。第7頁(3)C程序執(zhí)行是從main函數(shù)開始,假如在main函數(shù)中調(diào)用其它函數(shù),在調(diào)用后流程返回到main函數(shù),在main函數(shù)中結(jié)束整個程序運(yùn)行。(4)全部函數(shù)都是平行,即在定義函數(shù)時是分別進(jìn)行,是相互獨(dú)立。一個函數(shù)并不隸屬于另一函數(shù),即函數(shù)不能嵌套定義。函數(shù)間能夠相互調(diào)用,但不能調(diào)用main函數(shù)。main函數(shù)是系統(tǒng)調(diào)用。第8頁(5)從用戶使用角度看,函數(shù)有兩種:①

標(biāo)準(zhǔn)函數(shù),即庫函數(shù)。這是由系統(tǒng)提供,用戶無須自己定義這些函數(shù),能夠直接使用它們。不一樣C系統(tǒng)提供庫函數(shù)數(shù)量和功效會有一些不一樣,但許多基本函數(shù)是共同。②

用戶自己定義函數(shù)。用以處理用戶專門需要。

第9頁(6)從函數(shù)形式看,函數(shù)分兩類:①無參函數(shù)。無參函數(shù)普通用來執(zhí)行指定一組操作。在調(diào)用無參函數(shù)時,主調(diào)函數(shù)不向被調(diào)用函數(shù)傳遞數(shù)據(jù)。②有參函數(shù)。主調(diào)函數(shù)在調(diào)用被調(diào)用函數(shù)時,經(jīng)過參數(shù)向被調(diào)用函數(shù)傳遞數(shù)據(jù)。

第10頁7.2函數(shù)定義普通格式正當(dāng)標(biāo)識符函數(shù)返回值類型缺省int型無返回值void函數(shù)體函數(shù)類型函數(shù)名(形參類型說明表){ 說明部分 語句部分}當(dāng)代格調(diào):例有參函數(shù)(當(dāng)代格調(diào))intmax(intx,inty){intz;z=x>y?x:y;return(z);}例有參函數(shù)(當(dāng)代格調(diào))intmax(intx,y){intz;z=x>y?x:y;return(z);}例空函數(shù)dummy(){}函數(shù)體為空例無參函數(shù)voidprintstar(){printf(“**********\n”);}第11頁函數(shù)類型函數(shù)名(形參表)形參類型說明{ 說明部分 語句部分}傳統(tǒng)格調(diào):例有參函數(shù)(傳統(tǒng)格調(diào))intmax(x,y)

intx,y;{intz;z=x>y?x:y;return(z);}第12頁定義函數(shù)應(yīng)包含以下幾個方面內(nèi)容:指定函數(shù)名字,方便以后按名調(diào)用。指定函數(shù)類型,即函數(shù)返回值類型。指定函數(shù)參數(shù)名字和類型,方便在調(diào)用函數(shù)時向它們傳遞數(shù)據(jù)。對無參函數(shù)不需要這項。指定函數(shù)應(yīng)該完成什么操作,也就是函數(shù)是做什么,即函數(shù)功效。對于C編譯系統(tǒng)提供庫函數(shù),是由編譯系統(tǒng)事先定義好,對它們定義已放在相關(guān)頭文件中。程序設(shè)計者無須自己定義,只需用#include命令把相關(guān)頭文件包含在本文件模塊中即可。第13頁7.3函數(shù)參數(shù)及其傳遞方式形參加實(shí)參形式參數(shù):定義函數(shù)時函數(shù)名后面括號中參數(shù)實(shí)際參數(shù):調(diào)用函數(shù)時函數(shù)名后面括號中參數(shù)c=max(a,b);(main函數(shù))(max函數(shù))max(intx,inty){intz;z=x>y?x:y;return(z);}例比較兩個數(shù)并輸出大者#include"stdio.h"voidmain(){intmax(intx,inty);inta,b,c;scanf("%d,%d",&a,&b);c=max(a,b);printf("Maxis%d",c);}intmax(intx,inty){intz;z=x>y?x:y;return(z);}形參實(shí)參第14頁說明:實(shí)參必須有確定值,形參必須指定類型實(shí)參個數(shù)和類型應(yīng)與形參個數(shù)和類型按定義時次序完全一致。形參在函數(shù)被調(diào)用前不占內(nèi)存;函數(shù)調(diào)用時為形參分配內(nèi)存;調(diào)用結(jié)束,內(nèi)存釋放7.3函數(shù)參數(shù)及其傳遞方式形參加實(shí)參形式參數(shù):定義函數(shù)時函數(shù)名后面括號中變量名實(shí)際參數(shù):調(diào)用函數(shù)時函數(shù)名后面括號中表示式第15頁例計算x立方(7-1.c)#include<stdio.h>floatcube(floatx){return(x*x*x);}voidmain(){floata,product;printf("Pleaseinputvalueofa:");scanf("%f",&a);product=cube(a);printf(”Cubeof%.4fis%.4f\n",a,product);}xaproduct××××1.21.21.728運(yùn)行結(jié)果:Pleaseinputvalueofa:1.2Cubeof1.is1.7280第16頁參數(shù)傳遞方式值傳遞方式方式:函數(shù)調(diào)用時,為形參分配單元,并將實(shí)參值復(fù)制到形參中;調(diào)用結(jié)束,形參單元被釋放,實(shí)參單元仍保留并維持原值特點(diǎn):形參加實(shí)參占用不一樣內(nèi)存單元單向傳遞第17頁例交換兩個數(shù)(7-2.c)#include<stdio.h>voidswap(intx,inty);voidmain(){inta=5,b=9;printf(“a=%d,b=%d\n",a,b);

swap(a,b);printf(“a=%d,b=%d\n",a,b);}voidswap(int

x,inty){intt;t=x;x=y;y=t;}59a:b:調(diào)用前:調(diào)用結(jié)束:59a:b:調(diào)用:59x:y:59a:b:swap:95x:y:5t第18頁地址傳遞方式:函數(shù)調(diào)用時,將數(shù)據(jù)存放地址作為參數(shù)傳遞給形參特點(diǎn):形參加實(shí)參占用一樣存放單元“雙向”傳遞實(shí)參和形參必須是地址常量或變量第19頁7.4函數(shù)返回值返回語句形式:return(表示式);

或return表示式;功效:使程序控制從被調(diào)用函數(shù)返回到調(diào)用函數(shù)中,同時把返回值帶給調(diào)用函數(shù)說明:函數(shù)中可有多個return語句若無return語句,遇}時,自動返回調(diào)用函數(shù)若函數(shù)類型與return語句中表示式值類型不一致,按前者為準(zhǔn),自動轉(zhuǎn)換第20頁例有多個返回值函數(shù)(7-3.c)#include"stdio.h“stog(ints){if(s>94)return(‘A’);elseif(s>84)return(‘B’);elseif(s>69)return(‘C’);elseif(s>59)return(‘D’);elsereturn(‘E’);}voidmain(){intscore=85;chargrade;

grade=stog(score);printf(“score%disgrade%c\n",score,grade);}運(yùn)行結(jié)果:Score85isgradeB第21頁例函數(shù)返回值類型轉(zhuǎn)換(7-4.c)#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=x>y?x:y;

return(z);}例無返回值函數(shù)

voidswap(intx,inty){inttemp;temp=x;x=y;y=temp;}運(yùn)行結(jié)果:1.2,5.6Maxis5第22頁7.5函數(shù)調(diào)用方式1.函數(shù)語句把函數(shù)調(diào)用作為一個語句。如print_star();這時不要求函數(shù)帶回值,只要求函數(shù)完成一定操作。2.函數(shù)表示式函數(shù)出現(xiàn)在一個表示式中,這種表示式稱為函數(shù)表示式。這時要求函數(shù)帶回一個確定值以參加表示式運(yùn)算。比如:c=2*max(a,b);

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

第23頁3.函數(shù)參數(shù)函數(shù)調(diào)用作為一個函數(shù)實(shí)參。比如:printf(“%d”,max(a,b));把max(a,b)作為printf函數(shù)一個參數(shù)。第24頁例(7-5.c)#include"stdio.h“intsquare(intx){

return(x*x);}voidmain(){inti=2;while(i<256)printf("%d\n",i=square(i));}運(yùn)行結(jié)果:416256第25頁對被調(diào)用函數(shù)申明和函數(shù)原型在一個函數(shù)中調(diào)用另一函數(shù)(即被調(diào)用函數(shù))需要具備哪些條件呢?1.首先被調(diào)用函數(shù)必須是已經(jīng)存在函數(shù)(是庫函數(shù)或用戶自己定義函數(shù))。但光有這一條件還不夠。第26頁3.假如使用用戶自己定義函數(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ù)時所需用到信息“包含”到本文件中來。第27頁例對被調(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){floatz;z=x+y;return(z);}第28頁能夠看到,對函數(shù)申明與函數(shù)定義中第1行(函數(shù)首部)基本上是相同,只差一個分號。所以能夠簡單照著寫已定義函數(shù)首部,再加一個分號,就成為對函數(shù)“申明”。因?yàn)楹瘮?shù)申明與函數(shù)首部一致,故把函數(shù)申明稱為函數(shù)原型。第29頁函數(shù)原型普通形式為:函數(shù)類型函數(shù)名(參數(shù)類型1,參數(shù)類型2……);intmax(int,int);2.函數(shù)類型函數(shù)名(參數(shù)類型1,參數(shù)名1,參數(shù)類型2,參數(shù)名2……);

intmax(intx,inty);申明作用是把函數(shù)名、函數(shù)參數(shù)個數(shù)和參數(shù)類型等信息通知編譯系統(tǒng),方便在碰到函數(shù)調(diào)用時,編譯系統(tǒng)能正確識別函數(shù)并檢驗(yàn)調(diào)用是否正當(dāng)。第30頁注意:

函數(shù)“定義”和“申明”區(qū)分:函數(shù)定義是指對函數(shù)功效確實(shí)立,包含指定函數(shù)名,函數(shù)值類型、形參及其類型、函數(shù)體等,它是一個完整、獨(dú)立函數(shù)單位。函數(shù)申明作用則是把函數(shù)名字、函數(shù)類型以及形參類型、個數(shù)和次序通知編譯系統(tǒng),方便在調(diào)用該函數(shù)時系統(tǒng)按此進(jìn)行對照檢驗(yàn)。第31頁以下情況下,可不作函數(shù)申明1.假如被調(diào)用函數(shù)定義出現(xiàn)在主調(diào)函數(shù)之前,能夠無須申明。因?yàn)榫幾g系統(tǒng)已經(jīng)先知道了已定義函數(shù)相關(guān)情況,會依據(jù)函數(shù)首部提供信息對函數(shù)調(diào)用做正確性檢驗(yàn)。2.假如已在文件開頭(在全部函數(shù)之前),已對本文件中所調(diào)用全部函數(shù)進(jìn)行了申明,編譯系統(tǒng)已知道了被調(diào)用函數(shù)相關(guān)情況,所以無須在各函數(shù)中對其所調(diào)用函數(shù)再作申明。第32頁例函數(shù)申明舉例#include"stdio.h"floatadd(floatx,floaty){floatz;z=x+y;return(z);}voidmain(){floata,b,c;scanf("%f,%f",&a,&b);c=add(a,b);printf("sumis%f",c);}被調(diào)函數(shù)定義出現(xiàn)在主調(diào)函數(shù)之前,無須函數(shù)申明#include“stdio.h”voidmain(){floatadd(floatx,floaty);/*函數(shù)申明*/floata,b,c;scanf("%f,%f",&a,&b);c=add(a,b);printf("sumis%f",c);}floatadd(floatx,floaty){floatz;z=x+y;return(z);}floatadd();#include“stdio.h”floatadd(floatx,floaty);/*函數(shù)申明*/voidmain(){floata,b,c;scanf("%f,%f",&a,&b);c=add(a,b);printf("sumis%f",c);}floatadd(floatx,floaty){floatz;z=x+y;return(z);}在文件開頭已對本文件中所調(diào)用全部函數(shù)進(jìn)行了申明第33頁數(shù)組名作函數(shù)參數(shù)——地址傳遞因?yàn)閿?shù)組名代表數(shù)組首地址,只是將數(shù)組首元素地址傳遞給所對應(yīng)形參,對應(yīng)形參應(yīng)該是數(shù)組名或指針變量。7.6數(shù)組作為函數(shù)參數(shù)數(shù)組元素作函數(shù)實(shí)參——值傳遞因?yàn)閷?shí)參能夠是表示式,而數(shù)組元素能夠是表示式組成部分,所以數(shù)組元素能夠作為函數(shù)實(shí)參,與用變量作實(shí)參一樣,是單向傳遞,即“值傳送”方式。第34頁例數(shù)組元素與數(shù)組名作函數(shù)參數(shù)比較12a調(diào)用前a[0]a[1]12a調(diào)用a[0]a[1]12xy21xy交換12a返回#include<stdio.h>/*7-6.c*/voidswap2(intx,inty){intz;z=x;x=y;y=z;}main(){inta[2]={1,2};

swap2(a[0],a[1]);printf("a[0]=%d\na[1]=%d\n",a[0],a[1]);}值傳遞第35頁12a調(diào)用前12ax調(diào)用21ax交換21a返回#include<stdio.h>/*7-7.c*/voidswap2(intx[])/*C對形參數(shù)組大小不做檢驗(yàn)*/{intz;z=x[0];x[0]=x[1];x[1]=z;}main(){inta[2]={1,2};

swap2(a);printf("a[0]=%d\na[1]=%d\n",a[0],a[1]);}地址傳遞例數(shù)組元素與數(shù)組名作函數(shù)參數(shù)比較用數(shù)組名作函數(shù)實(shí)參時,不是把數(shù)組元素值傳遞給形參,而是把實(shí)參數(shù)組首元素地址傳遞給形參數(shù)組,這么實(shí)參數(shù)組和形參數(shù)組就共占同一段內(nèi)存單元。第36頁7.7函數(shù)嵌套與遞歸調(diào)用嵌套調(diào)用:在調(diào)用一個函數(shù)過程中調(diào)用另一個函數(shù)main()調(diào)用函數(shù)a結(jié)束a函數(shù)b函數(shù)調(diào)用函數(shù)b

第37頁例求三個數(shù)中最大數(shù)和最小數(shù)差值(7-8.c)#include<stdio.h>

intdif(intx,inty,intz);intmax(intx,inty,intz);intmin(intx,inty,intz);voidmain(){inta,b,c,d;scanf("%d%d%d",&a,&b,&c);

d=dif(a,b,c);printf("Max-Min=%d\n",d);}intdif(intx,inty,intz){returnmax(x,y,z)-min(x,y,z);}intmax(intx,inty,intz){intr;r=x>y?x:y;return(r>z?r:z);}intmin(intx,inty,intz){intr;r=x<y?x:y;return(r<z?r:z);}main()調(diào)用函數(shù)dif輸出結(jié)束dif函數(shù)max函數(shù)調(diào)用函數(shù)max調(diào)用函數(shù)minmin函數(shù)第38頁遞歸調(diào)用定義:函數(shù)直接或間接調(diào)用本身叫函數(shù)遞歸調(diào)用intf(intx){inty,z;……

z=f(y);…….return(2*z);}f()調(diào)ff1()調(diào)f2f2()調(diào)f1在調(diào)用f函數(shù)過程中,又調(diào)用f函數(shù),稱直接調(diào)用本函數(shù)。假如在調(diào)用f1函數(shù)過程中要調(diào)用f2函數(shù),而在調(diào)用f2過程中又要調(diào)用f1函數(shù),稱間接調(diào)用本函數(shù)。第39頁例:有5個人坐在一起,問第5個人多少歲?他說比第4個人大2歲。問第4個人歲數(shù),他說比第3個人大2歲。問第3個人,又說比第2個人大2歲。問第2個人,說比第1個人大2歲。最終問第1個人,他說是10歲。請問第5個人多大。

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)第40頁能夠用一個函數(shù)來描述上述遞歸過程:intage(intn)/*求年紀(jì)遞歸函數(shù)*/{intc;/*c用作存放函數(shù)返回值變量*/if(n==1)c=10;elsec=age(n-1)+2;return(c);}運(yùn)行結(jié)果以下:18用一個主函數(shù)調(diào)用age函數(shù),求得第5人年紀(jì)。#include<stdio.h>voidmain(){printf(″%d″,age(5));}第41頁例分別用遞推方法和遞歸方法求n!1.用遞推方法求n!#include<stdio.h>voidmain(){longfac(intn);intn;longfact=0;printf(“inputaintegernumber:”);scanf(“%d”,&n);fact=fac(n);printf(“%d!=%ld\n”,n,fact);}longfac(intn){inti;longfac=1;for(i=1;i<=n;i++)fac=fac*i;returnfac;}運(yùn)行結(jié)果為:inputaintegernumber:55!is120變量fac取上次運(yùn)行后值,并沒調(diào)用函數(shù)。i=1,fac=1*1=1i=2,fac=1*2=2i=3,fac=2*3=6i=4,fac=6*4=24i=5,fac=24*5=120遞推基本思想:從已知初始條件出發(fā),逐次推出所要求各中間結(jié)果和最終結(jié)果。第42頁例分別用遞推方法和遞歸方法求n!1.用遞歸方法求n!#include<stdio.h>voidmain(){longfac(intn);intn,y;printf(“inputaintegernumber:”);scanf(“%d”,&n);y=fac(n);printf(“%d!=%ld\n”,n,y);}longfac(intn){longf;if(n<0)printf(“n<0,dataerror!”);elseif(n==0||n==1)f=1;elsef=fac(n-1)*n;return(f);}運(yùn)行結(jié)果為:inputaintegernumber:55!is120遞歸基本思想:將一個復(fù)雜問題歸結(jié)為若干個較簡單問題,然后將這些較簡單每一個問題再歸結(jié)為更簡單問題,這個過程能夠一直做下去,直到最簡單問題為止。第43頁7.8變量存放屬性概述變量是對程序中數(shù)據(jù)存放空間抽象內(nèi)存…….main(){inta;a=10;printf(“%d”,a);}編譯或函數(shù)調(diào)用時為其分配內(nèi)存單元10程序中使用變量名對內(nèi)存操作第44頁變量屬性操作屬性:變量所持有數(shù)據(jù)性質(zhì)(數(shù)據(jù)類型)存放屬性:生存期:變量在某一時刻存在作用域:變量在某區(qū)域內(nèi)有效變量定義格式:[存放類型]數(shù)據(jù)類型變量表;7.8變量存放屬性概述變量是對程序中數(shù)據(jù)存放空間抽象如:intsum;

autointa,b,c;staticfloatx,y;第45頁變量:局部變量動態(tài)變量(自動變量)靜態(tài)變量

全局變量動態(tài)變量(auto變量):在調(diào)用該函數(shù)時,系統(tǒng)給這些變量分配存放空間,函數(shù)調(diào)用結(jié)束時就自動釋放這些空間。函數(shù)中大多數(shù)變量屬于自動變量。靜態(tài)變量(static變量):在程序運(yùn)行期間分配存放空間,在程序運(yùn)行期間不釋放。即函數(shù)調(diào)用結(jié)束后不消失而繼續(xù)保留原值,在下次調(diào)用時仍是上一次調(diào)用結(jié)束時值。第46頁局部變量與全局變量局部變量(內(nèi)部變量)定義:在函數(shù)內(nèi)定義,只在本函數(shù)內(nèi)有效說明:main中定義變量只在main中有效不一樣函數(shù)中同名變量,占不一樣內(nèi)存單元形參屬于局部變量可定義在復(fù)合語句中有效變量局部變量可用存放類型:autostatic(默認(rèn)為auto)floatf1(inta){intb,c;…….}charf2(intx,inty){inti,j;……}main(){intm,n;…….}a,b,c有效x,y,i,j有效m,n有效第47頁運(yùn)行結(jié)果:54321例復(fù)合語句中變量#defineN5main(){inti;inta[N]={1,2,3,4,5};for(i=0;i<N/2;i++)

{

inttemp; temp=a[i]; a[i]=a[N-i-1]; a[N-i-1]=temp;

}for(i=0;i<N;i++)printf("%d",a[i]);}局部動態(tài)變量第48頁例不一樣函數(shù)中同名變量main(){inta,b;a=3;b=4;printf("main:a=%d,b=%d\n",a,b);sub();printf("main:a=%d,b=%d\n",a,b);}sub(){inta,b;a=6;b=7;printf("sub:a=%d,b=%d\n",a,b);}運(yùn)行結(jié)果:main:a=3,b=4sub:a=6,b=7main:a=3,b=4局部動態(tài)變量第49頁例用靜態(tài)變量編程計算1到5階乘值(7-9.c)#include"stdio.h"intfac(intn){staticintf=1;f=f*n;returnf;}voidmain(){inti;for(i=1;i<=5;i++)printf("%d!=%d",i,fac(i));}局部靜態(tài)變量運(yùn)行結(jié)果:1!=12!=23!=64!=245!=120第50頁對靜態(tài)局部變量說明:

(1)靜態(tài)局部變量屬于靜態(tài)存放類別,在靜態(tài)存放區(qū)內(nèi)分配存放單元,在程序整個運(yùn)行期間都不釋放。而動態(tài)局部變量屬于動態(tài)存放類別,占動態(tài)存放區(qū)空間而不占靜態(tài)存放區(qū)空間,函數(shù)調(diào)用結(jié)束后即釋放。(2)對靜態(tài)局部變量是在編譯時賦初值,即只賦初值一次,在程序運(yùn)行時它已經(jīng)有初值,以后每次調(diào)用函數(shù)時不再重新賦初值而只是保留上次函數(shù)調(diào)用結(jié)束時值。而對自動變量賦初值,不是在編譯時進(jìn)行,而是在函數(shù)調(diào)用時進(jìn)行,每調(diào)用一次函數(shù)重新給一次初值,相當(dāng)于執(zhí)行一次賦值語句。第51頁(3)如在定義局部變量時不賦初值話,則對靜態(tài)局部變量來說,編譯時自動賦初值0(對數(shù)值型變量)或空字符(對字符變量)。而對自動變量來說,假如不賦初值則它值是一個不確定值。(4)即使靜態(tài)局部變量在函數(shù)調(diào)用結(jié)束后依然存在,但其它函數(shù)是不能引用它,因?yàn)樗蔷植孔兞浚荒鼙槐竞瘮?shù)引用,而不能被其它函數(shù)引用。(5)用靜態(tài)存放會多占內(nèi)存,降低程序可讀性,當(dāng)調(diào)用次數(shù)多時往往弄不清靜態(tài)局部變量當(dāng)前值是什么。

所以,若非必要,不要多用靜態(tài)局部變量。第52頁全局變量(外部變量)定義:在函數(shù)外定義,可為本文件全部函數(shù)共用有效范圍:從定義變量位置開始到根源文件結(jié)束外部變量說明:extern數(shù)據(jù)類型變量表;若外部變量與局部變量同名,則外部變量被屏蔽即它不起作用,此時局部變量是有效。外部變量可用存放類型:全局變量采取靜態(tài)存放方式,即缺省或static第53頁#include<stdio.h>floatmax,min;floataverage(floatarray[],intn){inti;floatsum=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+=array[i];}return(sum/n);}main(){inti;floatave,score[10];ave=average(score,10);printf("max=%6.2f\nmin=%6.2f\naverage=%6.2f\n",max,min,ave);}作用域maxmin第54頁提議:無須要時不要使用全局變量,原因以下:

①全局變量在程序全部執(zhí)行過程中都占用存放單元,而不是僅在需要時才開辟單元。②使用全局變量過多,會降低程序清楚性。在各個函數(shù)執(zhí)行時都可能改變外部變量值,程序輕易犯錯。所以,要限制使用全局變量。第55頁③降低函數(shù)通用性。因?yàn)楹瘮?shù)在執(zhí)行時要依賴于其所在外部變量。假如將一個函數(shù)移到另一個文件中,還要將相關(guān)外部變量及其值一起移過去。但若該外部變量與其它文件變量同名時,就會出現(xiàn)問題,降低了程序可靠性和通用性。普通要求把C程序中函數(shù)做成一個封閉體,除了能夠經(jīng)過“實(shí)參——形參”渠道與外界發(fā)生聯(lián)絡(luò)外,沒有其它渠道。第56頁例文件file1.cinta;main(){…….…….f2;…….f1;…….}f1(){autointb;………f2;……..}f2(){staticintc;………}C作用域b作用域a作用域mainf2f1mainf1f2maina生存期:b生存期:c生存期:第57頁例Hanoi(漢諾塔)問題:提升部分第58頁由上面分析可知:將n個盤子從A座移到C座能夠分解為以下3個步驟:1.將A上n-1個盤借助C座先移到B座上。2.把A座上剩下一個盤移到C座上。3.將n-1個盤從B座借助于A座移到C座上。第59頁程序以下(7-10.c)#include<stdio.h>voidmain(){voidhanoi(intn,charone,chartwo,charthree);

/*對hanoi函數(shù)申明*/intm;printf("inputthenumberofdiskes:");scanf(“%d

溫馨提示

  • 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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論