第7講C語言函數(shù)_第1頁
第7講C語言函數(shù)_第2頁
第7講C語言函數(shù)_第3頁
第7講C語言函數(shù)_第4頁
第7講C語言函數(shù)_第5頁
已閱讀5頁,還剩33頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

函數(shù)函數(shù)概述函數(shù)概述一個較大的程序可分為若干個程序模塊,每一個模塊用來實現(xiàn)一個特定的功能。對于較大的程序,通常將程序內(nèi)容分別放在若干個源文件中,再由若干源程序文件組成一個C程序。這樣便于分別編寫、分別編譯,提高調(diào)試效率。一個源程序文件可以為多個C程序公用。C語言中,各個模塊的功能通常采用子程序的形式來實現(xiàn),而子程序一般又是通過函數(shù)來實現(xiàn)的。所有函數(shù)都是平行的,即在定義函數(shù)時是分別進(jìn)行的,是互相獨立的。一個函數(shù)并不從屬于另一函數(shù),即函數(shù)不能嵌套定義。一個C程序可由一個主函數(shù)和若干個其他函數(shù)構(gòu)成。函數(shù)間可以互相調(diào)用,但不能調(diào)用main函數(shù)。main函數(shù)是由系統(tǒng)調(diào)用的。其他函數(shù)只能由主函數(shù)調(diào)用執(zhí)行。其他函數(shù)也可以互相調(diào)用。同一個函數(shù)可以被一個或多個函數(shù)調(diào)用任意多次。函數(shù)的分類從用戶角度標(biāo)準(zhǔn)函數(shù)(庫函數(shù)):由系統(tǒng)提供用戶自定義函數(shù)從函數(shù)形式無參函數(shù)有參函數(shù)使用庫函數(shù)應(yīng)注意:1、函數(shù)的功能2、函數(shù)參數(shù)的數(shù)目、順序及各參數(shù)意義和類型3、函數(shù)返回值的意義和類型4、需要使用的包含文件函數(shù)的定義一般格式合法的標(biāo)識符函數(shù)返回值類型。缺省int型,無返回值void函數(shù)體函數(shù)類型函數(shù)名(形參類型說明表){

說明部分 語句部分}例有參函數(shù)

int

max(int

x,inty){intz;z=x>y?x:y;return(z);}例有參函數(shù)

int

max(intx,y){intz;z=x>y?x:y;return(z);}例空函數(shù)

dummy(){}函數(shù)體為空例無參函數(shù)

printstar(){printf(“**********\n”);}

printstar(void){printf(“**********\n”);}函數(shù)的返回值返回語句形式:return(表達(dá)式);return表達(dá)式;

return;功能:使程序控制從被調(diào)函數(shù)返回到主調(diào)函數(shù)中,同時把返值帶給主調(diào)函數(shù)說明:函數(shù)中也可以有多個return語句若無return語句,遇最后一個“}”時,自動返回調(diào)用函數(shù)凡不加類型說明的函數(shù),自動按整型處理。對于不帶回值的函數(shù),應(yīng)當(dāng)用“void”定義函數(shù)為“無類型”(或稱“空類型”)。此時在函數(shù)體中不得出現(xiàn)return語句。對于不帶回值的函數(shù),應(yīng)當(dāng)用“void”定義函數(shù)為“無類型”(或稱“空類型”)。此時在函數(shù)體中不得出現(xiàn)return語句。例無返回值函數(shù)

void

swap(int

x,inty){inttemp;temp=x;x=y;y=temp;}若函數(shù)類型與return語句中表達(dá)式值的類型不一致,將自動轉(zhuǎn)換為函數(shù)類型(調(diào)用轉(zhuǎn)換)main(){int

max(float

a,floatb);

intc;

scanf("%f,%f",&a,&b);c=max(a,b);

printf("Maxis%d\n",c);}max(floatx,floaty){floatz;z=x>y?x:y;

return(z);}函數(shù)的調(diào)用調(diào)用形式

