版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第7章用函數(shù)實(shí)現(xiàn)模塊化程序設(shè)計(jì)
本章關(guān)鍵點(diǎn)函數(shù)概念函數(shù)定義與調(diào)用函數(shù)遞歸調(diào)用變量作用域函數(shù)作用域第1頁(yè)第7章用函數(shù)實(shí)現(xiàn)模塊化程序設(shè)計(jì)7.1為何要用函數(shù)
7.2怎樣定義函數(shù)7.3調(diào)用函數(shù)7.4對(duì)被調(diào)用函數(shù)申明和函數(shù)原型7.5函數(shù)嵌套調(diào)用
7.6函數(shù)遞歸調(diào)用7.7數(shù)組作為函數(shù)參數(shù)
7.8局部變量和全局變量7.9變量存放方式和生存期7.10關(guān)于變量申明和定義7.11內(nèi)部函數(shù)和外部函數(shù)第2頁(yè)7.1為何要用函數(shù)問(wèn)題:假如程序功效比較多,規(guī)模比較大,把全部代碼都寫(xiě)在main函數(shù)中,就會(huì)使主函數(shù)變得龐雜、頭緒不清,閱讀和維護(hù)變得困難有時(shí)程序中要屢次實(shí)現(xiàn)某一功效,就需要屢次重復(fù)編寫(xiě)實(shí)現(xiàn)此功效程序代碼,這使程序冗長(zhǎng),不精煉。第3頁(yè)7.1為何要用函數(shù)處理方法:用模塊化程序設(shè)計(jì)思緒采取“組裝”方法簡(jiǎn)化程序設(shè)計(jì)過(guò)程事先編好一批實(shí)現(xiàn)各種不一樣功效函數(shù)
把它們保留在函數(shù)庫(kù)中,需要時(shí)直接用。每一個(gè)函數(shù)用來(lái)實(shí)現(xiàn)一個(gè)特定功效函數(shù)名字應(yīng)反應(yīng)其代表功效第4頁(yè)7.1為何要用函數(shù)在設(shè)計(jì)一個(gè)較大程序時(shí),往往把它分為若干個(gè)程序模塊,每一個(gè)模塊包含一個(gè)或多個(gè)函數(shù),每個(gè)函數(shù)實(shí)現(xiàn)一個(gè)特定功效C程序可由一個(gè)主函數(shù)和若干個(gè)其它函數(shù)組成主函數(shù)調(diào)用其它函數(shù),其它函數(shù)也能夠相互調(diào)用同一個(gè)函數(shù)能夠被一個(gè)或多個(gè)函數(shù)調(diào)用任意屢次mainabcfghdeie主調(diào)函數(shù):調(diào)用某函數(shù)函數(shù);被調(diào)函數(shù):被調(diào)用函數(shù)。第5頁(yè)7.1為何要用函數(shù)庫(kù)函數(shù)用戶自己編寫(xiě)函數(shù)在程序設(shè)計(jì)中要善于利用函數(shù),能夠降低重復(fù)編寫(xiě)程序段工作量,同時(shí)能夠方便地實(shí)現(xiàn)模塊化程序設(shè)計(jì)。第6頁(yè)7.1為何要用函數(shù)例7.1輸出以下結(jié)果,用函數(shù)調(diào)用實(shí)現(xiàn)。******************Howdoyoudo!******************解題思緒:在輸出文字上下分別有一行“*”號(hào),顯然無(wú)須重復(fù)寫(xiě)這段代碼,用一個(gè)函數(shù)print_star來(lái)實(shí)現(xiàn)輸出一行“*”號(hào)功效。再寫(xiě)一個(gè)print_message函數(shù)來(lái)輸出中間一行文字信息。用主函數(shù)分別調(diào)用這兩個(gè)函數(shù)。第7頁(yè)7.1為何要用函數(shù)解題思緒:在輸出文字上下分別有一行“*”號(hào),顯然無(wú)須重復(fù)寫(xiě)這段代碼,用一個(gè)函數(shù)print_star來(lái)實(shí)現(xiàn)輸出一行“*”號(hào)功效。再寫(xiě)一個(gè)print_message函數(shù)來(lái)輸出中間一行文字信息用主函數(shù)分別調(diào)用這兩個(gè)函數(shù)第8頁(yè)#include<stdio.h>intmain(){voidprint_star();voidprint_message();
print_star();print_message();//函數(shù)調(diào)用
print_star();return0;}voidprint_star()//輸出18個(gè)*{printf(“******************\n”);}voidprint_message()//輸出一行字{printf(“Howdoyoudo!\n”);}主調(diào)函數(shù)main被調(diào)函數(shù)第9頁(yè)#include<stdio.h>intmain(){voidprint_star();voidprint_message();
print_star();print_message();
print_star();return0;}voidprint_star(){printf(“******************\n”);}voidprint_message(){printf(“Howdoyoudo!\n”);}申明函數(shù)定義函數(shù)第10頁(yè)#include<stdio.h>intmain(){voidprint_star();voidprint_message();
print_star();print_message();
print_star();return0;}voidprint_star(){printf(“******************\n”);}voidprint_message(){printf(“Howdoyoudo!\n”);}第11頁(yè)說(shuō)明:(1)一個(gè)C程序由一個(gè)或多個(gè)程序模塊組成,每一個(gè)程序模塊作為一個(gè)源程序文件。對(duì)較大程序,一般不希望把全部?jī)?nèi)容全放在一個(gè)文件中,而是將它們分別放在若干個(gè)源文件中,由若干個(gè)源程序文件組成一個(gè)C程序。這么便于分別編寫(xiě)、分別編譯,提高調(diào)試效率。一個(gè)源程序文件可認(rèn)為多個(gè)C程序共用。第12頁(yè)說(shuō)明:
(2)一個(gè)源程序文件由一個(gè)或多個(gè)函數(shù)以及其它相關(guān)內(nèi)容(如預(yù)處理指令、數(shù)據(jù)申明與定義等)組成。一個(gè)源程序文件是一個(gè)編譯單位,在程序編譯時(shí)是以源程序文件為單位進(jìn)行編譯,而不是以函數(shù)為單位進(jìn)行編譯。(3)C程序執(zhí)行是從main函數(shù)開(kāi)始,假如在main函數(shù)中調(diào)用其它函數(shù),在調(diào)用后流程返回到main函數(shù),在main函數(shù)中結(jié)束整個(gè)程序運(yùn)行。第13頁(yè)說(shuō)明:(4)全部函數(shù)都是平行,即在定義函數(shù)時(shí)是分別進(jìn)行,是相互獨(dú)立。一個(gè)函數(shù)并不隸屬于另一個(gè)函數(shù),即函數(shù)不能嵌套定義。函數(shù)間能夠相互調(diào)用,但不能調(diào)用main函數(shù)。main函數(shù)是被操作系統(tǒng)調(diào)用。第14頁(yè)說(shuō)明:(5)從用戶使用角度看,函數(shù)有兩種。庫(kù)函數(shù):它是由系統(tǒng)提供,用戶無(wú)須自己定義而直接使用它們。應(yīng)該說(shuō)明,不一樣C語(yǔ)言編譯系統(tǒng)提供庫(kù)函數(shù)數(shù)量和功效會(huì)有一些不一樣,當(dāng)然許多基本函數(shù)是共同。用戶自己定義函數(shù):它是用以處理用戶專門需要函數(shù)。第15頁(yè)說(shuō)明:(6)從函數(shù)形式看,函數(shù)分兩類。
①無(wú)參函數(shù)。無(wú)參函數(shù)普通用來(lái)執(zhí)行指定一組操作。無(wú)參函數(shù)能夠帶回或不帶回函數(shù)值,但普通以不帶回函數(shù)值居多。
②有參函數(shù)。在調(diào)用函數(shù)時(shí),主調(diào)函數(shù)在調(diào)用被調(diào)用函數(shù)時(shí),經(jīng)過(guò)參數(shù)向被調(diào)用函數(shù)傳遞數(shù)據(jù),普通情況下,執(zhí)行被調(diào)用函數(shù)時(shí)會(huì)得到一個(gè)函數(shù)值,供主調(diào)函數(shù)使用。第16頁(yè)C程序示例該程序包含三個(gè)文件:c_1.h、c_1.c和Cmain.c,分別以下:第17頁(yè)C程序示例//Cmain.c文件#include"stdio.h”#include“c_1.h“intmain(){inti,j;intx=9,y=50;inta[10];for(i=0;i<10;i++) a[i]=rand()%100;printf("排序前序列:\n");for(j=0;j<10;j++) printf("%3d",a[j]);printf("\n");
DataSort(a,10);printf("\n排序后序列:\n");for(j=0;j<10;j++) printf("%3d",a[j]);printf("\n");return0;}//c_1.h文件intmax(int,int);voidDataSort(int[],int);//c_1.c文件見(jiàn)下頁(yè)申明函數(shù)可省略。為何?第18頁(yè)C程序示例//c_1.c文件intmax(intx,inty){ return(x>y)?x:y;}voidDataSort(inta[],intlength){inti,t,j;for(i=0;i<length-1;i++) for(j=0;j<length-i;j++) if(a[j]>a[j+1]) { t=a[j]; a[j]=a[j+1]; a[j+1]=t; }}定義函數(shù)第19頁(yè)7.2~7.4函數(shù)定義與調(diào)用7.2函數(shù)定義7.3函數(shù)調(diào)用7.4對(duì)被調(diào)用函數(shù)申明和原型第20頁(yè)函數(shù)定義與調(diào)用C語(yǔ)言要求,在程序中用到全部函數(shù),必須“先定義,后使用”函數(shù)定義:
必須指定函數(shù)名字、函數(shù)返回值類型、函數(shù)實(shí)現(xiàn)功效以及參數(shù)個(gè)數(shù)與類型,將這些信息通知編譯系統(tǒng)。對(duì)于庫(kù)函數(shù),程序設(shè)計(jì)者只需用#include指令把相關(guān)頭文件包含到本文件模塊中即可。第21頁(yè)函數(shù)定義與調(diào)用函數(shù)定義[函數(shù)類型]函數(shù)名([形參列表]){
//形參說(shuō)明
內(nèi)部變量定義及申明部分;
執(zhí)行語(yǔ)句;}函數(shù)定義后并不馬上執(zhí)行,只有當(dāng)調(diào)用函數(shù)時(shí),程序才轉(zhuǎn)到函數(shù)去執(zhí)行。若無(wú)形參,則稱為無(wú)參函數(shù)若返回類型為void,則函數(shù)無(wú)返回值。普通將
不需要返回函數(shù)值函數(shù)定義為void類型。
若函數(shù)體為空,則稱為空函數(shù)。無(wú)參函數(shù)void空函數(shù)第22頁(yè)函數(shù)定義與調(diào)用1.定義無(wú)參函數(shù)定義無(wú)參函數(shù)普通形式為:類型名
函數(shù)名(void)
{
函數(shù)體
}
類型名
函數(shù)名(){
函數(shù)體
}
包含申明部分和語(yǔ)句部分包含申明部分和語(yǔ)句部分指定函數(shù)值類型指定函數(shù)值類型第23頁(yè)函數(shù)定義與調(diào)用1.定義無(wú)參函數(shù)voidprint_star(){ printf(“******************\n”);}voidprint_star(void){inti=0; for(;i<18;i++)printf(“*”);printf(“\n”);}無(wú)參數(shù)//申明部分第24頁(yè)2.定義有參函數(shù)定義有參函數(shù)普通形式為:類型名函數(shù)名(形式參數(shù)表列){
函數(shù)體
}intmax(intx,inty){//求兩個(gè)整數(shù)中較大值intz;z=x>y?x:y;return(z);}函數(shù)定義與調(diào)用第25頁(yè)3.定義空函數(shù)定義空函數(shù)普通形式為:類型名函數(shù)名(
){
}先用空函數(shù)占一個(gè)位置,以后逐步擴(kuò)充好處:程序結(jié)構(gòu)清楚,可讀性好,以后擴(kuò)充新功效方便,對(duì)程序結(jié)構(gòu)影響不大函數(shù)定義與調(diào)用第26頁(yè)函數(shù)定義與調(diào)用函數(shù)返回值類型:取決于定義函數(shù)中
函數(shù)類型。
函數(shù)返回值:由return語(yǔ)句取得。函數(shù)名([實(shí)參列表])函數(shù)調(diào)用第27頁(yè)求圓柱形表面積和體積#include“stdio.h”#definePI3.141593intmain(){floatR,H;//R為底面半徑;H為圓柱形高intoption;
scanf(“%f,%f”,&R,&H); printf(“1.surface_area2.volume3.exit\n”);
scanf(“%d”,&option); switch(option){case1:printf(“thesurfaceareais%f\n”,surface_area(R,H));break;case2:volume(R,H);break;default:break;} return0;}floatsurface_area(floatr,floath){//求圓柱形表面積return(Bot_area(r)*2+2*PI*r*h);}floatBot_area(floatr){//r為底面半徑returnPI*r*r;//底面面積}voidvolume(floatr,floath){//圓柱形體積printf(“thevolumeis%f\n”,Bot_area(r)*h);}實(shí)參形參第28頁(yè)函數(shù)調(diào)用時(shí)數(shù)據(jù)傳遞函數(shù)定義時(shí)函數(shù)名后括號(hào)中變量叫做“形式參數(shù)”.形參只能是普通變量、指針變量和數(shù)組名.函數(shù)調(diào)用時(shí)函數(shù)名后括號(hào)中變量叫做“實(shí)際參數(shù)”.實(shí)參能夠是常量、變量和數(shù)組名和表示式.1.對(duì)于無(wú)參函數(shù),形參列表與實(shí)參列表均為空,但小括號(hào)
不能省略,比如print_star()。2.對(duì)于有參函數(shù),實(shí)參加形參個(gè)數(shù)相等,次序?qū)?yīng),類型
一致或賦值相容。一、形式參數(shù)與實(shí)際參數(shù)第29頁(yè)函數(shù)調(diào)用時(shí)數(shù)據(jù)傳遞volume(R,H)//main函數(shù)1.按值傳遞:將實(shí)參值傳遞給形參。2.實(shí)參加形參間數(shù)值傳遞還可使用按地址傳遞,屬于雙向傳遞。后面再學(xué)習(xí)。二、實(shí)參加形參間數(shù)值傳遞voidvolume(floatr,floath){//圓柱形體積printf(“thevolumeis%f\n”,Bot_area(r)*h);}按值傳遞單向傳遞R→rH→h第30頁(yè)intmain(){floatR,H;//R為底面半徑;H為圓柱形高…volume(R,H);…return0;}函數(shù)調(diào)用過(guò)程voidvolume(floatr,floath){…}①調(diào)用函數(shù)③返回主調(diào)函數(shù)②運(yùn)行被調(diào)函數(shù)調(diào)用函數(shù)
當(dāng)一個(gè)函數(shù)調(diào)用另一個(gè)函數(shù),運(yùn)行被調(diào)用函數(shù)之前,需先完成三件任務(wù):將全部實(shí)在參數(shù)、返回地址等信息傳遞給被調(diào)用函數(shù)保留;為被調(diào)用函數(shù)局部變量分配存放區(qū);將控制轉(zhuǎn)移到被調(diào)用函數(shù)入口。第31頁(yè)函數(shù)調(diào)用過(guò)程返回主調(diào)函數(shù)
保留被調(diào)函數(shù)計(jì)算結(jié)果;釋放被調(diào)函數(shù)數(shù)據(jù)區(qū);依照被調(diào)函數(shù)保留返回地址將控制轉(zhuǎn)移到調(diào)用函數(shù)。
從被調(diào)用函數(shù)返回調(diào)用函數(shù)之前,應(yīng)該完成以下三項(xiàng)任務(wù):第32頁(yè)1.在定義函數(shù)中指定形參,在未出現(xiàn)函數(shù)調(diào)用時(shí),它們并不占內(nèi)存中存放單元。在發(fā)生函數(shù)調(diào)用時(shí),函數(shù)volume形參被暫時(shí)分配內(nèi)存單元。函數(shù)調(diào)用過(guò)程第33頁(yè)函數(shù)調(diào)用過(guò)程2.因?yàn)閷?shí)參和形參在內(nèi)存中占用不一樣內(nèi)存單元,所以假如再被調(diào)函數(shù)中改變形參值,實(shí)參值不會(huì)發(fā)生改變
。比如:#include"stdio.h"intmain(){intx,y;printf(“輸入xy,以空格隔開(kāi):");scanf("%d%d",&x,&y);printf(“最大值為:%d\n",max(x,y));printf("x=%dy=%d",x,y);return0;}intmax(intx,inty){x+=5;printf("x=%dy=%d",x,y);return(x>y?x:y);}第34頁(yè)7.4對(duì)被調(diào)用函數(shù)申明和函數(shù)原型在一個(gè)函數(shù)中調(diào)用另一個(gè)函數(shù)需要具備以下條件:(1)被調(diào)用函數(shù)必須是已經(jīng)定義函數(shù)(是庫(kù)函數(shù)或用戶自己定義函數(shù))(2)假如使用庫(kù)函數(shù),應(yīng)該在本文件開(kāi)頭加對(duì)應(yīng)#include指令(3)假如使用自己定義函數(shù),而該函數(shù)位置在調(diào)用它函數(shù)后面,應(yīng)該申明第35頁(yè)intmax(intx,inty){x+=5;printf("x=%dy=%d",x,y);return(x>y?x:y);}比如:#include"stdio.h"intmain(){intx,y;intmax(int,int);printf(“輸入xy,以空格隔開(kāi):");scanf("%d%d",&x,&y);printf(“最大值為:%d\n",max(x,y));printf("x=%dy=%d",x,y);return0;}7.4對(duì)被調(diào)用函數(shù)申明和函數(shù)原型申明函數(shù)第36頁(yè)函數(shù)原型普通形式有兩種:如floatadd(floatx,floaty);floatadd(float,float);原型說(shuō)明能夠放在文件開(kāi)頭,這時(shí)全部函數(shù)都能夠使用此函數(shù)第37頁(yè)7.5函數(shù)嵌套調(diào)用C語(yǔ)言函數(shù)定義是相互平行、獨(dú)立即函數(shù)不能嵌套定義但能夠嵌套調(diào)用函數(shù)即調(diào)用一個(gè)函數(shù)過(guò)程中,又能夠調(diào)用另一個(gè)函數(shù)第38頁(yè)7.5函數(shù)嵌套調(diào)用main函數(shù)①調(diào)用a函數(shù)⑨結(jié)束a函數(shù)③調(diào)用b函數(shù)⑦②⑧b函數(shù)⑤④⑥第39頁(yè)求圓柱形表面積和體積#include“stdio.h”#definePI3.141593intmain(){floatR,H;//R為底面半徑;H為圓柱形高intoption;
scanf(“%f,%f”,&R,&H); printf(“1.surface_area2.volume3.exit\n”);
scanf(“%d”,&option); switch(option){case1:printf(“thesurfaceareais%f\n”,surface_area(R,H));break;case2:volume(R,H);break;default:break;} return0;}floatsurface_area(floatr,floath){//求圓柱形表面積return(Bot_area(r)*2+2*PI*r*h);}floatBot_area(floatr){//r為底面半徑returnPI*r*r;//底面面積}voidvolume(floatr,floath){//圓柱形體積printf(“thevolumeis%f\n”,Bot_area(r)*h);}①②第40頁(yè)7.6函數(shù)遞歸調(diào)用在調(diào)用一個(gè)函數(shù)過(guò)程中又出現(xiàn)直接或間接地調(diào)用該函數(shù)本身,稱為函數(shù)遞歸調(diào)用。C語(yǔ)言特點(diǎn)之一就在于允許函數(shù)遞歸調(diào)用。第41頁(yè)f2函數(shù)調(diào)用f1函數(shù)7.6函數(shù)遞歸調(diào)用intf(intx){inty,z;z=f(y);return(2*z);}f函數(shù)調(diào)用f函數(shù)f1函數(shù)調(diào)用f2函數(shù)應(yīng)使用if語(yǔ)句控制結(jié)束調(diào)用直接調(diào)用本函數(shù)間接調(diào)用本函數(shù)第42頁(yè)一個(gè)問(wèn)題采取遞歸方法來(lái)處理時(shí),必須符合以下三個(gè)條件:能夠把問(wèn)題轉(zhuǎn)化為一個(gè)新較小問(wèn)題,而新問(wèn)題解法依然與原來(lái)問(wèn)題解法相同;能夠應(yīng)用這個(gè)轉(zhuǎn)化過(guò)程使問(wèn)題得到處理;必定有一個(gè)明確結(jié)束遞歸條件。7.6函數(shù)遞歸調(diào)用第43頁(yè)7.6函數(shù)遞歸調(diào)用
例7.6有5個(gè)學(xué)生坐在一起問(wèn)第5個(gè)學(xué)生多少歲?他說(shuō)比第4個(gè)學(xué)生大2歲問(wèn)第4個(gè)學(xué)生歲數(shù),他說(shuō)比第3個(gè)學(xué)生大2歲問(wèn)第3個(gè)學(xué)生,又說(shuō)比第2個(gè)學(xué)生大2歲問(wèn)第2個(gè)學(xué)生,說(shuō)比第1個(gè)學(xué)生大2歲最終問(wèn)第1個(gè)學(xué)生,他說(shuō)是10歲請(qǐng)問(wèn)第5個(gè)學(xué)生多大第44頁(yè)7.6函數(shù)遞歸調(diào)用解題思緒:要求第5個(gè)年紀(jì),就必須先知道第4個(gè)年紀(jì)要求第4個(gè)年紀(jì)必須先知道第3個(gè)年紀(jì)第3個(gè)年紀(jì)又取決于第2個(gè)年紀(jì)第2個(gè)年紀(jì)取決于第1個(gè)年紀(jì)第一個(gè)學(xué)生年紀(jì)已經(jīng)知道每個(gè)學(xué)生年紀(jì)都比其前1個(gè)學(xué)生年紀(jì)大2回溯第45頁(yè)7.6函數(shù)遞歸調(diào)用解題思緒:age(5)=age(4)+2age(4)=age(3)+2age(3)=age(2)+2age(2)=age(1)+2age(1)=10第46頁(yè)age(5)=age(4)+2age(4)=age(3)+2age(3)=age(2)+2age(2)=age(1)+2age(1)=10age(2)=12age(3)=14age(4)=16age(5)=18
回溯階段
遞推階段第47頁(yè)age(5)=age(4)+2age(4)=age(3)+2age(3)=age(2)+2age(2)=age(1)+2age(1)=10age(2)=12age(3)=14age(4)=16age(5)=18
回溯階段
遞推階段結(jié)束遞歸條件第48頁(yè)#include<stdio.h>intmain(){intage(intn);printf("NO.5,age:%d\n",age(5));return0;}
intage(intn){intc;if(n==1)c=10;elsec=age(n-1)+2;return(c);}第49頁(yè)age(5)輸出age(5)mainc=age(4)+2age函數(shù)n=5c=age(3)+2age函數(shù)n=4c=age(1)+2age函數(shù)n=2c=age(2)+2age函數(shù)n=3c=10age函數(shù)n=1age(1)=10age(2)=12age(3)=14age(4)=16age(5)=1818函數(shù)調(diào)用過(guò)程第50頁(yè)例7.7用遞歸方法求n!。解題思緒:求n!能夠用遞推方法:即從1開(kāi)始,乘2,再乘3……一直乘到n。遞推法特點(diǎn)是從一個(gè)已知事實(shí)(如1!=1)出發(fā),按一定規(guī)律推出下一個(gè)事實(shí)(如2!=1!*2),再?gòu)倪@個(gè)新已知事實(shí)出發(fā),再向下推出一個(gè)新事實(shí)(3!=3*2!)。n!=n*(n-1)!。第51頁(yè)例7.7用遞歸方法求n!。解題思緒:求n!也能夠用遞歸方法,即5!等于4!×5,而4!=3!×4…,1?。剑笨捎孟旅孢f歸公式表示:第52頁(yè)#include<stdio.h>intmain(){intfac(intn);intn;inty;printf("inputanintegernumber:");scanf("%d",&n);y=fac(n);printf("%d!=%d\n",n,y);return0;}第53頁(yè)intfac(intn){intf;if(n<0) printf("n<0,dataerror!");elseif(n==0||n==1) f=1;elsef=fac(n-1)*n;return(f);}注意溢出第54頁(yè)fac(5)輸出fac(5)mainf=fac(4)×5fac函數(shù)n=5f=fac(3)×4fac函數(shù)n=4f=fac(1)×2fac函數(shù)n=2f=fac(2)×3fac函數(shù)n=3f=1fac函數(shù)n=1fac(1)=1fac(2)=2fac(3)=6fac(4)=24fac(5)=120120第55頁(yè)
例7.8Hanoi(漢諾)塔問(wèn)題。
古代有一個(gè)梵塔,塔內(nèi)有3個(gè)座A、B、C,開(kāi)始時(shí)A座上有64個(gè)盤(pán)子,盤(pán)子大小不等,大在下,小在上。有一個(gè)老和尚想把這64個(gè)盤(pán)子從A座移到C座,但要求每次只允許移動(dòng)一個(gè)盤(pán),且在移動(dòng)過(guò)程中在3個(gè)座上都一直保持大盤(pán)在下,小盤(pán)在上。在移動(dòng)過(guò)程中能夠利用B座。要求編程序輸出移動(dòng)一盤(pán)子步驟。ABC第56頁(yè)解題思緒:要把64個(gè)盤(pán)子從A座移動(dòng)到C座,需要移動(dòng)大約264
次盤(pán)子。普通人是不可能直接確定移動(dòng)盤(pán)子每一個(gè)詳細(xì)步驟。老和尚會(huì)這么想:假如有另外一個(gè)和尚能有方法將上面63個(gè)盤(pán)子從一個(gè)座移到另一座。那么,問(wèn)題就處理了。此時(shí)老和尚只需這么做:第57頁(yè)解題思緒:(1)命令第2個(gè)和尚將63個(gè)盤(pán)子從A座移到B座(2)自己將1個(gè)盤(pán)子(最底下、最大盤(pán)子)從A座移到C座(3)再命令第2個(gè)和尚將63個(gè)盤(pán)子從B座移到C座第58頁(yè)ABC……命令第2個(gè)和尚將63個(gè)從A到B(借助C)第1個(gè)和尚做法:第1個(gè)和尚任務(wù):將64按規(guī)則從A移到C(借助B)第59頁(yè)……ABC命令第2個(gè)和尚將63個(gè)從A到B(借助C)第1個(gè)和尚做法:第1個(gè)和尚任務(wù):將64按規(guī)則從A移到C第60頁(yè)……ABC將第1個(gè)從A到C第1個(gè)和尚做法第61頁(yè)……ABC將1個(gè)從A到C第1個(gè)和尚做法第62頁(yè)……ABC再命令第2個(gè)和尚將63個(gè)從B到C(借助A)第1個(gè)和尚做法第二個(gè)和尚怎么做呢?第63頁(yè)……ABC再命令第3個(gè)和尚將62個(gè)從B到A(借助C)第2個(gè)和尚做法第64頁(yè)……ABC再將2個(gè)從B到C第2個(gè)和尚做法第65頁(yè)第3個(gè)和尚做法第4個(gè)和尚做法第5個(gè)和尚做法第6個(gè)和尚做法第7個(gè)和尚做法……第63個(gè)和尚做法第64個(gè)和尚僅做:將1個(gè)從A移到C第66頁(yè)ABC將3個(gè)盤(pán)子從A移到C全過(guò)程將2個(gè)盤(pán)子從A移到B第67頁(yè)ABC將3個(gè)盤(pán)子從A移到C全過(guò)程將2個(gè)盤(pán)子從A移到B第68頁(yè)ABC將3個(gè)盤(pán)子從A移到C全過(guò)程將1個(gè)盤(pán)子從A移到C第69頁(yè)ABC將3個(gè)盤(pán)子從A移到C全過(guò)程將1個(gè)盤(pán)子從A移到C第70頁(yè)ABC將3個(gè)盤(pán)子從A移到C全過(guò)程將2個(gè)盤(pán)子從B移到C第71頁(yè)ABC將3個(gè)盤(pán)子從A移到C全過(guò)程將2個(gè)盤(pán)子從B移到C第72頁(yè)ABC將2個(gè)盤(pán)子從A移到B過(guò)程將1個(gè)盤(pán)子從A移到C第73頁(yè)ABC將2個(gè)盤(pán)子從A移到B過(guò)程將1個(gè)盤(pán)子從A移到C第74頁(yè)ABC將2個(gè)盤(pán)子從A移到B過(guò)程將1個(gè)盤(pán)子從A移到B第75頁(yè)ABC將2個(gè)盤(pán)子從A移到B過(guò)程將1個(gè)盤(pán)子從A移到B第76頁(yè)ABC將2個(gè)盤(pán)子從A移到B過(guò)程將1個(gè)盤(pán)子從C移到B第77頁(yè)ABC將2個(gè)盤(pán)子從A移到B過(guò)程將1個(gè)盤(pán)子從C移到B第78頁(yè)ABC將2個(gè)盤(pán)子從B移到C過(guò)程第79頁(yè)ABC將2個(gè)盤(pán)子從B移到C過(guò)程第80頁(yè)ABC將2個(gè)盤(pán)子從B移到C過(guò)程第81頁(yè)ABC將2個(gè)盤(pán)子從B移到C過(guò)程第82頁(yè)由上面分析可知:將n個(gè)盤(pán)子從A座移到C座能夠分解為以下3個(gè)步驟:(1)將A上n-1個(gè)盤(pán)借助C座先移到B座上(2)把A座上剩下一個(gè)盤(pán)移到C座上(3)將n-1個(gè)盤(pán)從B座借助于A座移到C座上第83頁(yè)能夠?qū)⒌?1)步和第(3)步表示為:將“one”座上n-1個(gè)盤(pán)移到“two”座(借助“three”座)。在第(1)步和第(3)步中,one、two、three和A、B、C對(duì)應(yīng)關(guān)系不一樣。對(duì)第(1)步,對(duì)應(yīng)關(guān)系是one對(duì)應(yīng)A,two對(duì)應(yīng)B,three對(duì)應(yīng)C。對(duì)第(3)步,對(duì)應(yīng)關(guān)系是one對(duì)應(yīng)B,two對(duì)應(yīng)C,three對(duì)應(yīng)A。第84頁(yè)把上面3個(gè)步驟分成兩類操作:(1)將n-1個(gè)盤(pán)從一個(gè)座移到另一個(gè)座上(n>1)。這就是大和尚讓小和尚做工作,它是一個(gè)遞歸過(guò)程,即和尚將任務(wù)層層下放,直到第64個(gè)和尚為止。(2)將1個(gè)盤(pán)子從一個(gè)座上移到另一座上。這是大和尚自己做工作。第85頁(yè)編寫(xiě)程序。用hanoi函數(shù)實(shí)現(xiàn)第1類操作(即模擬小和尚任務(wù))用move函數(shù)實(shí)現(xiàn)第2類操作(模擬大和尚自己移盤(pán))函數(shù)調(diào)用hanoi(n,one,two.three)表示將n個(gè)盤(pán)子從“one”座移到“three”座過(guò)程(借助“two”座)函數(shù)調(diào)用move(x,y)表示將1個(gè)盤(pán)子從x座移到y(tǒng)座過(guò)程。x和y是代表A、B、C座之一,依據(jù)每次不一樣情況分別取A、B、C代入第86頁(yè)#include<stdio.h>intmain(){voidhanoi(intn,charone,chartwo,charthree);intm;printf(“thenumberofdiskes:");scanf("%d",&m);printf("move%ddiskes:\n",m);
hanoi(m,'A','B','C');}第87頁(yè)voidhanoi(intn,charone,chartwo,charthree){voidmove(charx,chary);if(n==1)
move(one,three);else{hanoi(n-1,one,three,two);
move(one,three);
hanoi(n-1,two,one,three);}}第88頁(yè)voidmove(charx,chary){printf("%c-->%c\n",x,y);}第89頁(yè)7.7數(shù)組作為函數(shù)參數(shù)7.7.1數(shù)組元素作函數(shù)實(shí)參7.7.2數(shù)組名作函數(shù)參數(shù)7.7.3多維數(shù)組名作函數(shù)參數(shù)按值傳遞按地址傳遞數(shù)組元素?cái)?shù)組名第90頁(yè)7.7.1數(shù)組元素作函數(shù)實(shí)參
例7.9輸入10個(gè)數(shù),要求輸出其中值最大元素和該數(shù)是第幾個(gè)數(shù)。第91頁(yè)7.7.1數(shù)組元素作函數(shù)實(shí)參解題思緒:定義數(shù)組a,用來(lái)存放10個(gè)數(shù)設(shè)計(jì)函數(shù)max,用來(lái)求兩個(gè)數(shù)中大者在主函數(shù)中定義變量m,初值為a[0],每次調(diào)用max函數(shù)后返回值存放在m中用“打擂臺(tái)”算法,依次將數(shù)組元素a[1]到a[9]與m比較,最終得到m值就是10個(gè)數(shù)中最大者第92頁(yè)#include<stdio.h>intmain(){intmax(intx,inty);inta[10],m,n,i;printf(“10integernumbers:\n");for(i=0;i<10;i++)scanf("%d",&a[i]);printf("\n");第93頁(yè)for(i=1,m=a[0],n=0;i<10;i++){if(max(m,a[i])>m) {m=max(m,a[i]); n=i; }}printf(“l(fā)argestnumberis%d\n",m);printf(“%dthnumber.\n“,n+1);}intmax(intx,inty){return(x>y?x:y);}數(shù)組元素作為函數(shù)參數(shù)用數(shù)組元素作實(shí)參時(shí),向形參變量傳遞是數(shù)組元素值。第94頁(yè)7.7.2數(shù)組名作函數(shù)參數(shù)用數(shù)組名作函數(shù)實(shí)參時(shí),向形參傳遞是數(shù)組首元素地址。floatscore[10];floataver;floataverage(float
array[10]){inti;floataver,sum=array[0];for(i=1;i<10;i++)sum=sum+array[i];aver=sum/10;return(aver);}aver=average(score);//數(shù)組名作為函數(shù)參數(shù)第95頁(yè)7.7.2數(shù)組名作函數(shù)參數(shù)例7.10有一個(gè)一維數(shù)組score,內(nèi)放10個(gè)學(xué)生成績(jī),求平均成績(jī)。解題思緒:用函數(shù)average求平均成績(jī),用數(shù)組名作為函數(shù)實(shí)參,形參也用數(shù)組名在average函數(shù)中引用各數(shù)組元素,求平均成績(jī)并返回main函數(shù)第96頁(yè)#include<stdio.h>intmain(){intaverage(int
array[10]);//申明函數(shù)
intscore[10],aver;inti;for(i=0;i<10;i++)score[i]=rand()%100;printf("十個(gè)學(xué)生成績(jī):");for(i=0;i<10;i++)printf("%3d",score[i]);printf("\n");aver=average(score);//調(diào)用函數(shù)average.
printf("實(shí)參數(shù)組score首地址:%d\n",score);printf("%d\n",aver);return0;}申明、定義函數(shù)時(shí):若數(shù)組作為形參,能夠不指定數(shù)組長(zhǎng)度int
array[]第97頁(yè)intaverage(intarray[10]){inti;intaver,sum=array[0];for(i=1;i<10;i++)sum=sum+array[i];aver=sum/10;printf("形參數(shù)組array首地址:%d\n",array);return(aver);}定義形參數(shù)組相當(dāng)于score[0]相當(dāng)于score[i]int
array[]傳遞數(shù)組首地址第98頁(yè)
例7.12用選擇法對(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輪用voidsort(intarray[],intn)函數(shù)來(lái)實(shí)現(xiàn)排序.第99頁(yè)a[0]a[1]a[2]a[3]a[4]36194
16394
1
3694
1
3
496
1
3
4
69小到大排序第100頁(yè)#include<stdio.h>intmain(){voidsort(intarray[],intn);//申明函數(shù)
inta[10],i;printf("enterarray:\n");for(i=0;i<10;i++)scanf("%d",&a[i]);
sort(a,10);//調(diào)用sort函數(shù)
printf("Thesortedarray:\n");for(i=0;i<10;i++)printf("%d",a[i]);printf("\n");return0;}第101頁(yè)void
sort(int
array[],int
n){inti,j,k,t;for(i=0;i<n-1;i++){k=i;//k:第i次排序中最小元素位置,初始為ifor(j=i+1;j<n;j++)if(array[j]<array[k])k=j;if(k!=i) {t=array[k];
array[k]=array[i];
array[i]=t;} }}在sort[i]~sort[9]中,最小數(shù)與sort[i]對(duì)換第102頁(yè)7.7.3多維數(shù)組名作函數(shù)參數(shù)
例7.13有一個(gè)3×4矩陣,求全部元素中最大值。解題思緒:先使變量max初值等于矩陣中第一個(gè)元素值,然后將矩陣中各個(gè)元素值與max相比,每次比較后都把“大者”存放在max中,全部元素比較完后,max值就是全部元素最大值。第103頁(yè)#include<stdio.h>intmain(){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));return0;}能夠省略不能省略要與實(shí)參數(shù)組第二維大小相同實(shí)參第104頁(yè)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);}要與實(shí)參數(shù)組第二維大小相同第105頁(yè)7.8局部變量和全局變量7.8.1局部變量7.8.2全局變量第106頁(yè)7.8.1局部變量定義變量可能有三種情況:在函數(shù)開(kāi)頭定義在函數(shù)內(nèi)或復(fù)合語(yǔ)句內(nèi)定義在函數(shù)外部定義全局變量局部變量第107頁(yè)7.8.1局部變量在一個(gè)函數(shù)內(nèi)部定義變量只在本函數(shù)范圍內(nèi)有效在復(fù)合語(yǔ)句內(nèi)定義變量只在本復(fù)合語(yǔ)句范圍內(nèi)有效在函數(shù)內(nèi)部或復(fù)合語(yǔ)句內(nèi)部定義變量稱為“局部變量”第108頁(yè)floatf1(inta){intb,c;……}charf2(intx,inty){inti,j;……}intmain(){intm,n;……return0;}a、b、c僅在此函數(shù)內(nèi)有效x、y、i、j僅在此函數(shù)內(nèi)有效m、n僅在此函數(shù)內(nèi)有效第109頁(yè)floatf1(inta){intb,c;……}charf2(intx,inty){inti,j;……}intmain(){inta,b;……return0;}類似于不一樣班同名學(xué)生。不一樣函數(shù)中能夠使用同名變量,它們代表不一樣對(duì)象。a、b也僅在此函數(shù)內(nèi)有效第110頁(yè)intmain(){inta,b;……{intc;
c=a+b;……}……}c僅在此復(fù)合語(yǔ)句內(nèi)有效a、b僅在此復(fù)合語(yǔ)句內(nèi)有效第111頁(yè)7.8.2全局變量(外部變量)——在函數(shù)之外定義變量。全局變量可認(rèn)為本文件中其他函數(shù)所共用。有效范圍為從定義變量位置開(kāi)始到根源文件結(jié)束。第112頁(yè)intp=1,q=5floatf1(inta){intb,c;……}charc1,c2;charf2(intx,inty){inti,j;……}intmain(){intm,n;……return0;}p、q、c1、c2為全局變量→不被包含在任何一個(gè)函數(shù)內(nèi)p、q、c1、c2為全局變量→不被包含在任何一個(gè)函數(shù)內(nèi)第113頁(yè)intp=1,q=5floatf1(inta){intb,c;……}charc1,c2;charf2(intx,inty){inti,j;……}intmain(){intm,n;……return0;}p、q有效范圍c1、c2有效范圍第114頁(yè)例7.14有一個(gè)一維數(shù)組,內(nèi)放10個(gè)學(xué)生成績(jī),寫(xiě)一個(gè)函數(shù),當(dāng)主函數(shù)調(diào)用此函數(shù)后,能求出平均分、最高分和最低分。解題思路:調(diào)用一個(gè)函數(shù)可以得到一個(gè)函數(shù)返回值,現(xiàn)在希望通過(guò)函數(shù)調(diào)用能得到3個(gè)結(jié)果。可以利用全局變量來(lái)達(dá)到此目。第115頁(yè)#include<stdio.h>floatMax=0,Min=0;//定義全局變量
intmain(){//申明函數(shù)floataverage(floatarray[],intn);floatave,score[10];inti;/*定義局部變量*/printf("Pleaseenter10scores:\n");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);return0;}floataverage(floatarray[],intn){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);}第116頁(yè)floataverage(floatarray[],intn){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);}第117頁(yè)avescore10MaxMinaverarraynMaxMinmain函數(shù)average函數(shù)提議不在必要時(shí)不要使用全局變量占用存放單元時(shí)間長(zhǎng)。降低函數(shù)通用性,影響函數(shù)能夠執(zhí)行。降低程序清楚性。例7.15第118頁(yè)
例7.15若外部變量與局部變量同名,分析結(jié)果。第119頁(yè)#include<stdio.h>inta=3,b=5;intmain(){intmax(inta,intb);inta=8;printf(“max=%d\n”,max(a,b));return0;}
intmax(inta,intb){intc;c=a>b?a:b;return(c);}a為局部變量,僅在此函數(shù)內(nèi)有效b為全部變量第120頁(yè)#include<stdio.h>inta=3,b=5;intmain(){intmax(inta,intb);inta=8;printf(“max=%d\n”,max(a,b));return0;}
intmax(inta,intb){intc;c=a>b?a:b;return(c);}a、b為局部變量,僅在此函數(shù)內(nèi)有效第121頁(yè)7.9變量存放方式和生存期7.9.1動(dòng)態(tài)存放方式與靜態(tài)存放方式7.9.2局部變量存放類別7.9.3全局變量存放類別7.9.4存放類別小結(jié)第122頁(yè)7.9.1動(dòng)態(tài)存放方式與靜態(tài)存放方式變量作用域全局變量局部變量靜態(tài)存放(static)動(dòng)態(tài)存放([auto])從變量值存在時(shí)間(即生存期)看變量存放有兩種不一樣方式:第123頁(yè)7.9.1動(dòng)態(tài)存放方式與靜態(tài)存放方式靜態(tài)存放方式
是指在程序運(yùn)行期間由系統(tǒng)分配固定存放空間方式。動(dòng)態(tài)存放方式
是在程序運(yùn)行期間依據(jù)需要進(jìn)行動(dòng)態(tài)分配存放空間方式第124頁(yè)程序區(qū)靜態(tài)存放區(qū)動(dòng)態(tài)存放區(qū)用戶區(qū)將數(shù)據(jù)存放在此區(qū)全局變量、靜態(tài)局部變量。①函數(shù)形式參數(shù)②函數(shù)中定義沒(méi)有用關(guān)鍵字static申明變量③函數(shù)調(diào)用時(shí)現(xiàn)場(chǎng)保護(hù)和返回地址等存放在動(dòng)態(tài)存放區(qū)程序開(kāi)始執(zhí)行時(shí)給全局變量分配存放區(qū),程序執(zhí)行完成就釋放。在程序執(zhí)行過(guò)程中占據(jù)固定存放單元函數(shù)調(diào)用開(kāi)始時(shí)分配,函數(shù)結(jié)束時(shí)釋放。在程序執(zhí)行過(guò)程中,這種分配和釋放是動(dòng)態(tài)堆棧第125頁(yè)
在C語(yǔ)言中,每一個(gè)變量和函數(shù)都有兩個(gè)屬性:數(shù)據(jù)類型和數(shù)據(jù)存放類別.(1)數(shù)據(jù)類型
如整型、浮點(diǎn)型等(2)存放類別——
指是數(shù)據(jù)在內(nèi)存中存放方式。存放類別包含:
自動(dòng)(auto)、靜態(tài)(static)、存放器(register)、外部(extern)依據(jù)變量存放類別,能夠知道變量作用域和生存期.第126頁(yè)7.9.2局部變量存放類別1.自動(dòng)變量
(auto變量)存放在動(dòng)態(tài)存放區(qū)2.靜態(tài)局部變量
(static變量)存放在靜態(tài)存放區(qū)3.存放器變量
(regitster變量)存放在CPU存放器中內(nèi)存第127頁(yè)7.9.2局部變量存放類別1.自動(dòng)變量(auto變量)局部變量,假如不專門申明存放類別,都是動(dòng)態(tài)地分配存放空間.調(diào)用函數(shù)時(shí),系統(tǒng)會(huì)給局部變量分配存放空間,調(diào)用結(jié)束時(shí)就自動(dòng)釋放空間。所以這類局部變量稱為自動(dòng)變量。自動(dòng)變量用關(guān)鍵字auto作存放類別申明第128頁(yè)7.9.2局部變量存放類別intf(inta){autointb,c=3;
┇}能夠省略第129頁(yè)7.9.2局部變量存放類別2.靜態(tài)局部變量(static局部變量)希望函數(shù)中局部變量在函數(shù)調(diào)用結(jié)束后不消失而繼續(xù)保留原值,即其占用存放單元不釋放,在下一次再調(diào)用該函數(shù)時(shí),該變量已經(jīng)有值(就是上一次函數(shù)調(diào)用結(jié)束時(shí)值),這時(shí)就應(yīng)該指定該局部變量為“靜態(tài)局部變量”,用關(guān)鍵字static進(jìn)行申明。第130頁(yè)
例7.16考查靜態(tài)局部變量值。#include<stdio.h>intmain(){intf(int);inta=2,i;for(i=0;i<3;i++)printf(“%d\n”,f(a));return0;}intf(inta){autointb=0;
staticc=3;b=b+1;c=c+1;return(a+b+c);}調(diào)用三次每調(diào)用一次,開(kāi)辟新a和b,但c不是第131頁(yè)
例7.16考查靜態(tài)局部變量值。#include<stdio.h>intmain(){intf(int);inta=2,i;for(i=0;i<3;i++)printf(“%d\n”,f(a));return0;}intf(inta){autointb=0;
staticc=3;b=b+1;c=c+1;return(a+b+c);}03bc第一次調(diào)用開(kāi)始第132頁(yè)
例7.16考查靜態(tài)局部變量值。#include<stdio.h>intmain(){intf(int);inta=2,i;for(i=0;i<3;i++)printf(“%d\n”,f(a));return0;}intf(inta){autointb=0;
staticc=3;b=b+1;c=c+1;return(a+b+c);}03bc第一次調(diào)用期間14第133頁(yè)
例7.16考查靜態(tài)局部變量值。#include<stdio.h>intmain(){intf(int);inta=2,i;for(i=0;i<3;i++)printf(“%d\n”,f(a));return0;}intf(inta){autointb=0;
staticc=3;b=b+1;c=c+1;return(a+b+c);}bc第一次調(diào)用結(jié)束147第134頁(yè)
例7.16考查靜態(tài)局部變量值。#include<stdio.h>intmain(){intf(int);inta=2,i;for(i=0;i<3;i++)printf(“%d\n”,f(a));return0;}intf(inta){autointb=0;
staticc=3;b=b+1;c=c+1;return(a+b+c);}bc第二次調(diào)用開(kāi)始04第135頁(yè)
例7.16考查靜態(tài)局部變量值。#include<stdio.h>intmain(){intf(int);inta=2,i;for(i=0;i<3;i++)printf(“%d\n”,f(a));return0;}intf(inta){autointb=0;
staticc=3;b=b+1;c=c+1;return(a+b+c);}bc第二次調(diào)用期間0451第136頁(yè)
例7.16考查靜態(tài)局部變量值。#include<stdio.h>intmain(){intf(int);inta=2,i;for(i=0;i<3;i++)printf(“%d\n”,f(a));return0;}intf(inta){autointb=0;
staticc=3;b=b+1;c=c+1;return(a+b+c);}bc第二次調(diào)用結(jié)束158第137頁(yè)
例7.16考查靜態(tài)局部變量值。#include<stdio.h>intmain(){intf(int);inta=2,i;for(i=0;i<3;i++)printf(“%d\n”,f(a));return0;}intf(inta){autointb=0;
staticc=3;b=b+1;c=c+1;return(a+b+c);}bc第三次調(diào)用開(kāi)始05第138頁(yè)
例7.16考查靜態(tài)局部變量值。#include<stdio.h>intmain(){intf(int);inta=2,i;for(i=0;i<3;i++)printf(“%d\n”,f(a));return0;}intf(inta){autointb=0;
staticc=3;b=b+1;c=c+1;return(a+b+c);}bc第三次調(diào)用期間0561第139頁(yè)
例7.16考查靜態(tài)局部變量值。#include<stdio.h>intmain(){intf(int);inta=2,i;for(i=0;i<3;i++)printf(“%d\n”,f(a));return0;}intf(inta){autointb=0;
staticc=3;b=b+1;c=c+1;return(a+b+c);}bc第三次調(diào)用結(jié)束169第140頁(yè)
例7.16考查靜態(tài)局部變量值。#include<stdio.h>intmain(){intf(int);inta=2,i;for(i=0;i<3;i++)printf(“%d\n”,f(a));return0;}intf(inta){autointb=0;
staticc=3;b=b+1;c=c+1;return(a+b+c);}c整個(gè)程序結(jié)束6第141頁(yè)
例7.16考查靜態(tài)局部變量值。#include<stdio.h>intmain(){intf(int);inta=2,i;for(i=0;i<3;i++)printf(“%d\n”,f(a));return0;}intf(inta){autointb=0;
staticc=3;b=b+1;c=c+1;return(a+b+c);}在編譯時(shí)賦初值在函數(shù)調(diào)用時(shí)賦初值第142頁(yè)
例7.16考查靜態(tài)局部變量值。#include<stdio.h>intmain(){intf(int);inta=2,i;for(i=0;i<3;i++)printf(“%d\n”,f(a));return0;}intf(inta){autointb=0;
staticc=3;b=b+1;c=c+1;return(a+b+c);}若不賦初值,是0若不賦初值,不確定第143頁(yè)
例7.16考查靜態(tài)局部變量值。#include<stdio.h>intmain(){intf(int);inta=2,i;for(i=0;i<3;i++)printf(“%d\n”,f(a));return0;}intf(inta){autointb=0;
staticc=3;b=b+1;c=c+1;return(a+b+c);}作用域:僅在本函數(shù)內(nèi)有效生存期:整個(gè)程序運(yùn)行期間在該函數(shù)外不能引用靜態(tài)局部變量c第144頁(yè)例7.17輸出1到5階乘值。解題思緒:能夠編一個(gè)函數(shù)用來(lái)進(jìn)行連乘,如第1次調(diào)用時(shí)進(jìn)行1乘1,第2次調(diào)用時(shí)再乘以2,第3次調(diào)用時(shí)再乘以3,依此規(guī)律進(jìn)行下去。當(dāng)需要保留函數(shù)上一次調(diào)用結(jié)束是值時(shí),能夠使用局部靜態(tài)變量。例7.17第145頁(yè)#include<stdio.h>intmain(){intfac(intn);inti;for(i=1;i<=5;i++)printf(“%d!=%d\n”,i,fac(i));return0;}intfac(intn){staticintf=1;f=f*n;return(f);}若非必要,不要多用靜態(tài)局部變量第146頁(yè)3.存放器變量(register變量)普通情況下,變量(包含靜態(tài)存放方式和動(dòng)態(tài)存放方式)值是存放在內(nèi)存中存放器變量允許將局部變量值放在CPU中存放器中?,F(xiàn)在計(jì)算機(jī)能夠識(shí)別使用頻繁變量,從而自動(dòng)地將這些變量放在存放器中,而不需要程序設(shè)計(jì)者指定。第147頁(yè)7.9.3全局變量存放類別全局變量都是存放在靜態(tài)存放區(qū)中。所以它們生存期是固定,存在于程序整個(gè)運(yùn)行過(guò)程一般來(lái)說(shuō),外部變量是在函數(shù)外部定義全局變量,它作用域是從變量定義處開(kāi)始,到本程序文件末尾。在此作用域內(nèi),全局變量可認(rèn)為程序中各個(gè)函數(shù)所引用。第148頁(yè)擴(kuò)展外部變量作用域(extern或static)在一個(gè)文件內(nèi)擴(kuò)展外部變量作用域假如用關(guān)鍵字extern對(duì)某變量作“外部變量申明”,則能夠從“申明”處起,正當(dāng)?shù)厥褂迷撏獠孔兞俊5?49頁(yè)例7.18
調(diào)用函數(shù),求3個(gè)整數(shù)中大者。#include<stdio.h>intmain(){intmax();
externintA,B,C;//外部變量申明
scanf(“%d%d%d”,&A,&B,&C);printf("maxis%d\n",max());return0;}
intA,B,C;
//定義外部變量intmax(){intm;m=A>B?A:B;if(C>m)m=C;return(m);}外部變量A、B、C作用域。若無(wú)此申明,則A、B、C作用域從定義處開(kāi)始。第150頁(yè)2.將外部變量作用域擴(kuò)展到其它文件假如一個(gè)程序包含兩個(gè)文件,在兩個(gè)文件中都要用到同一個(gè)外部變量Num,不能分別在兩個(gè)文件中各自定義一個(gè)外部變量Num,不然會(huì)出現(xiàn)錯(cuò)誤。應(yīng)在任一個(gè)文件中定義外部變量Num,而在另一文件中用extern
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024美發(fā)店與消防部門安全檢查合同
- 2025年度校園食堂廚師勞務(wù)派遣合同4篇
- 2025年度圖書(shū)代售及推廣服務(wù)合同4篇
- 2024碎石原料交易市場(chǎng)建設(shè)合同
- 2024裝修工程額外項(xiàng)目合同書(shū)一
- 2025年度智慧城市建設(shè)綜合解決方案承包合作協(xié)議4篇
- 2025年度SEO風(fēng)險(xiǎn)管理與合規(guī)性審核合同3篇
- 2025年度山林土地流轉(zhuǎn)與綜合開(kāi)發(fā)承包合同4篇
- 2024正規(guī)商鋪買賣合同合同標(biāo)的物權(quán)屬核實(shí)協(xié)議3篇
- 2024年教學(xué)專用高清晰度數(shù)碼集成背投行業(yè)發(fā)展趨勢(shì)報(bào)告
- 《呼吸衰竭的治療》
- 有余數(shù)的除法算式300題
- 2024年度醫(yī)患溝通課件
- 2024年中考政治總復(fù)習(xí)初中道德與法治知識(shí)點(diǎn)總結(jié)(重點(diǎn)標(biāo)記版)
- 2024年手術(shù)室的應(yīng)急預(yù)案
- 五年級(jí)上冊(cè)小數(shù)除法豎式計(jì)算練習(xí)300題及答案
- 【外資便利店在我國(guó)的經(jīng)營(yíng)策略分析案例:以日本羅森便利店為例11000字(論文)】
- 6061鋁合金退火工藝
- 教師職業(yè)素養(yǎng)與職業(yè)發(fā)展規(guī)劃
- 語(yǔ)言規(guī)劃講義
- Talent5五大職業(yè)性格測(cè)試技巧138答案
評(píng)論
0/150
提交評(píng)論