函數(shù)要點說明_第1頁
函數(shù)要點說明_第2頁
函數(shù)要點說明_第3頁
函數(shù)要點說明_第4頁
函數(shù)要點說明_第5頁
已閱讀5頁,還剩24頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

2024/1/417.2.1函數(shù)的定義函數(shù)定義的一般形式函數(shù)類型函數(shù)名(類型名形式參數(shù)1,…

){說明語句

執(zhí)行語句}例如:求兩個數(shù)的最大值。

int

max(int

x,inty){intz;z=x>y?x:y;return(z);}類型省略時默認為int類型沒有形式參數(shù)為無參函數(shù)

2024/1/42函數(shù)名(實參表列)在C語言中,把函數(shù)調(diào)用也作為一個表達式。因此凡是表達式可以出現(xiàn)的地方都可以出現(xiàn)函數(shù)調(diào)用。例如:①welcome();

②if(fabs(a)>max)max=fabs(a);

③m=max(c,max(a,b));7.2.2函數(shù)的調(diào)用函數(shù)調(diào)用的一般形式:2024/1/43voidswap(intx,inty){intz;z=x;x=y;y=z;

printf("\nx=%d,y=%d",x,y);}main(){inta=10,b=20;

swap(a,b);

printf("\na=%d,b=%d\n",a,b);}7.2.3函數(shù)參數(shù)與函數(shù)的返回值1.函數(shù)的形式參數(shù)與實際參數(shù)程序輸出結(jié)果:x=20,y=10a=10,b=20形式參數(shù)(形參)實際參數(shù)(實參)【例7.3】編一程序,將主函數(shù)中的兩個變量的值傳遞給swap函數(shù)中的兩個形參,交換兩個形參的值。單向值傳遞2024/1/44有關(guān)形參和實參的說明:

①當函數(shù)被調(diào)用時才給形參分配內(nèi)存單元。調(diào)用結(jié)束,所占內(nèi)存被釋放。②實參可以是常量、變量或表達式,但要求它們有確定的值。③實參與形參類型要一致,字符型與整型可以兼容④實參與形參的個數(shù)必須相等。在函數(shù)調(diào)用時,實參的值賦給與之相對應(yīng)的形參?!皢蜗蛑祩鬟f”。注意:在TC中,實參的求值順序是從右到左。

2024/1/45函數(shù)的返回值是通過return語句帶回到主調(diào)函數(shù)的功能:終止函數(shù)的運行,返回主調(diào)函數(shù),若有返回值,將返回值帶回主調(diào)函數(shù)。說明:①若函數(shù)沒有返回值,return語句可以省略。②return語句中的表達式類型一般應(yīng)和函數(shù)的類型一致,如果不一致,系統(tǒng)自動將表達式類型轉(zhuǎn)換為函數(shù)類型。函數(shù)的返回值return語句格式:return(表達式);

或return表達式;或return;2024/1/46【例7.6】計算并輸出圓的面積。s(intr){return3.14*r*r;}main(){int

r,area;

scanf("%d",&r);

printf("%d\n",s(r));}自動轉(zhuǎn)換為int型思考:若要得到單精度實型的圓面積,程序應(yīng)如何修改程序運行情況如下:2

12?2024/1/47

7.2.4對被調(diào)函數(shù)的聲明和函數(shù)原型變量要先定義后使用,函數(shù)也如此。即被調(diào)函數(shù)的定義要出現(xiàn)在主調(diào)函數(shù)的定義之前。如swap函數(shù):允許整型函數(shù)(且參數(shù)也是整型)的定義出現(xiàn)在主調(diào)函數(shù)之后。如max函數(shù):如果非整型函數(shù)在主調(diào)函數(shù)之后定義,則應(yīng)在主調(diào)函數(shù)中或主調(diào)函數(shù)之前對被調(diào)函數(shù)進行聲明。voidswap(intx,inty){…}main(){…

swap(a,b);}main(){…c=max(a,b);}max(int

x,inty){…}2024/1/48對被調(diào)函數(shù)進行聲明的一般形式