函數(shù)名(實參表);調(diào)用方式函數(shù)語句:如printstar();函數(shù)表達(dá)式:如m=max(a,b)*2;函數(shù)參數(shù):如printf(“%d”,max(a,b));m=max(a,max(b,c));說明:實參與形參個數(shù)相等,類型一致,按順序一一對應(yīng)如果實參表列包括多個實參,對實參求值的順序并不是確定的,有的系統(tǒng)按自左至右順序求實參的值,有的系統(tǒng)則按自右至左順序。#include<stdio.h>voidmain(){int

f(int

a,intb);/*函數(shù)聲明*/

inti=2,p;p=f(i,++i);/*函數(shù)調(diào)用*/

printf("%d\n",p);}int

f(int

a,intb)/*函數(shù)定義*/{intc;

if(a>b)c=1;elseif(a==b)c=0;elsec=-1;

return(c);}

如果按自左至右順序求實參的值,則函數(shù)調(diào)用相當(dāng)于f(2,3)如果按自左至右順序求實參的值,則函數(shù)調(diào)用相當(dāng)于f(3,3)例:參數(shù)求值順序(運行結(jié)果在不同編譯系統(tǒng)中可能不同)main(){inti=2,p;p=f(i,++i);

printf("%d",p);}int

f(inta,intb){intc;

if(a>b)c=1;elseif(a==b)c=0;elsec=-1;

return(c);}main(){inti=2,p;p=f(i,i++);

printf("%d",p);}int

f(inta,intb){intc;

if(a>b)c=1;elseif(a==b)c=0;elsec=-1;

return(c);}運行結(jié)果:0運行結(jié)果:1函數(shù)的說明如果使用用戶自己定義的函數(shù),而該函數(shù)的位置在主調(diào)函數(shù)的后面,應(yīng)該在主調(diào)函數(shù)中對被調(diào)用的函數(shù)作聲明。一般形式:函數(shù)類型函數(shù)名(形參類型[形參名],…..);或函數(shù)類型函數(shù)名();作用:告訴編譯系統(tǒng)函數(shù)類型、參數(shù)個數(shù)及類型,以便檢驗函數(shù)說明的位置:程序的數(shù)據(jù)說明部分(函數(shù)內(nèi)或外)TC中,下列情況可不作函數(shù)說明若函數(shù)返值是char或int型被調(diào)用函數(shù)定義出現(xiàn)在主調(diào)函數(shù)之前函數(shù)說明舉例1main(){floatadd(float,float);floata,b,c;

scanf("%f,%f",&a,&b);c=add(a,b);

printf("sumis%f",c);}floatadd(floatx,floaty){floatz;z=x+y;return(z);}floatadd();函數(shù)說明舉例2floatadd(floatx,floaty){floatz;z=x+y;return(z);}main(){floata,b,c;

scanf("%f,%f",&a,&b);c=add(a,b);

printf("sumis%f",c);}被調(diào)函數(shù)出現(xiàn)在主調(diào)函數(shù)之前,不必函數(shù)說明函數(shù)說明舉例3main(){floata,b;

intc;

scanf("%f,%f",&a,&b);c=max(a,b);

printf("Maxis%d\n",c);}max(floatx,floaty){floatz;z=x>y?x:y;return(z);}int型函數(shù)可不作函數(shù)說明(BorlandC++不行)函數(shù)的“定義”和“說明”的區(qū)別:函數(shù)的定義是指對函數(shù)功能的確立,包括指定函數(shù)名,函數(shù)值類型、形參及其類型、函數(shù)體等,它是一個完整的、獨立的函數(shù)單位。函數(shù)的聲明的作用則是把函數(shù)的名字、函數(shù)類型以及形參的類型、個數(shù)和順序通知編譯系統(tǒng),以便在調(diào)用該函數(shù)時系統(tǒng)按此進(jìn)行對照檢查。函數(shù)參數(shù)及其傳遞方式主調(diào)函數(shù)和被調(diào)用函數(shù)之間具有數(shù)據(jù)傳遞的關(guān)系。在不同的函數(shù)之間傳遞數(shù)據(jù),可以使用的方法有:參數(shù):通過形式參數(shù)和實際參數(shù)返回值:用return語句返回計算結(jié)果全局變量:外部變量形參:定義函數(shù)時函數(shù)名后面括號中的變量名實參:調(diào)用函數(shù)時函數(shù)名后面括號中的表達(dá)式說明:形參與實參應(yīng)類型一致或賦值兼容,個數(shù)相同若形參與實參類型不一致,自動按形參類型轉(zhuǎn)換,函數(shù)只有在調(diào)用時才為形參分配內(nèi)存;調(diào)用結(jié)束,內(nèi)存即釋放例比較兩個數(shù)并輸出大者main(){inta,b,c;

scanf("%d,%d",&a,&b);c=max(a,b);

printf("Maxis%d",c);}max(intx,inty){intz;z=x>y?x:y;return(z);}形參實參例:計算x的立方#include<stdio.h>floatcube(floatx){return(x*x*x);}main(){floata,p;

