函數(shù)及變量的存儲(chǔ)市公開(kāi)課獲獎(jiǎng)?wù)n件_第1頁(yè)
函數(shù)及變量的存儲(chǔ)市公開(kāi)課獲獎(jiǎng)?wù)n件_第2頁(yè)
函數(shù)及變量的存儲(chǔ)市公開(kāi)課獲獎(jiǎng)?wù)n件_第3頁(yè)
函數(shù)及變量的存儲(chǔ)市公開(kāi)課獲獎(jiǎng)?wù)n件_第4頁(yè)
函數(shù)及變量的存儲(chǔ)市公開(kāi)課獲獎(jiǎng)?wù)n件_第5頁(yè)
已閱讀5頁(yè),還剩69頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、第6章 函 數(shù)第1頁(yè)第1頁(yè)目的描述 C 語(yǔ)言中函數(shù)掌握 C 語(yǔ)言中常見(jiàn)內(nèi)置函數(shù)理解函數(shù)原型和函數(shù)返回值純熟掌握自定義函數(shù)定義和調(diào)用理解變量作用域、生命期理解變量存儲(chǔ)類(lèi)型正確理解函數(shù)在C語(yǔ)言程序設(shè)計(jì)中作用和地位;理解函數(shù)、形參、實(shí)參、作用域、生存期概念;掌握各種函數(shù)定義、原型申明和調(diào)用辦法;理解全局變量、局部變量、靜態(tài)變量、靜態(tài)函數(shù)作用域和生存期;掌握遞歸函數(shù)編寫(xiě)規(guī)則;掌握利用工程管理程序辦法; 第2頁(yè)第2頁(yè)6.1.1 什么是模塊化 模塊化程序設(shè)計(jì)辦法: 人們?cè)谇蠼饽硞€(gè)復(fù)雜問(wèn)題時(shí),通常采用逐步分解、分而治之辦法,也就是將一個(gè)大問(wèn)題分解成若干個(gè)比較容易求解小問(wèn)題,然后分別求解。程序員在設(shè)計(jì)一個(gè)復(fù)雜

2、應(yīng)用程序時(shí),往往也是把整個(gè)程序劃分成若干個(gè)功效較為單一程序模塊,然后分別予以實(shí)現(xiàn),最后再把所有程序模塊象搭積木同樣裝配起來(lái),這種在程序設(shè)計(jì)中分而治之策略,被稱(chēng)為模塊化程序設(shè)計(jì)辦法。 6.1 概述第3頁(yè)第3頁(yè)maincabdefghijkl圖6-1 C程序模塊化C程序模塊化第4頁(yè)第4頁(yè)6.1.2 什么是函數(shù)?在C語(yǔ)言中,模塊就是一組邏輯相關(guān)(這也表達(dá)了軟件工程中“內(nèi)聚性”)語(yǔ)句集合或說(shuō)是用于完畢特定任務(wù)程序代碼單元。依據(jù)規(guī)模大小,C語(yǔ)言中模塊有三種形式:語(yǔ)句塊(即復(fù)合語(yǔ)句)函數(shù)文獻(xiàn)。函數(shù)是C語(yǔ)言中最為慣用模塊單元。因此通常說(shuō)C程序是由函數(shù)構(gòu)成;函數(shù)是C語(yǔ)言程序基本構(gòu)成部分。第5頁(yè)第5頁(yè)void

3、main() : x=x*x*x; y=y*y*y; z=z*z*z; ans1=x+y+z; a=a*a*a; b=b*b*b; c=c*c*c; ans2=a+b+c; :重復(fù)多次同一計(jì)算類(lèi)型void main() : ans1=cube(x,y,z); ans2=cube(a,b,c); :int cube(int a,b,c) int ans; ans=(a*a*a)+(b*b*b)+(c*c*c); return ans;函數(shù)主程序ans函數(shù)能夠把相對(duì)獨(dú)立某個(gè)功效抽象出來(lái),使之成為程序中一個(gè)獨(dú)立實(shí)體。能夠在同一個(gè)程序或其它程序中多次重復(fù)使用為何使用函數(shù)?第6頁(yè)第6頁(yè)使程序變得更簡(jiǎn)短而

4、清楚 有助于程序維護(hù)能夠提升程序開(kāi)發(fā)效率 提升了代碼重用性 函數(shù)機(jī)制長(zhǎng)處第7頁(yè)第7頁(yè)6.2.1 函數(shù)分類(lèi) 內(nèi)置函數(shù)(庫(kù)函數(shù)):由語(yǔ)言系統(tǒng)提供;用戶不必定義,也不必在程序中作類(lèi)型闡明;只需在程序前包括有該函數(shù)定義頭文獻(xiàn); 自定義函數(shù):用戶在程序中依據(jù)需要而編寫(xiě)函數(shù);從用戶角度6.2 函數(shù)定義與使用第8頁(yè)第8頁(yè)內(nèi)置函數(shù)頭文獻(xiàn)用途double sqrt(double x)math.h計(jì)算x平方根double pow(double x, double y)計(jì)算xy次冪double ceil(double x)求不小于x最小整數(shù),并以double形式顯示double floor(double x)求小于

