《C語(yǔ)言程序設(shè)計(jì)基礎(chǔ)》第六章 函數(shù)、存儲(chǔ)類(lèi)和預(yù)處理程序_第1頁(yè)
《C語(yǔ)言程序設(shè)計(jì)基礎(chǔ)》第六章 函數(shù)、存儲(chǔ)類(lèi)和預(yù)處理程序_第2頁(yè)
《C語(yǔ)言程序設(shè)計(jì)基礎(chǔ)》第六章 函數(shù)、存儲(chǔ)類(lèi)和預(yù)處理程序_第3頁(yè)
《C語(yǔ)言程序設(shè)計(jì)基礎(chǔ)》第六章 函數(shù)、存儲(chǔ)類(lèi)和預(yù)處理程序_第4頁(yè)
《C語(yǔ)言程序設(shè)計(jì)基礎(chǔ)》第六章 函數(shù)、存儲(chǔ)類(lèi)和預(yù)處理程序_第5頁(yè)
已閱讀5頁(yè),還剩42頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、1第六章 函數(shù)、存儲(chǔ)類(lèi)和預(yù)處理程序課程名稱(chēng):語(yǔ)言程序設(shè)計(jì)課型與教法:講授,通過(guò)程序擴(kuò)展,進(jìn)行對(duì)比學(xué)習(xí)學(xué)時(shí):2課時(shí)授課題目: 第6章 函數(shù)、存儲(chǔ)類(lèi)和預(yù)處理程序基本教材:語(yǔ)言程序設(shè)計(jì)(高等教育出版社)廖雷主編教學(xué)目的與要求:通過(guò)本章的學(xué)習(xí)使學(xué)生了解結(jié)構(gòu)化程序設(shè)計(jì)的思想,掌握函數(shù)的定義方法,函數(shù)的調(diào)用和參數(shù)傳遞;了解什么是嵌套調(diào)用和遞歸調(diào)用,嵌套調(diào)用和遞歸調(diào)用時(shí)程序的執(zhí)行順序,編寫(xiě)簡(jiǎn)單的遞歸函數(shù)教學(xué)難點(diǎn):形參與實(shí)參的意義、作用與區(qū)別,參數(shù)的傳遞,函數(shù)的遞歸教學(xué)重點(diǎn):函數(shù)的定義和調(diào)用;形參與實(shí)參的意義、作用與區(qū)別;參數(shù)的按值傳遞 第六章 函數(shù)、存儲(chǔ)類(lèi)和預(yù)處理程序概述函數(shù)的定義函數(shù)的返回函數(shù)的調(diào)用參數(shù)傳

2、遞函數(shù)的嵌套與遞歸調(diào)用變量的作用域和生命期函數(shù)的說(shuō)明預(yù)處理程序3第六章 函數(shù)、存儲(chǔ)類(lèi)和預(yù)處理程序&函數(shù)式的程序結(jié)構(gòu)&必須有且只能有一個(gè)名為main的主函數(shù)&C程序的執(zhí)行總是從main函數(shù)開(kāi)始,在main中結(jié)束&函數(shù)不能嵌套定義,可以嵌套調(diào)用C程序設(shè)計(jì)程序設(shè)計(jì)main() f1( ); f2( ); f1() f2() f21( ); f22( ); f21() f22() C程序結(jié)構(gòu)4第六章 函數(shù)、存儲(chǔ)類(lèi)和預(yù)處理程序w從用戶(hù)角度從用戶(hù)角度n標(biāo)準(zhǔn)函數(shù)(庫(kù)函數(shù)):由系統(tǒng)提供標(biāo)準(zhǔn)函數(shù)(庫(kù)函數(shù)):由系統(tǒng)提供n用戶(hù)自定義函數(shù)用戶(hù)自定義函數(shù)w從函數(shù)形式從函數(shù)形式n無(wú)參函數(shù)無(wú)參函數(shù)n有參函數(shù)有參函數(shù)使用使用

3、庫(kù)函數(shù)庫(kù)函數(shù)應(yīng)注意:應(yīng)注意:1 1、函數(shù)功能、函數(shù)功能2 2、函數(shù)參數(shù)的數(shù)目和順序,及各參數(shù)意義和類(lèi)型、函數(shù)參數(shù)的數(shù)目和順序,及各參數(shù)意義和類(lèi)型3 3、函數(shù)返回值意義和類(lèi)型、函數(shù)返回值意義和類(lèi)型4 4、需要使用的包含文件、需要使用的包含文件函數(shù)分類(lèi)5第六章 函數(shù)、存儲(chǔ)類(lèi)和預(yù)處理程序 ()現(xiàn)代風(fēng)格:(ANSI C格式)n一般形式一般形式用戶(hù)定義用戶(hù)定義的合法標(biāo)的合法標(biāo)識(shí)符識(shí)符函數(shù)返回值類(lèi)型函數(shù)返回值類(lèi)型缺省缺省int型型無(wú)返回值無(wú)返回值void函數(shù)體函數(shù)體例 有參函數(shù)(現(xiàn)代風(fēng)格) int max(int x,int y) int z; z=xy?x:y; return(z); 例 有參函數(shù)(現(xiàn)代

4、風(fēng)格) int max(int x, y) int z; z=xy?x:y; return(z); 例 空函數(shù) dummy( ) 函數(shù)體為空例 無(wú)參函數(shù) printstar( ) printf(“*n”); 或 printstar(void ) printf(“*n”); 函數(shù)的定義可選項(xiàng)可選項(xiàng)一般形式為: , 6第六章 函數(shù)、存儲(chǔ)類(lèi)和預(yù)處理程序 ()傳統(tǒng)風(fēng)格:(K&R格式)例例 有參函數(shù)(傳統(tǒng)風(fēng)格)有參函數(shù)(傳統(tǒng)風(fēng)格) int max(x,y) int x,y; int z; z=xy?x:y; return(z); 函數(shù)傳統(tǒng)風(fēng)格和例子函數(shù)傳統(tǒng)風(fēng)格和例子例例 有參函數(shù)(傳統(tǒng)風(fēng)格)有參函數(shù)(傳

5、統(tǒng)風(fēng)格) int max(x,y) int x,y; int z; z=xy?x:y; return(z); 函數(shù)的定義7第六章 函數(shù)、存儲(chǔ)類(lèi)和預(yù)處理程序n函數(shù)定義不允許嵌套函數(shù)定義不允許嵌套。 在語(yǔ)言中,所有函數(shù)(包括主函數(shù)在語(yǔ)言中,所有函數(shù)(包括主函數(shù)main()main())都是平)都是平行的。一個(gè)函數(shù)的定義,可以放在程序中的任意位置,行的。一個(gè)函數(shù)的定義,可以放在程序中的任意位置,主函數(shù)主函數(shù)main()main()之前或之后。但在一個(gè)函數(shù)的函數(shù)體內(nèi),之前或之后。但在一個(gè)函數(shù)的函數(shù)體內(nèi),不能再定義另一個(gè)函數(shù),即不能嵌套定義。不能再定義另一個(gè)函數(shù),即不能嵌套定義。函數(shù)的定義注意注意:fu

