版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第五章函數(shù)本章目標1.進一步理解多個函數(shù)構(gòu)成一個C程序2.進一步了解和熟悉庫函數(shù)3.學(xué)會編寫自已的函數(shù)4.理解函數(shù)的調(diào)用關(guān)系5.理解函數(shù)中參數(shù)的傳遞機制一、C程序模塊一個C程序可由一個main()函數(shù)和多個其它函數(shù)構(gòu)成?!?.1C程序模塊其它函數(shù)指的是:系統(tǒng)函數(shù)由系統(tǒng)提供,放在頭文件中自編函數(shù)由程序設(shè)計人員編寫所有的函數(shù)都具有兩種特征:返回值參數(shù)(返回值和參數(shù)都是可缺省的)§5.2庫函數(shù)一、庫函數(shù)簡介系統(tǒng)自帶的標標準庫函數(shù)根據(jù)不同的功能作用放在不同的頭文件中。如:stdio.h用于標準輸入/輸出math.h用于數(shù)學(xué)計算ctype.h用于字符處理string.h用于字串處理time.h用于時間/日期的處理dir.h用于控制目錄和路徑graphics.h用于圖形操作dos.hbios.h用于接口處理二、庫函數(shù)的作用使程序更具有“獨立性”和“可移植”性。使用時只需在程序的開頭加上一條語句:#include<.h>“”根據(jù)使用的函數(shù)來確定使程序具有“模塊化”。例:函數(shù)的結(jié)構(gòu)main(){printstar();print_message();printstar();}printstar(){printf(“********************************”);}print_message(){printf(“howdoyoudo!\n”);}§5.3自定義函數(shù)一、自定義函數(shù)的作用使程序具有“積木”功能。(模塊化)使程序具有“重構(gòu)”功能。1、函數(shù)的返回值是通過函數(shù)中的return語句來完成的,return語句一次只能返回一個值;2、由return語句返回的數(shù)據(jù)類型應(yīng)與函數(shù)定義時的類型一致。例:3、當在函數(shù)的定義時,未指出函數(shù)的類型,c語言默認的類型為整型.4、函數(shù)沒有return語句并不表明函數(shù)沒有返回值,只是這個返回值對于調(diào)用者來說可能是沒有用的,這個返回值隨函數(shù)的不同它的值也不盡相同.5、如果我們明確表示函數(shù)不能返回值,在函數(shù)的定義時用“void”加以說明,這樣可以確保函數(shù)不帶回返回值.returnz等價return(z)return(x>y?x:y);6、例:函數(shù)的返回值例:對函數(shù)返回值的理解:main(){inta,b,c;a=printstar();b=print_message();c=printstar();printf(“%d,%d,%d\n”,a,b,c);}若不需要函數(shù)帶回任何值,可使用:voidprintstar(){…}voidprint_message(){…}例:函數(shù)返回值的類型與其定義的類型不符時:main(){floata,b;intc;scanf(“%f,%f”,&a,&b);c=max(a,b);printf(“maxis%d\n”,c);}max(floatx,floaty)輸入:1.5,2.5{floatz;輸出:maxis2z=x>y?x:y;return(z);}/*return(x>y?x:y)等價*/函數(shù)的一般調(diào)用1、函數(shù)調(diào)用的一般形式:函數(shù)名(實參表列);如:add(intx,inty)的調(diào)用為add(2,3)2、函數(shù)調(diào)用的規(guī)則:實參與形參在個數(shù)與類型上必須保持一致。當函數(shù)無參數(shù)時,實參表列就為空,但括號不能少。實參表列中的各個參數(shù)之間用逗號隔開。實參與形參是一一對應(yīng)的關(guān)系(函數(shù)調(diào)用的過程)。對于實參表的求值順序各個系統(tǒng)是不一致的。1.函數(shù)語句:功能:將函數(shù)調(diào)用作為一個語句。如:printf(“book”);要點:不要求函數(shù)帶回值,只要求完成一定的操作。2.函數(shù)表達式:功能:將函數(shù)作為表達式的一部分。如:c=2*max(a,b);要點:要求函數(shù)帶回一個確定的值,以參加表達式的運算。3.一個函數(shù)作為另一個函數(shù)的參數(shù):功能:將函數(shù)的調(diào)用作為一個函數(shù)的實參。如:m=max(a,max(b,c));要點:其實質(zhì)也是函數(shù)表達式的調(diào)用。函數(shù)調(diào)用的方式例1:求二個數(shù)中的最大值
intmax(x,y)intx,y;{intz;
z=x>y?x:y;return(z);}用return語句,返回函數(shù)的值?;颍篿ntmax(intx,inty)
{intz;
z=x>y?x:y;return(z);}四、舉例通過函數(shù)調(diào)用求二個數(shù)中的最大值:#include<stdio.h>intmax(int,int);/*函數(shù)原型*/main(){inta,b,t;scanf("%d%d",&a,&b);t=max(a,b);/*函數(shù)調(diào)用*/printf("valueofmaximizeis:t=%d",t);}intmax(intx,inty)/*函數(shù)定義*/{intz;z=x>y?x:y;return(z);}#include<stdio.h>
floatadd(floatx,floaty);/*函數(shù)定義*/
{floatz;
z=x+y;
returnz;
}
main()
{ floata,b,c;
scanf(“%f,%f”,&a,&b);
c=add(a,b);/*函數(shù)調(diào)用*/
printf("sum=%f";c);}求二實數(shù)之和(將例1程序改寫如下:)第五章函數(shù)1.形參與實參調(diào)用時:實參值單向傳遞形參。
函數(shù)被調(diào)用時,臨時分配單元給形參,調(diào)用完畢,這些單元被釋放。實參:
出現(xiàn)在調(diào)用函數(shù)中,形參:出現(xiàn)被調(diào)用函數(shù)中。五、自定義函數(shù)中的幾個重要特征2.函數(shù)返回或return變量的值;通過return語句將流程返回主調(diào)函數(shù)。return;函數(shù)無返回值return表達式的值;3.函數(shù)名要選擇一個簡潔的有意義的名字作為函數(shù)名。從函數(shù)名可以反映出函數(shù)的功能。六、傳值調(diào)用和傳引用(傳址)調(diào)用1.傳值調(diào)用方式:函數(shù)的實參和形參的類型均為簡單變量。當實參傳遞形參時系統(tǒng)會建立一份實參的拷貝給形參。當函數(shù)調(diào)用完畢,這份實參的拷貝消失。特點:傳值調(diào)用不會影響實參的值。2.傳引用(傳址)調(diào)用把實參形參后傳遞形參變量和實參變量共同內(nèi)存地址。地址傳遞:數(shù)組名和指針(共用內(nèi)存單元)特點:形參變量的值的變化會影響實參的值的改變?!?.4函數(shù)的存儲類型一、標識符的屬性一個標識符的屬性除了前面已講過的基本屬性外,還具有一些其它的屬性:存儲類別存儲期函數(shù)中的變量1、按作用域分局部變量:在本函數(shù)內(nèi)部有效
全局變量:從定義位置到源程序結(jié)束均有效2、按存儲類型分靜態(tài)存儲變量:程序運行時有固定的存儲空間,結(jié)束時釋放內(nèi)存單元動態(tài)存儲變量:根據(jù)需要動態(tài)分配和釋放內(nèi)存單元舉例說明二、存儲類別1.存儲類型和存儲期自動型(auto)寄存器型(register)外部型(extern)靜態(tài)型(static)自動存儲期靜態(tài)存儲期2.存儲期的性質(zhì)自動存儲:只有變量才具有自動存儲期如函數(shù)中的變量說明:[auto]floatx,y;[auto]intm,n;作用:進入到函數(shù)塊中,該變量存在,退出函數(shù)塊后該變量消失。程序中大部分變量都具有自動存儲期。靜態(tài)存儲:可用于變量和函數(shù)如:staticint;作用:從程序開始執(zhí)行起就一直存在,始終占據(jù)內(nèi)存單元,直到程序結(jié)束運行。對靜態(tài)存儲變量,若定義時賦初值,則程序運行中僅在第一次調(diào)用時賦初值,下一次調(diào)用不再賦初值,而是使用上一次調(diào)用的值。特別提醒:對靜態(tài)存儲變量,若定義時不賦初值,則系統(tǒng)置初值0,而動態(tài)變量不賦初值則值不確定。#include<stdio.h>
intfac(n)/*函數(shù)定義*/
intn;
{staticintf=1;
f=fn;
return(f);
}
main()
{inti;
for(i=1;i<=5;i++)
printf("%d!=%d\n",i,fac(i));
}例:求n!第五章函數(shù)1?。?2!=23!=64!=245?。?20每一次調(diào)用fac(i),打印一個i!,同時保留這個i!的值以便下次再乘(i+1)。運行結(jié)果為:§5.5標識符的作用域標識符可以具有四種作用域。函數(shù)作用域文件作用域塊作用域函數(shù)原型作用域(作用域:有效范圍)可根據(jù)標識符的作用域區(qū)分局部變量和全局變量。一、局部變量凡在函數(shù)(含main函數(shù))內(nèi)部定義的變量稱為局部變量。局部性:局部變量僅在函數(shù)內(nèi)部有效。2.形參為局部變量。3.在復(fù)合語句中可定義僅在復(fù)合語句中有效的臨時變量。1.不同的函數(shù)可有同名同類型的變量,它們占不同的內(nèi)存單元,互不影響。二、全局變量一個源文件中,在所有函數(shù)之外定義的變量為全局變量。有效性:自定義位置開始至文件結(jié)尾全部有效。例:intp=1,q=5;floatf1(a)inta;{intb,c;
}
charc1,c2;p,q的作用范圍c1,c2的作用范圍charf2(x,y);intx,y;{inti,j;
}
main(){
}第五章函數(shù)1.全局變量所作用到的函數(shù),相當于這些函數(shù)的公共變量。當一個函數(shù)對其值進行改變后,另一個函數(shù)使用該變量的值亦相應(yīng)改變。好處:函數(shù)之間值傳遞。2.不要隨意使用全局變量。一是始終占據(jù)內(nèi)存單元;二是由于函數(shù)依賴于外部定義的變量,減少了通用性。注意3.
不在作用域內(nèi)函數(shù)。若使用全局(外部)變量,需在函數(shù)體內(nèi)加上extern保留字。4.
全局和局部變量同名時,局部變量有效。
局部變量1、含義:在一個函數(shù)內(nèi)部定義的變量,其作用范圍為函數(shù)體內(nèi)部。2、應(yīng)用3、使用要點:(1)主函數(shù)中定義的變量也只在主函數(shù)中有效;(2)不同的函數(shù)中可以使用相同的函數(shù)名,它們代表不同的含義;(3)形參也是局部變量;(4)在一個函數(shù)內(nèi)部可以使用復(fù)合語句來定義變量,這樣的變量只在本復(fù)合語句中有效.intmax(inta,intb){intt;…..}fun(){inti;..}main(){intm,n;…}m,n有效a,b,t有效i有效局部變量---內(nèi)部變量定義:在函數(shù)內(nèi)定義,只在本函數(shù)內(nèi)有效說明:main中定義的變量只在main中有效不同函數(shù)中同名變量,占不同內(nèi)存單元形參屬于局部變量可定義在復(fù)合語句中有效的變量局部變量可用存儲類型:autoregisterstatic
(默認為auto)floatf1(inta){intb,c;…….}charf2(intx,inty){inti,j;……}main(){intm,n;…….}a,b,c有效x,y,i,j有效m,n有效例不同函數(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);}例不同函數(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);}運行結(jié)果:main:a=3,b=4sub:a=6,b=7main:a=3,b=4局部變量與全局變量
/*ch7_17.c*/inta=3,b=5;max(inta,intb){intc;c=a>b?a:b;return(c);}main(){inta=8;printf("max=%d",max(a,b));}運行結(jié)果:max=8例外部變量與局部變量全局變量1、含義:在所有的函數(shù)之外定義的變量稱為外部變量(或叫做全局變量).其作用范圍是從變量定義的位置開始,直到本源文件的結(jié)束。如:2、要點:3、舉例:intp=1,q=1;/*定義全局變量p,q*/floatf1(a)/*定義函數(shù)f1*/inta;{intb,c;…}charc1,c2;/*定義外部變量c1,c2*/charf2(intx,inty)/*定義函數(shù)f2*/{inti,j;…}main()
{intm,n;…}全局變量p,q的有效范圍全局變量c1,c2的有效范圍(1)一個源文件可以包含一個或幾個函數(shù).(2)全局變量可以被本源文件的所有函數(shù)共享.(3)全局變量的設(shè)置增強了函數(shù)間數(shù)據(jù)的聯(lián)系.一個函數(shù)對全局變量的值的改變將會影響到其他的函數(shù)中.例:(用于返回多個函數(shù)值)(4)建議在只有必要時才設(shè)置全局變量.(5)全局變量在文件的開頭定義,則它的有效范圍是整個源文件,但如果全局變量不是在開頭定義的,則它有效范圍是從定義點到源文件的結(jié)束.如果想在全局變量的定義點之前引用時,需要用關(guān)鍵字“extern”作提前引用說明.(6)當全局變量名與局部變量名相同時,則在局部變量的有效范圍內(nèi)全局變量不起作用.例:寫一個函數(shù),找出100-200之間的全部素數(shù)。#include“stdio.h”#include“math.h”intisprime(intd);{inti,s;s=sqrt(d);for(i=2;i<=s;i++)if(d%i==0)return0;return1;}main(){intm,n=0;for(m=100;m<=200;m++){if(isprime(m)){if(n%10==0)printf(“\n”);n++;printf(“%d”,m);}}}例:有一個一維數(shù)組,內(nèi)放10個學(xué)生成績,寫一個函數(shù),求出平均分、最高分和最低分。略floatmax=0,min=0;main()floataverage(array,n){floatave,score[10];floatarray[];intn;inti;{inti;for(i=0;i<10;i++)floataver,sum=array[0];scanf(“%f”,&score[i]);max=min=array[0];ave=average(score,10);for(i=0;i<n;i++)printf(“%6.2f,%6.2f,%6.2f\n”,{if(array[i]>max)max=array[i];max,min,ave);}elseif(array[i]<min)min=array[i];sum=sum+array[i];}aver=sum/n;return(aver);}例:分析下面的程序?qū)懗鼋Y(jié)果.plus(intx,inty){intz;z=x+y++;returnz;}mian()
{externinta,b;intz;z=plus(a,b);printf(“%d\n”,z);}inta=13,b=-8,z=10;運行結(jié)果;5例:分析下面的程序?qū)懗鼋Y(jié)果f1(intx,inty){intz;returnz=x>y?x:y;returnz;}f2(intx,inty){intz;z=x>y?++x:++y;returnz;}main()
{externinta,b;printf(“%d,%d,%d\n”,a,b,f1(a,b));printf(“%d,%d,%d\n”,a,b,f2(a,b));}inta=20,b=-15;20,-15,20//20,-15,21
例輸入長方體的長(l)、寬(w)、高(h),求長方體體積及正、側(cè)、頂三個面的面積。/*功能:利用全局變量計算長方體的體積及三個面的面積*/ints1,s2,s3;intvs(inta,intb,intc){intv; v=a*b*c;s1=a*b;s2=b*c;s3=a*c; returnv;}main(){intv,l,w,h;clrscr();printf("\ninputlength,widthandheight:");scanf("%d%d%d",&l,&w,&h);v=vs(l,w,h);printf("v=%ds1=%ds2=%ds3=%d\n",v,s1,s2,s3);getch();} [程序演示]#include<stdio.h>inti=1;main(){staticinta;
registerintb=-10;
intc=0;printf("-----MAIN------\n");printf("i:%da:%d\b:%dc:%d\n",i,a,b,c);c=c+8;other();printf("-----MAIN------\n");printf("i:%da:%d\b:%dc:%d\n",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:%d\b:%dc:%d\n",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全局i1main:a0b:-10registermain:c0靜態(tài)存儲區(qū)動態(tài)存儲區(qū)other:a2other:b0other:c10843315443other:c10675156例變量的壽命與可見性
例:f(a)inta;{autointb=0;staticintc=3;b+=1;c+=1;return(a+b+c);}main(){inta=2,i;for(i=0;i<3;i++)printf(“%3d”,f(a));}運行結(jié)果:7 8 9例:intfac(intn){registerinti,f=1;for(i=1;i<=n;i++)f=f*i;returnf;}main(){inti;for(i=1;i<=5;i++)printf(“%d!=%d\n”,i,fac(i));}結(jié)果:1!=12!=23!=64!=245!=1201、含義:所謂函數(shù)的嵌套調(diào)用是指一個函數(shù)在被調(diào)用時其本身又調(diào)用了其他函數(shù).2、嵌套調(diào)用的過程:main()a函數(shù)b函數(shù)調(diào)用a函數(shù)調(diào)用b函數(shù)結(jié)束3、舉例:函數(shù)的嵌套調(diào)用例7:函數(shù)的嵌套調(diào)用swap(inta,intb){intt;t=a,a=b,b=t;
printf(“%d,%d”,a,b);}//嵌套調(diào)用main(){inta=3,b=5;swap(a,b);//調(diào)用printf(“%d,%d”,a,b);}#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ù)例求三個數(shù)中最大數(shù)和最小數(shù)的差值§5.6遞歸調(diào)用一、遞歸的特點一個問題能夠成為遞歸必須具備的條件是:后一部分與原始問題類似后一部分是原始問題的簡化1.直接遞歸調(diào)用:函數(shù)直接調(diào)用本身二、程序中的遞歸方式2.間接遞歸調(diào)用:函數(shù)間接調(diào)用本身直接調(diào)用:intf(x)intx;{inty,z;
:
z=f(z);:}間接調(diào)用:intf1(x)intx;{inty,z;
:z=f2(y);:}intf2(t)intt;{inta,b;
:a=f1(b);:}以下表示了遞歸的概念.顯然:上述例子會無限遞歸(無限執(zhí)行)。所以,在遞歸調(diào)用時都必須有條件限制。n!=1(n=0,1)n(n–1)!(n>1)當條件成立,調(diào)用遞歸,否則結(jié)束。例:求n!1.從數(shù)學(xué)上定義#include<stdio.h>
longfac(intn)/*函數(shù)定義,計算n!*/
{longf;
if(n<0)
printf("inputerror!\n");
else
if(n==0||n==1)
f=1;
elsef=nfac(n–1);
return(f);
}2.程序:第五章函數(shù)main(){intn;longy;printf("inputainteger!")scanf("%d",&n);y=fac(n);/*函數(shù)調(diào)用,計算n!*/
printf("%d!=%7d",n,y);}第五章函數(shù)3.執(zhí)行過程:設(shè):
輸入5(n=5)第1次調(diào)用:y=fac(5)——返回:y=5fac(4)第2次調(diào)用:y=5*4fac(3)第3次調(diào)用:y=5*4*3fac(2)第4次調(diào)用:y=5*4*3*2fac(1)第5次調(diào)用:y=5*4*3*2*1*fac(0)例:有五個人坐在一起,問第五個人有多少歲?他說比第四個人大兩歲.問第四個人的歲數(shù),他說比第三個人大兩歲,問第三個人的歲數(shù),他說比第二個人大兩歲,….當問到第一個人時,他說自己10歲,請問第五個人的歲數(shù)?age(5)=age(4)+2age(4)=age(3)+2age(3)=age(3)+2age(2)=age(1)+2age(1)=10 10 (n=1) age(n-1)+2 (n>1)age(n)=遞歸調(diào)用的過程age(5)=age(4)+2age(4)=age(3)+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)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 新人音版小學(xué)音樂三年級上冊全冊教案
- 白楊課件教學(xué)
- 標志設(shè)計 課件 2024-2025學(xué)年人教版(2024)初中美術(shù)七年級上冊
- (統(tǒng)考版)2023版高考化學(xué)一輪復(fù)習(xí)第十一章物質(zhì)結(jié)構(gòu)與性質(zhì)第3講晶體結(jié)構(gòu)與性質(zhì)學(xué)生用書
- 上海瑜伽館裝修合同樣本
- 太陽能板生產(chǎn)廢渣運輸協(xié)議
- 主題餐廳翻新合同
- 煤炭運輸搬運合同
- 水族館裝修精協(xié)議
- 博物館翻新工程居間
- 機械設(shè)備工程工程量清單計價PPT課件
- 看聽學(xué)英語一冊十三十四課PPT課件
- 漆黑的魅影5.0二周目圖文攻略
- 擊劍運動介紹ppt課件
- 你不知道的事(王力宏)原版五線譜鋼琴譜正譜樂譜.docx
- 二氧化硅微球的制備
- 公證工作服務(wù)社會的調(diào)研報告
- 康復(fù)醫(yī)學(xué)科治療范圍和收費
- kk 2mw控制系統(tǒng)結(jié)構(gòu)(version 40)
- 附件1:《唐山賦》獲獎作品五篇
- 最全表格形式形容詞和副詞比較級和最高級
評論
0/150
提交評論