版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、,第八章,函數(shù),本章要點(diǎn),函數(shù)的概念 函數(shù)的定義與調(diào)用 函數(shù)的遞歸調(diào)用 變量的作用域 函數(shù)的作用域,主要內(nèi)容, 8.1 概述 8.函數(shù)定義的一般形式 8.函數(shù)參數(shù)和函數(shù)的值 8. 函數(shù)的調(diào)用 8. 函數(shù)的嵌套調(diào)用 8.函數(shù)的遞歸調(diào)用 8.數(shù)組作為函數(shù)參數(shù) 8.8 局部變量和全局變量 8.變量的存儲(chǔ)類別 8.10 內(nèi)部函數(shù)和外部函數(shù),8.1概述,一個(gè)較大的程序可分為若干個(gè)程序模塊,每一個(gè)模塊用來(lái)實(shí)現(xiàn)一個(gè)特定的功能。在高級(jí)語(yǔ)言中用子程序?qū)崿F(xiàn)模塊的功能。子程序由函數(shù)來(lái)完成。一個(gè)程序可由一個(gè)主函數(shù)和若干個(gè)其他函數(shù)構(gòu)成。,由主函數(shù)調(diào)用其他函數(shù),其他函數(shù)也可以互相調(diào)用。同一個(gè)函數(shù)可以被一個(gè)或多個(gè)函數(shù)調(diào)用任
2、意多次。,函數(shù)間的調(diào)用關(guān)系,# include void main() void printstar(); /*對(duì)printstar函數(shù)聲明*/ void print_message(); /*對(duì)print_message函數(shù)聲明*/ printstar(); *調(diào)用printstar函數(shù)* print_message(); /*調(diào)用print_message函數(shù)*/ printstar(); *調(diào)用printstar函數(shù)*/ ,例8.1先舉一個(gè)函數(shù)調(diào)用的簡(jiǎn)單例子,void printstar() *定義printstar函數(shù)* printf(* * * * * * * * * * * * *
3、 * * *n); void print_message() *定義print_message函數(shù)* printf(How do you do!n); ,運(yùn)行情況如下: * * * * * * * * * * * * * * * * How do you do! * * * * * * * * * * * * * * * *,說(shuō)明: (1)一個(gè)程序由一個(gè)或多個(gè)程序模塊組成,每一個(gè)程序模塊作為一個(gè)源程序文件。對(duì)較大的程序,一般不希望把所有內(nèi)容全放在一個(gè)文件中,而是將他們分別放在若干個(gè)源文件中,再由若干源程序文件組成一個(gè)C程序。這樣便于分別編寫、分別編譯,提高調(diào)試效率。一個(gè)源程序文件可以為多個(gè)C程
4、序公用。,(2) 一個(gè)源程序文件由一個(gè)或多個(gè)函數(shù)以及其他有關(guān)內(nèi)容(如命令行、數(shù)據(jù)定義等)組成。一個(gè)源程序文件是一個(gè)編譯單位,在程序編譯時(shí)是以源程序文件為單位進(jìn)行編譯的,而不是以函數(shù)為單位進(jìn)行編譯的。,(3)程序的執(zhí)行是從函數(shù)開(kāi)始的,如是在函數(shù)中調(diào)用其他函數(shù),在調(diào)用后流程返回到函數(shù),在函數(shù)中結(jié)束整個(gè)程序的運(yùn)行。,(4) 所有函數(shù)都是平行的,即在定義函數(shù)時(shí)是分別進(jìn)行的,是互相獨(dú)立的。一個(gè)函數(shù)并不從屬于另一函數(shù),即函數(shù)不能嵌套定義。函數(shù)間可以互相調(diào)用,但不能調(diào)用函數(shù)。函數(shù)是系統(tǒng)調(diào)用的。,(5)從用戶使用的角度看,函數(shù)有兩種: 標(biāo)準(zhǔn)函數(shù),即庫(kù)函數(shù)。這是由系統(tǒng)提供的,用戶不必自己定義這些函數(shù),可以直接使
5、用它們。應(yīng)該說(shuō)明,不同的C系統(tǒng)提供的庫(kù)函數(shù)的數(shù)量和功能會(huì)有一些不同,當(dāng)然許多基本的函數(shù)是共同的。 用戶自己定義的函數(shù)。用以解決用戶的專門需要。,(6) 從函數(shù)的形式看,函數(shù)分兩類: 無(wú)參函數(shù)。如例8.1中的printstar和print_message就是無(wú)參函數(shù)。在調(diào)用無(wú)參函數(shù)時(shí),主調(diào)函數(shù)不向被調(diào)用函數(shù)傳遞數(shù)據(jù)。無(wú)參函數(shù)一般用來(lái)執(zhí)行指定的一組操作。例如,例8程序中的printstar函數(shù)。 有參函數(shù)。在調(diào)用函數(shù)時(shí),主調(diào)函數(shù)在調(diào)用被調(diào)用函數(shù)時(shí),通過(guò)參數(shù)向被調(diào)用函數(shù)傳遞數(shù)據(jù),一般情況下,執(zhí)行被調(diào)用函數(shù)時(shí)會(huì)得到一個(gè)函數(shù)值,供主調(diào)函數(shù)使用。,8.函數(shù)定義的一般形式,8.2.1. 無(wú)參函數(shù)的定義一般形
6、式,定義無(wú)參函數(shù)的一般形式為: 類型標(biāo)識(shí)符函數(shù)名() 聲明部分 語(yǔ)句部分 ,在定義函數(shù)時(shí)要用“類型標(biāo)識(shí)符”指定函數(shù)值的類型,即函數(shù)帶回來(lái)的值的類型。例8.中的printstar和print_message函數(shù)為void類型,表示不需要帶回函數(shù)值。,8.2.2. 有參函數(shù)定義的一般形式,定義有參函數(shù)的一般形式為: 類型標(biāo)識(shí)符函數(shù)名(形式參數(shù)表列) 聲明部分 語(yǔ)句部分 ,例如: (int ,int ) ;/ *函數(shù)體中的聲明部分* ?; (); ,8.2.3 空函數(shù),定義空函數(shù)的一般形式為: 類型標(biāo)識(shí)符函數(shù)名() 例如: () ,調(diào)用此函數(shù)時(shí),什么工作也不做,沒(méi)有任何實(shí)際作用。在主調(diào)函數(shù)中寫上“(
7、);”表明“這里要調(diào)用一個(gè)函數(shù)”,而現(xiàn)在這個(gè)函數(shù)沒(méi)有起作用,等以后擴(kuò)充函數(shù)功能時(shí)補(bǔ)充上。,8.函數(shù)參數(shù)和函數(shù)的值,8.形式參數(shù)和實(shí)際參數(shù),大多數(shù)情況下,主調(diào)函數(shù)和被調(diào)用函數(shù)之間有數(shù)據(jù)傳遞的關(guān)系。,在不同的函數(shù)之間傳遞數(shù)據(jù),可以使用的方 法: 參數(shù):通過(guò)形式參數(shù)和實(shí)際參數(shù) 返回值:用return語(yǔ)句返回計(jì)算結(jié)果 全局變量:外部變量,#include void () int max(int ,int ); /* 對(duì)函數(shù)的聲明 */ int ,; scanf(,); (,); printf( ,); ,例8.調(diào)用函數(shù)時(shí)的數(shù)據(jù)傳遞,int max(int ,int )*定義有參函數(shù)max * int
8、; ?; return(); ,運(yùn)行情況如下: , ,通過(guò)函數(shù)調(diào)用,使兩個(gè)函數(shù)中的數(shù)據(jù)發(fā)生聯(lián)系,關(guān)于形參與實(shí)參的說(shuō)明:,(1) 在定義函數(shù)中指定的形參,在未出現(xiàn)函數(shù)調(diào)用時(shí),它們并不占內(nèi)存中的存儲(chǔ)單元。只有在發(fā)生函數(shù)調(diào)用時(shí),函數(shù)中的形參才被分配內(nèi)存單元。在調(diào)用結(jié)束后,形參所占的內(nèi)存單元也被釋放。,(2) 實(shí)參可以是常量、變量或表達(dá)式,如: (,); 但要求它們有確定的值。在調(diào)用時(shí)將實(shí)參的值賦給形參。,(3) 在被定義的函數(shù)中,必須指定形參的類型(見(jiàn)例8.2程序中的 “(,);” )。,(4) 實(shí)參與形參的類型應(yīng)相同或賦值兼容。例8中實(shí)參和形參都是整型。如果實(shí)參為整型而形參x為實(shí)型,或者相反,則按
9、第3章介紹的不同類型數(shù)值的賦值規(guī)則進(jìn)行轉(zhuǎn)換。,例如實(shí)參值a為3.5,而形參x為整型,則將實(shí)數(shù)3.5轉(zhuǎn)換成整數(shù)3,然后送到形參b。字符型與整型可以互相通用。,(5) 在語(yǔ)言中,實(shí)參向?qū)π螀⒌臄?shù)據(jù)傳遞是“值傳遞”,單向傳遞,只由實(shí)參傳給形參,而不能由形參傳回來(lái)給實(shí)參。在內(nèi)存中,實(shí)參單元與形參單元是不同的單元。,在調(diào)用函數(shù)時(shí),給形參分配存儲(chǔ)單元,并將實(shí)參對(duì)應(yīng)的值傳遞給形參,調(diào)用結(jié)束后,形參單元被釋放,實(shí)參單元仍保留并維持原值。因此,在執(zhí)行一個(gè)被調(diào)用函數(shù)時(shí),形參的值如果發(fā)生改變,并不會(huì)改變主調(diào)函數(shù)的實(shí)參的值。例如,若在執(zhí)行函數(shù)過(guò)程中和的值變?yōu)楹?,而和仍為和?8.3.2 函數(shù)的返回值,通常,希望通過(guò)函
10、數(shù)調(diào)用使主調(diào)函數(shù)能得到一個(gè)確定的值,這就是函數(shù)的返回值。例如,例8.中,(,)的值是,(,)的值是5。賦值語(yǔ)句將這個(gè)函數(shù)值賦給變量。,關(guān)于函數(shù)返回值的一些說(shuō)明:,(1)函數(shù)的返回值是通過(guò)函數(shù)中的return語(yǔ)句獲得的。,如果需要從被調(diào)用函數(shù)帶回一個(gè)函數(shù)值供主調(diào)函數(shù)使用,被調(diào)用函數(shù)中必須包含return語(yǔ)句。如果不需要從被調(diào)用函數(shù)帶回函數(shù)值可以不要return語(yǔ)句。,一個(gè)函數(shù)中可以有一個(gè)以上的return語(yǔ)句,執(zhí)行到哪一個(gè)return語(yǔ)句,哪一個(gè)語(yǔ)句起作用。return語(yǔ)句后面的括弧也可以不要, 如: “return ;” 等價(jià)于 “return ();”,return語(yǔ)句將被調(diào)用函數(shù)中的一個(gè)確
11、定值帶回主調(diào)函數(shù)中去。見(jiàn)圖8.2中從return語(yǔ)句返回的箭頭。,return后面的值可以是一個(gè)表達(dá)式。 例如,例8中的函數(shù)可以改寫成:,(int ,int ) (?); ,(2) 函數(shù)的返回值應(yīng)當(dāng)屬于某一個(gè)確定的類型,在定義函數(shù)時(shí)指定函數(shù)返回值的類型。,例如:下面是3個(gè)函數(shù)的首行: int max(float ,float ) /* 函數(shù)值為整型 */ char letter(char c1,char c2) /* 函數(shù)值為字符型 */ double min(int ,int ) /* 函數(shù)值為雙精度型 */,在語(yǔ)言中,凡不加類型說(shuō)明的函數(shù),自動(dòng)按整型處理。例8.中的函數(shù)首行的函數(shù)類型int
12、可以省寫,用Turbo C 2.0編譯程序時(shí)能通過(guò),但用Turbo C 3.0編譯程序時(shí)不能通過(guò),因?yàn)镃+要求所有函數(shù)都必須指定函數(shù)類型。因此,建議在定義時(shí)對(duì)所有函數(shù)都指定函數(shù)類型。,(3)在定義函數(shù)時(shí)指定的函數(shù)類型一般應(yīng)該和return語(yǔ)句中的表達(dá)式類型一致。,如果函數(shù)值的類型和return語(yǔ)句中表達(dá)式的值不一致,則以函數(shù)類型為準(zhǔn)。對(duì)數(shù)值型數(shù)據(jù),可以自動(dòng)進(jìn)行類型轉(zhuǎn)換。即函數(shù)類型決定返回值的類型。,(4)對(duì)于不帶回值的函數(shù),應(yīng)當(dāng)用“void”定義函數(shù)為“無(wú)類型”(或稱“空類型”)。這樣,系統(tǒng)就保證不使函數(shù)帶回任何值,即禁止在調(diào)用函數(shù)中使用被調(diào)用函數(shù)的返回值。此時(shí)在函數(shù)體中不得出現(xiàn)return語(yǔ)
13、句。,例 8. 返回值類型與函數(shù)類型不同,# include void main() int (float ,float ); float ,; int ; scanf(,); (,); printf( ,); int max(float ,float ) float ; /* z為實(shí)型變量 */ ?; return(); ,運(yùn)行情況如下: , Max is ,8. 函數(shù)的調(diào)用,8. 函數(shù)調(diào)用的一般形式,函數(shù)調(diào)用的一般形式為: 函數(shù)名(實(shí)參表列),如果實(shí)參表列包含多個(gè)實(shí)參,則各參數(shù)間用逗號(hào)隔開(kāi)。實(shí)參與形參的個(gè)數(shù)應(yīng)相等,類型應(yīng)匹配。實(shí)參與形參按順序?qū)?yīng),一一傳遞數(shù)據(jù)。,如果是調(diào)用無(wú)參函數(shù),則“實(shí)
14、參表列”可以沒(méi)有,但括弧不能省略。,例 8 實(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ù)定義 */ int c; if(ab) c=1; else if(a=b) c=0; else c=-1; return(c); ,如果按自左至右順序求實(shí)參的值,則函數(shù)調(diào)用相當(dāng)于(,),如果按自左至右順序求實(shí)參的值,則函數(shù)調(diào)用相當(dāng)于(3,),對(duì)于函數(shù)調(diào)用 int i=2,p; p=f(i,
15、+i);,8.函數(shù)調(diào)用的方式,按函數(shù)在程序中出現(xiàn)的位置來(lái)分,可以有以下三種函數(shù)調(diào)用方式:,函數(shù)語(yǔ)句 把函數(shù)調(diào)用作為一個(gè)語(yǔ)句。如例8.1中的printstar(),這時(shí)不要求函數(shù)帶回值,只要求函數(shù)完成一定的操作。,函數(shù)表達(dá)式 函數(shù)出現(xiàn)在一個(gè)表達(dá)式中,這種表達(dá)式稱為函數(shù)表達(dá)式。這時(shí)要求函數(shù)帶回一個(gè)確定的值以參加表達(dá)式的運(yùn)算。例如:*(,);,函數(shù)參數(shù) 函數(shù)調(diào)用作為一個(gè)函數(shù)的實(shí)參。例如: m = max (a , max ( b , c ) ) ; 其中max ( b , c )是一次函數(shù)調(diào)用,它的值作為max另一次調(diào)用的實(shí)參。m的值是a、b、c三者中的最大者。又如: printf (%d, max
16、 (a,b);也是把max ( a , b )作為printf函數(shù)的一個(gè)參數(shù)。 函數(shù)調(diào)用作為函數(shù)的參數(shù),實(shí)質(zhì)上也是函數(shù)表達(dá)式形式調(diào)用的一種,因?yàn)楹瘮?shù)的參數(shù)本來(lái)就要求是表達(dá)式形式。,8.對(duì)被調(diào)用函數(shù)的聲明和函數(shù)原型,在一個(gè)函數(shù)中調(diào)用另一函數(shù)(即被調(diào)用函數(shù))需要具備哪些條件呢 ?,(1) 首先被調(diào)用的函數(shù)必須是已經(jīng)存在的函數(shù)(是庫(kù)函數(shù)或用戶自己定義的函數(shù))。但光有這一條件還不夠。,8.對(duì)被調(diào)用函數(shù)的聲明和函數(shù)原型,(3) 如果使用用戶自己定義的函數(shù),而該函數(shù)的位置在調(diào)用它的函數(shù)(即主調(diào)函數(shù))的后面(在同一個(gè)文件中),應(yīng)該在主調(diào)函數(shù)中對(duì)被調(diào)用的函數(shù)作聲明。,(2) 如果使用庫(kù)函數(shù),還應(yīng)該在本文件開(kāi)頭
17、用命令將調(diào)用有關(guān)庫(kù)函數(shù)時(shí)所需用到的信息“包含”到本文件中來(lái)。,函數(shù)原型的一般形式為 (1) 函數(shù)類型 函數(shù)名(參數(shù)類型1,參數(shù)類型2); (2) 函數(shù)類型 函數(shù)名(參數(shù)類型1,參數(shù)名1,參數(shù)類型2,參數(shù)名2);,“聲明”一詞的原文是declaration,過(guò)去在許多書(shū)中把它譯為“說(shuō)明”。聲明的作用是把函數(shù)名、函數(shù)參數(shù)的個(gè)數(shù)和參數(shù)類型等信息通知編譯系統(tǒng),以便在遇到函數(shù)調(diào)用時(shí),編譯系統(tǒng)能正確識(shí)別函數(shù)并檢查調(diào)用是否合法。 (例如函數(shù)名是否正確,實(shí)參與形參的類型和個(gè)數(shù)是否一致)。,注意:函數(shù)的“定義”和“聲明”不是一回事。函數(shù)的定義是指對(duì)函數(shù)功能的確立,包括指定函數(shù)名,函數(shù)值類型、形參及其類型、函數(shù)體
18、等,它是一個(gè)完整的、獨(dú)立的函數(shù)單位。而函數(shù)的聲明的作用則是把函數(shù)的名字、函數(shù)類型以及形參的類型、個(gè)數(shù)和順序通知編譯系統(tǒng),以便在調(diào)用該函數(shù)時(shí)系統(tǒng)按此進(jìn)行對(duì)照檢查。,# include void main() float add(float x, float y); *對(duì)被調(diào)用函數(shù)add的聲明* float a,b,c; scanf(f,f,a,b); cadd(a,b); printf(sum is f n,c); float add(float ,float ) *函數(shù)首部* float ; /* 函數(shù)體 */ z; return(z); ,例8 對(duì)被調(diào)用的函數(shù)作聲明,如果 被調(diào)用函數(shù)的定義出
19、現(xiàn)在主調(diào)函數(shù)之前,可以不必加以聲明。因?yàn)榫幾g系統(tǒng)已經(jīng)先知道了已定義函數(shù)的有關(guān)情況,會(huì)根據(jù)函數(shù)首部提供的信息對(duì)函數(shù)的調(diào)用作正確性檢查。,如果 被調(diào)用函數(shù)的定義出現(xiàn)在主調(diào)函數(shù)之前,可以不必加以聲明。因?yàn)榫幾g系統(tǒng)已經(jīng)先知道了已定義函數(shù)的有關(guān)情況,會(huì)根據(jù)函數(shù)首部提供的信息對(duì)函數(shù)的調(diào)用作正確性檢查。,改寫例 8.,# include float add(float ,float ) *函數(shù)首部* float ; /* 函數(shù)體 */ z; return(z); void main() float a,b,c; scanf(f,f,a,b); cadd(a,b); printf(sum is f n,c);
20、 ,函數(shù)舉例,例1 計(jì)算10!+9!+6! 例2 寫一個(gè)函數(shù)使輸入的字符串按反次序存放,然后輸出。,作業(yè),輸入10個(gè)數(shù)x,計(jì)算下列函數(shù)值。 編寫程序計(jì)算1+(1+2)+(1+2+3)+(1+n) 編寫函數(shù)計(jì)算m!/(m-n)!,函數(shù)回顧,函數(shù)定義的一般格式 函數(shù)類型 函數(shù)名(形參表)/ 函數(shù)首部 / 函數(shù)體 函數(shù)實(shí)現(xiàn)過(guò)程 return 表達(dá)式; ,函數(shù)的參數(shù),形式參數(shù)表 類型1 參數(shù)1 ,類型2 參數(shù)2 ,類型n 參數(shù)n 參數(shù)之間用逗號(hào)分隔,每個(gè)參數(shù)前面的類型都必須分別寫明 函數(shù)定義時(shí)的參數(shù)被稱為形式參數(shù)(簡(jiǎn)稱形參) int max(int ,int ) 函數(shù)調(diào)用時(shí)的參數(shù)被稱為實(shí)際參數(shù)(簡(jiǎn)稱實(shí)
21、參) C= max(a,b),函數(shù)原型聲明,函數(shù)類型 函數(shù)名(參數(shù)表); int max(int ,int ); 函數(shù)聲明:說(shuō)明函數(shù)的類型和參數(shù)的情況,以保證程序編譯時(shí)能判斷對(duì)該函數(shù)的調(diào)用是否正確。 函數(shù)必須先定義后調(diào)用,將主調(diào)函數(shù)放在被調(diào)函數(shù)的后面,就像變量先定義后使用一樣。 如果自定義函數(shù)在主調(diào)函數(shù)的后面,就需要在函數(shù)調(diào)用前,加上函數(shù)原型聲明。,只寫函數(shù)定義中的第1行(函數(shù)首部),并以分號(hào)結(jié)束。,參數(shù)傳遞,實(shí)參形參 在參數(shù)傳遞過(guò)程中,實(shí)參把值復(fù)制給形參。 形參和實(shí)參一一對(duì)應(yīng):數(shù)量一致,類型一致,順序一致 形參:變量,用于接受實(shí)參傳遞過(guò)來(lái)的值 實(shí)參:常量、變量或表達(dá)式,例 求100以內(nèi)的全部
22、素?cái)?shù),每行輸出10個(gè),#include #include int main(void) int count, m; int prime (int m); count = 0; for(m = 2; m = 100; m+) if ( prime(m) != 0 ) printf(%6d, m ); count+; if (count %10 = 0) printf (n); printf (n); ,int prime (int m) int i, n; if ( m = 1 ) return 0; n = sqrt (m); for( i = 2; i = n; i+) if (m % i
23、= 0) return 0; return 1; ,8. 函數(shù)的嵌套調(diào)用,嵌套定義就在定義一個(gè)函數(shù)時(shí),其函數(shù)體內(nèi)又包含另一個(gè)函數(shù)的完整定義 。,語(yǔ)言不能嵌套定義函數(shù),但可以嵌套調(diào)用函數(shù),也就是說(shuō),在調(diào)用一個(gè)函數(shù)的過(guò)程中,又調(diào)用另一個(gè)函數(shù)。,8. 函數(shù)的嵌套調(diào)用,例1 編寫一個(gè)函數(shù)計(jì)算 分析 編寫一個(gè)函數(shù)計(jì)算i!,然后編寫函數(shù)C(n,m)計(jì)算,8. 函數(shù)的嵌套調(diào)用,計(jì)算階乘的函數(shù) int fac(int i) int k,f=1; for(k=1;k=i;k+) f*=k; return (f); ,計(jì)算C(n,m)的函數(shù) int cnm(int n,int m) int c; c=fac(n)
24、/(fac(m)*fac(n-m); return (c); ,8. 函數(shù)的嵌套調(diào)用,調(diào)用函數(shù)C(n,m)計(jì)算 void main() int c,n,m; n=9;m=5; (或 scanf(“%d%d”, ,函數(shù)嵌套調(diào)用的執(zhí)行過(guò)程,8函數(shù)的遞歸調(diào)用,在調(diào)用一個(gè)函數(shù)的過(guò)程中又出現(xiàn)直接或間接地調(diào)用該函數(shù)本身,稱為函數(shù)的遞歸調(diào)用。語(yǔ)言的特點(diǎn)之一就在于允許函數(shù)的遞歸調(diào)用。,例 8 有個(gè)人坐在一起,問(wèn)第個(gè)人多少歲?他說(shuō)比第個(gè)人大歲。問(wèn)第個(gè)人歲數(shù),他說(shuō)比第個(gè)人大歲。問(wèn)第個(gè)人,又說(shuō)比第個(gè)人大歲。問(wèn)第個(gè)人,說(shuō)比第個(gè)人大歲。最后問(wèn)第個(gè)人,他說(shuō)是歲。請(qǐng)問(wèn)第個(gè)人多大。,()() ()() ()() ()() (
25、) 可以用數(shù)學(xué)公式表述如下: age(n) () age(n)=age(n-1) (),可以用一個(gè)函數(shù)來(lái)描述上述遞歸過(guò)程: int age(int ) *求年齡的遞歸函數(shù)* int ; * 用作存放函數(shù)的返回值的變量 * if() ; else (); return(); 用一個(gè)主函數(shù)調(diào)用age函數(shù),求得第5人的年齡。 #include void main() printf(%d,age(5); ,運(yùn)行結(jié)果如下: ,例8.用遞歸方法求!,求!也可以用遞歸方法,即!等于!,而!,!??捎孟旅娴倪f歸公式表示: ! (,) ()! (),long fac (int n) long f; if (n=
26、0) f=1; else f=n*fac(n-1); return f; ,例8.8 用遞歸函數(shù)計(jì)算N!,例8.9用遞歸法計(jì)算n階勒讓德多項(xiàng)式的值,Float p(int n, float x) float q; if (n=0)q=1.0; else if(n=1) q=x; else q=(2*n-1)*x*p(n-1,x)-(n-1)*p(n-2,x)/n; return(q); ,8.數(shù)組作為函數(shù)參數(shù),數(shù)組作函數(shù)的參數(shù)有以下情況: 數(shù)組元素作函數(shù)的參數(shù) 數(shù)組名作函數(shù)的參數(shù) 8.7.1 數(shù)組元素作函數(shù)的實(shí)參 數(shù)組元素作函數(shù)的參數(shù)時(shí),和普通變量做參數(shù)相同。 數(shù)組元素只能作函數(shù)的實(shí)參,采用“
27、值傳送”方式。,8.7.2 數(shù)組名作函數(shù)參數(shù),可以用數(shù)組名作函數(shù)參數(shù),此時(shí)形參應(yīng)當(dāng)用數(shù)組名或用指針變量 。形參數(shù)組可不指定大小。,例 8.13 用選擇法對(duì)數(shù)組中10個(gè)整數(shù)按由小到大排序。,程序?qū)嵗?#include void main() void sort(int array,int ); int a10,i; printf(enter the arrayn); for(i=0;i10;i+) scanf(”%d”,i+) printf(”%d”,ai); printf(n); ,void sort(int array,int n) int i,j,k,t; for(i=0;in-1;i+)
28、 ki; for(j=i+1;jn;j+) if(arrayj arrayk)k=j; t=arrayk; arrayk=arrayi; arrayi=t; ,8.7.3. 多維數(shù)組名作函數(shù)參數(shù),程序如下: #include void main() int max_value ( int array4); int a34=1,3,5,7,2,4,6,8,15,17,34,12; printf(max value is , max_value(a) ); ,int max_value ( int array 4) int i,j,k,max; max=array00; for(i=0;imax)
29、 max= array ij; return(max); ,運(yùn)行結(jié)果如下: Max value is 34,8.8局部變量和全局變量,局部變量 在函數(shù)內(nèi)定義的變量(包括形參) 作用范圍:本函數(shù)內(nèi)部 定義在復(fù)合語(yǔ)句內(nèi)的變量 作用范圍:復(fù)合語(yǔ)句內(nèi)部 全局變量 在函數(shù)以外定義的變量,不從屬于任一函數(shù)。 作用范圍:從定義處到源文件結(jié)束(包括各函數(shù)),例 局部變量使用舉例。,#include int main (void) int a; a = 1; /* 復(fù)合語(yǔ)句開(kāi)始 */ int b = 2; b = a + b; a = a + b; /* 復(fù)合語(yǔ)句結(jié)束 */ printf (%d , a );
30、return 0; ,b:小范圍內(nèi)的臨時(shí)變量,4,全局變量,在函數(shù)內(nèi)定義的變量是局部變量,而在函數(shù)之外定義的變量稱為外部變量,外部變量是全局變量(也稱全程變量)。全局變量可以為本文件中其他函數(shù)所共用。它的有效范圍為從定義變量的位置開(kāi)始到本源文件結(jié)束。,例 8.15 有一個(gè)一維數(shù)組,內(nèi)放個(gè)學(xué)生成績(jī),寫一個(gè)函數(shù),求出平均分、最高分和最低分。,#include float Max,Min; *全局變量* void main() float average(float array,int n); float ave,score10; int ; for(i=0;i10;i+) scanf(%f, av
31、ersum/n; return aver ; ,建議不在必要時(shí)不要使用全局變量,原因如下:, 全局變量在程序的全部執(zhí)行過(guò)程中都占用存儲(chǔ)單元,而不是僅在需要時(shí)才開(kāi)辟單元。 使用全局變量過(guò)多,會(huì)降低程序的清晰性,人們往往難以清楚地判斷出每個(gè)瞬時(shí)各個(gè)外部變量的值。在各個(gè)函數(shù)執(zhí)行時(shí)都可能改變外部變量的值,程序容易出錯(cuò)。因此,要限制使用全局變量。,它使函數(shù)的通用性降低了,因?yàn)楹瘮?shù)在執(zhí)行時(shí)要依賴于其所在的外部變量。,8. 變量的存儲(chǔ)類別,8. 動(dòng)態(tài)存儲(chǔ)方式與靜態(tài)存儲(chǔ)方式,前面已介紹了從變量的作用域(即從空間)角度來(lái)分,可以分為全局變量和局部變量。那么從變量值存在的時(shí)間(即生存期)角度來(lái)分,又可以分為靜態(tài)存
32、儲(chǔ)方式和動(dòng)態(tài)存儲(chǔ)方式。,所謂靜態(tài)存儲(chǔ)方式是指在程序運(yùn)行期間由系統(tǒng)分配固定的存儲(chǔ)空間的方式。而動(dòng)態(tài)存儲(chǔ)方式則是在程序運(yùn)行期間根據(jù)需要進(jìn)行動(dòng)態(tài)的分配存儲(chǔ)空間的方式。這個(gè)存儲(chǔ)空間可以分為三部分: 程序區(qū) 靜態(tài)存儲(chǔ)區(qū) 動(dòng)態(tài)存儲(chǔ)區(qū),存儲(chǔ)類別指的是數(shù)據(jù)在內(nèi)存中存儲(chǔ)的方式。存儲(chǔ)方式分為兩大類: 靜態(tài)存儲(chǔ)類和動(dòng)態(tài)存儲(chǔ)類。 具體包含四種: 自動(dòng)的() 靜態(tài)的() 寄存器的() 外部的() 根據(jù)變量的存儲(chǔ)類別,可以知道變量的作用域和生存期。,8. auto變量,函數(shù)中的局部變量,數(shù)據(jù)存儲(chǔ)在動(dòng)態(tài)存儲(chǔ)區(qū)中 函數(shù)中的形參、在函數(shù)中定義的變量和復(fù)合語(yǔ)句中定 義的變量,都屬auto類。 在調(diào)用該函數(shù)時(shí)系統(tǒng)會(huì)給它們分配存儲(chǔ)空
33、間,在函數(shù)調(diào)用結(jié)束時(shí)就自動(dòng)釋放這些存儲(chǔ)空間。因此這類局部變量稱為自動(dòng)變量。自動(dòng)變量用關(guān)鍵字作存儲(chǔ)類別的聲明。例如: int (int ) *定義f函數(shù),為形參 * auto int ,; *定義、為自動(dòng)變量 * ,int (int ) int ,; ,8.9.3用static聲明局部變量,有時(shí)希望函數(shù)中的局部變量的值在函數(shù)調(diào)用結(jié)束后不消失而保留原值,即其占用的存儲(chǔ)單元不釋放,在下一次該函數(shù)調(diào)用時(shí),該變量已有值,就是上一次函數(shù)調(diào)用結(jié)束時(shí)的值。這時(shí)就應(yīng)該指定該局部變量為“靜態(tài)局部變量”,用關(guān)鍵字進(jìn)行聲明。通過(guò)下面簡(jiǎn)單的例子可以了解它的特點(diǎn)。,#include void fun (int k); i
34、nt main (void) int k; for (k = 1; k = 3; k+) fun (k); return 0; void fun(int k) static int a; printf (%d, , a); a += k ; ,0,1,3,靜態(tài)變量會(huì)記住前一次調(diào)用時(shí)留下來(lái)的值,靜態(tài)變量的初值為0,對(duì)靜態(tài)局部變量的說(shuō)明: (1) 靜態(tài)局部變量屬于靜態(tài)存儲(chǔ)類別,在靜態(tài)存儲(chǔ)區(qū)內(nèi)分配存儲(chǔ)單元。在程序整個(gè)運(yùn)行期間都不釋放。而自動(dòng)變量(即動(dòng)態(tài)局部變量)屬于動(dòng)態(tài)存儲(chǔ)類別,占動(dòng)態(tài)存儲(chǔ)區(qū)空間而不占靜態(tài)存儲(chǔ)區(qū)空間,函數(shù)調(diào)用結(jié)束后即釋放。 (2) 對(duì)靜態(tài)局部變量是在編譯時(shí)賦初值的,即只賦初值一次,在
35、程序運(yùn)行時(shí)它已有初值。以后每次調(diào)用函數(shù)時(shí)不再重新賦初值而只是保留上次函數(shù)調(diào)用結(jié)束時(shí)的值。而對(duì)自動(dòng)變量賦初值,不是在編譯時(shí)進(jìn)行的,而是在函數(shù)調(diào)用時(shí)進(jìn)行,每調(diào)用一次函數(shù)重新給一次初值,相當(dāng)于執(zhí)行一次賦值語(yǔ)句。,(3)如在定義局部變量時(shí)不賦初值的話,則對(duì)靜態(tài)局部變量來(lái)說(shuō),編譯時(shí)自動(dòng)賦初值(對(duì)數(shù)值型變量)或空字符(對(duì)字符變量)。而對(duì)自動(dòng)變量來(lái)說(shuō),如果不賦初值則它的值是一個(gè)不確定的值。這是由于每次函數(shù)調(diào)用結(jié)束后存儲(chǔ)單元已釋放,下次調(diào)用時(shí)又重新另分配存儲(chǔ)單元,而所分配的單元中的值是不確定的。 (4) 雖然靜態(tài)局部變量在函數(shù)調(diào)用結(jié)束后仍然存在,但其他函數(shù)是不能引用它的。,8.9.4 register變量,寄
36、存器變量,用關(guān)鍵字register作聲明。例如,例819中的程序是輸出到n的階乘的值。,例819 使用寄存器變量 #include void main ( ) long fac(long); long i,n; scanf(%ld, ,8.5 用extern聲明外部變量,外部變量是在函數(shù)的外部定義的全局變量,它的作用域是從變量的定義處開(kāi)始,到本程序文件的末尾。在此作用域內(nèi),全局變量可以為程序中各個(gè)函數(shù)所引用。編譯時(shí)將外部變量分配在靜態(tài)存儲(chǔ)區(qū)。 有時(shí)需要用extern來(lái)聲明外部變量,以擴(kuò)展外部變量的作用域。,1. 在一個(gè)文件內(nèi)聲明外部變量,例820 用extern聲明外部變量,擴(kuò)展它在程序文件中
37、的作用域。 #include void main() int max(int,int); *外部變量聲明* extern A,B; printf(%dn,max(A,B); int A=13,B=-8; *定義外部變量* int max(int x,int y) *定義函數(shù) * int z; z=xy?x:y; return(z); ,2. 在多文件的程序中聲明外部變量,例8 用extern將外部變量的作用域擴(kuò)展到其他文件。 本程序的作用是給定的值,輸入和,求和am的值。文件file中的內(nèi)容為: # include int A; /*定義外部變量*/ void main() int (int)
38、; /*函數(shù)聲明*/ int ,; printf(enter the number a and its power m:n); scanf(,A,); A*; printf(*,A,); (); printf(*n,A,); ,文件file中的內(nèi)容為: extern A; /*聲明A為一個(gè)已定義的外部變量*/ int (int ); int ,; for(;) *A; (); ,8.9.6用static聲明外部變量,有時(shí)在程序設(shè)計(jì)中希望某些外部變量只限于被本文件引用,而不能被其他文件引用。這時(shí)可以在定義外部變量時(shí)加一個(gè)聲明。 例如: file1.c file2.c static int A;
39、extern int A;/*cant use A in file1.c void main ( ) void fun (int n) A=A*n; ,例1 main() int i; for(i=0;i3;i+) add(); add() static int x=0; x+; printf(“%dn”,x); ,例2 main() int x=10; func(x); printf(“%d”,x); func(int x) x=20; ,例3 int x=1; main() func(x); printf(“%d”,x); func(int x) x=3; ,例4 main() int x
40、=10; int x=20; printf(“%d”,x); printf(“%dn”,x); ,例5 int n=7; main() extern int n; printf(“n=%d”, (f(+n), n); void f(int t) n=(t+1)*(n+1); ,8.8存儲(chǔ)類別小結(jié),(1) 從作用域角度分,有局部變量和全局變量。它們采用的存儲(chǔ)類別如下: 局部變量 |自動(dòng)變量,即動(dòng)態(tài)局部變量 (離開(kāi)函數(shù),值就消失) |靜態(tài)局部變量(離開(kāi)函數(shù),值仍保留) |寄存器變量(離開(kāi)函數(shù),值就消失) |(形式參數(shù)可以定義為自動(dòng)變量或寄存 器變量) 全局變量 |靜態(tài)外部變量(只限本文件引用) |外部變量 (即非靜態(tài)的外部變量,允許其他文件引用),從變量存在的時(shí)間(生存期)來(lái)區(qū)分,有動(dòng)態(tài)存儲(chǔ)和靜態(tài)存儲(chǔ)兩種類型。靜態(tài)存儲(chǔ)是程序整個(gè)運(yùn)行時(shí)間都存在,而動(dòng)態(tài)存儲(chǔ)則是在調(diào)用函數(shù)時(shí)臨時(shí)分配單元。 動(dòng)態(tài)存儲(chǔ) |自動(dòng)變量(本函數(shù)內(nèi)有效) |寄存器變量(本函數(shù)內(nèi)有效) |形式參數(shù)(本函數(shù)內(nèi)有效) 靜態(tài)存儲(chǔ) |靜態(tài)局部變量(函數(shù)內(nèi)有效) |靜態(tài)外部變量(本文件內(nèi)有效) |外部變量(其他文件可引用),(3) 從變量值存放的位置來(lái)區(qū)分,可分為: 內(nèi)存中靜態(tài)存儲(chǔ)區(qū) |靜態(tài)局部變量 |靜態(tài)外部變量(函數(shù)外部靜態(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026浙江金華市武義浙柳碳中和研究所招聘1人筆試備考試題及答案解析
- 2026年甘肅蘭州永登縣婦幼保健院招聘筆試參考題庫(kù)及答案解析
- 2026北京中醫(yī)醫(yī)院懷柔醫(yī)院第一批在編職工和額度管理職工招聘17人筆試參考題庫(kù)及答案解析
- 動(dòng)態(tài)心電圖總結(jié)2026
- 2026廣西來(lái)賓市忻城縣政務(wù)服務(wù)和大數(shù)據(jù)發(fā)展局招聘編外聘用人員2人筆試參考題庫(kù)及答案解析
- 2026湖南湘西融資擔(dān)保有限責(zé)任公司招聘3人筆試備考試題及答案解析
- 2026年蘇州農(nóng)業(yè)職業(yè)技術(shù)學(xué)院?jiǎn)握芯C合素質(zhì)筆試模擬試題附答案詳解
- 2026江西吉安市青原區(qū)專業(yè)森林消防大隊(duì)面向社會(huì)招聘2名聘用制隊(duì)員筆試備考題庫(kù)及答案解析
- 2026年1月南平武夷山職業(yè)學(xué)院人才招聘32人筆試模擬試題及答案解析
- 2026年保山中醫(yī)藥高等??茖W(xué)校高職單招職業(yè)適應(yīng)性測(cè)試模擬試題有答案解析
- 中國(guó)痤瘡治療指南
- 居民自建樁安裝告知書(shū)回執(zhí)
- 老同學(xué)聚會(huì)群主的講話發(fā)言稿
- 國(guó)家開(kāi)放大學(xué)最新《監(jiān)督學(xué)》形考任務(wù)(1-4)試題解析和答案
- 天然氣輸氣管線陰極保護(hù)施工方案
- 高血壓?jiǎn)柧碚{(diào)查表
- GB/T 25156-2010橡膠塑料注射成型機(jī)通用技術(shù)條件
- GB/T 25085.3-2020道路車輛汽車電纜第3部分:交流30 V或直流60 V單芯銅導(dǎo)體電纜的尺寸和要求
- GB/T 242-2007金屬管擴(kuò)口試驗(yàn)方法
- GB/T 21776-2008粉末涂料及其涂層的檢測(cè)標(biāo)準(zhǔn)指南
- 全新版尹定邦設(shè)計(jì)學(xué)概論1課件
評(píng)論
0/150
提交評(píng)論