5、x最大整數(shù),并以double形式顯示int toupper(int x)ctype.h假如x為小寫(xiě)字母,則返回相應(yīng)大寫(xiě)字母int tolower(int x)假如x為大寫(xiě)字母,則返回相應(yīng)小寫(xiě)字母int rand(void)stdlib.h產(chǎn)生一個(gè)隨機(jī)數(shù)void exit(int retval)終止程序慣用庫(kù)函數(shù)使用庫(kù)函數(shù)普通辦法:1、函數(shù)功效2、函數(shù)參數(shù)數(shù)目和順序,及各參數(shù)意義和類(lèi)型3、函數(shù)返回值意義和類(lèi)型4、需要使用包括文獻(xiàn)第9頁(yè)第9頁(yè) 函數(shù)定義格式函數(shù)體合法標(biāo)識(shí)符函數(shù)返回值類(lèi)型函數(shù)類(lèi)型 函數(shù)名(形參類(lèi)型闡明表)闡明部分語(yǔ)句部分return 語(yǔ)句下列紅色為函數(shù)6個(gè)元素函數(shù)頭部第10頁(yè)第10頁(yè)

6、參數(shù):普通用于一個(gè)函數(shù)把數(shù)據(jù)傳遞給另一個(gè)函數(shù)(調(diào)用者和被調(diào)用者之間),實(shí)現(xiàn)函數(shù)之間通信。定義函數(shù)時(shí)候,函數(shù)參數(shù)是形式參數(shù),是對(duì)一件詳細(xì)事件也許需要數(shù)據(jù)假設(shè)。返回值: 即函數(shù)帶回來(lái)值。而返回值類(lèi)型是在定義函數(shù)時(shí)指定,即用“返回值類(lèi)型”指定函數(shù)類(lèi)型。1、假如類(lèi)型標(biāo)識(shí)符為void則表示不需要帶回函數(shù)值;2、假如沒(méi)有類(lèi)型標(biāo)識(shí),則TC2.0默認(rèn)返回值類(lèi)型是int(在vc+ 6.0中則認(rèn)為默認(rèn)為void,視編譯器不同而不同)。函數(shù)體:一對(duì)花括號(hào)里面內(nèi)容(包括申明部分和語(yǔ)句部分)又被稱(chēng)為函數(shù)體,當(dāng)函數(shù)體為空時(shí)候,該函數(shù)也被叫做空函數(shù),就是說(shuō)它什么也不做。第11頁(yè)第11頁(yè)例6-1 計(jì)算兩個(gè)整數(shù)平均數(shù)函數(shù)。/*

7、 函數(shù)功效:就算平均數(shù)函數(shù)入口參數(shù):整型x,存儲(chǔ)第一個(gè)運(yùn)算數(shù) 整型y,存儲(chǔ)第二個(gè)運(yùn)算數(shù)函數(shù)返回值:平均數(shù)*/int Average(int x , int y) int result; result=(x+y)/2; return result;第12頁(yè)第12頁(yè) 大多數(shù)情況下,調(diào)用者(主調(diào)函數(shù))和被調(diào)用者(被調(diào)用函數(shù))之間有數(shù)據(jù)傳遞關(guān)系,也就是說(shuō)該函數(shù)有參數(shù)(能夠稱(chēng)為有參函數(shù),不然叫做無(wú)參函數(shù))。在定義函數(shù)時(shí)函數(shù)名后面括號(hào)中參數(shù)稱(chēng)為“形式參數(shù)”(簡(jiǎn)稱(chēng)“形參”),在主調(diào)函數(shù)中調(diào)用一個(gè)函數(shù)時(shí),函數(shù)名后面括號(hào)中參數(shù)(能夠是一個(gè)“表示式”)稱(chēng)為“實(shí)際參數(shù)”(簡(jiǎn)稱(chēng)“實(shí)參”)。參數(shù)和參數(shù)傳遞方式6.2.3

8、 函數(shù)參數(shù)和返回值第13頁(yè)第13頁(yè)例6-2調(diào)用函數(shù)時(shí)數(shù)據(jù)(參數(shù))傳遞。#include void main() int max(int x, int y); int a, b, c; scanf(%d, %d,&a, &b); c=max(a, b); printf(max is %d, c);int max(int x, int y) /*定義有參函數(shù)max*/ int z; z=xy?x:y; return(z); 運(yùn)營(yíng)情況下列:7,8Max is 8第14頁(yè)第14頁(yè)關(guān)于形參和實(shí)參闡明:在定義函數(shù)中指定形參,在函數(shù)尚未被調(diào)用時(shí),它們并不占用內(nèi)存中存儲(chǔ)單元。只有在發(fā)生函數(shù)調(diào)用時(shí),函數(shù)max中