6、nc1() func2() func1() func2() /*嵌套定義嵌套定義*/8第六章 函數(shù)、存儲(chǔ)類(lèi)和預(yù)處理程序 函數(shù)的返回w函數(shù)執(zhí)行的最后一個(gè)操作是返回函數(shù)執(zhí)行的最后一個(gè)操作是返回w返回的意義是:返回的意義是:n使流程返回主調(diào)函數(shù),宣告函數(shù)的一次執(zhí)行終結(jié),使流程返回主調(diào)函數(shù),宣告函數(shù)的一次執(zhí)行終結(jié),在調(diào)用期間所分配的變量單元被撤銷(xiāo)。在調(diào)用期間所分配的變量單元被撤銷(xiāo)。n送函數(shù)值到調(diào)用表達(dá)式中,但是這一點(diǎn)并非是必送函數(shù)值到調(diào)用表達(dá)式中,但是這一點(diǎn)并非是必需的,有些函數(shù)有返回值,有些函數(shù)可以沒(méi)有返需的,有些函數(shù)有返回值,有些函數(shù)可以沒(méi)有返回值?;刂怠從有無(wú)返回值這個(gè)角度,可把函數(shù)分為有返從

7、有無(wú)返回值這個(gè)角度,可把函數(shù)分為有返回值函數(shù)和無(wú)返回值函數(shù)兩種?;刂岛瘮?shù)和無(wú)返回值函數(shù)兩種。w函數(shù)的返回是通過(guò)函數(shù)中的函數(shù)的返回是通過(guò)函數(shù)中的returnreturn語(yǔ)句來(lái)實(shí)語(yǔ)句來(lái)實(shí)現(xiàn)的?,F(xiàn)的。9第六章 函數(shù)、存儲(chǔ)類(lèi)和預(yù)處理程序n返回語(yǔ)句返回語(yǔ)句w功能:使程序控制從被調(diào)用函數(shù)返回到調(diào)用函數(shù)中,同功能:使程序控制從被調(diào)用函數(shù)返回到調(diào)用函數(shù)中,同時(shí)把返回值帶給調(diào)用函數(shù)時(shí)把返回值帶給調(diào)用函數(shù)w形式:形式: nreturn(return(表達(dá)式表達(dá)式); ); 或或 return return 表達(dá)式表達(dá)式; ; nreturn;return;w說(shuō)明:說(shuō)明:n函數(shù)中可有多個(gè)函數(shù)中可有多個(gè)returnr

8、eturn語(yǔ)句語(yǔ)句n在定義函數(shù)時(shí),對(duì)函數(shù)類(lèi)型的說(shuō)明應(yīng)與在定義函數(shù)時(shí),對(duì)函數(shù)類(lèi)型的說(shuō)明應(yīng)與returnreturn語(yǔ)句中語(yǔ)句中返回值的類(lèi)型一致。返回值的類(lèi)型一致。n若函數(shù)類(lèi)型與若函數(shù)類(lèi)型與returnreturn語(yǔ)句中表達(dá)式值的類(lèi)型不一致,語(yǔ)句中表達(dá)式值的類(lèi)型不一致,按前者為準(zhǔn),自動(dòng)轉(zhuǎn)換按前者為準(zhǔn),自動(dòng)轉(zhuǎn)換-函數(shù)調(diào)用轉(zhuǎn)換函數(shù)調(diào)用轉(zhuǎn)換n不帶表達(dá)式的不帶表達(dá)式的returnreturn語(yǔ)句位于函數(shù)體的最后時(shí),允許語(yǔ)句位于函數(shù)體的最后時(shí),允許省略,用作函數(shù)體結(jié)束的省略,用作函數(shù)體結(jié)束的“”會(huì)將流程返回調(diào)用函會(huì)將流程返回調(diào)用函數(shù)數(shù)n函數(shù)中無(wú)函數(shù)中無(wú)returnreturn語(yǔ)句或使用不帶表達(dá)式的語(yǔ)句或使用

