




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、12第第4章章 函數與編譯預處理函數與編譯預處理 34.1 函數概述函數概述C程序程序源程序文件源程序文件n函數函數1函數函數m 源程序文件源程序文件1函數函數1函數函數n4.1.1 函數簡介函數簡介4【例例】 #include void print_line() /*函數定義函數定義*/ printf(*n);void print_text() /*函數定義函數定義*/ printf( Welcome to Beijing n);void main() print_line(); /*函數調用函數調用*/print_text(); /*函數調用函數調用*/print_line(); /*函數
2、調用函數調用*/程序的執行總是程序的執行總是從從main函數開始函數開始56 一個一個C源程序可以由一個或多個源程序文件組源程序可以由一個或多個源程序文件組成。成。C編譯系統在對編譯系統在對C源程序進行編譯時是以文件源程序進行編譯時是以文件為單位進行的。為單位進行的。 一個一個C源程序文件可以由一個或多個函數組成。源程序文件可以由一個或多個函數組成。所有函數都是獨立的。主函數可以調用其它函數,所有函數都是獨立的。主函數可以調用其它函數,其它函數可以相互調用。其它函數可以相互調用。 在一個在一個C程序中,有且僅有一個主函數程序中,有且僅有一個主函數main。C程序的執行總是從程序的執行總是從ma
3、in函數開始,調用其它函數函數開始,調用其它函數后最終回到后最終回到main函數,在函數,在main函數中結束整個程函數中結束整個程序的運行。序的運行。7 函數的種類函數的種類8n由由C編譯系統定義的一種函數,存放在系統函數編譯系統定義的一種函數,存放在系統函數庫中,用戶可以根據需要隨時調用庫中,用戶可以根據需要隨時調用n常用函數常用函數如:如:fabs、sqrt、sin、pow、rand(常用數學函數參見教材常用數學函數參見教材P100 表表4-1和附錄和附錄B )n函數調用形式函數調用形式:函數名(參數表)函數名(參數表)例如:例如: sqrt(x)4.1.2 數學庫函數數學庫函數9例例#
4、include #include void main( ) float x=4.5; printf (%f, %f, %fn ,sqrt(x),pow(x,2),fabs(-x); 104.2.1 函數的定義函數的定義函數定義的一般形式函數定義的一般形式函數類型函數類型 函數名函數名( (類型名類型名 形式參數形式參數1, ) ) 說明語句說明語句 執行語句執行語句 例如:求兩個數的最大值。例如:求兩個數的最大值。 int max(int x,int y) int z; z = x y ? x : y; return( z );4.2 函數定義及調用函數定義及調用11#includeint (
5、int y); /*函數原型聲明函數原型聲明*/void () int x,last,nowcb; last=1; printf(15之間,相鄰兩數的立方差是:之間,相鄰兩數的立方差是:n); for(x=2;xmax) max=iabs(a); /*函數調用構成表達式函數調用構成表達式*/ m=max(c,max(a,b); /*函數調用作為函數參數函數調用作為函數參數*/4.2.2 函數的調用函數的調用函數調用的一般形式:函數調用的一般形式: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 函數參數傳遞與返回值函數參數傳遞與返回值1函數的參數傳遞(值傳遞)函數的參數傳遞(值傳遞)程序輸出結果:程序輸出結果:x=20,y=10a=10,b=20形式參數(形參)形式參數(形參)實際參數(實參)實際參數(實參)【例例】編一程序,將主函數中的兩個變量的值傳遞給編一程序,將主函數中的兩個變量的值傳遞給swap函函數中的兩個形參,交換兩個形參的值。數中的兩個形參,交換兩個形參的值。單向值傳遞單向值傳遞14有關形參和實參的說明:有關形參和實參的說明: 當函數被調用時才給形參
7、分配內存單元。調用結當函數被調用時才給形參分配內存單元。調用結束,所占內存被釋放。束,所占內存被釋放。 實參可以是常量、變量或表達式,但要求它們有實參可以是常量、變量或表達式,但要求它們有確定的值。確定的值。 實參與形參類型要一致,字符型與整型兼容。實參與形參類型要一致,字符型與整型兼容。 實參與形參的個數必須相等。在函數調用時,實實參與形參的個數必須相等。在函數調用時,實參的值賦給與之相對應的形參。參的值賦給與之相對應的形參。“單向值傳遞單向值傳遞”。15函數的返回值是通過函數的返回值是通過return語句帶回到主調函數的語句帶回到主調函數的功能:功能:終止函數的運行,返回主調函數,若有返回
8、值,將終止函數的運行,返回主調函數,若有返回值,將返回值帶回主調函數。返回值帶回主調函數。2.函數的返回值函數的返回值16【例例】計算并輸出圓的面積。計算并輸出圓的面積。#include s(int r) return 3.14*r*r;void main( ) int r; scanf(%d,&r); printf(%dn,s(r);程序運行情況如下:程序運行情況如下:2 12說明:說明:函數的類型決定了函數返回值的類型。若省略函數的類函數的類型決定了函數返回值的類型。若省略函數的類型,系統默認其為型,系統默認其為int型。型。無返回值的函數應將其類型定義為無返回值的函數應將其類型定義為vo
9、id (空)類型。(空)類型。17【例例4-8】編寫函數實現兩組變量的顯示編寫函數實現兩組變量的顯示 定義定義2組,共組,共8個整型變量個整型變量a1a4,b1b4,要求:輸入字符,要求:輸入字符a和整數和整數1,顯,顯示示a1變量的值,輸入字符變量的值,輸入字符b和整數和整數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 函數的嵌套調用函數的嵌套調用20【例例】函數的嵌套調用函數的嵌套調用程序輸出結果:程序輸出結果:9 21 4.2.5 對被調函數的聲明和函數原型對被調函數的聲明和函數原型void swap(int x, int y) main( ) sw
11、ap(a,b); 22對被調函數進行聲明的一般形式對被調函數進行聲明的一般形式 函數類型函數類型 函數名(函數名(參數類型參數類型1 1 參數名參數名1 1,); ;或或 函數類型函數類型 函數名(函數名(參數類型參數類型1 1,參數類型參數類型2 2,); ;第二種形式省略了參數名,此種形式也稱為第二種形式省略了參數名,此種形式也稱為函數的原型函數的原型。 如果非整型函數在主調函數之后定義,如果非整型函數在主調函數之后定義,則應在主調函數中或主調函數之前對被則應在主調函數中或主調函數之前對被調函數進行聲明。調函數進行聲明。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); 對被調函對被調函數的聲明數的聲明【例例4-12】計算并輸出兩個數的和、差、積、商。計算并輸出兩個數的和、差、積、商。244.3 局部變量和全局變量局部變量和全局變量:變量在程序中可以被使用的范圍。:變量在程序中可以被使用的范圍。根據變量的作用域可以將變量分為根據變量的作用域可以將變量分為局部變量和全局局部變量和全局變量變量。():在函數內或復合語句:在函數內或復合語句內內定定義的變量以及義的變量以及。:函數內或復合語句內函數內或復合語句內。4.3.1 局部作用域和局部變量局部作用域和局部變量【例例】分析下面程序的
14、運行結果及變量的作用域。分析下面程序的運行結果及變量的作用域。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); “分程序分程序”或或“程序程序塊塊”程序輸出結果:程序輸出結果: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 全局作用域和全局變量全局作用域和全局變量():在):在函數外部函數外部定義的變量。定義的變量。:。【例例】全局變量和局部變量的作用域。全局變量和局部變量的作用域。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); 程序輸出結果:程序輸出結果:5 11 -25 6 79 8 79 8 109 8 105 6 10全局變量全局變量“分程序分程序”或或“程序程序塊塊”int284.4 變量的生存期和存儲類別變量的生存期和存儲類別4.4.1 變量的生存期變量的生存期變量的生存期變量的生
17、存期:變量在內存中占據存儲空間的時間。:變量在內存中占據存儲空間的時間。程序代碼區靜態存儲區動態存儲區存儲分配存儲分配動態存儲變量動態存儲變量靜態存儲變量靜態存儲變量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:靜態靜態存儲區存儲區am 不定不定bm 不定不定cm 不定不定1 2 as=1bs=2cs=0bm=2am=1sum(int a,int b)Sum=3程序區程序區動態動態存儲區存儲區觀察下列程序運行時變量的存儲情況觀察下列程序運行時變量的存儲情況單擊開始運
19、行as=1bs=2cs=3cm =3 33 內存分配內存分配調用函數或執行分程序時在調用函數或執行分程序時在動態存儲區動態存儲區為其分配存儲單元,為其分配存儲單元,函數或分程序執行結束,所占內存空間即刻釋放。函數或分程序執行結束,所占內存空間即刻釋放。 變量的初值變量的初值定義變量時若沒賦初值,變量的定義變量時若沒賦初值,變量的初值不確定初值不確定;如果賦初值則;如果賦初值則每次函數被調用時執行一次賦值操作。每次函數被調用時執行一次賦值操作。 生存期生存期 在函數或分程序執行期間。在函數或分程序執行期間。 作用域作用域自動變量所在的函數內或分程序內。自動變量所在的函數內或分程序內。342靜態變
20、量(靜態變量(static類別)類別)除形參外,局部變量和全局變量都可以定義為靜態變量。除形參外,局部變量和全局變量都可以定義為靜態變量。static int a; main( ) float x,y; f( ) static int b=1; 全局靜態變量全局靜態變量不能省35 內存分配內存分配編譯時,將其分配在內存的靜態存儲區中,程序運行結束編譯時,將其分配在內存的靜態存儲區中,程序運行結束釋放該單元。釋放該單元。 靜態變量的初值靜態變量的初值若定義時未賦初值,在編譯時,系統自動賦初值為若定義時未賦初值,在編譯時,系統自動賦初值為0 0;若定;若定義時賦初值,則僅在編譯時賦初值一次,程序運
21、行后不再義時賦初值,則僅在編譯時賦初值一次,程序運行后不再給變量賦初值給變量賦初值 。 生存期生存期整個程序的執行期間。整個程序的執行期間。 作用域作用域局部靜態變量的作用域是它所在的函數或分程序。全局靜局部靜態變量的作用域是它所在的函數或分程序。全局靜態變量的作用域是從定義處開始到本源文件結束。態變量的作用域是從定義處開始到本源文件結束。36【例例】靜態變量的使用。靜態變量的使用。37int c;static int a; main( ) float ; char s;f( ) static int b=1; 3.外部變量(外部變量(extern類別)類別)在函數外定義的變量若沒有用在函數外
22、定義的變量若沒有用 static說明,則是外部變量。說明,則是外部變量。外部變量只能隱式定義為外部變量只能隱式定義為extern類別,不能顯式定義。類別,不能顯式定義。全局靜態變量全局靜態變量外部變量外部變量38外部變量聲明的一般格式外部變量聲明的一般格式注意:注意:外部變量聲明用關鍵字外部變量聲明用關鍵字externextern,而外部變量的,而外部變量的定義不能用定義不能用externextern,只能隱式定義。,只能隱式定義。定義外部變量時,系統要給變量分配存儲空間,定義外部變量時,系統要給變量分配存儲空間,而對外部變量聲明時,系統不分配存儲空間,而對外部變量聲明時,系統不分配存儲空間,只是讓編譯系統知道該變量是一個已經定義過只是讓編譯系統知道該變量是一個已經定義過的外
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 三明醫學科技職業學院《幼兒舞蹈創編2》2023-2024學年第二學期期末試卷
- 蘭州現代職業學院《設計文本編制課程設計》2023-2024學年第二學期期末試卷
- 中國勞動關系學院《外科學(一)》2023-2024學年第二學期期末試卷
- 會議未到管理制度
- 湖南鐵道職業技術學院《產油國國家概況》2023-2024學年第二學期期末試卷
- 住宅用水管理制度
- 云南工程職業學院《信息圖表設計》2023-2024學年第二學期期末試卷
- 體質健康管理制度
- 佛山醒獅管理制度
- 作業吊具管理制度
- 創業修煉智慧樹知到期末考試答案章節答案2024年同濟大學
- GA/T 974.33-2011消防信息代碼第33部分:起火原因分類與代碼
- GA 44-2015消防頭盔
- 《科學護眼愛眼共享光明未來》近視防控宣傳教育課件
- 面向對象分析和設計講座面向對象方法學PPT資料
- 鑄鐵閘門及啟閉機安裝說明及操作手冊
- 《財政學》教學大綱中文版
- 高危新生兒急診服務流程圖
- “文化引導型”城市更新思想思考與實踐課件
- 卷心菜中過氧化物酶熱穩定性的初步研究
- 渦輪增壓器系統及常見故障案例
評論
0/150
提交評論