版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第7章用函數(shù)實現(xiàn)模塊化程序設(shè)計7.1為什么要用函數(shù)
7.2怎樣定義函數(shù)7.3調(diào)用函數(shù)7.4對被調(diào)用函數(shù)的聲明和函數(shù)原型7.5函數(shù)應(yīng)用舉例7.6
函數(shù)的嵌套、遞歸調(diào)用7.7數(shù)組作為函數(shù)參數(shù)
7.8局部變量和全局變量*7.9變量的存儲方式和生存期*7.10內(nèi)部函數(shù)和外部函數(shù)7.1為什么要用函數(shù)問題:如果程序的功能比較多,規(guī)模比較大,把所有代碼都寫在main函數(shù)中,就會使主函數(shù)變得龐雜、頭緒不清,閱讀和維護變得困難有時程序中要多次實現(xiàn)某一功能,就需要多次重復編寫實現(xiàn)此功能的程序代碼,這使程序冗長,不精煉
一個c程序可由一個主函數(shù)和若干個函數(shù)構(gòu)成。 由主函數(shù)調(diào)用其他函數(shù),其他函數(shù)也可互相調(diào)用。 同一個函數(shù)可以被一個或多個函數(shù)調(diào)用任意多次。例如:7.1為什么要用函數(shù)例:voidprintstar(){printf(“******************\n”);}
voidprint_message(){printf(“Howdoyoudo!\n”);}voidmain(){print_message();printstar();}6點說明:1、一個源程序文件由一個或多個函數(shù)組成。一個源程序文件是一個編譯單位。2、一個c程序由一個或多個源程序文件組成。3、c程序的執(zhí)行從main函數(shù)開始,調(diào)用其他函數(shù)后,流程回到main函數(shù),在main函數(shù)結(jié)束整個函數(shù)的運行。4、所有函數(shù)在定義時都是互相獨立的,一個函數(shù)并不從屬于另一函數(shù),即不能嵌套定義,函數(shù)間可以互相調(diào)用,但不能調(diào)用main函數(shù)。5、從用戶角度看,函數(shù)分為兩種:(1)標準函數(shù),即庫函數(shù)。由系統(tǒng)提供。(2)用戶自定義函數(shù),用來解決用戶的專門需要。6、從函數(shù)形式看,函數(shù)分為兩種:(1)無參函數(shù)。(2)有參函數(shù)。1、無參函數(shù)的定義形式
類型標識符函數(shù)名()
{聲明部分語句}2、有參函數(shù)定義的一般形式
類型標識符函數(shù)名(形參表列)
{聲明部分語句}7.2怎樣定義函數(shù)無參函數(shù):voidprintstar(){printf(“******************\n”);}voidprint_message(){printf(“Howdoyoudo!\n”);}voidmain(){print_message();printstar();}voidmain(){inta,b,c;scanf(“%d,%d”,&a,&b);c=max(a,b);printf(“c=%d\n”,c);
}intmax(intx,inty){intz;if(x>y)z=x;elsez=y;return(z);}實參形參有參函數(shù):7.3.1函數(shù)調(diào)用形式
格式:
函數(shù)名(實參表列);說明:各實參間用逗號格開。實參與形參的個數(shù)應(yīng)相同,類型應(yīng)一致。7.3調(diào)用函數(shù)按出現(xiàn)的位置分,有如下三種函數(shù)調(diào)用方式:
1、函數(shù)語句。
如:“printstar();”。函數(shù)不帶回值,只完成一定的操作。
2、函數(shù)表達式。
如:“c=2*max(a,b);”。要求函數(shù)帶回確定值,參加表達式運算。
3、函數(shù)參數(shù)。
如:“m=max(c,max(a,b));”
又如:
“printf(“%d”,max(a,b));”
其中函數(shù)max(a,b)作為一個參數(shù)。1、形參只在調(diào)用時分配內(nèi)存單元,調(diào)用結(jié)束,被釋放。2、形參、實參個數(shù)、類型、順序必須一致。關(guān)于形參與實參的5點說明:7.3.2函數(shù)參數(shù)和返回值3、參數(shù)傳遞單向,值傳遞。實參形參,不能由形參傳回來給實參。
(一)形式參數(shù)與實際參數(shù)4、實參可以是常量、變量或表達式,必須有確定的值。在調(diào)用時,將實參的值賦給形參變量。例:max(3,a+b);5、在被定義的函數(shù)中,必須指定形參類型。(二)函數(shù)的返回值
對函數(shù)值的說明:
1、函數(shù)返回值是通過函數(shù)中的return語句獲得的。若不需要從被調(diào)用函數(shù)帶回函數(shù)值,可以不要return語句。
2、定義函數(shù)時要指定函數(shù)的類型。一般應(yīng)與return語句中的表達式類型一致。如:intmax(x,y) 函數(shù)值為整型
charletter(c1,c2) 函數(shù)值為字符型 凡不加說明的函數(shù),自動按整型處理。
3、為了明確表示“不帶回值”,可以用“void”定義“無類型”(或稱“空類型”)。如
voidprintstar(){……}
這樣,系統(tǒng)就保證不使函數(shù)帶回任何值。此時使用:“a=printstar();”就是錯的。7.4對被調(diào)用函數(shù)的聲明和函數(shù)原型在一個函數(shù)中調(diào)用另一個函數(shù)需要具備如下條件:(1)被調(diào)用函數(shù)必須是已經(jīng)定義的函數(shù)(是庫函數(shù)或用戶自己定義的函數(shù))(2)如果使用庫函數(shù),應(yīng)該在本文件開頭加相應(yīng)的#include指令(3)如果使用自己定義的函數(shù),而該函數(shù)的位置在調(diào)用它的函數(shù)后面,應(yīng)該聲明。(即向編譯系統(tǒng)聲明將要調(diào)用此函數(shù),并將有關(guān)信息通知編譯系統(tǒng)。)例:voidmain(){floatadd(floatx,floaty);//對被調(diào)函數(shù)聲明*/
floata,b,c;scanf(“%f,%f”,&a,&b);c=add(a,b);printf(“Sumis%f\n”,c);}floatadd(floatx,floaty)//add函數(shù)首部{floatz;//函數(shù)體
z=x+y;return(z);}在函數(shù)聲明中也可以不寫形參名,只寫形參的類型。如:
floatadd(float,float);
以上的函數(shù)聲明稱為函數(shù)原型(functionprototype)。
函數(shù)原型的一般形式為:
函數(shù)類型函數(shù)名(參數(shù)類型1,參數(shù)類型,…...);7.5函數(shù)應(yīng)用舉例
例1:打印:****************************hello!****************************voidprintstar(){printf(“******************\n”);}
voidprint_message(){printf(“****hello!****\n”);}voidmain(){printstar();print_message();printstar();}例2:求n!
LI8_N!.Cdoublejie(intx){inti;doublek=1;for(i=1;i<=x;i++)k=k*i;return(k);}voidmain(){doublejie(intx);intn;doublejc;scanf("%d",&n);jc=jie(n);printf("jc=%e\n",jc);}
練習:求Cnmdoublefac(intn) {inti;doublek=1;for(i=1;i<=n;i++)k*=i;return(k);}voidmain(){intn=5,m=3;doublecnm;
cnm=fac(n)*fac(m)/fac(n-m);printf(“\n%d\n”,cnm);}練習:求1!+2!+3!+…+n!
li8_nhe.cdoublejch(intx){inti;doublek=1;for(i=1;i<=x;i++){k=k*i;}return(sum);}voidmain(){intn;doublejc;scanf("%d",&n);jc=jch(n);printf("jc=%e\n",jc);},sum=0sum=sum+k;?
prime(?){inti;for(i=2;i<m;i++)if(m%i==0)return0;return1;}intmint例3:判斷一個數(shù)是否素數(shù)。voidmain(){intn,k;scanf(“%d”,&n);k=prime(n)if(k==1)printf(“%d是素數(shù)。\n”,n);elseprintf(“%d不是素數(shù)。\n”,n);}(一)函數(shù)的嵌套調(diào)用
C語言不能嵌套定義函數(shù),但可以嵌套調(diào)用函數(shù),即允許在調(diào)用一個函數(shù)的過程中,又調(diào)用另一個函數(shù)。例如:main函數(shù)a函數(shù)b函數(shù)①②③④調(diào)用a函數(shù)調(diào)用b函數(shù)⑤⑨⑧⑦⑥結(jié)束7.6函數(shù)的嵌套、遞歸調(diào)用(二)函數(shù)的遞歸調(diào)用
在調(diào)用一個函數(shù)的過程中,又出現(xiàn)直接或間接地調(diào)用該函數(shù)本身,稱為函數(shù)的遞歸調(diào)用。如下是直接調(diào)用本身:
intf(x) intx; {inty,z;
….. z=f(y);
….. return(2*z); }間接調(diào)用本身:intf1(x)intf2(t)intx;intt;{inty,z;{inta,c;
……
……z=f2(y);c=f1(c);
……
……return(2*z);return(3+c);}}voidage(intn){intc;
if(n==1)c=10;elsec=age(n-1)+2;return(c);}voidmain(){printf(“%d”,age(5));}例4:age(5)=?依次比前一個人大2歲,第1個人2歲。age(n)=10(n=1)C8_7.c
age(n)=age(n-1)+2(n>1)例5:用遞歸法求n!C8_8.cfloatfac(intn){floatf;if(n==0||n==1)f=1;elsef=fac(n-1)*n;return(f);}voidmain(){intn;floaty;scanf(“%d”,&n);y=fac(n);rintf(“%d!=%15.0f”,n,y);}
(一)數(shù)組元素作為函數(shù)實參
數(shù)組元素作為函數(shù)實參,與變量作實參一樣,是單向傳遞,即值傳遞方式。
(二)數(shù)組名作為函數(shù)實參
說明:(1)形參數(shù)組與實參數(shù)組類型一致。(2)把實參數(shù)組首地址傳給形參。7.7數(shù)組作為函數(shù)參數(shù)例6:求10個學生的平均成績。C8_11.cfloataverage(floatarray[10]){inti;floataver,sum=array[0];for(i=1;i<10;i++) sum=sum+array[i];aver=sum/10;return(aver);}
例6:求10個學生的平均成績。C8_11.cvoidmain(){floatscore[10],aver;inti;printf(“input10score:\n”);for(i=0;i<10;i++)scanf(“%f”,&score[i]);printf(“\n”);aver=average(score);printf(“averagescoreis%5.2f”,aver);}說明:1、數(shù)組名做函數(shù)參數(shù)時,不是“值傳送”,而是把實參數(shù)組的起始地址傳遞給形參數(shù)組,兩個數(shù)組共占同一段內(nèi)存單元。這種傳遞方式叫“地址傳送”。當形參數(shù)組中元素值變化時,實參數(shù)組的對應(yīng)元素值也要發(fā)生相同變化。 這與變量做函數(shù)參數(shù)時不同。
2、形參數(shù)組可以不指定大小,可另設(shè)一個參數(shù),傳遞數(shù)組元素個數(shù)。例6:求10個學生的平均成績。floataverage(floatarray[],intn){inti;floataver,sum=array[0];for(i=1;i<n;i++) sum=sum+array[i];aver=sum/n;return(aver);}例6:求10個學生的平均成績。voidmain(){floatscore[10],aver;inti;printf(“input10score:\n”);for(i=0;i<10;i++)scanf(“%f”,&score[i]);printf(“\n”);
//此處調(diào)用函數(shù)
printf(“averagescoreis%5.2f”,aver);}aver=average(score,10);練習:數(shù)組排序C8_13.cvoidsort(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;}練習:數(shù)組排序C8_13.cvoidmain(){inta[10],i;printf(“enterthearray:\n”);for(i=0;i<10;i++)scanf(“%d”,&a[i]);
//此處調(diào)用函數(shù)printf(“thesortedarray:\n”);for(i=0;i<10;i++)printf(“%d”,a[i]);printf(“\n”);}sort(a,10);(三)用多維數(shù)組作函數(shù)參數(shù)
說明:可以用多維數(shù)組元素作實參。可以用多維數(shù)組元素名作實參和形參。在被調(diào)函數(shù)中對形參數(shù)組定義時可以指定每一維的大小,也可以省略第一維的大小,如:
intarray[3][10];寫為intarray[][10];注意:第二維及其它高維的大小,不能省略。
練習:有3×4的矩陣,求其中的最大元素。C8_14.cintmax_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);練習:有3×4的矩陣,求其中的最大元素。C8_14.cvoidmain(){int[3][4]={{1,3,5,7},{2,4,6,8},{15,17,34,12}};printf(“Maxvalueis%d\n”,);}max_value(a)局部變量:函數(shù)內(nèi)部定義的變量,只在本函數(shù)內(nèi)部有效。內(nèi)部變量全局變量:在函數(shù)之外定義的變量,也叫外部變量。有效范圍:從定義變量位置開始到本源文件結(jié)束。外部變量7.8局部變量和全局變量intp=1,q=5;floatf1(inta){intb,c;┊}charc1,c2;charf2(intx,inty){inti,j;┊}voidmain(){intm,n;┊}全局變量c1,c2的作用范圍
全局變量p,q的作用范圍
例7:求兩個數(shù)最大值。C1_3.cvoidmain(){inta,b,c;scanf("%d,%d",&a,&b);c=max(a,b);printf(“c=%d\n",c);
}intmax(intx,inty){intz;if(x>y)z=x;elsez=y;return(z);}
如果在同一源文件中,外部變量與局部變量同名,則在局部變量的作用范圍內(nèi),外部變量被“屏蔽”,不起作用。C8_16.cinta=3,b=5; /*a,b為外部變量*/intmax(inta,intb)/*a,b為形參(局部變量)*/{intc;c=a>b?a:b;return(c);}voidmain(){inta=8;/*a為局部變量*/printf(“%d”,max(a,b));}形參a、b的作用范圍運行結(jié)果為8
說明:1、使用全局變量可減少形參和實參的個數(shù),減少內(nèi)存空間。
2、全局變量會使函數(shù)通用性降低,會降低程序的清晰性。
3、全局變量在程序的全部執(zhí)行過程中都占用存儲單元。
4、同一源文件中,全局變量與局部變量重名,則在局部變量范圍內(nèi),全局變量不起作用。floatMax,Min; /*定義兩個全局變量*/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);}例8:10個學生成績,求平均分、最高分、最低分。C8_15.c
voidmain(){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);}思考:用全局變量實現(xiàn)求1!+2!+3!+…+n!的和。
li8_nhe.c練習:編程兩個函數(shù),分別求兩個正整數(shù)的最大公約數(shù)與最小公倍數(shù),用主函數(shù)調(diào)用這兩個函數(shù),并輸出結(jié)果,兩個正整數(shù)由鍵盤輸入。
要求:(1)不用全局變量,用函數(shù)值返回求最大公約數(shù)與最小公倍數(shù)。Gygbj.c
(2)用全局變量的方法,分別用兩個函數(shù)求出最大公約數(shù)與最小公倍數(shù),其值不用函數(shù)值帶回。將最大公約數(shù)與最小公倍數(shù)定義為全局變量,再主函數(shù)中輸出它們的值。Gygbq.c
1、動態(tài)存儲方式和靜態(tài)存儲方式
靜態(tài)存儲方式:在程序運行期間分配固定存儲單元的方式。動態(tài)存儲方式:在程序運行期間根據(jù)需要動態(tài)分配存儲單元的方式。
變量動態(tài)存儲方式變量靜態(tài)存儲方式變量生存期角度7.9變量的存儲方式和生存期程序區(qū)
靜態(tài)存儲區(qū)
動態(tài)存儲區(qū)
用戶區(qū)主要存放全局變量和靜態(tài)局部變量.程序開始運行時分配空間,運行結(jié)束時釋放。主要存放(1)函數(shù)形參變量(2)自動變量(未加static說明的局部變量)。(3)函數(shù)調(diào)用時的現(xiàn)場保護和返回地址。在函數(shù)調(diào)用開始時分配動態(tài)存儲空間,函數(shù)調(diào)用結(jié)束時釋放這些空間。
2、局部變量的存儲方式
每個局部變量在定義時可以指定其存儲方式,即對每個局部變量的定義除定義其數(shù)據(jù)類型外,還應(yīng)定義其存儲方式。定義存儲方式用auto(自動的)static(靜態(tài)的)。如:
intf1()intf2(){autointa=1;{staticintb=1;┊┊}}
缺省時為auto
動態(tài)局部變量在函數(shù)調(diào)用時分配、賦初值,調(diào)用結(jié)束時釋放。
靜態(tài)局部變量在第一次調(diào)用時分配、賦初值,調(diào)用結(jié)束時不釋放,其單元及其值仍保留,下次調(diào)用時不重新分配,不重新賦初值。在實際應(yīng)用中,如果希望在函數(shù)調(diào)用結(jié)束后仍保留某個局部變量的值給下次調(diào)用時使用,則可定義該變量為靜態(tài)的。
intf(inta){autointb=0;staticintc=3;b=b+1;c=c+1; return(a+b+c);}voidmain(){inta=2,i;for(i=0;i<3;i++)printf(“%d”
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 造紙廠原材料采購合同
- 車業(yè)租賃合同范文
- 農(nóng)村菜地維修合同范文
- 代班勞動合同范文模板
- 儒房地產(chǎn)合同范本
- 幼兒風箏課程設(shè)計模板
- 幼兒英語 在線課程設(shè)計
- 小班彩泥教學課程設(shè)計
- 彩色的秋天課程設(shè)計
- 關(guān)于月季的課程設(shè)計
- (完整)知識產(chǎn)權(quán)法考試題題庫(含答案)
- 文件袋、檔案袋密封條模板
- 電動葫蘆吊裝施工方案
- 校本課程《典籍里的中國》教案
- 最新汽車租賃管理制度
- CNAS-CV03-2022 溫室氣體 第三部分 溫室氣體聲明審定與核查規(guī)范和指南
- 思想政治教育學原理整套課件完整版電子教案課件匯總(最新)
- GB 40560-2021 人民幣現(xiàn)金機具鑒別能力技術(shù)規(guī)范
- 10t單梁起重機安裝方案
- 醫(yī)院支氣管鏡檢查及治療知情同意書
- 住宿業(yè)疫情防控應(yīng)急預案(通用25篇)
評論
0/150
提交評論