




已閱讀5頁,還剩6頁未讀, 繼續(xù)免費閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
C語言程序設(shè)計A課程輔導(dǎo)(6)-第6章 函數(shù)主要內(nèi)容: 一、函數(shù)的定義 二、函數(shù)的調(diào)用 三、變量的作用域 四、遞歸函數(shù) 五、函數(shù)指針 六、函數(shù)應(yīng)用舉例一、函數(shù)的定義l 函數(shù)定義格式 () 有效范圍:由所使用的保留字extern或static決定,若使用extern則稱為全局函數(shù)或外部函數(shù);若使用static則稱為局部函數(shù)或靜態(tài)函數(shù)。若選項被省略,則默認(rèn)為是全局函數(shù)。對于全局函數(shù),能夠在一個程序的其他每個程序文件中被聲明和調(diào)用;對于局部函數(shù),則只能被所在的程序文件聲明和調(diào)用。 類型名:給出函數(shù)通過return語句返回的值的類型,當(dāng)使用保留字void作為類型名時,則不需要返回值。 函數(shù)名:是用戶為函數(shù)所起的名字,它是一個符合C語言命名規(guī)定的標(biāo)識符。通常用函數(shù)名反映該函數(shù)的功能。如用SUM表示求和。 參數(shù)表:又稱形式參數(shù)表,它包含有任意多個參數(shù)說明,當(dāng)多于一個時其前后兩個參數(shù)說明項之間必須用逗號分開。每個參數(shù)說明包括類型名和參數(shù)名兩項內(nèi)容。 函數(shù)體:是一條復(fù)合語句,它以左花括號開始,到右花括號結(jié)束,中間為一條或若干條C語句。 函數(shù)頭:在函數(shù)定義中,函數(shù)體之前的部分構(gòu)成函數(shù)頭,又稱為函數(shù)原型。取出函數(shù)頭再加上分號就構(gòu)成該函數(shù)的原型聲明語句。l 函數(shù)定義格式舉例 (1) void f1() . /返回?zé)o類型,無須返回值,函數(shù)名為f1 /參數(shù)表為空,即不帶有任何參數(shù)。 (2) static void f2(int x) . /文件域函數(shù),無返回類型,函數(shù)名 /為f2,帶有一個int型參數(shù)x (3) int f3(int x,int* p) . /全局域函數(shù),返回值類型為int, /函數(shù)名為f3,帶有2個參數(shù),一個為整型x,另一個為整型指針p (4) char* f4(char a). /返回類型為字符指針,函數(shù)名為f4, /帶有一個一維字符數(shù)組參數(shù)a,標(biāo)記為后跟一對中括號 (5) void f5(float cN, int m) . /無類型,函數(shù)名f5,第 /1個為二維單精度型數(shù)組參數(shù)c,第2個為整型參數(shù)m。 /標(biāo)記是后跟兩對中括號,并在第2個內(nèi)給出常量(列數(shù))。l 函數(shù)定義和使用的幾點說明函數(shù)定義位置:可以出現(xiàn)在整個程序的任一個程序文件內(nèi)的任何位置。函數(shù)原型聲明語句:在利用函數(shù)調(diào)用表達(dá)式調(diào)用一個函數(shù)之前,必須出現(xiàn)有該函數(shù)的原型聲明語句或函數(shù)定義。函數(shù)的常量形參:即在一般的形參說明項前加上const修飾。如: void f6(const float x, float y) . /x常量形參,y一般形參 void f7(const char* a, char* b) . /a常量形參,b一般形參 在f6函數(shù)體中只能讀取x的值,不能改變它的值,對y可任意操作。 在f7函數(shù)體中只能讀取a所指的字符或字符串,不能改變它,對b任意。 一維數(shù)組參數(shù)說明項的格式: 等價于指針參數(shù)說明: * 指針變量名就是數(shù)組參數(shù)說明中的數(shù)組名。如一個函數(shù)定義中的數(shù)組參數(shù)說明 int a /數(shù)組參數(shù)說明,指向int類型元素的指針 int* a /等價于指針參數(shù)說明 當(dāng)調(diào)用它們時,對應(yīng)的實參為同類型的數(shù)組名,訪問它們既可以是指針方式也可以是下標(biāo)方式。 二維數(shù)組參數(shù)說明項格式: 等價的指針參數(shù)說明: (*) 如假定一個函數(shù)定義中的: 二維數(shù)組參數(shù)說明: float cN /指向N個float類型元素的指針 等價的指針參數(shù)說明: float(*c)N 當(dāng)調(diào)用它們時,與c對應(yīng)的實參為具有相同列數(shù)N的二維數(shù)組名,訪問它們既可以是指針方式也可以是下標(biāo)方式。l 編寫具體函數(shù)定義舉例例1:編寫一個函數(shù)定義,求3個整數(shù)中的最大值。int MaxValue(int x, int y, int z) /用x,y,z分別表示3個整數(shù)形參int w; /w作為臨時變量,存放大者if(x=y) w=x; else w=y; /x和y中的大者賦給w保存if(w=z) return w; else return z; /返回w和z中的大者例2:編寫一個函數(shù)定義,求n個整數(shù)中的最大值。分析:n個整數(shù)用一個一維數(shù)組a來表示,n也是一個整型參數(shù),采用順序比較的方法查找出數(shù)組an中的最大值。int MaxArray(int a, int n) /數(shù)組參數(shù)和表示數(shù)組長度的參數(shù) / int a可改為int* aint x,i; /用x保存當(dāng)前比較中的大者,i為循環(huán)變量x=a0; /把a中第1個元素值賦給xfor(i=1; ix) x=ai;return x; /返回最大值 二、函數(shù)的調(diào)用l 函數(shù)調(diào)用格式 ( )函數(shù)調(diào)用:又稱為函數(shù)調(diào)用表達(dá)式。函數(shù)名:在前面已經(jīng)聲明或定義了的函數(shù)名稱,否則在編譯時將報錯。實參表:可含0、1或多個用逗號分開的實參,每個實參可以為任何表達(dá)式。每個實參同函數(shù)定義或聲明中的形參相對應(yīng)。l 格式舉例 (1) fd1(); /實參表為空 (2) fd2(bx, 10); /實參表有2個參數(shù),一個為變量,一個為常量 (3) fd3(2*a-3); /實參表只有一個參數(shù),它是一個算術(shù)表達(dá)式 (4) double y=fd4(5, sin(x), b3); /常數(shù)、函數(shù)、下標(biāo)變量l 調(diào)用過程第一步:參數(shù)傳遞。把實參的值傳送給函數(shù)定義中對應(yīng)的形參。第二步:執(zhí)行函數(shù)體。執(zhí)行函數(shù)定義中的函數(shù)體。第三步:返回。當(dāng)執(zhí)行到函數(shù)體中的任一條return語句或最后的花括號則返回。l 參數(shù)傳遞就是在函數(shù)調(diào)用時,自動把實參表中的每個實際參數(shù)的值向形參表中每個對應(yīng)的形式參數(shù)傳遞的過程。此過程首先計算出每個實參值,接著為每個形參變量分配相應(yīng)的存儲空間,然后把每個實參值對應(yīng)賦給每個形參變量中。舉例1:int f1(int x, int y, int z) /參數(shù)為一般變量int w;if(x=y) w=x; else w=y;if(w=z) return w; return z;int s=f1(25, 38, 30); /調(diào)用f1函數(shù),返回值為38int a=15, b=23, c=36,d; d=f1(a,b,c); /實參值不變,返回值36舉例2:void f4(int* x, int* y) /參數(shù)為指針變量 /交換x和y所指向?qū)ο蟮膬?nèi)容,作用于實參變量int w;w=*x; *x=*y; *y=w;int a=25, b=18; f4(&a, &b); /把a和b的地址賦給x和y,實參值被交換得到結(jié)果:a=18, b=25舉例3:void f5(int a, int n) /int *a,參數(shù)為數(shù)組(指針)變量 /按相反次序排列數(shù)組an的n個數(shù)據(jù),作用于實參數(shù)組int i,w;for(i=0; in/2; i+) w=ai; ai=an-1-i; an-1-i=w; /對稱值對調(diào) int b5=12,35,56,62,78; f5(b,5); /把b的值傳送給a,a也指向b,修改了數(shù)組b得到結(jié)果:b5=78,62,56,35,12 舉例4:int f6(const int *a, int n) /a,參數(shù)a所指對象不能被修改 /返回數(shù)組an中的n個整數(shù)之和int i,sum=0;for(i=0; in; i+) sum+=*a+; /累加求和,只取值不修改return sum; /若ai=5則編譯出錯 int b5=5,8,4,10,20; int x=f6(b,5); /把b的值傳送給a,a也指向b /返回值47舉例5:#include#define Col 10void f7(char (*a)Col, int m);void main() char b3Col=one,two,three; f7(b,3); /把b的值傳送給a,輸出b中3個字符串void f7(char (*a)Col, int m) /二維數(shù)組參數(shù)aColint i;for(i=0; im; i+) /輸出每行字符串printf(%sn,ai);三、變量的作用域l 變量作用域的概念程序中使用的每個變量都有它的作用域(有效區(qū)域),離開它的作用域該變量就不起任何作用了。變量的作用域從定義它的位置開始,到所在的程序模塊結(jié)束。l 作用域分類:全局、文件、函數(shù)、塊 全局域變量:在所有函數(shù)定義之外定義的變量,通常是在主程序文件的開始或頭文件中定義,在該程序的所有文件里都有效,但在其他程序文件中使用時必須加以聲明。全局變量若沒有被初始化,則自動被賦值0。 文件作用域變量:在所有函數(shù)定義之外定義的變量,通常是在每個程序文件的開始定義,此變量定義語句的開始必須使用static保留字。文件域變量的作用域?qū)儆谒诘奈募羲鼪]有被初始化,則也自動被賦值0。例如:#include#define NN 15 /相當(dāng)于文件域常量int x=3,y; /全局變量,x值3,y值0static double a,b; /文件域變量,初值均為0.0const int MM=20; /全局域常量void main() /可以使用以上定義的任何常量和變量 /在同一程序的其他程序文件中,經(jīng)聲明后只能使用上面的全局量 /聲明格式為:extern int x,y; extern const int MM; 函數(shù)作用域:專指語句標(biāo)號,供goto語句用。Goto語句只能轉(zhuǎn)移到本函數(shù)定義中的一個帶有語句標(biāo)號的位置。 塊作用域變量:又稱為局部變量。一種情況:在一條復(fù)合語句內(nèi)定義,作用域從定義點開始到復(fù)合語句結(jié)束。另一種情況:函數(shù)定義中的形參變量,作用域為整個函數(shù)體。l 函數(shù)定義體內(nèi)的自動變量和靜態(tài)變量 函數(shù)定義體內(nèi)的變量都屬于塊作用域變量,即局部變量,但根據(jù)變量性質(zhì)又分為2種:一種叫自動變量,另一種叫靜態(tài)變量。如:void ff() int z=0; /自動變量,不賦初值,值不確定 static int k; /靜態(tài)變量,第1次自動賦初值0 k+=5; /每次調(diào)用此函數(shù)在k的原值上加5 z+=5; /每次都在0上加5int i; for(i=1; i=5; i+) ff();l 分析變量作用域的程序舉例程序1:#include#define NN 8 /文件域符號常量 int NumNN=12,10,8,3,5,0,7,2; /全局域數(shù)組int Sum() /求全局?jǐn)?shù)組NumNN中的所有元素之和int i,s=0; /i,s為局部變量,作用域為此函數(shù)體for(i=0; iNN; i+) s+=Numi;return s; /返回所求元素之和int Max() /求全局?jǐn)?shù)組NumNN中的所有元素的最大值int i,m=Num0; /i,m為局部變量,作用域為此函數(shù)體for(i=1; im) m=Numi;return m; /返回所有元素的最大值void main() int c; /局部變量,從此處到主函數(shù)結(jié)束 c=Sum()+2*Max(); /47+2*12=71 printf(c=%dn,c); /輸出結(jié)果:c=71程序2:#includeint Mul(int a, int n); /函數(shù)原型聲明語句void main() int b5=1,2,3,4,5; /只作用于主函數(shù)的數(shù)組 int r1,r2; /只作用于主函數(shù)的局部變量 r1=Mul(b,5); /所有元素乘積,值120 r2=Mul(b+2,3); /b2*b3*b4,值60 printf(r1=%d, r2=%dn,r1,r2); /輸出:r1=120, r2=60int Mul(int a, int n) /a和n的作用域為該函數(shù) int i,p=1; /局部變量,作用域到復(fù)合語句結(jié)束 for(i=0; in; i+) p*=ai; 求a數(shù)組中n個元素之積 return p; /返回p的值程序3: #include int x=10; /全局變量 void main() int y=20; /局部于整個主函數(shù)的變量 printf(x=%d, y=%dn,x,y); /輸出:x=10, y=20 int x=30; /局部于此復(fù)合語句內(nèi)的變量,優(yōu)先于外部同名變量 y=y+x; /y為外部的,x為內(nèi)部的 printf(x=%d, y=%dn,x,y); /輸出:x=30, y=50 /內(nèi)部的x的作用域就此結(jié)束 printf(x=%d, y=%dn,x,y); /輸出:x=10, y=50 /y作用域就此結(jié)束 /全局變量x的作用域到整個程序運行結(jié)束程序4: #include int Cdiv(int m, int n) /求出m和n的最大公約數(shù) /m和n只作用于此函數(shù) int r; /局部變量 if(mn) r=m; m=n; n=r; /大者放m,小者放n while(r=m%n) m=n; n=r; /循環(huán)結(jié)束時n的值為最大公約數(shù) return n; /返回n值 void main() int m,n; /此處的m和n只作用于主函數(shù) printf(輸入兩個正整數(shù)求其最大公約數(shù): ); scanf(%d %d,&m,&n); printf(%d 和 %d 的最大公約數(shù)為: %dn,m,n,Cdiv(m,n); /進(jìn)行Cdiv(m,n)調(diào)用時,m和n的值分別對應(yīng)傳送, /在Cdiv(m,n)的函數(shù)體中對m和n的修改,與此處的m和n無關(guān) /允許不同作用域的變量同名運行結(jié)果: 輸入兩個正整數(shù)求其最大公約數(shù): 25 40 25 和 40 的最大公約數(shù)為: 5程序5: #include void xk2(); void main() int i; for(i=1; i5*f(4)-5*4*f(3)-5*4*3*f(2)-5*4*3*2*f(1) -5*4*3*2*1-5*4*3*2-5*4*6-5*24-120 /x=120又如:int f7(int a, int n) if(n=1) return a0; /結(jié)束遞歸并返回else return an-1+f7(a,n-1); /遞歸調(diào)用int a5=2,5,4,8,6;int z=f7(a,5); /6+f7(a,4)-6+8+f7(3)-6+8+4+f7(2)-6+8+4+5+f7(1) -6+8+4+5+2-6+8+4+7-6+8+11-6+19-25 /z=25*五、函數(shù)指針l 函數(shù)名是指向該函數(shù)執(zhí)行代碼的指針int fa(int x, int y)return x+y; int (*) (int, int)l 定義函數(shù)指針變量并賦予同類型函數(shù)的函數(shù)名(指針)后,可以同函數(shù)名一樣使用int (*fp) (int, int)=fa;fa(a,b); fp(a,b);l 函數(shù)的形參表中也可以使用函數(shù)參數(shù)void fc(char* p, int hf(int, int); /hf為函數(shù)形參/fc(”abcd”, fa); fc(str, fp); /fa和fp為函數(shù)實參l 使用函數(shù)參數(shù)的程序舉例 #include int Length(char* p) int i=0; while(*p+) i+; return i;/返長度 void Out(char *s, int(*pp)(char*) / printf(%d: %sn, pp(s), s); /輸出s串的長度和串值 / pp(s)的調(diào)用就是Length(s)的調(diào)用 void main() char* x1=123456; char* x2=asder oiu; Out(x1, Length); /輸出: 6: 123456 Out(x2, Length); /輸出: 9: asder oiu 六、利用函數(shù)編寫程序舉例 通常用一個函數(shù),完成一個程序設(shè)計中相對獨立的功能,而一個程序通常有若干個函數(shù)所組成,整個程序的功能通過函數(shù)的調(diào)用來實現(xiàn)。例1:編寫一個程序,判斷從鍵盤上輸入的任一個整數(shù)是否為素數(shù)。分析:判斷一個整數(shù)是否為素數(shù)的功能相對獨立,可以單獨編寫成一個函數(shù),該函數(shù)帶有一個整數(shù)參數(shù),假定用x表示,函數(shù)名假定用Prime表示,該函數(shù)應(yīng)該把判斷結(jié)果返回,所以返回類型應(yīng)定義為int,當(dāng)返回1時表明x是一個素數(shù),返回0時則表明不是一個素數(shù)。 若一個整數(shù)是素數(shù),則它不能被除1和本身之外的任何數(shù)整除,也就是說,若一個整數(shù)x能夠分解為兩個整數(shù)a和b的乘積,則它就不是素數(shù),在這兩個整數(shù)a和b中,一個若小于等于,則另一個必然大于等于。所以判斷一個整數(shù)x是否為素數(shù),只要判斷是否能夠被2中的任一數(shù)整除即可,若能夠被其中的任一個數(shù)整除,則它不是素數(shù),若不能被其中的所有數(shù)整除,則才是一個素數(shù)。 根據(jù)以上分析,編寫出函數(shù)如下: int Prime(int x) int y=(int)sqrt(x); int i; for(i=2; iy) return 1; else return 0; 在該程序的主函數(shù)中,應(yīng)定義一個整型變量,假定仍用x表示,用來接收從鍵盤上輸入的整數(shù),接著應(yīng)把x作為實參去調(diào)用求素數(shù)的函數(shù),判斷x是否為素數(shù),然后再根據(jù)不同的判斷結(jié)果輸出相應(yīng)的信息。帶主函數(shù)的程序如下: #include #include int Prime(int x); void main(void) int x,y
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 城市商業(yè)綜合體采購合同
- 軟件服務(wù)行業(yè)軟件測試與質(zhì)量保障方案
- 產(chǎn)品銷售及代理協(xié)議書
- 債權(quán)債務(wù)轉(zhuǎn)讓協(xié)議書
- 電焊勞務(wù)承包協(xié)議
- 公廁保潔承包合同協(xié)議書
- 自考行政管理社會熱點試題及答案
- 超市商品陳列與促銷管理方案
- 股東權(quán)益保障出資證明書(6篇)
- 農(nóng)村勞務(wù)輸出與管理服務(wù)協(xié)議
- 前列腺增生癥患者圍手術(shù)期的護(hù)理
- 五防系統(tǒng)調(diào)試報告
- 日語綜合教程第六冊 單詞表
- 在建項目雨季施工(防汛)安全隱患排查表
- 《廣東省普通高中學(xué)生檔案》模板
- GB/T 7715-2014工業(yè)用乙烯
- GB/T 40848-2021飼料原料壓片玉米
- GB/T 3715-2007煤質(zhì)及煤分析有關(guān)術(shù)語
- GB/T 2-2016緊固件外螺紋零件末端
- GB/T 12237-2021石油、石化及相關(guān)工業(yè)用的鋼制球閥
- GB/T 1094.11-2007電力變壓器第11部分:干式變壓器
評論
0/150
提交評論