9、形參才被分派內(nèi)存單元。在調(diào)用結(jié)束后,形參所占內(nèi)存單元也被釋放。實(shí)參能夠是常量、變量或表示式,比如:max(3,a+b);但要求它們有擬定值。在調(diào)用時(shí)將實(shí)參值賦給形參。參數(shù)和參數(shù)傳遞方式第15頁(yè)第15頁(yè)關(guān)于形參和實(shí)參闡明:在被定義函數(shù)中,必須指定形參類(lèi)型。實(shí)參加形參類(lèi)型應(yīng)相同或賦值兼容。在C語(yǔ)言中,實(shí)參向形參數(shù)據(jù)傳遞是“值傳遞”,單向傳遞,只由實(shí)參傳給形參,而不能由形參傳回來(lái)給實(shí)參。在內(nèi)存中,實(shí)參單元與形參單元是不同單元。參數(shù)和參數(shù)傳遞方式第16頁(yè)第16頁(yè)2222abxy圖6-3 參數(shù)值傳遞221015abxy圖6-4 實(shí)參值不變參數(shù)和參數(shù)傳遞方式第17頁(yè)第17頁(yè)int Check (int n

10、um) if (num % 5 = 0) return 1; else return 0;通常,希望通過(guò)函數(shù)調(diào)用使主調(diào)函數(shù)能得到一個(gè)擬定值,這就是函數(shù)返回值,也稱(chēng)函數(shù)值。C 語(yǔ)言中 return 語(yǔ)句用于向調(diào)用函數(shù)返回值,語(yǔ)法下列:return (); 函數(shù)返回值第18頁(yè)第18頁(yè)void swap(int x, int y) int z; z=x; x=y; y=z; printf(nx=%d,y=%d,x ,y);main( ) int a= 10,b=20; swap(a,b); printf(na=%d,b=%dn,a,b);程序輸出結(jié)果:x=20,y=10a=10,b=20形式參數(shù)(形

11、參)實(shí)際參數(shù)(實(shí)參)【例】編一程序,將主函數(shù)中兩個(gè)變量值傳遞給swap函數(shù)中兩個(gè)形參,互換兩個(gè)形參值。單向值傳遞第19頁(yè)第19頁(yè)c=max(a, b);(調(diào)用main函數(shù))(max函數(shù))int max(int x, int y) int z; z=xy?x:y; return(z);圖6-2 函數(shù)調(diào)用函數(shù)返回值第20頁(yè)第20頁(yè)void main() : ans1=cube(2,5,7); ans2=cube(2,3,4); :int cube(int a,int b,int c) int ans; ans=(a*a*a)+(b*b*b)+(c*c*c); return ans;函數(shù)主程序ans

12、參數(shù)(實(shí)參)參數(shù)(形參)返回值第21頁(yè)第21頁(yè)(1)函數(shù)返回值是通過(guò)函數(shù)中return語(yǔ)句取得。闡明return語(yǔ)句將被調(diào)用函數(shù)中一個(gè)擬定值帶回主調(diào)函數(shù)中去。 假如需要從被調(diào)用函數(shù)帶回一個(gè)數(shù)值,則被調(diào)用函數(shù)中必須包括reutrn 語(yǔ)句。假如不需要?jiǎng)t能夠不要return語(yǔ)句。一個(gè)函數(shù)中能夠有一個(gè)以上return語(yǔ)句,執(zhí)行到哪一個(gè) return語(yǔ)句,則哪個(gè)語(yǔ)句起作用。return語(yǔ)句后面括號(hào)也能夠不要,如“return z;”和“return (z);”等價(jià)。return后面值能夠是一個(gè)表示式。比如,例6.2中函數(shù)max能夠改寫(xiě)下列: max(int x, int y) return (xy?x:

13、y); 第22頁(yè)第22頁(yè)(2)函數(shù)類(lèi)型。既然函數(shù)有返回值,這個(gè)值當(dāng)然應(yīng)屬于某一個(gè)擬定類(lèi)型,應(yīng)當(dāng)在定義函數(shù)時(shí)指定函數(shù)值類(lèi)型。 比如下面是3個(gè)函數(shù)首行: int max(float x, float y) /*函數(shù)值為整型*/ char letter(char c1, char c2) ) /*函數(shù)值為字符型*/ double min(int x, int y) )/*函數(shù)值為雙精度型*/ 在C語(yǔ)言中,凡不加類(lèi)型闡明函數(shù),自動(dòng)按整型處理。第23頁(yè)第23頁(yè)(3)在定義函數(shù)時(shí)指定函數(shù)類(lèi)型普通應(yīng)當(dāng)和return語(yǔ)句中表示式類(lèi)型一致。 例6.2中指定max函數(shù)值為整型,而變量z也被指定為整型,通過(guò)retu

