版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、第7章 函數(shù)山西財經(jīng)大學(xué)華商學(xué)院C語言程序設(shè)計函數(shù)概述函數(shù)定義的一般形式函數(shù)的調(diào)用、參數(shù)和返回值局部變量和全局變量變量的存儲類型內(nèi)部函數(shù)和外部函數(shù)概述C程序源程序文件n函數(shù)1函數(shù)m 源程序文件1函數(shù)1函數(shù)nC語言用函數(shù)實現(xiàn)程序模塊化一個源程序文件由一個或多個函數(shù)組成;一個程序由一個或多個源程序文件組成C程序的執(zhí)行從main函數(shù)開始,并回到main函數(shù)結(jié)束函數(shù)之間可以相互調(diào)用,或調(diào)用自身不能調(diào)用main函數(shù)函數(shù)之間相互獨立,不存在從屬關(guān)系【例】求一個整數(shù)的立方int cube (int x) /* 函數(shù)定義 */ return (x * x * x); main( ) int f, a; pri
2、ntf(nEnter an integer number:); scanf(%d, &a); f = cube (a); printf(%d * %d * %d = %dn, a, a, a, f);程序運行情況如下:Enter an integer number:22 * 2 * 2 = 8函數(shù)調(diào)用程序的執(zhí)行總是從main函數(shù)開始 函數(shù)的種類從函數(shù)定義形式分: 有參函數(shù):int cube (int x) 無參函數(shù):如 getchar( )從使用的角度看: 標(biāo)準(zhǔn)函數(shù)(庫函數(shù)) 用戶自定義函數(shù)。7.2.1 函數(shù)的定義函數(shù)定義的一般形式函數(shù)類型 函數(shù)名(形式參數(shù)表列) 聲明部分 語句返回類型、參數(shù)
3、、函數(shù)體內(nèi)容都可沒有dummy()/* does nothing & returns nothing */關(guān)于“聲明部分”指變量、函數(shù)的聲明函數(shù)定義形式的說明關(guān)于“函數(shù)類型”指函數(shù)返回值的類型若省略此項,則認(rèn)為返回類型是int若無返回值,則定義返回類型為void例如:求兩個數(shù)的最大值。 int max(int x,int y) int z; z = x y ? x : y; return( z );類型省略時默認(rèn)為int類型int max(x,y)int x,y; int z; z = x y ? x : y; return( z );int max(x,y) int x,y;或int max
4、(int x,y) 或int max(x,y)int x,y,z; z = x y ? x : y; return( z );形參也可以這樣定義如下定義都是錯誤的 形參定義格式:類型 形參名, 類型 形參名, .int max(int x,int y) 函數(shù)名(實參表列)在C語言中,把函數(shù)調(diào)用也作為一個表達(dá)式。因此凡是表達(dá)式可以出現(xiàn)的地方都可以出現(xiàn)函數(shù)調(diào)用。例如: welcome( ); if (iabs (a)max) max=iabs(a); m=max(c,max(a,b);7.2.2 函數(shù)的調(diào)用函數(shù)調(diào)用的一般形式:int sum ( ) int i,t=0; for (i=1; i=1
5、00; i+) t+=i; return (t);main( ) int s; s=sum ( ); printf(%dn, s);程序輸出結(jié)果:5050int sum ( int x ) int i,t=0; for (i=1; i=x; i+) t+=i; return (t);main( ) int s; s=sum (100); printf(%dn, s); 【例】求1100的累加和。思考:兩個程序有何不同程序輸出結(jié)果:5050?void swap(int x, int y) int z; z=x; x=y; y=z; printf(nx=%d,y=%d,x ,y);main( )
6、int a= 10,b=20; swap(a,b); printf(na=%d,b=%dn,a,b);7.2.3 函數(shù)參數(shù)與函數(shù)的返回值1函數(shù)的形式參數(shù)與實際參數(shù)程序輸出結(jié)果:x=20,y=10a=10,b=20形式參數(shù)(形參)實際參數(shù)(實參)【例】編一程序,將主函數(shù)中的兩個變量的值傳遞給swap函數(shù)中的兩個形參,交換兩個形參的值。單向值傳遞有關(guān)形參和實參的說明: 說明:實參必須有確定的值形參必須指定類型形參與實參類型一致,個數(shù)相同若形參與實參類型不一致,自動按形參類型轉(zhuǎn)換函數(shù)調(diào)用轉(zhuǎn)換形參在函數(shù)被調(diào)用前不占內(nèi)存;函數(shù)調(diào)用時為形參分配內(nèi)存;調(diào)用結(jié)束,內(nèi)存釋放“單向值傳遞”return語句形式形式
7、一:return (表達(dá)式);形式二:return 表達(dá)式;功能函數(shù)返回語句結(jié)束函數(shù)調(diào)用如果需要,還可以帶回函數(shù)返回值函數(shù)的返回值說明函數(shù)返回值的類型在函數(shù)定義中指定函數(shù)返回值通過函數(shù)中的return語句獲得return語句后的表達(dá)式類型,與函數(shù)返回值類型不同時,自動做按函數(shù)類型轉(zhuǎn)換函數(shù)需要返回值時,若缺少return語句,或return語句未帶返回值,則返回一個不確定值為明確表示不帶回值,用void定義無類型。系統(tǒng)保證不使函數(shù)帶回任何值?!纠坑嬎悴⑤敵鰣A的面積。s(int r) return 3.14*r*r;main( ) int r,area; scanf(%d,&r); printf
8、(%dn,s(r);自動轉(zhuǎn)換為int型 程序運行情況如下:212函數(shù)聲明的一般形式如下:類型名 函數(shù)名(類型1 形參1,類型2 形參2,類型n 形參n);或類型名 函數(shù)名(類型1,類型2,類型n);或類型名 函數(shù)名();函數(shù)聲明是以語句形式出現(xiàn)的,因此其后有語句結(jié)束標(biāo)記“;”若函數(shù)定義放在主調(diào)函數(shù)之前,遵循先定義后調(diào)用原則,函數(shù)聲明可以省略。庫函數(shù)的聲明包括在頭文件(*.h)里,不需聲明對被調(diào)函數(shù)的聲明和函數(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ù)進(jìn)行聲明。void swap(int x
9、, int y) main( ) swap(a,b); main( ) c=max(a,b);max(int x,int y) 函數(shù)聲明被調(diào)函數(shù)出現(xiàn)在主調(diào)函數(shù)之前,不必函數(shù)說明int型函數(shù)可不作函數(shù)說明 例 函數(shù)聲明舉例#include foat max(float x, float y);main() float a,b; int c; scanf(%f,%f,&a,&b); c=max(a,b); printf(Max is %dn,c);foat max(float x, float y) float z; z=xy?x:y; return(z);在函數(shù)外面做了聲明, 所有調(diào)用函數(shù)不必再
10、聲明main() float add(float,float); /*function declaration*/ float a,b,c; scanf(%f,%f,&a,&b); c=add(a,b); printf(sum is %f,c);float add(float x, float y) float z; z=x+y; return(z);float add();一維數(shù)組名作函數(shù)參數(shù)數(shù)組名表示數(shù)組在內(nèi)存中的起始地址。 例如:數(shù)組a在內(nèi)存中從2000地址開始存放,則a的值為2000。2000是地址值,是指針類型的數(shù)據(jù),不能把它看成是整型或其他類型數(shù)據(jù)。實參是數(shù)組名,形參也應(yīng)定義為數(shù)組
11、形式,形參數(shù)組的長度可以省略,但 不能省,否則就不是數(shù)組形式了。void sort(int b ,int n); void printarr(int b ); main( ) int a10 = 11,22,63,97,58,80,45, 32,73,36; printf(Before sort:n); printarr(a); sort(a,10); printf(After sort:n); printarr(a);void printarr(int b10) int i; for (i=0; i10; i+) printf(%5d,bi); printf(n);void sort(int
12、 b , int n) int i,j,t; for (i=1; in; i+) for (j=0; jbj+1) t=bj;bj=bj+1;bj+1=t; 用冒泡法將10個整數(shù)排序 a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 b0 b1 b2 b3 b4 b5 b6 b7 b8 b911 22 63 97 58 80 45 32 73 36(a) 排序前a0 a1 a2 a3 a4 a5 a6 a7 a8 a9b0 b1 b2 b3 b4 b5 b6 b7 b8 b911 22 32 36 45 58 63 73 80 97(b) 排序后圖8.3 調(diào)用sort函數(shù)2000b形
13、參 b 實際是一個可以存放地址的變量a:2000實參賦給形參首地址: 2000首地址: 2000函數(shù)的遞歸調(diào)用1遞歸的基本概念遞歸調(diào)用:一個函數(shù)直接或間接地調(diào)用了它本身,就稱為函數(shù)的遞歸調(diào)用。遞歸函數(shù):在函數(shù)體內(nèi)調(diào)用該函數(shù)本身。int sub(int x) int y,z; if( ) z=sub(y); else return ;例如:直接調(diào)用sub函數(shù)本身2遞歸函數(shù)的執(zhí)行過程【例】編一遞歸函數(shù)求n!。思路:以求4的階乘為例:4!=4*3!,3!=3*2!,2!=2*1!,1!=1,0!=1。遞歸結(jié)束條件:當(dāng)n=1或n=0時,n!=1。遞歸公式:n! =1 (n=0, 1)n(n-1)! (
14、n1)遞歸調(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; return 24 return 6 return 2 return 1 遞 推 3編制遞歸函數(shù)的方法對于數(shù)值型問題,首先要找出解題的數(shù)學(xué)公式,這個公式必須是遞歸定義的,且所處理的對象要有規(guī)律地遞增或遞減,然后確定遞歸結(jié)束條件。【例】編一遞歸函數(shù)求xn 。思路:首先把xn轉(zhuǎn)化成遞歸定義的公式xn =1 (n=0)x xn - 1 (n0)再找出遞歸結(jié)束條件:當(dāng)n=0時,xn=1。程
15、序如下:long xn(int x,int n) long f=0; if (n0) printf(n0,data error!n); else if (n=0) f=1; else f=x*xn(x,n-1); return (f);main( ) int n,x; long y; scanf(%d,%d,&x,&n); y=xn(x,n); printf(%ldn,y);程序運行情況如下:2,101024局部變量和全局變量在一個函數(shù)內(nèi)部定義的變量稱為局部變量。 局部變量的有效范圍是所在定義的函數(shù)內(nèi)。float f1(int a)int b , c; char f2(int x, int y
16、) int b ,c ; a,b,c的有效范圍x , y ,b,c的有效范圍main()int m,n; m , n的有效范圍說明:1、主函數(shù)中定義的變量也屬于局部變量。2、不同函數(shù)中可以使用相同名字的變量,在內(nèi)存中占有不同的存儲單元。例如上面的函數(shù) f1 和 f2中均使用局部變量 b 和c 。3、形參也是局部變量。4、在一個函數(shù)內(nèi)部,也可以在復(fù)合語句中定義變量,這些變量只能在本復(fù)合語句中有效,這種復(fù)合語句稱為“分程序”或“程序塊”。例如: main() int a ,b ; . int c; c=a+b; . . C的有效范圍a ,b的有效范圍例 不同函數(shù)中同名變量main() int a,
17、b; a=3; b=4; printf(main:a=%d,b=%dn,a,b); sub(); printf(main:a=%d,b=%dn,a,b);sub() int a,b; a=6; b=7; printf(sub:a=%d,b=%dn,a,b);例 不同函數(shù)中同名變量main() int a,b; a=3; b=4; printf(main:a=%d,b=%dn,a,b); sub(); printf(main:a=%d,b=%dn,a,b);sub() int a,b; a=6; b=7; printf(sub:a=%d,b=%dn,a,b);運行結(jié)果:main:a=3,b=4s
18、ub:a=6,b=7main:a=3,b=4地址地址3467函數(shù)main中的變量a,b的存儲單元20002050abba31003500函數(shù)sub中的變量a,b的存儲單元地址地址二、全局變量 定義在函數(shù)外部的變量稱為全局變量,全局變量可以為本文件中其它函數(shù)所使用。它的有效范圍為從定義變量的位置開始到本源文件結(jié)束。int p=1 ,q=5;float f1(int a)int b, c ; .char c1 ,c2 ;char f2(int x,int y)int i ,j ; . main() int m ,n ; 全局變量p、q有效范圍全局變量c1,c2有效范圍變量 p、q、c1、c2都是全
19、局變量,但是它們的作用范圍是不同的。全局變量也稱為外部變量,通常定義中全局變量的變量名的第一個字母大寫,便于識別。float Max,Min;float average(float array, int n) int i; float sum=array0; Max=Min=array0; for(i=1;iMax) Max=arrayi; else if(arrayib?a:b; return(c);main() int a=8; printf(max=%d,max(a,b);運行結(jié)果:max=8如果在同一個源文件中,外部變量與局部變量同名,則在局部變量的作用范圍內(nèi),外部變量被“屏蔽”,即不
20、起作用。變量的存儲類型 一、動態(tài)存儲方式與靜態(tài)存儲方式每一個變量從它的作用域角度來分:全局變量和局部變量。下面我們考慮變量在內(nèi)存中的存儲情況:C語言把用戶使用的內(nèi)存分為三部分(如圖):即1、程序區(qū)2、靜態(tài)存儲區(qū)3、動態(tài)存儲區(qū)程序區(qū)靜態(tài)存儲區(qū)動態(tài)存儲區(qū)用戶區(qū)內(nèi)存變量的存儲區(qū)靜態(tài)區(qū)中變量是源程序編譯時分配單元的,程序執(zhí)行完畢才釋放動態(tài)區(qū)中變量是程序執(zhí)行過程中分配單元的,程序執(zhí)行過程中釋放二、變量的存儲類別從全局變量、局部變量出發(fā)來考慮。C語言中規(guī)定所有的全局變量都放在靜態(tài)存儲區(qū)中 對局部變量分以下幾種情況來處理: 局部變量: 1、auto 變量 (自動變量)2、static 變量 (靜態(tài)局部變量)
21、3、register 變量(寄存器變量)1、auto 變量 (自動變量)所有未聲明為static存儲類別的函數(shù)中的局部變量,就是auto變量。auto類別變量是動態(tài)的分配存儲空間,數(shù)據(jù)存儲在動態(tài)存儲區(qū)中。 自動變量使用關(guān)鍵字auto(可以省略)作存儲類別聲明。例如: int f(int a) int f(int a) auto int b , c=3; int b ,c=3; a,b,c都是auto類型變量,這類變量是在調(diào)用該函數(shù)時系統(tǒng)會給它們分配存儲空間,在函數(shù)調(diào)用結(jié)束時就釋放這些存儲空間。因此稱為自動變量。2、用static聲明局部變量 (靜態(tài)局部變量) 用static聲明的局部變量稱為靜
22、態(tài)局部變量,特點是變量存儲在靜態(tài)存儲區(qū)中,函數(shù)編譯時賦初值,函數(shù)調(diào)用結(jié)束后不釋放存儲單元,其值作為下次調(diào)用的初始值。靜態(tài)局部變量用關(guān)鍵字static聲明。例如: f(int a) main() auto int b=0; int a=2, i ; static int c=3; for(i=0;i3;i+) b=b+1; printf(“%d”,f(a); c=c+1; return(a+b+c); 運行結(jié)果: 7 8 93、register 變量(寄存器變量)只有函數(shù)內(nèi)定義的變量或形參可以定義為寄存器變量。凡是聲明為register類別的變量 ,不是保存在內(nèi)存中,而是保存在CPU中的寄存器中
23、。聲明方式如下: int fac( int n) main() register int i, f=1; int i; for(i=1;i=n;i+) for(i=1; iy?x:y; return(z);main() extern int a,b; printf(max=%d,max(a,b);int a=13,b=-8;extern a,b;int max() int z; z=ab?a:b; return(z);main() printf(max=%d,max();int a=13,b=-8;A、變量的存儲方式小節(jié)程序區(qū)靜態(tài)存儲區(qū)動態(tài)存儲區(qū)全局變量、靜態(tài)局部變量 形參變量 局部動態(tài)變量(
24、auto) 全局變量(定義在函數(shù)外部): 有效范圍是從定義處開始到文件結(jié)束。局部變量(定義在函數(shù)內(nèi)部): 有效范圍是在所定義的函數(shù)內(nèi)。B、變量的作用范圍小節(jié)C、變量的聲明方式小節(jié)auto 類型符 變量名 是自動變量(局部變量)static 類型符 變量名 register 類型符 變量名 聲明為寄存器局部變量 extern 變量名 聲明外部變量,擴(kuò)展作用域聲明靜態(tài)的局部變量聲明靜態(tài)的外部變量(只限于本文件使用)D、變量存在的時間小節(jié)全局變量(外部變量):在程序的整個運行期間。靜態(tài)局部變量(用static聲明的局部變量): 在程序的整個運行期間。自動變量(未用static聲明的局部變量): 從函
25、數(shù)調(diào)用到該函數(shù)結(jié)束。 寄存器變量:屬于自動變量。靜態(tài)動態(tài)存儲方式程序整個運行期間函數(shù)調(diào)用開始至結(jié)束生存期編譯時賦初值,只賦一次每次函數(shù)調(diào)用時賦初值自動賦初值0或空字符不確定未賦初值靜態(tài)存儲區(qū)動態(tài)區(qū)存儲區(qū)寄存器局部變量外部變量作用域定義變量的函數(shù)或復(fù)合語句內(nèi)本文件其它文件局部變量默認(rèn)為auto型局部static變量具有可繼承性extern不是變量定義,可擴(kuò)展外部變量作用域register局部staticauto外部static外部存儲類別變量存儲類型例 auto 變量的作用域main() int x=1; void prt(void); int x=3; prt(); printf(“2nd x=%dn”,x); printf(“1st x=%dn”,x);void prt(void) int x=5; printf(“3th x=%dn”,x);運行結(jié)果:3th x=52nd x=31st x=1x=1作用域x=1作用域x=3作用域x=5作用域main() void increment(void); increment(); increment(); increment();void increment(void) int x=0; x+; printf(“%dn”,x);例 局部靜態(tài)變量值具有可繼承性main() void increment(v
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 化學(xué)教師教學(xué)工作總結(jié)15篇
- 浙江省湖州市2022-2023學(xué)年高一上學(xué)期期末調(diào)研測試化學(xué)試題含解析
- 2025年度企業(yè)員工技能提升培訓(xùn)合同-@-1
- 甘肅省歷年中考語文現(xiàn)代文閱讀真題10篇(截至2024年)
- 湘教版數(shù)學(xué)九年級上冊《4.1.1正弦和余弦》聽評課記錄3
- 2025年度地質(zhì)災(zāi)害風(fēng)險評估勘察分包合同
- 2025年度環(huán)境風(fēng)險評估與咨詢合同范本
- 滬科版數(shù)學(xué)八年級上冊《直角三角形全等的判定定理(HL)》聽評課記錄1
- 2025年度知識產(chǎn)權(quán)保護(hù)居間服務(wù)合同范本
- 中華書局版歷史八年級上冊第20課《重慶談判與內(nèi)戰(zhàn)爆發(fā)》聽課評課記錄
- 2024赤峰學(xué)院教師招聘考試筆試試題
- 三年級下冊全冊書法教案
- 2023年天津市文化和旅游局直屬事業(yè)單位招聘考試真題及答案
- 《中國慢性阻塞性肺疾病基層診療與管理指南(2024年)》解讀
- 《研學(xué)旅行課程設(shè)計》課件-研學(xué)課程設(shè)計計劃
- 電力系統(tǒng)分析(郝亮亮)
- 改善護(hù)理服務(wù)行動計劃方案
- 《手語基礎(chǔ)學(xué)習(xí)》課件
- 部編(統(tǒng)編)版語文+四下第四單元教材解讀課件
- 建筑材料包銷協(xié)議書
- 常州市2023-2024學(xué)年八年級上學(xué)期期末地理試卷(含答案解析)
評論
0/150
提交評論