9、不帶表達(dá)式的returnreturn語(yǔ)句,語(yǔ)句,并不是不返回一個(gè)值,而是一個(gè)不確定的值。為了明并不是不返回一個(gè)值,而是一個(gè)不確定的值。為了明確表示不返回值,可以用確表示不返回值,可以用“void”void”定義成定義成“無(wú)(空)無(wú)(空)類(lèi)型類(lèi)型”-voidvoid型函數(shù)型函數(shù)例例 無(wú)返回值函數(shù)無(wú)返回值函數(shù) void swap(int x,int y ) int temp; temp=x; x=y; y=temp; 函數(shù)的返回例:有指定返回值函數(shù)例:有指定返回值函數(shù) int max(int k,int m) return(km?k:m); 例例 多個(gè)多個(gè)return語(yǔ)句語(yǔ)句 int cp(int

10、 x,int y ) if(xy) return 1; else if(xy) return 2; return 0; 10第六章 函數(shù)、存儲(chǔ)類(lèi)和預(yù)處理程序w對(duì)被調(diào)用函數(shù)要求:對(duì)被調(diào)用函數(shù)要求:n必須是必須是已存在已存在的函數(shù)的函數(shù)n庫(kù)函數(shù)庫(kù)函數(shù): : #include #include .hn用戶(hù)自定義函數(shù)用戶(hù)自定義函數(shù): : 函數(shù)說(shuō)明函數(shù)說(shuō)明w函數(shù)說(shuō)明函數(shù)說(shuō)明n采用函數(shù)原型方式,對(duì)被調(diào)用函數(shù)進(jìn)行說(shuō)明采用函數(shù)原型方式,對(duì)被調(diào)用函數(shù)進(jìn)行說(shuō)明n一般形式:一般形式: ( ); );n作用:告訴編譯系統(tǒng)函數(shù)類(lèi)型、參數(shù)個(gè)數(shù)及類(lèi)型,以作用:告訴編譯系統(tǒng)函數(shù)類(lèi)型、參數(shù)個(gè)數(shù)及類(lèi)型,以便檢驗(yàn)便檢驗(yàn)n函數(shù)定義函

11、數(shù)定義與與函數(shù)說(shuō)明函數(shù)說(shuō)明不同不同n函數(shù)說(shuō)明位置:函數(shù)說(shuō)明位置:程序的數(shù)據(jù)說(shuō)明部分(函數(shù)內(nèi)或外)程序的數(shù)據(jù)說(shuō)明部分(函數(shù)內(nèi)或外)n下列情況下,可不作函數(shù)說(shuō)明下列情況下,可不作函數(shù)說(shuō)明n函數(shù)返值是函數(shù)返值是intint型型n被調(diào)用函數(shù)定義出現(xiàn)在主調(diào)函數(shù)之前被調(diào)用函數(shù)定義出現(xiàn)在主調(diào)函數(shù)之前函數(shù)說(shuō)明11第六章 函數(shù)、存儲(chǔ)類(lèi)和預(yù)處理程序double fun(int n) main() fun(1); 函數(shù)說(shuō)明與定義的對(duì)應(yīng)關(guān)系main()double fun(int n); fun(1); double fun(int n) double fun(int n); main() fun(1); doubl