函數(shù)類型函數(shù)名(參數(shù)類型1

參數(shù)名1,…);或函數(shù)類型函數(shù)名(參數(shù)類型1,參數(shù)類型2,…);思考:以下哪種情況需要在主調(diào)函數(shù)中對被調(diào)函數(shù)聲明被調(diào)函數(shù)定義在前,主調(diào)函數(shù)定義在后。主調(diào)函數(shù)定義在前,被調(diào)函數(shù)定義在后,且被調(diào)函數(shù)的類型不是整型的。被調(diào)函數(shù)定義在后,但被調(diào)函數(shù)的類型是整型。第二種形式省略了參數(shù)名,此種形式也稱為函數(shù)的原型。?2024/1/497.3數(shù)組作函數(shù)參數(shù)7.3.1一維數(shù)組元素作函數(shù)參數(shù)main(){inta[5],i,m;for(i=0;i<5;i++)

scanf("%d",&a[i]);m=a[0];for(i=1;i<5;i++)m=min(m,a[i]);

printf("%d\n",m);}【例7.8】求5個數(shù)中的最小值。int

min(intx,inty){return(x<y?x:y);}用打擂臺方法求最小值。m相當于擂主2024/1/4107.3.2一維數(shù)組名作函數(shù)參數(shù)數(shù)組名表示數(shù)組在內(nèi)存中的起始地址。例如:數(shù)組a在內(nèi)存中從2000地址開始存放,則a的值為2000。2000是地址值,是指針類型的數(shù)據(jù)(第8中將介紹指針類型),不能把它看成是整型或其他類型數(shù)據(jù)。實參是數(shù)組名,形參也應(yīng)定義為數(shù)組形式,形參數(shù)組的長度可以省略,但[]不能省,否則就不是數(shù)組形式了。

【例7.9】用冒泡法將10個整數(shù)排序。2024/1/411voidsort(intb[],intn);voidprintarr(intb[]);main(){inta[10]={11,22,63,97,58,80,45,32,73,36};

printf("Beforesort:\n");

printarr(a);

sort(a,10);

printf("Aftersort:\n");

printarr(a);}voidprintarr(int

b[10]){inti;for(i=0;i<10;i++)printf("%5d",b[i]);

printf("\n");}voidsort(intb[],intn){int

i,j,t;for(i=1;i<n;i++)for(j=0;j<n-i;j++)if(b[j]>b[j+1]){t=b[j];b[j]=b[j+1];b[j+1]=t;}}2024/1/412

a[0]a[1]a[2]a[3]a[4]a[5]a[6]a[7]a[8]a[9]

b[0]b[1]b[2]b[3]b[4]b[5]b[6]b[7]b[8]b[9]11226397588045327336(a)排序前a[0]a[1]a[2]a[3]a[4]a[5]a[6]a[7]a[8]a[9]b[0]b[1]b[2]b[3]b[4]b[5]b[6]b[7]b[8]b[9]11223236455863738097(b)排序后圖7.3調(diào)用sort函數(shù)2000b形參b實際是一個可以存放地址的變量a:2000實參賦給形參首地址:

2000首地址:

20002024/1/413函數(shù)B{

……

……

……}函數(shù)A{……

調(diào)用函數(shù)B;

……}main函數(shù){

……

調(diào)用函數(shù)A;

……}7.4函數(shù)的嵌套調(diào)用和遞歸調(diào)用7.4.1函數(shù)的嵌套調(diào)用2024/1/414【例7.11】函數(shù)的嵌套調(diào)用main(){intn=3;

printf("%d\n",sub1(n));}sub1(intn){int

i,a=0;for(i=n;i>0;i--)a+=sub2(i);returna;}sub2(intn){returnn+1;}程序輸出結(jié)果:92024/1/4157.4.2函數(shù)的遞歸調(diào)用1.遞歸的基本概念遞歸調(diào)用:一個函數(shù)直接或間接地調(diào)用了它本身,就稱為函數(shù)的遞歸調(diào)用。遞歸函數(shù):在函數(shù)體內(nèi)調(diào)用該函數(shù)本身。int

sub(intx){int

y,z;……if(……)z=sub(y);else{……}return;}例如:直接調(diào)用sub函數(shù)本身2024/1/4162.遞歸函數(shù)的執(zhí)行過程【例7.12】編一遞歸函數(shù)求n!。思路:以求4的階乘為例:4!=4*3!,3!=3*2!,2!=2*1!,1!=1,0!=1。遞歸結(jié)束條件:當n=1或n=0時,n!=1。遞歸公式:n!=1(n=0,1)n×(n-1)!(n>1)2024/1/417程序如下:floatfact(intn){floatf=0;

if(n<0)

printf("n<0,error!");elseif(n==0||n==1)f=1;elsef=fact(n-1)*n;return(f);}main(){intn;floaty;

printf("\nInputn:");

scanf("%d",&n);y=fact(n);

printf("%d!=%-10.0f\n",n,y);}運行情況如下:Inputaintegernumber:4

