第八章 函數(shù)、用戶標(biāo)識符的作用域和存儲類_第1頁
第八章 函數(shù)、用戶標(biāo)識符的作用域和存儲類_第2頁
第八章 函數(shù)、用戶標(biāo)識符的作用域和存儲類_第3頁
第八章 函數(shù)、用戶標(biāo)識符的作用域和存儲類_第4頁
第八章 函數(shù)、用戶標(biāo)識符的作用域和存儲類_第5頁
已閱讀5頁,還剩56頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

C是模塊化程序設(shè)計語言,C程序結(jié)構(gòu),第八章函數(shù)和標(biāo)識符作用域、存儲類,8.1概述模塊化程序設(shè)計基本思想:將一個大的程序按功能分割成一些小模塊特點:各模塊相對獨立、功能單一、結(jié)構(gòu)清晰控制了程序設(shè)計的復(fù)雜性避免程序開發(fā)的重復(fù)勞動易于維護和功能擴充開發(fā)方法:自上向下,逐步分解,分而治之,C是函數(shù)式語言必須有且只能有一個名為main的主函數(shù)C程序的執(zhí)行總是從main函數(shù)開始,在main中結(jié)束函數(shù)不能嵌套定義,可以嵌套調(diào)用,說明:,函數(shù)分類從用戶角度標(biāo)準函數(shù)(庫函數(shù)):由系統(tǒng)提供用戶自定義函數(shù)從函數(shù)形式無參函數(shù)有參函數(shù),Ch7_201.c,8.2函數(shù)的定義一般格式,合法標(biāo)識符,函數(shù)返回值類型缺省int型無返回值void,函數(shù)體,例無參函數(shù)printstar()printf(“*n”);或printstar()printf(“*n”);,例有參函數(shù)(傳統(tǒng)風(fēng)格)intmax(x,y)intx,y;intz;z=xy?x:y;return(z);,例比較兩個數(shù)并輸出大者,main()inta,b,c;scanf(%d,%d,8.3函數(shù)參數(shù)和返回值形參與實參形式參數(shù):定義函數(shù)時函數(shù)名后面括號中的變量名實際參數(shù):調(diào)用函數(shù)時函數(shù)名后面括號中的表達式,說明:實參必須有確定的值形參必須指定類型形參與實參類型一致,個數(shù)相同若形參與實參類型不一致,自動按形參類型轉(zhuǎn)換函數(shù)調(diào)用轉(zhuǎn)換形參在函數(shù)被調(diào)用前不占內(nèi)存;函數(shù)調(diào)用時為形參分配內(nèi)存;調(diào)用結(jié)束,內(nèi)存釋放,8.3函數(shù)參數(shù)和返回值形參與實參形式參數(shù):定義函數(shù)時函數(shù)名后面括號中的變量名實際參數(shù):調(diào)用函數(shù)時函數(shù)名后面括號中的表達式,例計算x的立方,#includefloatcube(floatx)return(x*x*x);main()floata,product;printf(Pleaseinputvalueofa:);scanf(%f,x,1.2,1.2,1.728,參數(shù)傳遞方式值傳遞方式方式:函數(shù)調(diào)用時,為形參分配單元,并將實參的值復(fù)制到形參中;調(diào)用結(jié)束,形參單元被釋放,實參單元仍保留并維持原值特點:形參與實參占用不同的內(nèi)存單元單向傳遞,例交換兩個數(shù),/*ch7_2.c*/#includemain()intx=7,y=11;printf(x=%d,ty=%dn,x,y);printf(swapped:n);swap(x,y);printf(x=%d,ty=%dn,x,y);swap(inta,intb)inttemp;temp=a;a=b;b=temp;,返回語句形式:return(表達式);或return表達式;功能:使程序控制從被調(diào)用函數(shù)返回到主調(diào)函數(shù)中,同時把返回值帶給主調(diào)函數(shù)說明:函數(shù)中可有多個return語句若無return語句,遇時,自動返回調(diào)用函數(shù)若函數(shù)類型與return語句中表達式值的類型不一致,按前者為準,自動轉(zhuǎn)換void型函數(shù),例無返回值函數(shù)voidswap(intx,inty)inttemp;temp=x;x=y;y=temp;,printstar()printf(*);main()inta;a=printstar();printf(%d,a);,例函數(shù)帶回不確定值,輸出:10,voidprintstar()printf(*);main()inta;a=printstar();printf(%d,a);,編譯錯誤!,例函數(shù)返回值類型轉(zhuǎn)換,main()floata,b;intc;scanf(%f,%f,8.4函數(shù)的調(diào)用調(diào)用形式函數(shù)名(實參表);說明:實參與形參個數(shù)相等,類型一致,按順序一一對應(yīng)實參表求值順序,因系統(tǒng)而定(TurboC自右向左),main()inti=2,p;p=f(i,+i);printf(%d,p);intf(inta,intb)intc;if(ab)c=1;elseif(a=b)c=0;elsec=-1;return(c);,例參數(shù)求值順序,main()inti=2,p;p=f(i,i+);printf(%d,p);intf(inta,intb)intc;if(ab)c=1;elseif(a=b)c=0;elsec=-1;return(c);,運行結(jié)果:0,運行結(jié)果:1,調(diào)用方式函數(shù)語句:例printstar();printf(“Hello,World!n”);函數(shù)表達式:例m=max(a,b)*2;函數(shù)參數(shù):例printf(“%d”,max(a,b);m=max(a,max(b,c);,函數(shù)說明對被調(diào)用函數(shù)要求:必須是已存在的函數(shù)庫函數(shù):#include用戶自定義函數(shù):函數(shù)類型說明,使用庫函數(shù)應(yīng)注意:1、函數(shù)功能2、函數(shù)參數(shù)的數(shù)目和順序,及各參數(shù)意義和類型3、函數(shù)返回值意義和類型4、需要使用的包含文件,函數(shù)聲明一般形式函數(shù)類型函數(shù)名(形參類型形參名,.);作用:告訴編譯系統(tǒng)函數(shù)類型、參數(shù)個數(shù)及類型,以便檢驗函數(shù)定義與函數(shù)說明不同函數(shù)說明位置:程序的數(shù)據(jù)說明部分(函數(shù)內(nèi)或外)下列情況下,可不作函數(shù)說明若函數(shù)返值是char或int型,系統(tǒng)自動按int型處理被調(diào)用函數(shù)定義出現(xiàn)在主調(diào)函數(shù)之前,例函數(shù)說明舉例,/*ch7_5.c*/main()floatadd(float,float);/*functiondeclaration*/floata,b,c;scanf(%f,%f,8.5函數(shù)的嵌套與遞歸調(diào)用嵌套調(diào)用C規(guī)定:函數(shù)定義不可嵌套,但可以嵌套調(diào)用函數(shù),例求三個數(shù)中最大數(shù)和最小數(shù)的差值,#includeintdif(intx,inty,intz);intmax(intx,inty,intz);intmin(intx,inty,intz);voidmain()inta,b,c,d;scanf(%d%d%d,Ch7_202.c,intdif(intx,inty,intz)returnmax(x,y,z)-min(x,y,z);intmax(intx,inty,intz)intr;r=xy?x:y;return(rz?r:z);intmin(intx,inty,intz)intr;r=xy?x:y;return(rz?r:z);,例用弦截法求方程根,運行情況:Inputx1,x2:2,6Arootofequationis5.0000,遞歸調(diào)用定義:函數(shù)直接或間接的調(diào)用自身叫函數(shù)的遞歸調(diào)用,intf(intx)inty,z;z=f(y);.return(2*z);,例求n的階乘,/*ch7_8.c*/#includeintfac(intn)intf;if(nbi,ai=bi,aik,認為數(shù)組ab若nk,認為數(shù)組ab若n=k,認為數(shù)組a=b,數(shù)組名作函數(shù)參數(shù)地址傳遞在主調(diào)函數(shù)與被調(diào)函數(shù)分別定義數(shù)組,且類型應(yīng)一致形參數(shù)組大小(多維數(shù)組第一維)可不指定形參數(shù)組名是地址變量,例求學(xué)生的平均成績,#includefloataverage(intstu10,intn);voidmain()intscore10,i;floatav;printf(Input10scores:n);for(i=0;i10;i+)scanf(%d,floataverage(intstu10,intn)inti;floatav,total=0;for(i=0;in;i+)total+=stui;av=total/n;returnav;,實參用數(shù)組名,形參用數(shù)組定義,intstu,例數(shù)組元素與數(shù)組名作函數(shù)參數(shù)比較,#includevoidswap2(intx,inty)intz;z=x;x=y;y=z;main()inta2=1,2;swap2(a0,a1);printf(a0=%dna1=%dn,a0,a1);,值傳遞,#includevoidswap2(intx)intz;z=x0;x0=x1;x1=z;main()inta2=1,2;swap2(a);printf(a0=%dna1=%dn,a0,a1);,地址傳遞,例數(shù)組元素與數(shù)組名作函數(shù)參數(shù)比較,例數(shù)組排序-簡單選擇排序,9,49,i=0,例數(shù)組排序-簡單選擇排序,13,68,i=1,i=8,例數(shù)組排序-簡單選擇排序,例求二維數(shù)組中最大元素值,intmax_value(intarray34)inti,j,k,max;max=array00;for(i=0;imax)max=arrayij;return(max);main()inta34=1,3,5,7,2,4,6,8,15,17,34,12;printf(maxvalueis%dn,max_value(a);,例求二維數(shù)組中各行元素之和,get_sum_row(intx3,intresult,introw,intcol)inti,j;for(i=0;irow;i+)resulti=0;for(j=0;jcol;j+)resulti+=xij;main()inta23=3,6,9,1,4,7;intsum_row2,row=2,col=3,i;get_sum_row(a,sum_row,row,col);for(i=0;i,外部變量與局部變量同名,則外部變量被屏蔽應(yīng)盡量少使用全局變量,因為:,floatmax,min;floataverage(floatarray,intn)inti;floatsum=array0;max=min=array0;for(i=1;imax)max=arrayi;elseif(arrayimin)min=arrayi;sum+=arrayi;return(sum/n);main()inti;floatave,score10;/*Input*/ave=average(score,10);printf(max=%6.2fnmin=%6.2fnaverage=%6.2fn,max,min,ave);,運行結(jié)果:max=8,inti;main()voidprt();for(i=0;iy?x:y;return(z);main()externinta,b;printf(max=%d,max(a,b);inta=13,b=-8;,運行結(jié)果:max=13,externinta,b;intmax()intz;z=ab?a:b;return(z);main()printf(max=%d,max();inta=13,b=-8;,變量的屬性小結(jié)數(shù)據(jù)類型:變量所持有的數(shù)據(jù)的性質(zhì)(操作屬性)存儲屬性存儲器類型:寄存器、靜態(tài)存儲區(qū)、動態(tài)存儲區(qū)生存期:變量在某一時刻存在-靜態(tài)變量與動態(tài)變量作用域:變量在某區(qū)域內(nèi)有效-局部變量與全局變量,變量存儲類型,局部變量默認為auto型register型變量個數(shù)受限,且不能為long,double,float型局部static變量具有全局壽命和局部可見性局部static變量具有可繼承性extern不是變量定義,可擴展外部變量作用域,例文件file1.cinta;main().f2;.f1;.f1()autointb;f2;.f2()staticintc;,例auto變量的作用域,main()intx=1;voidprt(void);intx=3;prt();printf(“2ndx=%dn”,x);printf(“1stx=%dn”,x);voidprt(void)intx=5;printf(“3thx=%dn”,x);,運行結(jié)果:3thx=52ndx=31stx=1,main()voidincrement(void);increment();increment();increment();voidincrement(void)intx=0;x+;printf(“%dn”,x);,例局部靜態(tài)變量值具有可繼承性,運行結(jié)果:111,main()voidincrement(void);increment();increment();increment();voidincrement(void)staticintx=0;x+;printf(“%dn”,x);,運行結(jié)果:123,例變量的壽命與可見性,#includeinti=1;main()staticinta;registerintb=-10;intc=0;printf(-MAIN-n);printf(i:%da:%db:%dc:%dn,i,a,b,c);c=c+8;other();printf(-MAIN-n);printf(i:%da:%db:%dc:%dn,i,a,b,c);i=i+10;other();,other()staticinta=2;staticintb;intc=10;a=a+2;i=i+32;c=c+5;printf(-OTHER-n);printf(i:%da:%db:%dc:%dn,i,a,b,c);b=a;,-Main-i:1a:0b:-10c:0,-Other-i:33a:4b:0c:15,-Main-i:33a:0b:-10c:8,-Other-i:75a:6b:4c:15,8,4,33,15,4,43,6,75,15,6,main()voidgx(),gy();externintx,y;printf(“1:x=%dty=%dn”,x,y);y=246;gx();gy();voidgx()externintx,y;x=135;printf(“2

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論