12、e fun(int n) 現(xiàn)代風(fēng)格:不需要說(shuō)明:main() fun(1); int fun(int n) 12第六章 函數(shù)、存儲(chǔ)類(lèi)和預(yù)處理程序n在程序中,是通過(guò)對(duì)函數(shù)的調(diào)用來(lái)執(zhí)行函數(shù)體的在程序中,是通過(guò)對(duì)函數(shù)的調(diào)用來(lái)執(zhí)行函數(shù)體的n函數(shù)調(diào)用的一般形式:函數(shù)調(diào)用的一般形式: (實(shí)參表列實(shí)參表列) 說(shuō)明:說(shuō)明:w調(diào)用函數(shù)時(shí),函數(shù)名稱(chēng)必須與具有該功能的自定義函調(diào)用函數(shù)時(shí),函數(shù)名稱(chēng)必須與具有該功能的自定義函數(shù)名稱(chēng)完全一致。數(shù)名稱(chēng)完全一致。w實(shí)參與形參實(shí)參與形參個(gè)數(shù)相等個(gè)數(shù)相等,類(lèi)型一致類(lèi)型一致,按順序一一對(duì)應(yīng),按順序一一對(duì)應(yīng),才能正確地進(jìn)行數(shù)據(jù)傳遞才能正確地進(jìn)行數(shù)據(jù)傳遞 w實(shí)參表求值順序,因系統(tǒng)而定(

13、實(shí)參表求值順序,因系統(tǒng)而定(Turbo C Turbo C 自右向左自右向左)nC C語(yǔ)言規(guī)定,在調(diào)用函數(shù)之前,必須有相應(yīng)的函語(yǔ)言規(guī)定,在調(diào)用函數(shù)之前,必須有相應(yīng)的函數(shù)說(shuō)明或函數(shù)定義。數(shù)說(shuō)明或函數(shù)定義。 函數(shù)的調(diào)用13第六章 函數(shù)、存儲(chǔ)類(lèi)和預(yù)處理程序n函數(shù)調(diào)用語(yǔ)句:函數(shù)調(diào)用語(yǔ)句: 例:例: printstar();printstar(); printf(“Hello,World!n”); printf(“Hello,World!n”);n函數(shù)表達(dá)式:函數(shù)表達(dá)式: 例:例: m=max(a,b)m=max(a,b)* *2;2;n函數(shù)參數(shù):函數(shù)參數(shù): 例:例: printf(“%d”,max(a

14、,b);printf(“%d”,max(a,b); m=max(a,max(b,c); m=max(a,max(b,c);函數(shù)的調(diào)用調(diào)用方式:調(diào)用方式:14第六章 函數(shù)、存儲(chǔ)類(lèi)和預(yù)處理程序c=max(a,b);(main 函數(shù))(max 函數(shù))max(int x, int y) int z; z=xy?x:y; return(z); 例 比較兩個(gè)數(shù)并輸出大者/*ch6_3.c*/#include main() int a,b,c; scanf(%d,%d,&a,&b); c=max(a,b); printf(Max is %d,c);max(int x, int y) int z; z=xy?

15、x:y; return(z);函數(shù)的調(diào)用15第六章 函數(shù)、存儲(chǔ)類(lèi)和預(yù)處理程序n形參與實(shí)參形參與實(shí)參w形式參數(shù):定義函數(shù)時(shí)函數(shù)名后面括號(hào)中的變量名形式參數(shù):定義函數(shù)時(shí)函數(shù)名后面括號(hào)中的變量名w實(shí)際參數(shù):調(diào)用函數(shù)時(shí)函數(shù)名后面括號(hào)中的表達(dá)式實(shí)際參數(shù):調(diào)用函數(shù)時(shí)函數(shù)名后面括號(hào)中的表達(dá)式nC C語(yǔ)言的參數(shù)傳遞規(guī)則是按值傳遞語(yǔ)言的參數(shù)傳遞規(guī)則是按值傳遞w方式:函數(shù)調(diào)用時(shí),為形參分配單元,并將實(shí)參的值方式:函數(shù)調(diào)用時(shí),為形參分配單元,并將實(shí)參的值復(fù)制復(fù)制到形參中;調(diào)用結(jié)束,形參單元被釋放,實(shí)參單到形參中;調(diào)用結(jié)束,形參單元被釋放,實(shí)參單元仍保留并維持原值元仍保留并維持原值w特點(diǎn):特點(diǎn):n形參與實(shí)參占用形參與

16、實(shí)參占用不同不同的內(nèi)存單元的內(nèi)存單元n單向單向傳遞傳遞參數(shù)傳遞16第六章 函數(shù)、存儲(chǔ)類(lèi)和預(yù)處理程序711x:y:調(diào)用前:調(diào)用結(jié)束:711x:y:/*ch6_4.c*/#include main() int x=7,y=11; printf(x=%d,ty=%dn,x,y); printf(swapped:n); swap(x,y); printf(x=%d,ty=%dn,x,y);swap(int a,int b) int temp; temp=a; a=b; b=temp;調(diào)用:711a:b:711x:y:swap:711x:y:117a:b:temp例 交換兩個(gè)數(shù)形參實(shí)參17第六章 函數(shù)、

17、存儲(chǔ)類(lèi)和預(yù)處理程序說(shuō)明:說(shuō)明: 實(shí)參必須有確定的值實(shí)參必須有確定的值 形參必須指定類(lèi)型形參必須指定類(lèi)型 形參與實(shí)參形參與實(shí)參類(lèi)型一致,個(gè)數(shù)相同類(lèi)型一致,個(gè)數(shù)相同,按順序一一對(duì)應(yīng)按順序一一對(duì)應(yīng) 若形參與實(shí)參類(lèi)型不一致,自動(dòng)按形參類(lèi)型轉(zhuǎn)換若形參與實(shí)參類(lèi)型不一致,自動(dòng)按形參類(lèi)型轉(zhuǎn)換函數(shù)調(diào)用轉(zhuǎn)換函數(shù)調(diào)用轉(zhuǎn)換 形參在函數(shù)被調(diào)用前不占內(nèi)存形參在函數(shù)被調(diào)用前不占內(nèi)存; ;函數(shù)調(diào)用時(shí)為形參函數(shù)調(diào)用時(shí)為形參分配內(nèi)存;調(diào)用結(jié)束,內(nèi)存釋放分配內(nèi)存;調(diào)用結(jié)束,內(nèi)存釋放 形參與實(shí)參占用不同的內(nèi)存單元形參與實(shí)參占用不同的內(nèi)存單元 單向傳遞單向傳遞參數(shù)傳遞n形參與實(shí)參形參與實(shí)參w形式參數(shù):定義函數(shù)時(shí)函數(shù)名后面括號(hào)中的變量名

18、形式參數(shù):定義函數(shù)時(shí)函數(shù)名后面括號(hào)中的變量名w實(shí)際參數(shù):調(diào)用函數(shù)時(shí)函數(shù)名后面括號(hào)中的表達(dá)式實(shí)際參數(shù):調(diào)用函數(shù)時(shí)函數(shù)名后面括號(hào)中的表達(dá)式18第六章 函數(shù)、存儲(chǔ)類(lèi)和預(yù)處理程序#include long sum(int a, int b); long factorial(int n);main() int n1,n2; long a; scanf(%d,%d,&n1,&n2); a=sum(n1,n2); printf(a=%1d,a); long sum(int a,int b) long c1,c2; c1=factorial(a); c2=factorial(b); return(c1+c2)

19、;/*ch6_5.c*/ long factorial(int n) long rtn=1; int i; for(i=1;i=n;i+) rtn*=i; return(rtn); long sum(int a, int b);long factorial(int n);文件包含編譯預(yù)處理命令函數(shù)說(shuō)明函數(shù)定義函數(shù)調(diào)用函數(shù)調(diào)用函數(shù)返回值形參實(shí)參例子解析19第六章 函數(shù)、存儲(chǔ)類(lèi)和預(yù)處理程序n嵌套調(diào)用嵌套調(diào)用w函數(shù)的嵌套調(diào)用是指,在執(zhí)行被調(diào)用函數(shù)時(shí),被調(diào)函數(shù)的嵌套調(diào)用是指,在執(zhí)行被調(diào)用函數(shù)時(shí),被調(diào)用函數(shù)又調(diào)用了其它函數(shù)。用函數(shù)又調(diào)用了其它函數(shù)。 wC C規(guī)定:規(guī)定:函數(shù)定義不可嵌套函數(shù)定義不可嵌套,

20、但,但可以嵌套調(diào)用可以嵌套調(diào)用函數(shù)函數(shù)main( )調(diào)用函數(shù)調(diào)用函數(shù)a結(jié)束結(jié)束a函數(shù)函數(shù)b函數(shù)函數(shù)調(diào)用函數(shù)調(diào)用函數(shù)b函數(shù)的嵌套與遞歸調(diào)用20第六章 函數(shù)、存儲(chǔ)類(lèi)和預(yù)處理程序/*ch6_6.c*/#include int dif(int x,int y,int z); int max(int x,int y,int z); int min(int x,int y,int z);void main() int a,b,c,d; scanf(%d%d%d,&a,&b,&c); d=dif(a,b,c); printf(Max-Min=%dn,d); int dif(int x,int y,int z

21、) return max(x,y,z)-min(x,y,z); int max(int x,int y,int z) int r; r=xy?x:y; return(rz?r:z); int min(int x,int y,int z) int r; r=xy?x:y; return(rz?r:z); main( )調(diào)用函數(shù)dif輸出結(jié)束dif函數(shù)max函數(shù)調(diào)用函數(shù)max調(diào)用函數(shù)minmin函數(shù)例 求三個(gè)數(shù)中最大數(shù)和最小數(shù)的差值21第六章 函數(shù)、存儲(chǔ)類(lèi)和預(yù)處理程序定義:函數(shù)直接或間接的調(diào)用自身叫函數(shù)的遞歸調(diào)用f( )調(diào)f調(diào)f2調(diào)f1f1( )f2( )說(shuō)明: C編譯系統(tǒng)對(duì)遞歸函數(shù)的自調(diào)用次數(shù)沒(méi)

22、有限制 每調(diào)用函數(shù)一次,在內(nèi)存堆棧區(qū)分配空間,用于存放函數(shù)變量、返回值等信息,所以遞歸次數(shù)過(guò)多,可能引起堆棧溢出int f(int x) int y,z; z=f(y); . return(2*z);int f1(int x) int y,z; z=f2(y); . return(2*z);int f2(int t) int a,c; c=f1(a); . return(3+c);遞歸調(diào)用22第六章 函數(shù)、存儲(chǔ)類(lèi)和預(yù)處理程序)2()2() 1()2(1) 1(1)(nnfibnfibnnnfib/*ch6_8.c*/#include long fib(int n) if(n=1) return

23、 1; else if(n=2) return 1; else return fib(n-1)+fib(n-2);main() long r; r=fib(5); printf(fib(5)=%ld,r);例 求Fibonacci數(shù)列的值遞歸調(diào)用關(guān)系示意圖mainfib(5)fib(4)fib(3)fib(3)fib(2)fib(1)fib(2)fib(2)fib(1)23第六章 函數(shù)、存儲(chǔ)類(lèi)和預(yù)處理程序)2()2() 1()2(1) 1(1)(nnfibnfibnnnfib例 求Fibonacci數(shù)列的值遞歸調(diào)用處理過(guò)程mainfib(5)fib(4)fib(3)fib(3)fib(2)fi

24、b(1)fib(2)fib(2)fib(1)112111325遞歸調(diào)用關(guān)系示意圖mainfib(5)fib(4)fib(3)fib(3)fib(2)fib(1)fib(2)fib(2)fib(1)24第六章 函數(shù)、存儲(chǔ)類(lèi)和預(yù)處理程序/*ch6_9.c*/#include Void printint(int n) if(n0) putchar(-); n=-n; if(n/10!=0) printint(n/10); putchar(n%10+0);main() int k; scanf(“%d”,&k); printint(k); printf(“n”);例 用遞歸方法輸出任何一個(gè)整數(shù)Prin

25、tint(321)321/10!=0Printint(32)32/10!=0Printint(3)3/10=0Putchar(3+0)Putchar(2+0)Putchar(1+0)25第六章 函數(shù)、存儲(chǔ)類(lèi)和預(yù)處理程序課程名稱(chēng):語(yǔ)言程序設(shè)計(jì)課型與教法:講授,通過(guò)程序擴(kuò)展,進(jìn)行對(duì)比學(xué)習(xí)學(xué)時(shí):2課時(shí)授課題目: 第6章 函數(shù)、存儲(chǔ)類(lèi)和預(yù)處理程序基本教材:語(yǔ)言程序設(shè)計(jì)(高等教育出版社)廖雷主編教學(xué)目的與要求:通過(guò)本章的學(xué)習(xí)使學(xué)生了解變量的作用域和生命期、預(yù)處理程序;能分析出程序中變量的作用范圍;會(huì)使用預(yù)處理命令#include、#define和條件編譯。教學(xué)重點(diǎn)與難點(diǎn):變量的作用域和生命期、預(yù)處理命令

26、#include、#define 26第六章 函數(shù)、存儲(chǔ)類(lèi)和預(yù)處理程序n概述概述w變量是對(duì)程序中數(shù)據(jù)的存儲(chǔ)空間的抽象變量是對(duì)程序中數(shù)據(jù)的存儲(chǔ)空間的抽象內(nèi)存.main() int a; a=10; printf(“%d”,a);編譯或函數(shù)調(diào)用時(shí)為其分配內(nèi)存單元編譯或函數(shù)調(diào)用時(shí)為其分配內(nèi)存單元20002001變量的的作用域和生命期10程序中使用變量名對(duì)內(nèi)存操作程序中使用變量名對(duì)內(nèi)存操作27第六章 函數(shù)、存儲(chǔ)類(lèi)和預(yù)處理程序 變量的屬性變量的屬性數(shù)據(jù)類(lèi)型:數(shù)據(jù)類(lèi)型:存儲(chǔ)類(lèi)別:存儲(chǔ)類(lèi)別:存儲(chǔ)器類(lèi)型:內(nèi)存、寄存器存儲(chǔ)器類(lèi)型:內(nèi)存、寄存器生命期生命期:變量占據(jù)內(nèi)存的時(shí)間期限:變量占據(jù)內(nèi)存的時(shí)間期限-靜態(tài)變量

27、與動(dòng)態(tài)變量靜態(tài)變量與動(dòng)態(tài)變量作用域作用域:變量出現(xiàn)的有效區(qū)域:變量出現(xiàn)的有效區(qū)域-局部變量與全局變量局部變量與全局變量 變量說(shuō)明格式變量說(shuō)明格式: : ; 變量的存儲(chǔ)類(lèi)別變量的存儲(chǔ)類(lèi)別auto -auto -自動(dòng)型自動(dòng)型register-register-寄存器型(寄存器型(Turbo C 2.0Turbo C 2.0中按自動(dòng)型處理)中按自動(dòng)型處理)static -static -靜態(tài)型靜態(tài)型extern -extern -外部型外部型 變量說(shuō)明的位置變量說(shuō)明的位置 外部變量:在函數(shù)外部說(shuō)明的變量外部變量:在函數(shù)外部說(shuō)明的變量 內(nèi)部變量:在一個(gè)函數(shù)內(nèi)部說(shuō)明的變量?jī)?nèi)部變量:在一個(gè)函數(shù)內(nèi)部說(shuō)明的變

28、量 概述概述如如: int sum; auto int a,b,c; register int i; static float x,y; extern int f,m;變量的作用域和生命期變量所持有的數(shù)據(jù)的性質(zhì)(變量所持有的數(shù)據(jù)的性質(zhì)(操作屬性操作屬性)28第六章 函數(shù)、存儲(chǔ)類(lèi)和預(yù)處理程序w存儲(chǔ)方式存儲(chǔ)方式n靜態(tài)存儲(chǔ):程序運(yùn)行期間分配固定存儲(chǔ)空間靜態(tài)存儲(chǔ):程序運(yùn)行期間分配固定存儲(chǔ)空間n動(dòng)態(tài)存儲(chǔ):程序運(yùn)行期間根據(jù)需要?jiǎng)討B(tài)分配存儲(chǔ)空間動(dòng)態(tài)存儲(chǔ):程序運(yùn)行期間根據(jù)需要?jiǎng)討B(tài)分配存儲(chǔ)空間w內(nèi)存用戶(hù)區(qū)內(nèi)存用戶(hù)區(qū)程序區(qū)靜態(tài)存儲(chǔ)區(qū)動(dòng)態(tài)存儲(chǔ)區(qū)全局變量、靜態(tài)局部變量形參變量局部動(dòng)態(tài)變量(auto,register)

29、函數(shù)調(diào)用現(xiàn)場(chǎng)保護(hù)和返回地址等w 生命期生命期n 靜態(tài)變量:編譯時(shí)分配存儲(chǔ)空間,從程序開(kāi)始執(zhí)行直靜態(tài)變量:編譯時(shí)分配存儲(chǔ)空間,從程序開(kāi)始執(zhí)行直到程序結(jié)束到程序結(jié)束n 動(dòng)態(tài)變量:函數(shù)被調(diào)用期間動(dòng)態(tài)變量:函數(shù)被調(diào)用期間動(dòng)態(tài)變量與靜態(tài)變量29第六章 函數(shù)、存儲(chǔ)類(lèi)和預(yù)處理程序局部變量動(dòng)態(tài)(局部)變量靜態(tài)局部變量auto變量register變量生命期:說(shuō)明該變量的函數(shù)被調(diào)用期間函數(shù)內(nèi)定義的static變量 生命期:整個(gè)程序的執(zhí)行期w局部變量局部變量-內(nèi)部變量?jī)?nèi)部變量n定義:在定義:在函數(shù)內(nèi)定義,函數(shù)內(nèi)定義,在本函數(shù)內(nèi)出現(xiàn)有效在本函數(shù)內(nèi)出現(xiàn)有效n局部變量可用存儲(chǔ)類(lèi)型局部變量可用存儲(chǔ)類(lèi)型:auto regis