14、rn語(yǔ)句把z值作為max函數(shù)值,由max帶回主調(diào)函數(shù)。z類(lèi)型與max函數(shù)類(lèi)型是一致,是正確。假如函數(shù)值類(lèi)型和return語(yǔ)句中表示式值不一致,則以函數(shù)類(lèi)型為準(zhǔn)。對(duì)數(shù)值型數(shù)據(jù),能夠自動(dòng)進(jìn)行類(lèi)型轉(zhuǎn)換。即函數(shù)類(lèi)型決定返回值類(lèi)型。(4)對(duì)于不帶返回值函數(shù),應(yīng)當(dāng)用“void”定義函數(shù)為“無(wú)類(lèi)型”(或稱(chēng)“空類(lèi)型”)。 這樣,系統(tǒng)就確保不使函數(shù)帶回任何值,即嚴(yán)禁在調(diào)用函數(shù)中使用被調(diào)用函數(shù)返回值。此時(shí)在函數(shù)體中不得出現(xiàn)return語(yǔ)句。第24頁(yè)第24頁(yè)例6-3 返回值類(lèi)型與函數(shù)類(lèi)型不同。#include void main() int max(int x, int y); float a, b int c;

15、scanf(%f, %f, &a, &b); c=max(a, b); printf(max is %d, c);int max(float x, float y) float z;/*z為實(shí)型變量*/ z=xy?x:y; return(z);運(yùn)營(yíng)情況下列:1.5,2.5Max is 2第25頁(yè)第25頁(yè)6.3.1 函數(shù)調(diào)用普通形式 函數(shù)調(diào)用普通形式為 函數(shù)名(實(shí)參表列);注意事項(xiàng):(1)假如是調(diào)用無(wú)參函數(shù),則“實(shí)參表列”能夠沒(méi)有,但是括號(hào)不能省略。(2)假如實(shí)參表列包括多個(gè)實(shí)參,則各個(gè)參數(shù)間用逗號(hào)隔開(kāi)。 實(shí)參能夠是常量、變量、表示式、函數(shù)等 6.3 函數(shù)調(diào)用 第26頁(yè)第26頁(yè)注意事項(xiàng): (3)

16、 賦值對(duì)應(yīng)關(guān)系: 實(shí)參1 - 形參1 實(shí)參2 - 形參2 實(shí)參n - 形參n (4)實(shí)參表求值次序(即實(shí)參賦值給形參次序) 因系統(tǒng)而定。TC、BC、VC均是自右向左,也就是說(shuō)最右邊實(shí)參最先賦值給最右邊形參, 最左邊實(shí)參最終賦值給最左邊形參。但VC與TC、BC在詳細(xì)賦值時(shí)稍有不同,注意它們之間區(qū)分。 第27頁(yè)第27頁(yè)例6-4 實(shí)參求值順序。#include void main( ) int f(int a, int b); /*函數(shù)申明*/ int i=2, p; p=f(i, +i); /*函數(shù)調(diào)用*/ printf(%dn, p);int f(int a, int b) /*函數(shù)定義*/ i

