版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第6章 函數(shù)
第1章信息技術(shù)與計算機(jī)C語言程序設(shè)計1教學(xué)目標(biāo)、要求了解:函數(shù)的定義函數(shù)的聲明函數(shù)的調(diào)用(嵌套調(diào)用、遞歸調(diào)用)形式參數(shù)、實際參數(shù)和參數(shù)的傳遞局部變量和全局變量變量的存儲類別(自動、靜態(tài)、寄存器、外部)變量的作用域和生存期26.1問題的提出與程序示例計算機(jī)高級語言中的函數(shù)實際上是一個能完成某一獨(dú)立功能的子程序,即程序模塊。程序設(shè)計人員將大而復(fù)雜的程序分解為若干相對獨(dú)立而功能單一的小程序塊(函數(shù))來進(jìn)行編寫,并通過在各個函數(shù)之間進(jìn)行調(diào)用,來實現(xiàn)總體上的功能。設(shè)計C程序的過程,就是編寫函數(shù)的過程,我們至少要編寫一個main()函數(shù)。執(zhí)行C程序,就是執(zhí)行相應(yīng)的main()函數(shù),如果在執(zhí)行過程中遇到其它函數(shù),則調(diào)用其它函數(shù),調(diào)用完后,返回到剛才調(diào)用函數(shù)的下一條語句繼續(xù)執(zhí)行,而其它函數(shù)也只有在執(zhí)行main()函數(shù)的過程中被調(diào)用時才會執(zhí)行。36.2函數(shù)基礎(chǔ)函數(shù)定義就是定義函數(shù)所能實現(xiàn)的功能,即告訴編譯系統(tǒng)函數(shù)所做的工作。函數(shù)聲明即函數(shù)原型,就是告訴編譯系統(tǒng)函數(shù)的名稱、類型和形式參數(shù)表的構(gòu)成。函數(shù)的調(diào)用在C語言中除main()由系統(tǒng)自動調(diào)用外,其它函數(shù)都是由main()直接或間接調(diào)用的。函數(shù)定義好之后,就可以通過調(diào)用的方式使用這個函數(shù)。如果函數(shù)定義在前,調(diào)用此函數(shù)在后,這種調(diào)用是合法的;但是如果函數(shù)定義在后,而調(diào)用此函數(shù)在前,就會產(chǎn)生編譯錯誤。為使函數(shù)的調(diào)用不受函數(shù)定義位置的影響,可以在調(diào)用函數(shù)之前進(jìn)行函數(shù)的聲明。函數(shù)的調(diào)用過程分3步:1.參數(shù)傳遞;2.函數(shù)體的執(zhí)行;3.返回。
在一個函數(shù)體內(nèi)允許有一個或多個return語句,一旦執(zhí)行到其中的某一個return語句時,直接返回調(diào)用位置繼續(xù)往下執(zhí)行。56.2函數(shù)基礎(chǔ)形式參數(shù)是變量
程序在編譯時,并不為形參分配內(nèi)存單元,只有此函數(shù)被調(diào)用時,形參才臨時占用存儲空間,并從調(diào)用函數(shù)中相應(yīng)實參獲得值;當(dāng)調(diào)用結(jié)束后,形參所占的存儲單元有被釋放。
實際參數(shù)是表達(dá)式(常量、變量或表達(dá)式)
與函數(shù)定義中的形參一一對應(yīng),即個數(shù)相等、次序一致且對應(yīng)的數(shù)據(jù)類型相同或相容。函數(shù)從用戶使用角度上看,可分為標(biāo)準(zhǔn)函數(shù)(庫函數(shù))和用戶定義函數(shù)。6案例回放#include<stdio.h>voidmain(){intmax(intx,inty);inta,b,c;scanf("%d,%d",&a,&b);c=max(a,b);printf("max=%d\n",c);getch();/*使程序暫停,按任一鍵繼續(xù)*/}intmax(intx,inty)/*定義函數(shù)max()*/{intz;if(x>y)z=x;elsez=y;return(z);}7案例對比voidmain(){intmax(intx,inty);
/*函數(shù)說明,可以省略*/inta,b,c;scanf("%d,%d",&a,&b);c=max(a,b);printf("max=%d\n",c);getch();/*使程序暫停,按任一鍵繼續(xù)*/}#include<stdio.h>/*定義一個函數(shù)max()*/intmax(intx,inty){intz;if(x>y)z=x;elsez=y;return(z);}86.3函數(shù)的定義[類型說明符]函數(shù)名([形式參數(shù)表]){聲明部分; 語句;
}省略類型說明符,C編譯系統(tǒng)確認(rèn)函數(shù)返回int數(shù)值;類型說明符為void,函數(shù)無返回值;省略形式參數(shù)表列,此函數(shù)為無參函數(shù)。函數(shù)不能嵌套定義,即所有函數(shù)都是平行的,定義函數(shù)時是相互獨(dú)立的,沒有從屬關(guān)系,但是函數(shù)可以相互調(diào)用。6.3.1函數(shù)定義的形式
函數(shù)返回值的數(shù)據(jù)類型說明:96.3函數(shù)的定義6.3.2函數(shù)的返回值
函數(shù)的返回值是通過函數(shù)中的return語句獲得的,一個函數(shù)只能返回一個值,但是函數(shù)中可以有一個以上的return語句。函數(shù)值的類型,在定義函數(shù)時指定(缺省值為int類型,不返回值為void類型)。如果函數(shù)值定義類型與return語句返回的表達(dá)式值類型不一致,以定義類型為準(zhǔn)。如果被調(diào)用函數(shù)中沒有return語句,函數(shù)返回一個不確定的值。106.4函數(shù)調(diào)用函數(shù)語句
函數(shù)名(實參表列);如:printf(“max=%d”,c);函數(shù)表達(dá)式
函數(shù)為表達(dá)式的一部分如:c=2*max(a,b);函數(shù)參數(shù)
函數(shù)的調(diào)用作為另一個函數(shù)的實參如:m=max(a,max(b,c));函數(shù)調(diào)用一般形式函數(shù)名(實際參數(shù)表);函數(shù)調(diào)用的語法格式
116.4函數(shù)調(diào)用函數(shù)的嵌套調(diào)用在調(diào)用一個函數(shù)的過程中,又調(diào)用了另一個函數(shù)。其關(guān)系如圖所示。嵌套調(diào)用
12案例一、寫出下列程序的運(yùn)行結(jié)果1.#include<stdio.h>fun(inta,intb) {if(a>b)return(a); elsereturn(b);}voidmain(){intx=3,y=8,z=6,r; r=fun(fun(x,y),x*z); printf("%d\n",r);}結(jié)果:1813案例2.#include<stdio.h>intfun(intx,inty){return(y-x)*x;}voidmain() {inta=3,b=4,c=5,d; d=fun(fun(a,b),fun(a,c)); printf("%d\n",d);}結(jié)果:9146.5函數(shù)說明如果使用庫函數(shù),一般應(yīng)在文件開頭用#include命令將被調(diào)庫函數(shù)所需的相關(guān)的信息“包含”到本源程序文件中。如果使用用戶自定義函數(shù),而且該函數(shù)與調(diào)用它的函數(shù)在同一個文件中,一般應(yīng)在主調(diào)函數(shù)中對被調(diào)函數(shù)作聲明(用函數(shù)的原型聲明)。voidmain() voidmain(){floatadd(floatx,floaty); {floatadd(float,float); …… …… …… ……} }floatadd(floatx,floaty) floatadd(floatx,floaty){……} {……}156.5函數(shù)說明如果被調(diào)用函數(shù)的定義出現(xiàn)在主調(diào)函數(shù)之前,可以不作聲明。如果在所有函數(shù)定義之前(在函數(shù)外部)已作了函數(shù)聲明,則各主調(diào)函數(shù)不必對被調(diào)函數(shù)作聲明。charletter(char,char);/*函數(shù)聲明*/floatf(float,float);/*函數(shù)聲明*/inti(float,float);/*函數(shù)聲明*/voidmain(){……}charletter(charc1,charc2){……}floatf(floatx,floaty){……}inti(floatj,floatk){……}166.6參數(shù)傳遞
回顧1.定義函數(shù)時,形式參數(shù)不占內(nèi)存單元,只能函數(shù)發(fā)生調(diào)用時,形參才被分配內(nèi)存單元,而調(diào)用結(jié)束后,形參所占的內(nèi)存單元被釋放。2.實參可以是常量、變量和表達(dá)式(值一定是確定的)。3.定義函數(shù)時,需指定形參的類型。4.形參和實參的類型相同或賦值兼容。6.6.1形參和實參參數(shù)傳遞—即虛實結(jié)合,調(diào)用函數(shù)將實際參數(shù)的信息傳遞給被調(diào)用函數(shù)的形式參數(shù),使形式參數(shù)具有確切的含義。C語言規(guī)定,實參變量對形參變量的數(shù)據(jù)傳遞是單向傳遞,即值傳遞,(在內(nèi)存中,實參單元和形參單元占用不同的內(nèi)存單元)。176.6.2基本數(shù)據(jù)類型的形參
當(dāng)形參的數(shù)據(jù)類型為基本數(shù)據(jù)類型時,參數(shù)傳遞方式為值傳遞,被調(diào)用函數(shù)本身不對實參進(jìn)行操作,即使形參的值在函數(shù)中發(fā)生了變化,實參的值也完全不會影響,仍為調(diào)用前的值,這種傳遞方式減少了調(diào)用函數(shù)與被調(diào)用函數(shù)之間的數(shù)據(jù)依賴。例如:輸入a,b兩個整數(shù),用函數(shù)實現(xiàn)按大小順序輸出。#include<stdio.h>voidswap(intx,inty){inttemp;
temp=x;x=y;y=temp;
}voidmain(){inta,b;scanf("%d,%d",&a,&b);if(a<b)swap(a,b);
printf("\n%d,%d\n",a,b);}x
y
186.6.3形參的數(shù)據(jù)類型是指針類型
程序中定義的變量,在編譯時給變量分配內(nèi)存單元,內(nèi)存中的每一個字節(jié)的編號,稱為地址,而內(nèi)存單元中存放的內(nèi)容稱為數(shù)據(jù)。
如:inti=3,j=5,k;k=i+j;這種按變量名存取變量值的方式稱為“直接訪問”方式。也可以采用“間接訪問”方式,即將變量i的地址存放到另一個變量中,這種用來存放另一個變量地址的變量稱為指針變量。指針變量的值是指針即地址。指針數(shù)據(jù)類型
19指針變量的定義
格式:數(shù)據(jù)類型*變量名……;說明:
*表示變量名是指針變量。例如:inti,*p;指針?biāo)笇ο蟮刂?001H2002H內(nèi)容ip00000000000000110010000000000001……pi2001H3*p&i2122H2123H20指針運(yùn)算符
&——取地址運(yùn)算符 優(yōu)先級別2*——指針運(yùn)算符(間接訪問運(yùn)算符) 自右向左#include<stdio.h>voidmain(){inta,b;
int*p1,*p2;a=100;b=10;p1=&a;p2=&b;printf("%d,%d\n",a,b);printf("%d,%d\n",*p1,*p2);}216.6參數(shù)傳遞指針變量作函數(shù)參數(shù)時,是將一個變量的地址傳送到另一個函數(shù)中。是值傳遞。
可以實現(xiàn)被調(diào)函數(shù)對指針?biāo)缸兞康男薷?。即通過傳遞指針變量的值,調(diào)用函數(shù)和被調(diào)用函數(shù)可以操作相同的存儲單元。6.6.3形參的數(shù)據(jù)類型是指針類型
22案例例如:輸入a,b兩個整數(shù),用函數(shù)實現(xiàn)按大小順序輸出。#include<stdio.h>voidswap(int*p1,int*p2){inttemp;temp=*p1;*p1=*p2;*p2=temp;}voidmain(){int*pt1,*pt2,a,b;scanf("%d,%d",&a,&b);pt1=&a;pt2=&b;if(a<b)swap(pt1,pt2);printf("\n%d,%d\n",a,b);}23&apt1a5b9圖示&bP2apt1&a5bpt2&b9在main()函數(shù)中p1&apt2&b59在swap()函數(shù)中24案例例如:輸入a,b兩個整數(shù),用函數(shù)實現(xiàn)按大小順序輸出。#include<stdio.h>voidswap(int*p1,int*p2){int*p;p=p1;p1=p2;p2=p;}voidmain(){int*pt1,*pt2,a,b;scanf("%d,%d",&a,&b);pt1=&a;pt2=&b;if(a<b)swap(pt1,pt2);printf("\n%d,%d\n",a,b);}25&bp2&ap1a5b9交換指針變量p1和p2的值,而不是變量a和b的值。圖示&bp2a5b9&ap1pt2pt1266.7遞歸調(diào)用函數(shù)的遞歸調(diào)用是指,一個函數(shù)在它的函數(shù)體內(nèi),直接或間接地調(diào)用它自身。1.C語言在遞歸調(diào)用中,調(diào)用函數(shù)又是被調(diào)用函數(shù),執(zhí)行遞歸函數(shù)將反復(fù)調(diào)用其自身。每調(diào)用一次就進(jìn)入新的一層。2.為了防止遞歸調(diào)用無終止地進(jìn)行,必須在函數(shù)內(nèi)有終止遞歸調(diào)用的手段。常用的辦法是加條件判斷,滿足某種條件后就不再作遞歸調(diào)用,然后逐層返回。遞歸調(diào)用
幾點說明
27案例1.用遞歸法計算n!。
1n=0,1 n×(n-1)! n>1n!=floatfac(intn){floatf;if(n<0)printf("n<0,dataerror!");elseif(n==0||n==1)f=1;elsef=fac(n-1)*n;return(f);}voidmain(){intn;floaty;printf("inputaintegernumber:");scanf("%d",&n);y=fac(n);printf("%d!=%15.0f",n,y);}28案例2.有5個人坐在一起,問第5個人多少歲?他說比第4人大2歲,第4人比第3人大2歲,以此類推,第1人10歲,求第5個人多大?age(n)=
10 n=1
age(n-1)+2 n>1分析:#include<stdio.h>age(intn){intc;if(n==1)c=10;elsec=age(n-1)+2;return;}voidmain(){printf("%d\n",age(5));}29補(bǔ)充題3.編寫程序?qū)⑤斎氲氖M(jìn)制整數(shù)轉(zhuǎn)換為二進(jìn)制輸出。#include<stdio.h>voidmain(){voidfun(int);intn;
scanf(“%d”,&n);fun(n);}voidfun(intn){if(n!=1)fun(n/2);printf(“%d”,n%2);}306.8變量的存儲類別C語言中說明變量的類型,可以確定該變量占用內(nèi)存空間的大小。在C語言中可以說明變量的存儲類別,不同的存儲類別可以確定一個變量的作用域和生存期。C語言中變量的存儲類別自動變量(auto)、寄存器變量(register)、外部變量(extern)和靜態(tài)變量(static)。用戶存儲空間程序區(qū)、靜態(tài)存儲區(qū)和動態(tài)存儲區(qū)。自動變量和寄存器變量存放在動態(tài)存儲區(qū),外部變量和靜態(tài)內(nèi)部變量存放在靜態(tài)存儲區(qū)。316.8.1局部變量與全局變量局部變量在函數(shù)體內(nèi)或分程序內(nèi)定義,存儲在動態(tài)存儲區(qū)。在函數(shù)中定義的局部變量,只在該函數(shù)內(nèi)有效;函數(shù)被調(diào)用時分配存儲空間,調(diào)用結(jié)束就釋放。在復(fù)合語句中定義的局部變量,只在該復(fù)合語句中有效;退出復(fù)合語句后,也不能再使用。定義而不初始化,則其值是不確定的。如果初始化,則賦初值操作是在調(diào)用時進(jìn)行的,且每次調(diào)用都要重新賦一次初值。局部變量
C語言中所有的變量都有自己的作用域。變量說明的位置不同,其作用域也不同,據(jù)此將C語言中的變量分為局部變量(內(nèi)部變量)和全局變量(外部變量)。intf1(inta)
/*a,b,c僅限于函數(shù)f1()*/
{intb,c;
……}
intf2(intx)
/*x,y,z僅限于函數(shù)f2()*/
{inty,z;
……}
main()
/*m,n僅限于函數(shù)main()*/
{intm,n;
……}326.8.1局部變量與全局變量全局變量在函數(shù)外定義,存儲在靜態(tài)存儲區(qū)。全局變量從變量定義處開始到本程序文件的末尾有效。如果在定義點之前或其他源程序文件中要引用該變量,則應(yīng)該在引用處之前用extern對變量加以聲明。定義而不初始化,則其值為0。如果初始化,則賦初值操作是在編譯時進(jìn)行的,且只賦值一次。全局變量
intp=1,q=5;floatf1(inta){intb,c;…………}charc1,c2;charf2(intx,inty){inti,j;…………}main(){intm,n;…………}a,b,c有效i,j,x,y有效m,n有效c1,c2有效p,q有效33案例1.寫出下列程序的運(yùn)行結(jié)果。 #include<stdio.h>
inta=3,b=5; max(inta,intb) {intc; c=a>b?a:b; return(c); } voidmain() {inta=8; printf("%d",max(a,b)); }結(jié)果:834案例2.輸入長方體的長(l)、寬(w)、高(h),求長方體體積及正、側(cè)、頂三個面的面積。#include<stdio.h>ints1,s2,s3;intvs(inta,intb,intc){intv;v=a*b*c;s1=a*b;s2=b*c;s3=a*c;returnv;}voidmain(){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);} 35案例1.寫出下列程序的運(yùn)行結(jié)果。#include<stdio.h>voidmain(){intmax(intx,inty);
externA,B;
/*外部變量說明*/printf("%d",max(A,B));}
intA=13,B=-8;intmax(intx,inty){intz;z=x>y?x:y;return(z);}結(jié)果:1336案例2.求a×b和am的值。/*file1.c*/#include<stdio.h>intA; voidmain(){intpower(int);intb=3,c,d,m; scanf("%d,%d",&A,&m);c=A*b;printf("%d*%d=%d\n",A,b,c);d=poewr(m);printf("%d**%d=%d\n",A,m,d);}/*file2.c*/externA;power(intn){inti,y=1; for(i=1;i<=n;i++)y=A*y;return(y);}376.8.2靜態(tài)變量靜態(tài)變量可以分為內(nèi)部靜態(tài)變量和外部靜態(tài)變量。靜態(tài)變量函數(shù)調(diào)用結(jié)束后不釋放內(nèi)存單元,保留其值。定義格式內(nèi)部靜態(tài)變量在函數(shù)體或分程序內(nèi)定義,且在本函數(shù)體或分程序內(nèi)有效(即用static聲明的局部變量)。外部靜態(tài)變量在函數(shù)體外定義,且在本源程序文件內(nèi)有效(即用static聲明的全部變量)。定義而不初始化,則其值為0。如果初始化,則賦初值操作是在編譯時進(jìn)行的,且只賦值一次。
static數(shù)據(jù)類型變量表;38案例#include<stdio.h>f(inta){autointb=0;staticintc=3;/*內(nèi)部靜態(tài)變量*/b++;c++;return(a+b+c);}voidmain(){inta=2,i;for(i=0;i<3;i++)printf("%d",f(a));}結(jié)果:789
396.8.3寄存器變量一般情況下,變量的值存放在內(nèi)存中,對于頻繁使用的變量可以將其值存到CPU中的寄存器中,以提高執(zhí)行的速度。定義格式寄存器變量的實現(xiàn)與硬件配置有關(guān)。只有很少的變量可以保存在寄存器中。register說明只適用于自動變量和函數(shù)的形參。
register
數(shù)據(jù)類型變量表;40總結(jié)C語言中的每個變量和函數(shù)都有兩個屬性:數(shù)據(jù)類型
數(shù)據(jù)的存儲類別變量聲明的一般格式[存儲類別]類型說明符變量表;存儲類別為auto、register、static和extern缺省值為auto41案例#include<stdio.h>intfac(intn){registerinti,f=1;for(i=1;i<=n;i++)f=f*i;return(f);}voidmain(){inti;for(i=1;i<=5;i++)printf("%d!=%d\n",i,fac(i));}例如:求n!42補(bǔ)充題1.以下程序的功能是計算函數(shù)的值,請選擇填空。
F(x,y)=(x+y)/(x-y)+(z+y)/(z-
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 基于物聯(lián)網(wǎng)的2025年度智能物流代理協(xié)議2篇
- 二零二五版電子商務(wù)合同電子商務(wù)合同電子檔案管理與利用合同3篇
- 二零二五年度商業(yè)綜合體清潔外包合同安全規(guī)范2篇
- 二零二五年度能源設(shè)施蟲害防治與能源安全協(xié)議4篇
- 2025年度個人藝術(shù)品居間買賣合同范本4篇
- 二零二五年度綠色廚房裝修設(shè)計與環(huán)保材料供應(yīng)合同2篇
- 2025年度個人小額貸款合同風(fēng)險評估4篇
- 2025年挖機(jī)駕駛員招聘合同范本匯編3篇
- 個人與旅游公司服務(wù)合同(2024版)3篇
- 2025年度貨運(yùn)保險合同風(fēng)險評估與管理協(xié)議3篇
- 人教版物理八年級下冊 專項訓(xùn)練卷 (一)力、運(yùn)動和力(含答案)
- 山東省房屋市政工程安全監(jiān)督機(jī)構(gòu)人員業(yè)務(wù)能力考試題庫-中(多選題)
- 重慶市2023-2024學(xué)年七年級上學(xué)期期末考試數(shù)學(xué)試題(含答案)
- 北師大版 2024-2025學(xué)年四年級數(shù)學(xué)上冊典型例題系列第三單元:行程問題“拓展型”專項練習(xí)(原卷版+解析)
- 2023年譯林版英語五年級下冊Units-1-2單元測試卷-含答案
- 施工管理中的文檔管理方法與要求
- DL∕T 547-2020 電力系統(tǒng)光纖通信運(yùn)行管理規(guī)程
- 種子輪投資協(xié)議
- 執(zhí)行依據(jù)主文范文(通用4篇)
- 浙教版七年級數(shù)學(xué)下冊全冊課件
- 精神病醫(yī)院財務(wù)后勤總務(wù)管理制度
評論
0/150
提交評論