30、ter static auto register static (默認(rèn)為默認(rèn)為autoauto)n說(shuō)明:說(shuō)明:n所有函數(shù)是平行關(guān)系,所有函數(shù)是平行關(guān)系,mainmain函數(shù)不例外。函數(shù)不例外。mainmain中定義的變中定義的變量只在量只在mainmain中有效,不能使用其它函數(shù)中定義的內(nèi)部變量中有效,不能使用其它函數(shù)中定義的內(nèi)部變量 n不同函數(shù)中同名變量,占不同內(nèi)存單元不同函數(shù)中同名變量,占不同內(nèi)存單元n語(yǔ)言規(guī)定形參的存儲(chǔ)類(lèi)別是自動(dòng)型,屬于局部變量語(yǔ)言規(guī)定形參的存儲(chǔ)類(lèi)別是自動(dòng)型,屬于局部變量n可定義在復(fù)合語(yǔ)句中出現(xiàn)有效的變量可定義在復(fù)合語(yǔ)句中出現(xiàn)有效的變量局部變量和全局變量float f1(

31、int a) register int b,c; .char f2(int x,int y) static int i,j; main() int m,n; .int a,d; . a,b,c有效x,y,i,j有效a,d有效m,n有效例 不同函數(shù)中同名變量/*ch6_10.c*/#include 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);運(yùn)行結(jié)果:main