printf("Pleaseinputvalueofa:");

scanf("%f",&a);p=cube(a);

printf(”Cubeof%.4fis%.4f\n",a,p);}函數(shù)參數(shù)的傳值方式屬于值傳遞方式實參向形參的數(shù)據(jù)傳遞是單向“值傳遞”,只能由實參傳給形參,而不能由形參傳回來給實參。函數(shù)在調(diào)用時,首先為形參分配存儲單元,并將實參的值復(fù)制到形參中;調(diào)用結(jié)束,形參單元被釋放,實參單元仍保留并維持原值值傳遞的特點:形參與實參占用不同的內(nèi)存單元單向傳遞例:交換兩個數(shù)#include<stdio.h>main(){intx=7,y=11;

printf("x=%d,\ty=%d\n",x,y);

printf("swapped:\n");

swap(x,y);

printf("x=%d,\ty=%d\n",x,y);}swap(int

a,intb){inttemp;temp=a;a=b;b=temp;}711x:y:調(diào)用前:調(diào)用結(jié)束:711x:y:調(diào)用:711a:b:711x:y:Swap:711x:y:117a:b:temp局部變量(內(nèi)部變量)定義:在一個函數(shù)內(nèi)部定義的變量稱內(nèi)部變量。它只在本函數(shù)范圍內(nèi)有效,即:只有在本函數(shù)內(nèi)才能使用這些變量,故稱為“局部變量”。說明:主函數(shù)中定義的變量只在主函數(shù)中有效,而不因為在主函數(shù)中定義而在整個文件或程序中有效。主函數(shù)也不能使用其他函數(shù)中定義的變量。

不同函數(shù)中可以使用相同名字的變量,它們代表不同的對象,互不干擾。

形式參數(shù)也是局部變量。在一個函數(shù)內(nèi)部,可以在復(fù)合語句中定義變量,這些變量只在本復(fù)合語句中有效,這種復(fù)合語句也稱為“分程序”或“程序塊”。例:不同函數(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例:可以在復(fù)合語句中定義變量#include<stdio.h>main(){ inti;

for(i=1;i<=10;i++) { staticcharj='A';

printf("%c:%d",j++,i); }}變量j只能在for循環(huán)語句的循環(huán)體內(nèi)被調(diào)用全局變量(外部變量)定義:函數(shù)之外定義的變量稱為外部變量。外部變量可以為本文件中其他函數(shù)所共用。它的有效范圍為從定義變量的位置開始到本源文件結(jié)束。所以也稱全程變量。應(yīng)盡量少使用全局變量,因為:全局變量在程序全部執(zhí)行過程中都占用著存儲單元降低了函數(shù)的通用性、可靠性,可移植性降低程序清晰性,容易出錯#include<stdio.h>#defineN10floatMax=0,Min=0;/*全局變量*/floataverage(floatarray[])/*定義子函數(shù),形參為數(shù)組*/{ inti; floatsum=0; Max=Min=array[0];

for(i=0;i<N;i++) { if(array[i]>Max)Max=array[i]; elseif(array[i]<Min)Min=array[i]; sum=sum+array[i]; }

return(sum/N);}voidmain(){ floatave,score[N];

inti;

for(i=0;i<N;i++)

scanf("%f",&score[i]);

ave=average(score);

printf("max=%6.2f\nmin=%6.2f\naverage=%6.2f\n",Max,Min,ave);}外部變量與局部變量同名問題#include<stdio.h>inta=3,b=5;/*a,b為外部變量*/voidmain(){inta=8;/*a為局部變量*/