4!=242024/1/418遞歸調(diào)用過程

回推main()fact(4)fact(3)fact(2)fact(1){{{{{……………

y=fact(4);f=4*fact(3);f=3*fact(2);f=2*fact(1);f=1;

……………return24return6return2return1}}}}}

遞推

2024/1/4197.5局部變量和全局變量及其作用域7.5.1變量的作用域7.5.2局部變量及其作用域變量的作用域:變量在程序中可以被使用的范圍。根據(jù)變量的作用域可以將變量分為局部變量和全局變量。局部變量(內(nèi)部變量):在函數(shù)內(nèi)或復(fù)合語句內(nèi)定義的變量以及形參。作用域:函數(shù)內(nèi)或復(fù)合語句內(nèi)?!纠?.15】分析下面程序的運行結(jié)果及變量的作用域。問題:一個變量在程序的哪個函數(shù)中都能使用嗎?2024/1/420voidsub(int

a,int

b){

int

c;a=a+b;b=b+a;c=b-a;printf("sub:\ta=%db=%dc=%d\n",a,b,c);}局部變量main(){

int

a=1,b=1,c=1;

printf("main:\ta=%db=%dc=%d\n",a,b,c);

sub(a,b);

printf("main:\ta=%db=%dc=%d\n",a,b,c);

{

int

a=2,b=2;

printf("comp:\ta=%db=%dc=%d\n",a,b,c);}

printf("main:\ta=%db=%dc=%d\n",a,b,c);}局部變量局部變量“分程序”或“程序塊”程序輸出結(jié)果:main: a=1b=1c=1sub: a=2b=3c=1main:a=1b=1c=1comp:a=2b=2c=1main: a=1b=1c=12024/1/4217.5.3全局變量及其作用域全局變量(外部變量):在函數(shù)外部定義的變量。作用域:從定義變量的位置開始到本源文件結(jié)束。如在其作用域內(nèi)的函數(shù)或分程序中定義了同名局部變量,則在局部變量的作用域內(nèi),同名全局變量暫時不起作用?!纠?.16】全局變量和局部變量的作用域。2024/1/422int

a=5; voidf(int

x,int

y) {

int

b,c; b=a+x;c=a-y;printf("%d\t%d\t%d\n",a,b,c);}局部變量main(){intb=6,c=7;

f(b,c);

printf("%d\t%d\t%d\n",a,b,c);

{

int

a=9,b=8;

printf("%d\t%d\t%d\n",a,b,c);

{

c=10;

printf("%d\t%d\t%d\n",a,b,c);

}

printf("%d\t%d\t%d\n",a,b,c);

}

printf("%d\t%d\t%d\n",a,b,c);}局部變量局部變量程序輸出結(jié)果:511-2567987981098105610全局變量2024/1/4237.6變量的存儲類別及變量的生存期7.6.1變量的生存期與變量的存儲分類變量的生存期:變量在內(nèi)存中占據(jù)存儲空間的時間。思考:1.何時為變量分配內(nèi)存單元?

2.將變量分配在內(nèi)存的什么區(qū)域?3.變量占據(jù)內(nèi)存的時間(生存期)?程序代碼區(qū)靜態(tài)存儲區(qū)動態(tài)存儲區(qū)存儲分配動態(tài)存儲變量靜態(tài)存儲變量2024/1/4247.6.2變量的存儲類別變量的屬性數(shù)據(jù)類型:決定為變量分配內(nèi)存單元的長度,數(shù)據(jù)的存放形式,數(shù)的范圍。存儲類別:決定了變量的生存期,給它分配在哪個存儲區(qū)。2024/1/425變量定義語句的一般形式存儲類別數(shù)據(jù)類型變量名1,…,變量名n;auto(自動的)

register(寄存器的)static(靜態(tài)的)

extern(外部的)1.自動變量(auto類別)局部變量可以定義為自動變量。main()

{int

x,y;…}main()

{auto

int

x,y;…}自動變量等價可省2024/1/4262.靜態(tài)變量(static類別)除形參外,局部變量和全局變量都可以定義為靜態(tài)變量。局部靜態(tài)變量(或稱內(nèi)部靜態(tài)變量)全局靜態(tài)變量(或稱外部靜態(tài)變量)靜態(tài)變量靜態(tài)變量static

int

a;

溫馨提示

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

評論

0/150

提交評論