32、:a=3,b=4sub:a=6,b=7main:a=3,b=430第六章 函數(shù)、存儲(chǔ)類(lèi)和預(yù)處理程序w局部變量-內(nèi)部變量局部變量與全局變量例 auto變量/*ch6_12.c*/#include long factor(int n) long int f=1; f=f*n; return f;main() int i; for(i=1;i=5;i+) printf(“%ldn,factor(i);運(yùn)行結(jié)果:12345例 static變量/*ch6_13.c*/#include long factor(int n) static long f=1; f=f*n; return f;main() i

33、nt i; for(i=1;iw全局變量全局變量-外部變量外部變量n定義:在定義:在函數(shù)外面定義的變量,可被作用域內(nèi)的所有函數(shù)直函數(shù)外面定義的變量,可被作用域內(nèi)的所有函數(shù)直接引用接引用 n外部變量可用存儲(chǔ)類(lèi)型:缺省外部變量可用存儲(chǔ)類(lèi)型:缺省 或或 staticstaticn說(shuō)明說(shuō)明n不帶存儲(chǔ)類(lèi)別的外部變量說(shuō)明是變量的定義性說(shuō)明不帶存儲(chǔ)類(lèi)別的外部變量說(shuō)明是變量的定義性說(shuō)明n作用域作用域:從變量出現(xiàn)的位置直至本文件結(jié)束:從變量出現(xiàn)的位置直至本文件結(jié)束n生命期生命期:整個(gè)程序執(zhí)行期:整個(gè)程序執(zhí)行期n在函數(shù)外面定義的在函數(shù)外面定義的staticstatic變量變量-靜態(tài)外部變量靜態(tài)外部變量限定該外部限

34、定該外部變量只在本文件使用變量只在本文件使用n用用externextern說(shuō)明可擴(kuò)充外部變量的作用域說(shuō)明可擴(kuò)充外部變量的作用域n若外部變量與局部變量同名,則外部變量被屏蔽若外部變量與局部變量同名,則外部變量被屏蔽 應(yīng)盡量少使用全局變量,因?yàn)椋篩全局變量在程序全部執(zhí)行過(guò)程中占用存儲(chǔ)單元Y降低了函數(shù)的通用性、可靠性,可移植性Y降低程序清晰性,容易出錯(cuò)局部變量與全局變量 32第六章 函數(shù)、存儲(chǔ)類(lèi)和預(yù)處理程序/*ch6_11.c*/#include int sum;void plusone() sum+;void plustwo() sum+=2;main() sum=5; plusone(); pl