17、nt c; if(ab) c=1; else if(a=b) c=0; else c= -1; return (c);問(wèn):在Turbo C 2.0和Turbo C+ 3.0系統(tǒng)上運(yùn)營(yíng)結(jié)果?原型申明 i為實(shí)參 a、b為形參 第28頁(yè)第28頁(yè)若按自左至右順序求實(shí)參值,則函數(shù)調(diào)用相稱(chēng)于f(2,3),程序運(yùn)營(yíng)應(yīng)得結(jié)果為“-1”。 若按自右至左順序求實(shí)參值,則它相稱(chēng)于f(3,3),程序運(yùn)營(yíng)結(jié)果為“0”。分析: 假如本意是按自左而右順序求實(shí)參值,即f(2,3)調(diào)用,可改寫(xiě)成: j=i; k=+i; p=f(j, k); 假如本意是自右而左求實(shí)參值,即f(3,3)調(diào)用,可改寫(xiě)成: j=+i; p=f(j,

18、j);是否有辦法讓參數(shù)擬定?第29頁(yè)第29頁(yè)1.函數(shù)語(yǔ)句 把函數(shù)調(diào)用作為一個(gè)語(yǔ)句。這時(shí)不要求函數(shù)帶來(lái)返回值,只要求函數(shù)完畢一定操作。比如: printstar ( ); printf (“Hello,World!n”);2.函數(shù)表示式 函數(shù)出現(xiàn)在一個(gè)表示式中,這種表示式稱(chēng)為函數(shù)表示式。這是要求函數(shù)帶回一個(gè)擬定值以擬定參與表示式運(yùn)算。比如: C=2*max(a, b); 函數(shù)max是表示式一部分,它值乘2再賦給c。6.3.2 函數(shù)調(diào)用方式 按函數(shù)在程序中出現(xiàn)位置分,可有3種函數(shù)調(diào)用方式:第30頁(yè)第30頁(yè)3.函數(shù)參數(shù) 函數(shù)調(diào)用作為一個(gè)函數(shù)實(shí)參。比如: M=max(a, max(b, c); 其中m

19、ax(b,c)是一次函數(shù)調(diào)用,它值作為max另一次調(diào)用實(shí)參。M值是a、b、c三者中最大者。比如: printf(“%d”, max(a, b); 也是把max(a, b)作為printf函數(shù)一個(gè)函數(shù)。 函數(shù)調(diào)用作為函數(shù)參數(shù),實(shí)質(zhì)上也是函數(shù)表示式形式調(diào)用一個(gè),由于函數(shù)參數(shù)本來(lái)就要求是表示式形式。第31頁(yè)第31頁(yè)6.3.3 對(duì)被調(diào)用函數(shù)申明和函數(shù)原型#include float count (int, int);void main() . . . . . .float count(int x,int y) . . .函數(shù)原型闡明在形式上與函數(shù)頭部類(lèi)似,最后加一個(gè)分號(hào)。原型闡明中參數(shù)表里參數(shù)名能夠不

20、寫(xiě)(只寫(xiě)參數(shù)類(lèi)型)。第32頁(yè)第32頁(yè)問(wèn)題描述:依據(jù)用戶選擇求不同形狀面積。函數(shù)調(diào)用示例#includevoid AreaOfRect();void AreaOfTriangle();void AreaOfRound();void main() int select; do printf( 0、退出n 1、長(zhǎng)方形n 2、三角形n 3、圓形n);printf(請(qǐng)選擇功效:);scanf(%d,&select);if(select = 0) break;switch(select) case 1 : AreaOfRect(); break; /長(zhǎng)方形 case 2 : AreaOfTriangle(

21、); break; /三角形 case 3 : AreaOfRound(); break; /圓形 default : printf(輸入有誤,請(qǐng)?jiān)?04 之間選擇。n); while(1);void AreaOfRect() int x,y; printf(請(qǐng)輸入長(zhǎng)方形長(zhǎng):); scanf(%d,&x); printf(請(qǐng)輸入長(zhǎng)方形寬:); scanf(%d,&y); printf(面積為:%dn,(x * y); void AreaOfTriangle() int x,y; printf(請(qǐng)輸入三角形底:); scanf(%d,&x); printf(請(qǐng)輸入三角形高:); scanf(%d

22、,&y); printf(面積為:%dn,(x * y)/2); void AreaOfRound() int r; printf(請(qǐng)輸入圓形半徑:); scanf(%d,&r); printf(面積為:%dn,3.14*r*r); 函數(shù)原型第33頁(yè)第33頁(yè) 在一個(gè)函數(shù)中調(diào)用另一個(gè)函數(shù)(即被調(diào)用函數(shù))需要具備條件下列:首先被調(diào)用函數(shù)必須是已經(jīng)存在函數(shù)(庫(kù)函數(shù)或自定義函數(shù))。假如使用庫(kù)函數(shù),還應(yīng)當(dāng)在文本開(kāi)頭用#include命令將調(diào)用相關(guān)庫(kù)函數(shù)時(shí)所需用到信息(這些信息是一些常量和函數(shù)原型)“包括”到本文獻(xiàn)中來(lái),不然函數(shù)將不能正常地得到調(diào)用。比如,前面經(jīng)慣用到過(guò): #include 3. 假如使用

23、用戶自定義函數(shù),則假如該函數(shù)被定義位置在調(diào)用它函數(shù)(即主調(diào)函數(shù))后面(在同一文獻(xiàn)中),應(yīng)當(dāng)在主調(diào)函數(shù)中對(duì)被調(diào)函數(shù)作申明。假如被調(diào)用函數(shù)定義出現(xiàn)在主調(diào)函數(shù)之前,能夠不必加以申明。第34頁(yè)第34頁(yè)對(duì)于函數(shù)位置: 對(duì)于非int函數(shù),調(diào)用單位位置要在被調(diào)用單位在下面,不然編譯產(chǎn)生錯(cuò)誤。處理辦法是:在調(diào)用單位加上被調(diào)用函數(shù)聲(說(shuō))明。void f() main( ) f ( ); void f( ) main( ) f (); void f( ) main( )void f( ); f (); 第35頁(yè)第35頁(yè) 例6-5 編制子函數(shù)實(shí)現(xiàn)求兩個(gè)單精度實(shí)數(shù)和,main函數(shù)調(diào)用該函數(shù)時(shí)候要先申明。/*6_5.

24、c*/#include void main() float add(float x, float y); /*對(duì)被調(diào)用函數(shù)add申明*/ float a, b, c; scanf(%f, %f, &a ,&b); c=add(a, b); printf(sum is %fn, c);float add(float x, float y) /*函數(shù)首部*/ float z; /*函數(shù)體*/ z=x+y; return (z);運(yùn)營(yíng)情況下列:3.6,6.5sum is 10.100000float add(float, float);第36頁(yè)第36頁(yè)總而言之,函數(shù)原型普通形式有兩種:(1)函數(shù)類(lèi)型

25、 函數(shù)名(參數(shù)類(lèi)型1 ,參數(shù)類(lèi)型2,參數(shù)類(lèi)型n);(2)函數(shù)類(lèi)型 函數(shù)名(參數(shù)類(lèi)型1 參數(shù)名1,參數(shù)類(lèi)型2 參數(shù)名2,參數(shù)類(lèi)型n 參數(shù)名n);第37頁(yè)第37頁(yè)應(yīng)該注意到函數(shù)原型與函數(shù)定義是不同。函數(shù)定義是指對(duì)函數(shù)功效確實(shí)立,包含指定函數(shù)名、函數(shù)值類(lèi)型、形參及其類(lèi)型、函數(shù)體等,它是一個(gè)完整、獨(dú)立函數(shù)單位。函數(shù)申明作用則是把函數(shù)名字、函數(shù)類(lèi)型以及形參類(lèi)型、個(gè)數(shù)和次序通知編譯系統(tǒng),方便在調(diào)用該函數(shù)時(shí)系統(tǒng)按此進(jìn)行對(duì)照檢驗(yàn)(比如,函數(shù)名是否正確,實(shí)參加形參類(lèi)型和個(gè)數(shù)是否一致等)。第38頁(yè)第38頁(yè)6.3.4 嵌套調(diào)用 在C語(yǔ)言中,函數(shù)定義是平行,不允許進(jìn)行函數(shù)嵌套定義,即在一個(gè)函數(shù)體中不允許定義另一個(gè)函數(shù)

26、。而函數(shù)之間調(diào)用能夠是任意,即允許在一個(gè)函數(shù)體內(nèi)再調(diào)用其它函數(shù),在函數(shù)體中再調(diào)用其它函數(shù)稱(chēng)為函數(shù)嵌套調(diào)用。 第39頁(yè)第39頁(yè)void reverse() : :#includevoid main():palindrome();:void palindrome() : reverse(); :從一個(gè)函數(shù)調(diào)用另一個(gè)函數(shù)稱(chēng)為函數(shù)嵌套調(diào)用 比如:C要求:函數(shù)定義不可嵌套,但能夠嵌套調(diào)用函數(shù)第40頁(yè)第40頁(yè)例6-6函數(shù)嵌套調(diào)用。main() aia();aia() ber();ber() cal();cal() .圖6-5 函數(shù)嵌套調(diào)用89246135710 函數(shù)main調(diào)用了aia,aia調(diào)用了ber

27、, ber又調(diào)用了cal。其調(diào)用過(guò)程和返回過(guò)程如圖所表示。void aia(), ber(), cal();main() printf(Im in main.n); aia();void aia() printf(Now Im in aia.n); ber();void ber() printf(Now Im in ber.n); cal();void cal() printf(Now Im in cal.); 第41頁(yè)第41頁(yè) 一個(gè)函數(shù)直接或間接地調(diào)用函數(shù)本身,這種調(diào)用稱(chēng)為遞歸調(diào)用,前者稱(chēng)為直接遞歸,后者稱(chēng)為間接遞歸。遞歸調(diào)用函數(shù)稱(chēng)為遞歸函數(shù)。 由于遞歸非常符合人們思維習(xí)慣,并且許多數(shù)學(xué)函數(shù)

28、及許多算法或數(shù)據(jù)結(jié)構(gòu)都是遞歸定義,因此,遞歸調(diào)用頗具實(shí)用價(jià)值。6.3.4 函數(shù)遞歸調(diào)用 第42頁(yè)第42頁(yè)/* 此函數(shù)用于計(jì)算 n 階乘 */int factorial(int n) int a; if (n = 1) return 1; else a = n * factorial(n-1); return a; 在一個(gè)函數(shù)體內(nèi)調(diào)用本身稱(chēng)為函數(shù)遞歸調(diào)用 第43頁(yè)第43頁(yè)例6-7利用函數(shù)遞歸調(diào)用來(lái)求n階乘。#include long fact(); /*申明被調(diào)用函數(shù)返回值為長(zhǎng)整型*/main() /*主函數(shù)*/ int h,i; printf(請(qǐng)輸入任一正整數(shù):n); scanf(%d, &h

29、); for(i=0; i=h; +i) printf(%d!=%ldn, i , fact(i);long fact(int n) /*求階乘函數(shù)*/ long int res; if(n=0) res=1; else res=n*fact(n-1); /*遞歸調(diào)用*/ return(res);請(qǐng)輸入任一正整數(shù): 60!等于11!等于12!等于23!等于64!等于245!等于1206!等于720程序執(zhí)行后顯示:第44頁(yè)第44頁(yè)6.3.6 程序設(shè)計(jì)舉例(使用函數(shù)編寫(xiě)程序)例6-8 輸出5之內(nèi)數(shù)字金字塔。例6-9 輸入精度e,使用格里高利公式求近似值,準(zhǔn)確到最后一項(xiàng)絕對(duì)值小于e。要求定義和調(diào)用函

30、數(shù)funpi(e)求近似值。例6-10 采用遞歸方式實(shí)現(xiàn)二分查找。二分查找算法是對(duì)有序數(shù)列進(jìn)行查找操作一個(gè)有效操作。事實(shí)上,這種查找辦法是一個(gè)遞歸過(guò)程。第45頁(yè)第45頁(yè)結(jié)構(gòu)體變量作為函數(shù)參數(shù) 140頁(yè)例5-3 將鍵盤(pán)輸入相關(guān)學(xué)生檔案信息用函數(shù)list實(shí)現(xiàn)。#include struct STUD char name20; long num; int age; char sex; float score; ;void list(struct STUD stud) printf(%-20s%-10ld%-4d%-4c%-6.2fn,,stud.num,stud.age,stud.

31、sex,stud.score); void main( ) struct STUD stud3; int i; for(i=0;i3;i+) printf(Input all information about the No.%d student:n,i+1); getchar(); gets(); scanf(%ld,%d,%c,%f,&studi.num,&studi.age,&studi.sex,&studi.score);printf(n%-20s%-10s%-4s%-4s%-6sn,Name,Num,Age,Sex,Scores); for(i=0;i y ? x

32、 : y; return (z);void f2 ( ) printf (%dn, z );局部變量 變量x、y、z作用域引用錯(cuò)誤!第53頁(yè)第53頁(yè) 闡明 (1) 主函數(shù)main( )中定義變量也是局部變量,它只能在主函數(shù)中使用,其它函數(shù)不能使用。同時(shí),主函數(shù)中也不能使用其它函數(shù)中定義局部變量。 int f3 (int x);void main ( ) int a = 2, b; b = a + y ; printf (%dn, b); int f3 ( int x ) int y; y = a + 5; return ( y );局部變量 變量a、b作用域變量x、y作用域局部變量 錯(cuò)誤!錯(cuò)誤

33、!第54頁(yè)第54頁(yè) 闡明 (2) 形參變量屬于被調(diào)用函數(shù)局部變量;實(shí)參變量則屬于全局變量或調(diào)用函數(shù)局部變量。 (3) 允許在不同函數(shù)中使用相同變量名,它們代表不同對(duì)象,分派不同單元,互不干擾,也不會(huì)發(fā)生混同。 #include void subf ( );void main ( ) int a, b; a=3, b=4; printf (main: a = %d, b = %dn, a, b); subf ( ); printf (main: a = %d, b = %dn, a, b);void subf ( ) int a, b; a = 6, b = 7; printf(subf: a

34、= %d, b = %dn,a,b);運(yùn)營(yíng)結(jié)果:main: a = 3, b = 4subf: a = 6, b = 7main: a = 3, b = 4變量名相同 第55頁(yè)第55頁(yè) 闡明 (4) 在復(fù)合語(yǔ)句中定義變量也是局部變量,其作用域只在復(fù)合語(yǔ)句范圍內(nèi)。其生存期是從復(fù)合語(yǔ)句被執(zhí)行時(shí)刻到復(fù)合語(yǔ)句執(zhí)行完畢時(shí)刻。 #include void main ( ) int a = 2, b = 4; int k, b; k = a + 5; b = a * 5; printf (k = %dn, k); printf (b = %dn, b); printf (b = %dn, b); a = k

