版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第六章函數(shù)為何要使用函數(shù)?函數(shù)怎樣定義和調用?函數(shù)參數(shù)怎樣傳遞?怎樣取得函數(shù)返回值?怎樣使用局部變量與全局變量?變量有幾個存放類型?C提供預處理功效主要有哪幾個?怎樣定義帶參數(shù)宏?第1頁本章內容6.1問題提出與程序示例6.2函數(shù)定義與調用6.3函數(shù)參數(shù)傳遞與返回值6.4變量作用域和存放類型6.5編譯預處理6.6函數(shù)應用舉例*6.7函數(shù)嵌套與遞歸調用第2頁6.1問題提出與程序示例
為何要使用函數(shù)?大型程序多人合作模塊化,功效清楚,便于編寫、閱讀和調試降低重復編寫工作量,如第3頁#include<stdio.h>longfactorial(intx)/*定義函數(shù)factorial計算n階乘*/{ inti;longresult=1; for(i=2;i<=x;i++) result*=i;returnresult;
/*將result作為factorial函數(shù)值返回到主調函數(shù)中*/}第4頁voidmain(){intm,n;longc;printf("Pleaseinputm,n:");scanf("%d,%d",&m,&n);
c=factorial(m)/(factorial(n)*factorial(m-n));/*調用函數(shù)factorial并作為運算對象*/ printf(“c=%ld\n”,c);}第5頁例2:doubleadd(doublea,doubleb){doubles;s=a+b;returns;}voidmain(){……x=add(3.0,4.0);for(y=0,i=1;i<=5;i++) y=add(y,i);}函數(shù)參數(shù)實際值代入這是函數(shù)返回值第6頁例3:計算1!+2!+3!+……+n!用函數(shù)完成#include“stdio.h”intfun(intn){ints=0,t=1;inti;for(i=1;i<=n;i++){t=t*i;s=s+t;}return(s);}voidmain(){intn;ints=0;scanf(“%d”,&n);s=fun(n);printf(“s=%d\n”,s);}第7頁6.2函數(shù)定義與調用6.2.1函數(shù)分類函數(shù)定義角度(1)庫函數(shù)
庫函數(shù)是由C系統(tǒng)提供,能夠直接使用它們。如:scanf,printf,getchar,putchar等。(2)用戶自定義函數(shù)
用戶自定義函數(shù)就是由用戶自己定義和設計函數(shù)。從主調函數(shù)和被調函數(shù)之間數(shù)據(jù)傳遞角度分為:(1)無參函數(shù)(2)有參函數(shù)第8頁6.2函數(shù)定義與調用
6.2.2函數(shù)定義C語言中函數(shù)和變量一樣,含有一定存放類型和數(shù)據(jù)類型。普通情況下,函數(shù)也應先定義,后調用
1.無參函數(shù)定義形式類型說明符函數(shù)名(){申明部分語句部分}
比如,定義一個打印一行語句函數(shù)。voidprintfline(){printf("ThisisaCprogram!\n");}第9頁6.2函數(shù)定義與調用2.有參函數(shù)定義形式以下:類型說明符函數(shù)名(形式參數(shù)表列)
{
申明部分 語句部分
}比如:定義一個average函數(shù),用來計算兩個整數(shù)平均數(shù)。floataverage(intx,inty){ floatresult;/*定義變量result*/ result=(x+y)/2.0; returnresult;/*函數(shù)返回值*/}第10頁6.2函數(shù)定義與調用
有參函數(shù)注意事項:(1)必須為每一個參數(shù)指定數(shù)據(jù)類型,如floataverage(intx,inty)。任何不指定參數(shù)類型寫法都是錯誤。如:floataverage(intx,y)編譯時會犯錯,參數(shù)y未指定數(shù)據(jù)類型。(2)不允許在函數(shù)內部再次定義與參數(shù)同名變量。但不一樣函數(shù)內部允許定義同名變量。第11頁6.2函數(shù)定義與調用6.2.3函數(shù)調用1.函數(shù)調用形式
函數(shù)調用形式為:
函數(shù)名(實參表列);
或 函數(shù)名();第12頁【例6-2】編寫程序計算兩個整數(shù)平均數(shù)。要求調用printfline和average函數(shù)。#include<stdio.h>voidprintfline()/*函數(shù)定義*/{ printf("ThisisaCprogram!\n");}floataverage(intx,inty)/*函數(shù)定義*/{ floatresult; result=(x+y)/2.0; returnresult;}第13頁voidmain(){ inta,b; floatave;
printfline();/*調用printfline函數(shù)輸出一行語句*/ printf("Pleaseinputa,b:"); scanf(“%d,%d”,&a,&b); ave=average(a,b); /*調用average函數(shù)求兩個整數(shù)a和b平均數(shù)*/ printf("Averageof%dand%dis%f.\n",a,b,ave);}第14頁
按函數(shù)調用在程序中出現(xiàn)位置來分,函數(shù)調用大致可分為以下幾個形式:(1)函數(shù)語句:把函數(shù)作為語句來使用,普通不需要返回值,只是經(jīng)過函數(shù)調用完成一些操作。如printfline();(2)函數(shù)表示式:函數(shù)作為表示式中一項出現(xiàn)在表示式中,以函數(shù)返回值參加表示式運算,如ave=average(a,b);(3)函數(shù)實參:函數(shù)作為另一個函數(shù)調用實際參數(shù)出現(xiàn)。這種形式是把該函數(shù)返回值作為實參進行傳送,所以要求該函數(shù)必須是有返回值函數(shù)調用形式
第15頁6.2函數(shù)定義與調用
被調函數(shù)申明函數(shù)申明普通形式為:
函數(shù)類型 函數(shù)名(參數(shù)類型1,參數(shù)類型2,…);或函數(shù)類型函數(shù)名(參數(shù)類型1參數(shù)名1,參數(shù)類型2參數(shù)名2,…);自定義函數(shù)普通應定義在前,調用在后。假如用戶在編制程序時都按這個規(guī)律來進行,則不需要進行函數(shù)申明。但因為C語言中函數(shù)定義是各自獨立。函數(shù)與函數(shù)之間排放位置并沒有先后次序關系,只有調用與被調用關系。當出現(xiàn)調用在前,定義在后情況,即被調函數(shù)放置在主調函數(shù)之后,則應在主調函數(shù)適當位置,加上函數(shù)原型申明第16頁6.3函數(shù)參數(shù)傳遞和返回值6.3.1函數(shù)參數(shù)傳遞參數(shù)傳遞方式分為:(1)值傳遞方式(單向傳遞)所謂“值傳遞方式”是指將實參詳細數(shù)值單向傳遞給形參一個方式。注意:值單向傳遞是指只能由實參傳遞給形參,而不能由形參傳遞給實參。以下例中,只能由實參a,b依次對應傳遞給形參x,y,反之則不行。第17頁6.3函數(shù)參數(shù)傳遞和返回值例:#include<stdio.h>voidmain(){
voidswap(intx,inty);/*函數(shù)原型說明申明*/inta,b; a=2,b=6; printf("調用前:a=%d,b=%d\n",a,b);
swap(a,b);/*函數(shù)調用*/
printf("調用后:a=%d,b=%d\n",a,b);}函數(shù)在后,調用在前,所以要在調用前加說明第18頁6.3函數(shù)參數(shù)傳遞和返回值voidswap(intx,inty)/*函數(shù)定義*/{ inttemp; printf("交換前:x=%d,y=%d\n",x,y); temp=x; x=y; y=temp; printf("交換后:x=%d,y=%d\n",x,y);}第19頁6.3函數(shù)參數(shù)傳遞和返回值上例運行結果:最終交換成功了嗎?為何?在C語言中,數(shù)據(jù)只能從實參單向傳遞給形參,稱為“按值”傳遞,即當簡單變量作為實參時,用戶不能在函數(shù)中改變對應實參值!!!!第20頁6.3函數(shù)參數(shù)傳遞和返回值(2)地址傳遞方式所謂“地址傳遞方式”是指將實參地址傳遞給形參一個方式。在函數(shù)調用時,經(jīng)過對形參所指地址單元中內容進行操作,從而引發(fā)與形參指向同一地址單元實參內容發(fā)生改變。但這種改變并不是由形參傳回實參引發(fā)。采取這種方式時,實參能夠是變量地址、也能夠是后續(xù)章節(jié)要介紹數(shù)組名、相關指針變量,形參通常是數(shù)組或指針變量。第21頁6.3函數(shù)參數(shù)傳遞和返回值6.3.2函數(shù)返回值在C語言中,能夠在被調函數(shù)內采取return語句取得函數(shù)返回值。一個函數(shù)利用return語句只能返回一個值!!!。return語句形式為:(以下兩種寫法均可)
return(表示式);或return表示式;需注意是:函數(shù)名前面函數(shù)類型說明符是用來指定本函數(shù)返回值數(shù)據(jù)類型。在進行函數(shù)定義時,應使return語句中表示式類型與函數(shù)類型說明一致。當return語句中表示式類型與函數(shù)類型說明不一致時,則以函數(shù)類型說明為準,系統(tǒng)自動將return語句中表示式值轉換為函數(shù)類型說明所指定類型。
第22頁#include<stdio.h>voidmain(){intaverage(intx,inty);/*函數(shù)申明*/inta,b;floatave;printf("Pleaseinputa,b:");scanf(“%d,%d”,&a,&b);ave=average(a,b);/*調用average函數(shù)求兩個整數(shù)a和b平均數(shù)*/printf("Averageof%dand%dis%f.\n",a,b,ave);}第23頁intaverage(intx,inty)/*將average函數(shù)類型改為int型*/{ floatresult; result=(x+y)/2.0; returnresult;}本例中,因為函數(shù)average返回類型為int型,所以要將return實型值3.5轉化為int型。故結果為3.000000當函數(shù)沒有返回值時,為了使程序有良好可讀性并降低犯錯,在函數(shù)定義時,函數(shù)類型說明符應為void(“空類型”)。第24頁注意:(1)調用函數(shù)時,函數(shù)名不能有錯。(2)實參和形參要一一對應,個數(shù)一致,類型匹配。(3)函數(shù)必須先定義,后調用,除非函數(shù)返回值類型為int或char。(4)函數(shù)能夠自己調用自己,即遞歸調用。第25頁例:doubleadd(double,double);函數(shù)說明形式類型名函數(shù)名(參數(shù)類型1,參數(shù)類型2,……)
對于用戶定義函數(shù)要“先定義,后使用”規(guī)則。凡是未在調用前定義函數(shù),默認函數(shù)返回值為int類型。對于返回值為其它類型函數(shù),若把函數(shù)定義放在調用之后,應該在調用之間對函數(shù)進行說明(稱為函數(shù)原型說明)函數(shù)原型說明可放在全部函數(shù)外部,在今后全部位置上都能夠調用該函數(shù)。也可放在某函數(shù)內說明部分,則只有在某函數(shù)內能識別該函數(shù)。第26頁補充例子:打印全部“水仙花數(shù)”。所謂“水仙花數(shù)”,是指一個三位數(shù),其各位數(shù)字立方和等于該數(shù)本身。比如,153是“水仙花數(shù)”,因為153=13+33+53。編程分析:首先確定“水仙花數(shù)”n可能存在范圍,因為n是一個三位數(shù),所以范圍確定為100~999,分離出n百位,十位,個位后,只要判斷n是否等于三個位數(shù)立方之和,即可得出n是否是水仙花數(shù)。#include<stdio.h>voidmain(){inti,j,k,n;第27頁for(n=100;n<1000;n++)
{i=n/100;//分離出百位j=(n-i*100)/10;//分離出十位k=n%10;//分離出個位if(i*100+j*10+k==i*i*i+j*j*j+k*k*k)printf(“%d\t”,n);}printf(”\n”);}第28頁補充例子:求1000以內全部完數(shù)。所謂“完數(shù)”指是一個數(shù)假如假如等于它因子之和(除本身外),則稱該數(shù)為“完數(shù)”。比如:6=1+2+3,6為完數(shù)。編程分析:先求一個數(shù)全部因子,只要把這個數(shù)x從1到x/2求余,假如余數(shù)為0,即是因子,然后累加這些因子與這個數(shù)x進行比較,若相等,則x是完數(shù),不然不是。第29頁#include<stdio.h>voidmain(){intx,i,m;for(x=2;x<=1000;x++){for(m=0,i=1;i<=x/2;i++)if(!(x%i))m+=i;if(m==x)printf(“%4d”,x);}}第30頁直到最終一項絕對值小于10-4為止。#include<stdio.h>#include<math.h>voidmain(){floate,pi;
doublefunpi(doublet);scanf(“%lf”,&e);pi=funpi(e);printf(“pi=%f\n”,pi);}程序舉例函數(shù)說明原型說明第31頁doublefunpi(doublee){ints;doublen,t,pi;t=1;pi=0;n=1.0;s=1;
while((fabs(t)>=e){pi=pi+t;n=n+2;s=-s;t=s/n;}
returnpi=pi*4;
第32頁補充:
編寫函數(shù)isprime(inta)用來判斷自變量a是否為素數(shù),若是素數(shù),函數(shù)返回1,不然返回0#include“math.h”intisprime(int);voidmain(){intx;printf(“Enteraintegernumber:”);scanf(“%d”,&x);if(isprime(x))printf(“%disprime\n”,x);elseprintf(“%disnotprime\n”,x);}第33頁編寫函數(shù)isprime(inta)用來判斷自變量a是否為素數(shù),若是素數(shù),函數(shù)返回1,不然返回0intisprime(inta){inti;for(i=2;i<=(int)sqrt((double)a);i++)if(a%i==0)return0;elsereturn1;}第34頁補充例子:編寫函數(shù)myupper(ch),把ch中小寫字母轉換成大寫字母作為函數(shù)值返回,其它字符不變,用字符#結束輸入。#include<stdio.h>charmyupper(char);voidmain(){charc;while((c=getchar())!=‘#’){c=myupper(c);putchar(c);}}charmyupper(charch){if(ch>=‘a(chǎn)’&&ch<=‘z’)ch=ch-32;returnch;}第35頁程序舉例(補充):編寫函數(shù)sum(intn)求。和值作為函數(shù)返回。f(x)=x2+1#include<stdio.h>intsum(int);/*函數(shù)要先定義它原型,后調用*/intf(int);voidmain(){intn,s;printf(“Enteraintegernumber:”);scanf(“%d”,&n);s=sum(n);printf(“n=%dsum=%d\n”,n,s);}第36頁intsum(intn){intx,s=0;
for(x=0;x<=n;x++)s+=f(x);returns;}intf(intx){returnx*x+1;}第37頁補充例子:用梯形法求函數(shù)f(x)=sin(x)在[0,1.5]區(qū)間定積分,n選100。近似公式近似公式s=h*((f(a)+f(b))/2+)#include“math.h”doubleinteg(doublea,doubleb)(函數(shù)先定義后調用){doubles,x,h;intn=100,i;h=fabs(b-a)/n;s=(sin(a)+sin(b))/2.0;第38頁for(i=1;i<=n-1;i++){x=a+i*h;s=s+sin(x);}s=s*h;returns;voidmain(){doubles;s=integ(0.0,1.5);printf(“s=%f\n”,s);}第39頁6.4變量作用域與存放類型
6.4.1變量作用域程序中定義變量并不是在整個程序中都能有效使用,有變量只能在一個函數(shù)內使用,有變量只能在一個源文件中使用,而有變量則能夠在整個程序中使用。變量在程序中有效使用范圍稱為變量作用域。變量定義時所處位置不一樣,變量作用域也不一樣。從變量作用域來劃分話,變量可分為局部變量和全局變量。第40頁6.4變量作用域與存放類型
6.4.1變量作用域:
1.局部變量 (1)在函數(shù)體內定義變量,在本函數(shù)范圍內有效,作用域局限于函數(shù)體內。 (2)在復合語句內定義變量,在本復合語句范圍內有效,作用域局限于復合語句內。 (3)有參函數(shù)形式參數(shù)也是局部變量,只在其所在函數(shù)范圍內有效。
第41頁6.4變量作用域與存放類型
6.4.1變量作用域:
注意:(1)主函數(shù)中定義變量只能在主函數(shù)中使用,不能在其它函數(shù)中使用。同時,主函數(shù)中也不能使用其它函數(shù)中定義變量。(2)不一樣函數(shù)中和不一樣復合語句中能夠使用(即定義)相同變量名。因為它們作用域不一樣,程序運行時在內存中占據(jù)不一樣存放單元,各自代表不一樣對象,所以它們之間互不干預。第42頁6.4變量作用域與存放類型
2.全局變量全局變量也稱為外部變量,它是在任何函數(shù)之外定義變量。它有效范圍為從定義變量位置開始到根源文件結束。比如:
intx,y,z;/*x,y,z均是全局變量*/floatf1(floata,floatb){…}charch1,ch2;/*ch1,ch2均是全局變量*/intf2(intm){…}doublet,p;/*t,p均是全局變量*/voidmain(){… }第43頁6.4變量作用域與存放類型
全局變量和局部變量同名應用例子。
#include<stdio.h>inta=3,b=5;/*a,b為全局變量*/intmax(inta,intb)/*a,b為局部變量*/{intc;c=a>b?a:b;return(c);}voidmain(){inta=8;/*a為局部變量*/printf("max=%d\n",max(a,b));}運行結果:假如同一個源文件中,全局變量與局部變量同名,當局部變量有效時,同名全局變量不起作用。
第44頁6.4變量作用域與存放類型
局部變量和全局變量是從變量作用域(即從空間)來劃分。假如從變量值存在時間(即從生存期)來劃分話,變量還可分為動態(tài)存放變量和靜態(tài)存放變量。也就是說,變量生存期取決于變量存放方式。變量存放方式也能夠分為兩類:動態(tài)存放方式和靜態(tài)存放方式。所謂動態(tài)存放方式是在程序運行期間不固定分配內存空間,僅在需要時分配,不需要時就釋放。而靜態(tài)存放方式是指程序運行期間分配固定內存空間。第45頁6.4變量作用域與存放類型
6.4.2變量存放類型依據(jù)這兩類存放方式,變量又可詳細分為四種:自動變量(auto)、存放器變量(register)、靜態(tài)變量(static)、外部變量(extern)。在C語言中,每個變量和函數(shù)有兩個屬性:數(shù)據(jù)類型和存放類型。定義變量完整形式為:存放類型數(shù)據(jù)類型變量名1[,變量名2,…];其中,存放類型能夠是auto、register、extern或static。第46頁6.4變量作用域與存放類型
1.a(chǎn)uto變量auto說明符經(jīng)常省略,系統(tǒng)默認為沒有存放類型說明符變量為自動存放類型變量,前面各章中全部程序中所用到各個變量,都未說明存放方式,都是自動變量。在函數(shù)體內定義變量時,下面兩種寫法是等價。intx,y,z;autointx,y,z;第47頁6.4變量作用域與存放類型
2.register變量(用得較少)普通情況下,變量值都是存放在內存中。對于一些頻繁使用變量,能夠放在CPU內部存放器中,以提升訪問這些變量速度。這種變量就稱為存放器變量。存放器變量也屬于局部變量范圍。(1)只有局部變量和形參能夠作為存放器變量,其它變量不能夠(全局變量、局部靜變量不能夠)。(2)因為計算機存放器數(shù)目有限,不宜定義太多存放器變量。不一樣系統(tǒng)允許使用存放器個數(shù)是不一樣。第48頁6.4變量作用域與存放類型
3.static變量靜態(tài)變量在程序開始運行時就分配了固定內存空間,在程序運行過程中不釋放,直到程序運行結束才釋放它所占存放空間,所以靜態(tài)變量生存期是整個程序。因為變量分為局部變量和全局變量,所以靜態(tài)變量也分為靜態(tài)局部變量和靜態(tài)全局變量。(1)靜態(tài)局部變量靜態(tài)局部變量依然是定義在函數(shù)內部局部變量,它作用域依然局限于函數(shù)內部。比如:staticintm=10,n;第49頁6.4變量作用域與存放類型
【例6-7】編寫程序計算1!~5!值。#include<stdio.h>intfac(intn)/*函數(shù)定義*/{staticintf=1;/*靜態(tài)局部變量*/f=f*n;return(f);}voidmain(){inti;for(i=1;i<=5;i++)printf("%d!=%d\n",i,fac(i));}在函數(shù)fac內部定義了靜態(tài)局部變量f,每次調用都保留了上一次計算結果第50頁比如:staticintm=10,n;說明:(1)靜態(tài)局部變量存放空間是在程序編譯時由系統(tǒng)分配,且在程序運行整個期間都固定不變。(2)靜態(tài)局部變量編譯時賦初值,每次調用時不再賦初值,只保留調用結束時變量值。(3)對靜態(tài)局部變量,假如定義時不賦初值話,編譯時系統(tǒng)會自動賦值為0或空字符(對字符變量)。如上例在程序編譯時給變量m賦予10,對未給定初值變量n,C編譯系統(tǒng)自動給它賦0值。(2)靜態(tài)全局變量在C語言中,全局變量存放都采取靜態(tài)存放方式。第51頁6.4變量作用域與存放類型
4.extern變量全局變量(即外部變量)作用域是從定義位置起到本文件末尾止。采取extern來申明全局變量能夠擴大全局變量作用域。(1)在多個文件中申明全局變量一個C程序能夠由多個文件組成。假如一個文件中要引用另外一個文件中所定義全局變量,需要在此文件中,用extern進行申明。(2)在一個文件中申明全局變量同一個文件中,在全局變量定義點之前函數(shù)想引用該全局變量,應該在引用之前用extern對該變量作“全局變量申明”。全局變量未被初始化,系統(tǒng)自動賦初值0。第52頁6.4變量作用域與存放類型
【例6-8】同一個文件中申明全局變量應用例子。#include<stdio.h>voidmain()結果示例:{intmin(inta,intb);externx,y; /*申明全局變量x,y*/printf("%d\n",min(x,y));}intx=22,y=11; /*定義全局變量x,y*/intmin(inta,intb){intc;c=a<b?a:b;return(c);}第53頁6.5編譯預處理編譯預處理是指,在對源程序進行編譯之前,先對源程序中編譯預處理命令進行處理,然后再將處理結果,和源程序一起進行編譯,以得到目標代碼。C提供預處理功效主要有宏定義、文件包含和條件編譯。這些功效分別用宏定義命令、文件包含命令、條件編譯命令來實現(xiàn)。預處理命令是以#號開頭代碼行。第54頁6.5編譯預處理6.5.1宏定義宏定義是用指定標識符(宏名)來代表一個字符串。1.不帶參數(shù)宏定義其定義普通形式:#define宏名字符串字符串能夠是常數(shù)、表示式、格式串等。宏定義可出現(xiàn)在程序中任何位置。能夠用#undef命令終止宏名作用域,其普通形式為#undef標識符第55頁
一、無參數(shù)宏定義格式:#define宏名替換文本如:#defineSIZE100
替換文本中能夠包含已定義過宏名如: #definePI3.14 #defineADDPI(PI+1) #defineTWO_ADDPI(2*ADDPI)第56頁若程序中有表示式:x=TWO_ADDPI/2,替換后,表示式將成為:x=(2*(3.14+1))/2若寫成#definePI3.14 #defineADDPIPI+1(無括號) #defineTWO_ADDPI2*ADDPI(無括號)則以上表示式成為:x=2*3.14+1/2第57頁
二、有參數(shù)宏定義格式:#define宏名(參數(shù)表)替換文本如:#defineMU(X,Y)((X)*(Y))
………… a=MU(5,2); /*引用帶參宏名*/ b=6/MU(a+3,a);注意:同一宏名也不能重復定義,圓括號不能少第58頁6.5編譯預處理對于帶參數(shù)宏定義有以下問題需要說明:(1)定義帶參數(shù)宏時,宏名與左圓括號之間不能留有空格。不然將空格以后全部字符均作為替換字符串,用來替換不帶參數(shù)宏名。(2)帶參數(shù)宏展開時,用實參字符串替換形參字符串,不做任何語法檢驗。讀者可能已經(jīng)體會到,帶參數(shù)宏在程序中使用時,它使用形式和特征和函數(shù)很相同。不過在本質上它們是完全不一樣。第59頁6.5編譯預處理帶參數(shù)宏和函數(shù)區(qū)分有以下幾點:
(1)函數(shù)調用時,先求出實參表示式值,然后將值代入形參;而宏調用時只是用實參簡單地替換形參。(2)函數(shù)調用是在程序運行時進行,為形參分配暫時內存單元,占用運行時間;而宏調用則是在編譯時由編譯預處理程序完成,僅僅是一個簡單替換,并不分配內存單元,不進行值傳遞處理,也沒有“返回值”概念,所以宏調用不占用運行時間。(3)在函數(shù)定義時,必須指定每一個形式參數(shù)類型,而宏定義中只給出形式參數(shù),宏不存在類型問題,宏名無類型,它參數(shù)也沒有類型,只是一個符號代表。(4)調用函數(shù)只能夠得到一個返回值,而用宏能夠設法得到幾個結果。第60頁#include<stdio.h>#definePI3.1415926#defineC(r)2*PI*r/*定義帶參數(shù)宏*/voidmain(){doubleradius,perimeter;printf("EnterTheRadius:");scanf("%lf",&radius);
perimeter=C(radius);/*宏調用*/printf("ThePerimeter=%lf\n",perimeter);/*輸出圓周長值*/}帶參數(shù)宏調用例子:第61頁#include<stdio.h>#definePI3.1415926doublec(doubler)/*定義c函數(shù)*/{return2*PI*r;}voidmain(){doubleradius,perimeter;printf("EnterTheRadius:");scanf("%lf",&radius);perimeter=c(radius);/*調用c函數(shù)*/printf("ThePerimeter=%lf\n",perimeter}用函數(shù)調用例子:第62頁6.5編譯預處理6.5.2文件包含普通形式為:#include“文件名”或#include<文件名>它功效是把指定文件插入該命令行位置取代該命令行,從而把指定文件和當前源程序文件連成一個源文件。使用雙引號形式表示系統(tǒng)將先在源程序文件所在目錄內查找指定包含文件;假如找不到,再按照系統(tǒng)指定標準方式到相關目錄中去尋找。使用尖括號形式表示系統(tǒng)將直接按照指定標準方式到相關目錄中去尋找。第63頁在程序設計中,文件包含是很有用。有些公用符號常量或宏定義等可單獨組成一個文件,在其它文件開頭用包含命令包含該文件即可使用。這么,可防止在每個文件開頭都去書寫那些公用量,從而節(jié)約時間,并降低犯錯。詳細例子見P102第64頁//(2)主文件file.c#include<stdio.h>/*包含標準輸入輸出頭文件*/#include"mydef.h"voidmain(){doubleradius,perimeter;printf("EnterTheRadius:");scanf("%lf",&radius);/*輸入圓半徑*/
perimeter=C(radius);/*此處宏展開*/printf(“ThePerimeter=%lf\n”,perimeter)}//(1)將宏做成頭文件mydef.h#definePI3.1415926#defineC(r)2*PI*r第65頁6.5編譯預處理6.5.3條件編譯為了提升程序可移植性,增加程序靈活性,有時只希望對其中某一部分在滿足一定條件時才進行編譯,即對部分內容指定編譯條件,這就是條件編譯。條件編譯命令有以下幾個形式:(1)#ifdef標識符程序段1[#else
程序段2]
#endif它功效是:當所指定標識符被#define命令定義過,程序在編譯時只編譯程序段1;不然,只編譯程序段2,或不編譯。第66頁6.5編譯預處理(2)#ifndef標識符程序段1[#else
程序段2]
#endif它功效是當所指定標識符沒有被#define命令定義過,則在程序編譯時只編譯程序段1;不然編譯程序段2,或不編譯。這種形式與第一個形式功效恰好相反。(3)#if表示式程序段1[#else
程序段2]
#endif它功效是當指定表示式值為真(非零)時,程序在編譯時只編譯程序段1;不然編譯程序段2,或不編譯。第67頁6.6函數(shù)應用舉例【例6-14】由鍵盤任意輸入兩個整數(shù),求這兩個整數(shù)最大條約數(shù)和最小公倍數(shù)。分析:設兩個整數(shù)用變量m、n表示,最大條約數(shù)用“輾轉相除法”求解,其思緒是:首先用兩個數(shù)中大數(shù)m除以小數(shù)n,得到一個余數(shù)r,若r值為0,則此時除數(shù)n就是最大條約數(shù);若r值不為0,則把除數(shù)作為被除數(shù),余數(shù)作為除數(shù),再相除,直到余數(shù)為0為止。從數(shù)學知識可知道,任何兩個整數(shù)最小公倍數(shù)等于這兩個數(shù)之積再除以這兩個數(shù)最大條約數(shù)。即最小公倍數(shù)=m*n/最大條約數(shù)。定義一個函數(shù)maxdivisor來實現(xiàn)最大條約數(shù)。第68頁6.6函數(shù)應用舉例#include<stdio.h>voidmain(){ intmaxdivisor(intm,intn);/*函數(shù)申明*/ inta,b,divisor,multiple; printf("inputtwointegernumbers:"); scanf("%d%d",&a,&b);
divisor=maxdivisor(a,b);/*調用函數(shù),求最大條約數(shù)*/
multiple=a*b/divisor;/*求最小公倍數(shù)*/
printf("Thelargestcommondivisor:%d\n",divisor); printf("Thesmallcommonmultiple:%d\n",multiple);}第69頁6.6函數(shù)應用舉例intmaxdivisor(intm,intn) /*定義求出最
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 文庫發(fā)布:飛機介紹
- 2026上半年云南事業(yè)單位聯(lián)考云南大理大學招聘參考考試題庫及答案解析
- 2026福建兆佳貿易有限公司招聘項目制工作人員補充備考考試試題及答案解析
- 2026北京積水潭醫(yī)院聊城醫(yī)院博士研究生引進22人考試參考試題及答案解析
- 普外科引流管護理的跨學科合作模式
- 2026年安徽潁濱市政工程有限公司公開招聘4名備考考試題庫及答案解析
- 2026湖南長沙市長郡芙蓉中學春季物理學科教師招聘備考考試題庫及答案解析
- 2026浙江寧波市升力同創(chuàng)科技咨詢服務有限公司招聘1人考試備考題庫及答案解析
- 2026湖北省奕派科技高級管理崗位招聘筆試參考題庫及答案解析
- 樂山修路施工方案(3篇)
- 二零二五版醫(yī)院物業(yè)管理服務合同標準范例
- 2025下半年中學教師資格證英語《學科知識與教學能力》真題卷(帶答案)
- 漁獲物船上保鮮技術規(guī)范(DB3309-T 2004-2024)
- 車輛使用協(xié)議合同2025年
- 東北大學2015年招生簡章
- 資金管理辦法實施細則模版(2篇)
- IATF16949-質量手冊(過程方法無刪減版)
- 河南省安陽市滑縣2024-2025學年高二數(shù)學上學期期末考試試題文
- 客房服務員:高級客房服務員考試資料
- GB/T 6974.5-2023起重機術語第5部分:橋式和門式起重機
- 運用PDCA循環(huán)管理提高手衛(wèi)生依從性課件
評論
0/150
提交評論