35、ustwo(); printf(“The sum is %dn,sum);作用域sum例子解析(1)33第六章 函數(shù)、存儲(chǔ)類(lèi)和預(yù)處理程序w全局變量全局變量-外部變量外部變量n externextern說(shuō)明說(shuō)明u 帶帶externextern的外部變量說(shuō)明是變量的引用性說(shuō)明的外部變量說(shuō)明是變量的引用性說(shuō)明u 引用性說(shuō)明格式:引用性說(shuō)明格式: extern extern 數(shù)據(jù)類(lèi)型數(shù)據(jù)類(lèi)型 變量表;變量表;u 擴(kuò)充外部變量的作用域擴(kuò)充外部變量的作用域u 外部變量的定義性說(shuō)明與引用性說(shuō)明不同外部變量的定義性說(shuō)明與引用性說(shuō)明不同 定義性說(shuō)明定義性說(shuō)明 引用性說(shuō)明引用性說(shuō)明u次數(shù):次數(shù): 只能只能1次次

36、可說(shuō)明多次可說(shuō)明多次u位置:位置: 所有函數(shù)之外所有函數(shù)之外 函數(shù)內(nèi)或函數(shù)外函數(shù)內(nèi)或函數(shù)外u分配內(nèi)存:分配內(nèi)存: 分配內(nèi)存分配內(nèi)存,可初始化可初始化 不分配內(nèi)存不分配內(nèi)存,不可初始化不可初始化局部變量與全局變量34第六章 函數(shù)、存儲(chǔ)類(lèi)和預(yù)處理程序int p=1,q=5;float f1(int a) int b,c; .int f3().char c1,c2;char f2(int x,int y) int i,j; main() int m,n; .c1,c2的原作用域p,q的作用域extern char c1,c2;extern char c1,c2;c1,c2的作用范圍擴(kuò)展后c1,c2的

