




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、12第第4章章 函數(shù)與編譯預處理函數(shù)與編譯預處理 34.1 函數(shù)概述函數(shù)概述C程序程序源程序文件源程序文件n函數(shù)函數(shù)1函數(shù)函數(shù)m 源程序文件源程序文件1函數(shù)函數(shù)1函數(shù)函數(shù)n4.1.1 函數(shù)簡介函數(shù)簡介4【例例】 #include void print_line() /*函數(shù)定義函數(shù)定義*/ printf(*n);void print_text() /*函數(shù)定義函數(shù)定義*/ printf( Welcome to Beijing n);void main() print_line(); /*函數(shù)調(diào)用函數(shù)調(diào)用*/print_text(); /*函數(shù)調(diào)用函數(shù)調(diào)用*/print_line(); /*函數(shù)
2、調(diào)用函數(shù)調(diào)用*/程序的執(zhí)行總是程序的執(zhí)行總是從從main函數(shù)開始函數(shù)開始56 一個一個C源程序可以由一個或多個源程序文件組源程序可以由一個或多個源程序文件組成。成。C編譯系統(tǒng)在對編譯系統(tǒng)在對C源程序進行編譯時是以文件源程序進行編譯時是以文件為單位進行的。為單位進行的。 一個一個C源程序文件可以由一個或多個函數(shù)組成。源程序文件可以由一個或多個函數(shù)組成。所有函數(shù)都是獨立的。主函數(shù)可以調(diào)用其它函數(shù),所有函數(shù)都是獨立的。主函數(shù)可以調(diào)用其它函數(shù),其它函數(shù)可以相互調(diào)用。其它函數(shù)可以相互調(diào)用。 在一個在一個C程序中,有且僅有一個主函數(shù)程序中,有且僅有一個主函數(shù)main。C程序的執(zhí)行總是從程序的執(zhí)行總是從ma
3、in函數(shù)開始,調(diào)用其它函數(shù)函數(shù)開始,調(diào)用其它函數(shù)后最終回到后最終回到main函數(shù),在函數(shù),在main函數(shù)中結(jié)束整個程函數(shù)中結(jié)束整個程序的運行。序的運行。7 函數(shù)的種類函數(shù)的種類8n由由C編譯系統(tǒng)定義的一種函數(shù),存放在系統(tǒng)函數(shù)編譯系統(tǒng)定義的一種函數(shù),存放在系統(tǒng)函數(shù)庫中,用戶可以根據(jù)需要隨時調(diào)用庫中,用戶可以根據(jù)需要隨時調(diào)用n常用函數(shù)常用函數(shù)如:如:fabs、sqrt、sin、pow、rand(常用數(shù)學函數(shù)參見教材常用數(shù)學函數(shù)參見教材P100 表表4-1和附錄和附錄B )n函數(shù)調(diào)用形式函數(shù)調(diào)用形式:函數(shù)名(參數(shù)表)函數(shù)名(參數(shù)表)例如:例如: sqrt(x)4.1.2 數(shù)學庫函數(shù)數(shù)學庫函數(shù)9例例#
4、include #include void main( ) float x=4.5; printf (%f, %f, %fn ,sqrt(x),pow(x,2),fabs(-x); 104.2.1 函數(shù)的定義函數(shù)的定義函數(shù)定義的一般形式函數(shù)定義的一般形式函數(shù)類型函數(shù)類型 函數(shù)名函數(shù)名( (類型名類型名 形式參數(shù)形式參數(shù)1, ) ) 說明語句說明語句 執(zhí)行語句執(zhí)行語句 例如:求兩個數(shù)的最大值。例如:求兩個數(shù)的最大值。 int max(int x,int y) int z; z = x y ? x : y; return( z );4.2 函數(shù)定義及調(diào)用函數(shù)定義及調(diào)用11#includeint (
5、int y); /*函數(shù)原型聲明函數(shù)原型聲明*/void () int x,last,nowcb; last=1; printf(15之間,相鄰兩數(shù)的立方差是:之間,相鄰兩數(shù)的立方差是:n); for(x=2;xmax) max=iabs(a); /*函數(shù)調(diào)用構(gòu)成表達式函數(shù)調(diào)用構(gòu)成表達式*/ m=max(c,max(a,b); /*函數(shù)調(diào)用作為函數(shù)參數(shù)函數(shù)調(diào)用作為函數(shù)參數(shù)*/4.2.2 函數(shù)的調(diào)用函數(shù)的調(diào)用函數(shù)調(diào)用的一般形式:函數(shù)調(diào)用的一般形式:13void swap(int x, int y) int z; z=x; x=y; y=z; printf(nx=%d,y=%d,x ,y);mai
6、n( ) int a=10,b=20; swap(a,b); printf(na=%d,b=%dn,a,b);4.2.3 函數(shù)參數(shù)傳遞與返回值函數(shù)參數(shù)傳遞與返回值1函數(shù)的參數(shù)傳遞(值傳遞)函數(shù)的參數(shù)傳遞(值傳遞)程序輸出結(jié)果:程序輸出結(jié)果:x=20,y=10a=10,b=20形式參數(shù)(形參)形式參數(shù)(形參)實際參數(shù)(實參)實際參數(shù)(實參)【例例】編一程序,將主函數(shù)中的兩個變量的值傳遞給編一程序,將主函數(shù)中的兩個變量的值傳遞給swap函函數(shù)中的兩個形參,交換兩個形參的值。數(shù)中的兩個形參,交換兩個形參的值。單向值傳遞單向值傳遞14有關(guān)形參和實參的說明:有關(guān)形參和實參的說明: 當函數(shù)被調(diào)用時才給形參
7、分配內(nèi)存單元。調(diào)用結(jié)當函數(shù)被調(diào)用時才給形參分配內(nèi)存單元。調(diào)用結(jié)束,所占內(nèi)存被釋放。束,所占內(nèi)存被釋放。 實參可以是常量、變量或表達式,但要求它們有實參可以是常量、變量或表達式,但要求它們有確定的值。確定的值。 實參與形參類型要一致,字符型與整型兼容。實參與形參類型要一致,字符型與整型兼容。 實參與形參的個數(shù)必須相等。在函數(shù)調(diào)用時,實實參與形參的個數(shù)必須相等。在函數(shù)調(diào)用時,實參的值賦給與之相對應(yīng)的形參。參的值賦給與之相對應(yīng)的形參。“單向值傳遞單向值傳遞”。15函數(shù)的返回值是通過函數(shù)的返回值是通過return語句帶回到主調(diào)函數(shù)的語句帶回到主調(diào)函數(shù)的功能:功能:終止函數(shù)的運行,返回主調(diào)函數(shù),若有返回
8、值,將終止函數(shù)的運行,返回主調(diào)函數(shù),若有返回值,將返回值帶回主調(diào)函數(shù)。返回值帶回主調(diào)函數(shù)。2.函數(shù)的返回值函數(shù)的返回值16【例例】計算并輸出圓的面積。計算并輸出圓的面積。#include s(int r) return 3.14*r*r;void main( ) int r; scanf(%d,&r); printf(%dn,s(r);程序運行情況如下:程序運行情況如下:2 12說明:說明:函數(shù)的類型決定了函數(shù)返回值的類型。若省略函數(shù)的類函數(shù)的類型決定了函數(shù)返回值的類型。若省略函數(shù)的類型,系統(tǒng)默認其為型,系統(tǒng)默認其為int型。型。無返回值的函數(shù)應(yīng)將其類型定義為無返回值的函數(shù)應(yīng)將其類型定義為vo
9、id (空)類型。(空)類型。17【例例4-8】編寫函數(shù)實現(xiàn)兩組變量的顯示編寫函數(shù)實現(xiàn)兩組變量的顯示 定義定義2組,共組,共8個整型變量個整型變量a1a4,b1b4,要求:輸入字符,要求:輸入字符a和整數(shù)和整數(shù)1,顯,顯示示a1變量的值,輸入字符變量的值,輸入字符b和整數(shù)和整數(shù)1,顯示,顯示b1變量的值變量的值18#include int ArrayOperating(int i,char ch)int a1=1,a2=0,a3=3,a4=5; int b1=2,b2=0,b3=4,b4=3; switch(i) case 1: switch(ch) case a: return a1; ca
10、se b: return b1; case 2: case 3: case 4: void main() int i;char ch; printf(輸入顯示的變量,輸入顯示的變量,形式如:形式如:a1或或b4:); scanf(%c%d,&ch,&i); printf(%c%d=%dn,ch, i,ArrayOperating(i,ch); 194.2.4 函數(shù)的嵌套調(diào)用函數(shù)的嵌套調(diào)用20【例例】函數(shù)的嵌套調(diào)用函數(shù)的嵌套調(diào)用程序輸出結(jié)果:程序輸出結(jié)果:9 21 4.2.5 對被調(diào)函數(shù)的聲明和函數(shù)原型對被調(diào)函數(shù)的聲明和函數(shù)原型void swap(int x, int y) main( ) sw
11、ap(a,b); 22對被調(diào)函數(shù)進行聲明的一般形式對被調(diào)函數(shù)進行聲明的一般形式 函數(shù)類型函數(shù)類型 函數(shù)名(函數(shù)名(參數(shù)類型參數(shù)類型1 1 參數(shù)名參數(shù)名1 1,); ;或或 函數(shù)類型函數(shù)類型 函數(shù)名(函數(shù)名(參數(shù)類型參數(shù)類型1 1,參數(shù)類型參數(shù)類型2 2,); ;第二種形式省略了參數(shù)名,此種形式也稱為第二種形式省略了參數(shù)名,此種形式也稱為函數(shù)的原型函數(shù)的原型。 如果非整型函數(shù)在主調(diào)函數(shù)之后定義,如果非整型函數(shù)在主調(diào)函數(shù)之后定義,則應(yīng)在主調(diào)函數(shù)中或主調(diào)函數(shù)之前對被則應(yīng)在主調(diào)函數(shù)中或主調(diào)函數(shù)之前對被調(diào)函數(shù)進行聲明。調(diào)函數(shù)進行聲明。23#include void main( ) float calc(
12、float x,float y,char opr); float a,b; char opr; printf(n輸入四則運算表達式輸入四則運算表達式:); scanf(%f%c%f,&a,&opr,&b); if(opr=+|opr=-|opr=*|opr=/) printf(%5.2f%c%5.2f=%6.2fn,a,opr,b,calc(a,b,opr); else printf(非法運算符非法運算符! n ); float calc(float x,float y,char opr) switch(opr) case +: return(x+y); case -:return(x-y);
13、 case *:return(x*y); case /:return(x/y); 對被調(diào)函對被調(diào)函數(shù)的聲明數(shù)的聲明【例例4-12】計算并輸出兩個數(shù)的和、差、積、商。計算并輸出兩個數(shù)的和、差、積、商。244.3 局部變量和全局變量局部變量和全局變量:變量在程序中可以被使用的范圍。:變量在程序中可以被使用的范圍。根據(jù)變量的作用域可以將變量分為根據(jù)變量的作用域可以將變量分為局部變量和全局局部變量和全局變量變量。():在函數(shù)內(nèi)或復合語句:在函數(shù)內(nèi)或復合語句內(nèi)內(nèi)定定義的變量以及義的變量以及。:函數(shù)內(nèi)或復合語句內(nèi)函數(shù)內(nèi)或復合語句內(nèi)。4.3.1 局部作用域和局部變量局部作用域和局部變量【例例】分析下面程序的
14、運行結(jié)果及變量的作用域。分析下面程序的運行結(jié)果及變量的作用域。25void sub(int a,int b) int c; a=a+b; b=b+a; c=b-a;printf(sub:ta=%d b= %d c= %dn,a,b,c); void main( ) int a=1,b=1,c=1; printf(main:ta=%d b= %d c= %dn,a,b,c); sub(a,b); printf(main:ta=%d b= %d c= %dn,a,b,c); int a=2,b=2; printf(comp:ta=%d b= %d c= %dn,a,b,c); printf(mai
15、n:ta=%d b= %d c= %dn,a,b,c); “分程序分程序”或或“程序程序塊塊”程序輸出結(jié)果:程序輸出結(jié)果:main: a=1 b= 1 c= 1sub: a=2 b= 3 c= 1main: a=1 b= 1 c= 1comp: a=2 b= 2 c= 1main: a=1 b= 1 c= 1264.3.2 全局作用域和全局變量全局作用域和全局變量():在):在函數(shù)外部函數(shù)外部定義的變量。定義的變量。:?!纠咳肿兞亢途植孔兞康淖饔糜颉H肿兞亢途植孔兞康淖饔糜?。27int a = 5;void f(int x, int y) int b,c; b=a+x; c=a-y;p
16、rintf(%dt%dt%dn,a,b,c); main( ) int b=6,c=7; f(b,c); printf(%dt%dt%dn,a,b,c); int a=9,b=8; printf(%dt%dt%dn,a,b,c); printf(%dt%dt%dn,a,b,c); printf(%dt%dt%dn,a,b,c); 程序輸出結(jié)果:程序輸出結(jié)果:5 11 -25 6 79 8 79 8 109 8 105 6 10全局變量全局變量“分程序分程序”或或“程序程序塊塊”int284.4 變量的生存期和存儲類別變量的生存期和存儲類別4.4.1 變量的生存期變量的生存期變量的生存期變量的生
17、存期:變量在內(nèi)存中占據(jù)存儲空間的時間。:變量在內(nèi)存中占據(jù)存儲空間的時間。程序代碼區(qū)靜態(tài)存儲區(qū)動態(tài)存儲區(qū)存儲分配存儲分配動態(tài)存儲變量動態(tài)存儲變量靜態(tài)存儲變量靜態(tài)存儲變量294.4.2 變量的存儲類別變量的存儲類別變量的屬性30變量定義語句的一般形式變量定義語句的一般形式 311自動變量(自動變量(auto類別)類別)main()int x,y; main()auto int x,y; 等價等價可省局部變量可以定義為自動變量。局部變量可以定義為自動變量。32main() int a,b,c; printf(“Enter a,b:n”); scanf(“%d%d”,&a,&b); c=sum(a,b
18、); printf(“Sum=%dn”,c);sum(int a,int b) int c=0; c=a+b; return(c);printf(“Enter a,b:n”);scanf(“%d%d”,&a,&b);c=sum(a,b);c=a+b;return(c);printf(“Sum=%dn”,c);main()Enter a,b:靜態(tài)靜態(tài)存儲區(qū)存儲區(qū)am 不定不定bm 不定不定cm 不定不定1 2 as=1bs=2cs=0bm=2am=1sum(int a,int b)Sum=3程序區(qū)程序區(qū)動態(tài)動態(tài)存儲區(qū)存儲區(qū)觀察下列程序運行時變量的存儲情況觀察下列程序運行時變量的存儲情況單擊開始運
19、行as=1bs=2cs=3cm =3 33 內(nèi)存分配內(nèi)存分配調(diào)用函數(shù)或執(zhí)行分程序時在調(diào)用函數(shù)或執(zhí)行分程序時在動態(tài)存儲區(qū)動態(tài)存儲區(qū)為其分配存儲單元,為其分配存儲單元,函數(shù)或分程序執(zhí)行結(jié)束,所占內(nèi)存空間即刻釋放。函數(shù)或分程序執(zhí)行結(jié)束,所占內(nèi)存空間即刻釋放。 變量的初值變量的初值定義變量時若沒賦初值,變量的定義變量時若沒賦初值,變量的初值不確定初值不確定;如果賦初值則;如果賦初值則每次函數(shù)被調(diào)用時執(zhí)行一次賦值操作。每次函數(shù)被調(diào)用時執(zhí)行一次賦值操作。 生存期生存期 在函數(shù)或分程序執(zhí)行期間。在函數(shù)或分程序執(zhí)行期間。 作用域作用域自動變量所在的函數(shù)內(nèi)或分程序內(nèi)。自動變量所在的函數(shù)內(nèi)或分程序內(nèi)。342靜態(tài)變
20、量(靜態(tài)變量(static類別)類別)除形參外,局部變量和全局變量都可以定義為靜態(tài)變量。除形參外,局部變量和全局變量都可以定義為靜態(tài)變量。static int a; main( ) float x,y; f( ) static int b=1; 全局靜態(tài)變量全局靜態(tài)變量不能省35 內(nèi)存分配內(nèi)存分配編譯時,將其分配在內(nèi)存的靜態(tài)存儲區(qū)中,程序運行結(jié)束編譯時,將其分配在內(nèi)存的靜態(tài)存儲區(qū)中,程序運行結(jié)束釋放該單元。釋放該單元。 靜態(tài)變量的初值靜態(tài)變量的初值若定義時未賦初值,在編譯時,系統(tǒng)自動賦初值為若定義時未賦初值,在編譯時,系統(tǒng)自動賦初值為0 0;若定;若定義時賦初值,則僅在編譯時賦初值一次,程序運
21、行后不再義時賦初值,則僅在編譯時賦初值一次,程序運行后不再給變量賦初值給變量賦初值 。 生存期生存期整個程序的執(zhí)行期間。整個程序的執(zhí)行期間。 作用域作用域局部靜態(tài)變量的作用域是它所在的函數(shù)或分程序。全局靜局部靜態(tài)變量的作用域是它所在的函數(shù)或分程序。全局靜態(tài)變量的作用域是從定義處開始到本源文件結(jié)束。態(tài)變量的作用域是從定義處開始到本源文件結(jié)束。36【例例】靜態(tài)變量的使用。靜態(tài)變量的使用。37int c;static int a; main( ) float ; char s;f( ) static int b=1; 3.外部變量(外部變量(extern類別)類別)在函數(shù)外定義的變量若沒有用在函數(shù)外
22、定義的變量若沒有用 static說明,則是外部變量。說明,則是外部變量。外部變量只能隱式定義為外部變量只能隱式定義為extern類別,不能顯式定義。類別,不能顯式定義。全局靜態(tài)變量全局靜態(tài)變量外部變量外部變量38外部變量聲明的一般格式外部變量聲明的一般格式注意:注意:外部變量聲明用關(guān)鍵字外部變量聲明用關(guān)鍵字externextern,而外部變量的,而外部變量的定義不能用定義不能用externextern,只能隱式定義。,只能隱式定義。定義外部變量時,系統(tǒng)要給變量分配存儲空間,定義外部變量時,系統(tǒng)要給變量分配存儲空間,而對外部變量聲明時,系統(tǒng)不分配存儲空間,而對外部變量聲明時,系統(tǒng)不分配存儲空間,只是讓編譯系統(tǒng)知道該變量是一個已經(jīng)定義過只是讓編譯系統(tǒng)知道該變量是一個已經(jīng)定義過的外
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 《第03節(jié) 電場強度》導學案
- 《Reading Chinese New Year;Thanksgiving》獲獎教案下載八年級下冊北師大版
- 2025年老年心理健康師資格考試試題及答案
- 2025年金融風險管理師職業(yè)資格考試試卷及答案
- 2025年科學教育專業(yè)教師考試試題及答案
- 2014年全國高中數(shù)學聯(lián)合競賽加試(A卷)解答
- 和學校簽合同協(xié)議
- 商住樓轉(zhuǎn)租合同協(xié)議
- 品牌出租合同協(xié)議
- 商品代賣代銷合同協(xié)議
- 踝關(guān)節(jié)骨折分型
- 事故樹(故障樹)分析法專題培訓教材
- UPS電子商務(wù)物流案例分析
- 理論力學摩擦實驗報告
- LED燈高低溫試驗及老化測試標準
- 2023年浙江省公務(wù)員考試申論真題A卷
- 全套三級安全教育記錄及表格
- 安全風險及控制措施清單
- KTV工程部崗位職責
- 社會科學處橫向課題合同書
- GB/T 3452.4-2020液壓氣動用O形橡膠密封圈第4部分:抗擠壓環(huán)(擋環(huán))
評論
0/150
提交評論