printf("%d",max(a,b));/*全局變量b的作用范圍*/}max(int

a,intb)/*a,b為局部變量*/{intc;c=a>b?a:b;/*形參a、b作用范圍*/

return(c);}運行結(jié)果為

8

變量的存儲類別從變量的作用域角度來分,可以分為全局變量和局部變量。從變量值存在的時間角度來分,又可以分為靜態(tài)存儲方式和動態(tài)存儲方式。靜態(tài)存儲方式:指在程序運行期間由系統(tǒng)分配固定的存儲空間的方式。動態(tài)存儲方式:則是在程序運行期間根據(jù)需要進(jìn)行動態(tài)的分配存儲空間的方式。存儲空間可以分為三部分:1.程序區(qū)2.靜態(tài)存儲區(qū)3.動態(tài)存儲區(qū)變量的存儲類別變量和函數(shù)有兩個屬性:數(shù)據(jù)類型和數(shù)據(jù)的存儲類別。存儲類別指的是數(shù)據(jù)在內(nèi)存中存儲的方式。根據(jù)變量的存儲類別,我們可以知道變量的作用域和生存期。C語言中變量的存儲類別包含:自動的(auto);靜態(tài)的(static);寄存器的(register);外部的(extern)。auto變量不專門聲明存儲類別的局部變量都是自動變量。函數(shù)中的形參和在函數(shù)中定義的變量(包括在復(fù)合語句中定義的變量),都屬此類。自動變量可用關(guān)鍵字auto作存儲類別的聲明。例如:int

f(int

a)/*定義f函數(shù),a為形參*/{autoint

b,c=3;/*定義b、c為自動變量*/

……}用static聲明局部變量用關(guān)鍵字static進(jìn)行聲明的變量被稱為靜態(tài)局部變量。靜態(tài)局部變量在函數(shù)調(diào)用結(jié)束后并不立即消失,而是繼續(xù)保留原值直到程序結(jié)束。說明:靜態(tài)局部變量屬于靜態(tài)存儲類別,在靜態(tài)存儲區(qū)內(nèi)分配存儲單元。在程序整個運行期間都不釋放。靜態(tài)局部變量是在編譯時賦初值的,即只賦初值一次,以后每次調(diào)用函數(shù)時不再重新賦初值而只是保留上次函數(shù)調(diào)用結(jié)束時的值。對靜態(tài)局部變量來說,在定義時不賦初值的話,編譯系統(tǒng)會自動為其賦初值,對數(shù)值型變量賦0值,對字符變量賦空值。雖然靜態(tài)局部變量在函數(shù)調(diào)用結(jié)束后仍然存在,但其他函數(shù)不能引用它??疾祆o態(tài)局部變量的值#include<stdio.h>voidmain(){ voidf(int);

inta=1,i;

for(i=0;i<3;i++)f(a);}voidf(inta){ autointb=1; staticintc=1; b++; c++;

printf("a=%db=%dc=%d\n",a,b,c);}運行結(jié)果為a=1b=2c=2a=1b=2c=3a=1b=2c=4register變量變量的值是存放在內(nèi)存中的。當(dāng)程序中用到哪一個變量的值時,由控制器發(fā)出指令將內(nèi)存中該變量的值送到運算器中。經(jīng)過運算后,再從運算器將數(shù)據(jù)送到內(nèi)存存放。如果一個變量使用頻繁,則為存取變量的值要花費不少時間。為提高執(zhí)行效率,C語言允許將局部變量的值放在CPU中的寄存器中,需要用時直接從寄存器取出參加運算,不必再到內(nèi)存中去存取。由于對寄存器的存取速度遠(yuǎn)高于對內(nèi)存的存取速度,因此這樣做可以提高執(zhí)行效率。以上描述的這種變量叫做寄存器變量,用關(guān)鍵字register作聲明。

使用寄存器變量,求n的階乘#include<stdio.h>voidmain(){ longfac(long); longn;

scanf("%ld",&n);

printf("%ld!=%ld\n",n,fac(n));}longfac(longn){ registerlongi,f=1;/*定義寄存器變量*/ for(i=1;i<=n;i++) f*=i; return(f);}用extern聲明外部變量外部變量是在函數(shù)的外部定義的全局變量,

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論