37、作用范圍擴(kuò)展后例子解析(2)35第六章 函數(shù)、存儲(chǔ)類(lèi)和預(yù)處理程序int max(int x, int y) int z; z=xy?x:y; return(z);main() extern int a,b; printf(max=%d,max(a,b);int a=13,b=-8;運(yùn)行結(jié)果:max=13extern int a,b;int max() int z; z=ab?a:b; return(z);main() printf(max=%d,max();int a=13,b=-8;例 外部變量用于函數(shù)之間的通信36第六章 函數(shù)、存儲(chǔ)類(lèi)和預(yù)處理程序int a=3,b=5;max(int a,

38、 int b) int c; c=ab?a:b; return(c);main() int a=8; printf(max=%d,max(a,b);運(yùn)行結(jié)果:max=8例 外部變量與局部變量37第六章 函數(shù)、存儲(chǔ)類(lèi)和預(yù)處理程序靜態(tài)動(dòng)態(tài)存儲(chǔ)方式程序整個(gè)運(yùn)行期間函數(shù)調(diào)用開(kāi)始至結(jié)束生存期編譯時(shí)賦初值,只賦一次每次函數(shù)調(diào)用時(shí)賦初值自動(dòng)賦初值0或空字符不確定未賦初值靜態(tài)存儲(chǔ)區(qū)動(dòng)態(tài)區(qū)存儲(chǔ)區(qū)寄存器局部變量全局變量作用域定義變量的函數(shù)或復(fù)合語(yǔ)句內(nèi)本文件其它文件u局部變量默認(rèn)為auto型uregister型變量個(gè)數(shù)受限u局部static變量具有全局壽命和局部可見(jiàn)性u(píng)局部static變量具有可繼承性u(píng)extern

39、不是變量定義,可擴(kuò)展外部變量作用域register局部staticauto外部static外部存儲(chǔ)類(lèi)別變量存儲(chǔ)類(lèi)型38第六章 函數(shù)、存儲(chǔ)類(lèi)和預(yù)處理程序預(yù)處理程序 作用:在編譯前對(duì)源程序進(jìn)行一些預(yù)加工作用:在編譯前對(duì)源程序進(jìn)行一些預(yù)加工, ,生成擴(kuò)展生成擴(kuò)展C C源程序源程序 具體功能:具體功能:w宏替換宏替換 #define#definew文件包含文件包含 #include#includew條件編譯條件編譯 #if-#else-#endif#if-#else-#endif 預(yù)處理命令說(shuō)明:預(yù)處理命令說(shuō)明:w“#”#”開(kāi)頭開(kāi)頭w占單獨(dú)書(shū)寫(xiě)行占單獨(dú)書(shū)寫(xiě)行w尾部不加分號(hào)尾部不加分號(hào)w可以出現(xiàn)在程序中

40、的任何位置可以出現(xiàn)在程序中的任何位置w作用域是自出現(xiàn)點(diǎn)到程序正文結(jié)束作用域是自出現(xiàn)點(diǎn)到程序正文結(jié)束39第六章 函數(shù)、存儲(chǔ)類(lèi)和預(yù)處理程序n不帶參數(shù)宏定義不帶參數(shù)宏定義w一般形式:一般形式: #define #define w功能:把程序中該宏定義之后的所有指定標(biāo)識(shí)符功能:把程序中該宏定義之后的所有指定標(biāo)識(shí)符( (宏宏名名) )用字符串用字符串( (宏體宏體) )替換替換u 宏展開(kāi):預(yù)編譯時(shí)宏展開(kāi):預(yù)編譯時(shí), ,用宏體替換宏名用宏體替換宏名-不作語(yǔ)法檢查不作語(yǔ)法檢查宏體可缺省宏體可缺省,表示宏表示宏名定義過(guò)或取消宏名定義過(guò)或取消宏體體u 定義位置定義位置: :任意任意( (一般在函數(shù)外面,文件開(kāi)頭

41、處一般在函數(shù)外面,文件開(kāi)頭處) )u 作用域作用域: :從定義命令到文件結(jié)束從定義命令到文件結(jié)束u #undef#undef可終止宏名作用域可終止宏名作用域 格式:格式: #undef #undef 宏名宏名u 宏定義可嵌套,不能遞歸宏定義可嵌套,不能遞歸例例 #define MAX MAX+10 ( )u 引號(hào)中的內(nèi)容與宏名相同也不置換引號(hào)中的內(nèi)容與宏名相同也不置換u 宏定義中使用必要的括號(hào)宏定義中使用必要的括號(hào)()()宏替換(宏定義)例例 #define MAX 10 語(yǔ)句:語(yǔ)句: printf(“MAX”); (不置換)(不置換)例例 #define MAX 5+10 語(yǔ)句:語(yǔ)句: k=

42、30/MAX;結(jié)果:結(jié)果:1616例例 #define P 25 #define R return(2*P); /*源文件源文件*/#define PI 3.1416#define R 2.0double circum() return(2.0*PI*R);/*預(yù)處理后形成的源文件預(yù)處理后形成的源文件*/double circum() return(2.0*3.1416*2.0);宏替換宏替換宏名不能用宏名不能用引號(hào)括起來(lái)引號(hào)括起來(lái)40第六章 函數(shù)、存儲(chǔ)類(lèi)和預(yù)處理程序u 宏展開(kāi):形參用實(shí)參換,其它字符保留宏展開(kāi):形參用實(shí)參換,其它字符保留u 宏體及各形參外一般應(yīng)加括號(hào)宏體及各形參外一般應(yīng)加括號(hào)

43、()()u 較長(zhǎng)定義在一行寫(xiě)不下,可在本行末尾使用斜杠表示要續(xù)較長(zhǎng)定義在一行寫(xiě)不下,可在本行末尾使用斜杠表示要續(xù)行,注意斷開(kāi)的位置行,注意斷開(kāi)的位置 例例: #define PRX printf(“Shanxi Economic : #define PRX printf(“Shanxi Economic Management University.”); Management University.”); printf(“n”); printf(“n”);w一般形式:一般形式: #define #define () ) w調(diào)用格式:調(diào)用格式: ()例例 #define S (r) PI*r*r

44、相當(dāng)于定義了不帶參宏相當(dāng)于定義了不帶參宏S,代表字符串代表字符串“(r) PI*r*r” 例例 #define S(a,b) a*b . area=S(3,2);宏展開(kāi)宏展開(kāi): area=3*2;不能加空格不能加空格例例 #define POWER(x) x*x x=4; y=6; z=POWER(x+y);宏展開(kāi):宏展開(kāi):z=x+y*x+y;一般寫(xiě)成:一般寫(xiě)成: #define POWER(x) (x)*(x)宏展開(kāi):宏展開(kāi): z=(x+y)*(x+y);n 帶參數(shù)宏定義帶參數(shù)宏定義宏替換(宏定義)41第六章 函數(shù)、存儲(chǔ)類(lèi)和預(yù)處理程序#define MAX(x,y) (x)(y)?(x):(y) .main() int a,b,c,d,t; . t=MAX(a+b,c+d); 宏展開(kāi):t=(a+b)(c+d)?(a+b):(c+d);int max(int x,int y) return(xy?x:y);main() int a,b,c,d,t; . t=max(a+b,c+d); 例 用宏定義和函數(shù)實(shí)現(xiàn)同樣的功能宏替換(宏定義)42第六章 函數(shù)、存儲(chǔ)類(lèi)和預(yù)處理程序帶參宏函數(shù)處理過(guò)程簡(jiǎn)單的字符置

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論