35、 + 2;main中局部變量 復(fù)合語(yǔ)句中局部變量 mian中變量a、b作用域 復(fù)合語(yǔ)句中變量k、b作用域輸出k = 7 輸出b = 10 輸出b = 4 錯(cuò)誤!第56頁(yè)第56頁(yè)6.6.2 全局變量作用域和生存期 定義 在函數(shù)外部作定義闡明變量,也稱(chēng)為外部變量 。它不屬于哪一個(gè)函數(shù),而屬于一個(gè)源程序文獻(xiàn)。 作用域 從定義變量位置開(kāi)始到本源文獻(xiàn)結(jié)束,及有extern闡明其它源文獻(xiàn)。 生存期 與程序相同。即從程序開(kāi)始執(zhí)行到程序終止這段時(shí)間內(nèi),全局變量都有效。 #include #include int sign ( );/計(jì)算數(shù)n平方根float sqr ( ) if ( n 0 ) return

36、(sqrt(n); else return (-1);float n = 0;void main ( ) int s; float t; scanf (%f, &n); s = sign ( ); /取符號(hào) t = sqr ( ); /取平方根 printf (s = %d t = %f , s, t);/取數(shù)n符號(hào)int sign ( ) int r = 0; if (n 0) r = 1; if (n 0) r = -1; return ( r );定義全局變量,并賦初值局部變量全局變量n作用域 局部變量s、t作用域局部變量局部變量r作用域錯(cuò)誤!第57頁(yè)第57頁(yè) 闡明 (1) 應(yīng)盡也許少使

37、用全局變量。 全局變量在程序所有執(zhí)行過(guò)程中始終占用存儲(chǔ)單元 減少了函數(shù)獨(dú)立性、通用性、可靠性及可移植性 減少程序清楚性,容易犯錯(cuò) (2) 若外部變量與局部變量同名,則外部變量被屏蔽。要引用全局變量,則必須在變量名前家上兩個(gè)冒號(hào)“:” #include int a = 10; /全局變量void main ( ) int a = 100; /局部變量(與全局變量同名) printf (local a = %dn, a); printf (global a = %dn, :a);運(yùn)營(yíng)結(jié)果:local a = 100global a = 10注意:局部變量與全局變量同名極易造成程序員犯邏輯錯(cuò)誤。第5

38、8頁(yè)第58頁(yè)#include int a=3,b=5;max(int a,int b)int c;c=ab?a:b;return(c);main()int a=8;printf(%dn,max(a,b);運(yùn)營(yíng)結(jié)果?第59頁(yè)第59頁(yè) 闡明 (3) 全局變量定義必須在所有函數(shù)之外,且只能定義一次,并可賦初始值。全局變量定義普通形式為: extern 類(lèi)型闡明符 全局變量名1 = 初始值1, , 全局變量名n = 初始值n;可缺省!char ch = Y; void main ( ) char ch; void func ( ) 定義全局變量ch錯(cuò)誤!ch只能定義一次例:int a = 2, b =

39、 4; extern int a = 2, b = 4; 第60頁(yè)第60頁(yè) 闡明 (4) 對(duì)全局變量進(jìn)行闡明,可擴(kuò)展全局變量作用域。全局變量闡明普通形式為: extern 類(lèi)型闡明符 全局變量名1, ,全局變量名n;不可缺省!不可賦初值!void gx ( ), gy ( );void main ( ) extern int x, y; printf (1: x = %dty = %dn, x, y); y = 246; gx ( ); gy ( );extern int x, y;void gx ( ) x = 135; printf (2: x = %dty = %dn, x, y);in

40、t x = 0, y = 0;void gy ( ) printf (3: x=%dty=%dn, x, y);全局變量定義未闡明前作用域全局變量闡明闡明后作用域全局變量闡明闡明后作用域運(yùn)營(yíng)結(jié)果: 1: x = 0 y = 0 2: x = 135 y = 246 3: x = 135 y = 246第61頁(yè)第61頁(yè) 闡明 (5) 全局變量定義與全局變量闡明區(qū)別 extern int a; void func1 ( ) /引用變量aextern int a = 2; void func2 ( ) /引用變量a誰(shuí)是定義?誰(shuí)是闡明?全局變量定義(由于賦了初值)全局變量闡明 注意:兩者中有且只能有一

41、個(gè)對(duì)變量a賦初始值,不能都對(duì)變量a賦初始值或都不賦值,不然編譯錯(cuò)! 第62頁(yè)第62頁(yè)6.7 變量生命期-變量存儲(chǔ)類(lèi)型 概述變量屬性 數(shù)據(jù)類(lèi)型:變量所持有數(shù)據(jù)性質(zhì)(操作屬性)。要求了它們?nèi)≈捣秶涂蓞⑴c運(yùn)算 。 存儲(chǔ)類(lèi)型: 要求了變量占用內(nèi)存空間方式,也稱(chēng)為存儲(chǔ)方式。 存儲(chǔ)類(lèi)型:存儲(chǔ)器、靜態(tài)存儲(chǔ)區(qū)、動(dòng)態(tài)存儲(chǔ)區(qū) auto-自動(dòng)型 register-存儲(chǔ)器型 static -靜態(tài)型 extern-外部型動(dòng)態(tài)存儲(chǔ)區(qū)靜態(tài)存儲(chǔ)區(qū)存儲(chǔ)類(lèi)型闡明符 數(shù)據(jù)類(lèi)型闡明符 變量名1,變量名2,變量名n;變量定義完整形式應(yīng)為: 第63頁(yè)第63頁(yè)1、動(dòng)態(tài)變量(auto型變量)auto 數(shù)據(jù)類(lèi)型闡明符 變量名1,變量名2,變量名n; 定義格式 闡明 存儲(chǔ)類(lèi)型闡明符auto能夠省略。 動(dòng)態(tài)變量只能在函數(shù)內(nèi)或復(fù)合語(yǔ)句中定義,它屬于局部變量(動(dòng)態(tài)局部變量)。 void func ( ) int i, j, k; 等價(jià)于 auto int i, j, k;auto int k; void func ( ) 錯(cuò)誤!動(dòng)態(tài)變量不可定義在函數(shù)外 第64頁(yè)第64頁(yè)2、靜態(tài)變量(static型變量) 靜態(tài)變量類(lèi)型闡明符是static。 靜態(tài)變量屬于靜態(tài)存儲(chǔ)類(lèi)型。 靜態(tài)局部變量 在局部變

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 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ì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論