版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、7.1 函數(shù)是什么函數(shù)是什么7.2 函數(shù)的定義和調(diào)用函數(shù)的定義和調(diào)用7.3 函數(shù)的嵌套調(diào)用和遞歸調(diào)用函數(shù)的嵌套調(diào)用和遞歸調(diào)用7.4 數(shù)組作為函數(shù)參數(shù)數(shù)組作為函數(shù)參數(shù)7.5 變量的作用域和生存期變量的作用域和生存期7.6 內(nèi)部函數(shù)和外部函數(shù)內(nèi)部函數(shù)和外部函數(shù)7.7 提高部分提高部分p1687.1 函數(shù)是什么函數(shù)是什么如果程序的功能比較多,規(guī)模比較大,如果程序的功能比較多,規(guī)模比較大,把所有的程序代碼都寫在一個(gè)主函數(shù)把所有的程序代碼都寫在一個(gè)主函數(shù)中,就會(huì)使主函數(shù)變得龐雜、頭緒不中,就會(huì)使主函數(shù)變得龐雜、頭緒不清,使閱讀和維護(hù)程序變得困難。清,使閱讀和維護(hù)程序變得困難。p168有時(shí)程序中要多次實(shí)現(xiàn)
2、某一功能,就有時(shí)程序中要多次實(shí)現(xiàn)某一功能,就需要多次重復(fù)編寫實(shí)現(xiàn)此功能的程序需要多次重復(fù)編寫實(shí)現(xiàn)此功能的程序代碼。這使程序冗長,不精煉。代碼。這使程序冗長,不精煉。7.1 函數(shù)是什么函數(shù)是什么p168采用采用“組裝組裝”的辦法簡化程序設(shè)計(jì)過程的辦法簡化程序設(shè)計(jì)過程事先編好一批函數(shù)實(shí)現(xiàn)各種不同的功能事先編好一批函數(shù)實(shí)現(xiàn)各種不同的功能用到什么函數(shù)就直接裝使用就可以用到什么函數(shù)就直接裝使用就可以這就是這就是模塊化的程序設(shè)計(jì)模塊化的程序設(shè)計(jì)7.1 函數(shù)是什么函數(shù)是什么p168函數(shù)就是功能函數(shù)就是功能(function)每一個(gè)函數(shù)用來實(shí)現(xiàn)一個(gè)特定的功能每一個(gè)函數(shù)用來實(shí)現(xiàn)一個(gè)特定的功能函數(shù)的名字應(yīng)反映其代
3、表的功能函數(shù)的名字應(yīng)反映其代表的功能7.1 函數(shù)是什么函數(shù)是什么p168在設(shè)計(jì)一個(gè)較大的程序時(shí),往往把它分在設(shè)計(jì)一個(gè)較大的程序時(shí),往往把它分為若干個(gè)程序模塊,每一個(gè)模塊包括一為若干個(gè)程序模塊,每一個(gè)模塊包括一個(gè)或多個(gè)函數(shù),每個(gè)函數(shù)實(shí)現(xiàn)一個(gè)特定個(gè)或多個(gè)函數(shù),每個(gè)函數(shù)實(shí)現(xiàn)一個(gè)特定的功能。的功能。7.1 函數(shù)是什么函數(shù)是什么p168一個(gè)程序可由一個(gè)主函數(shù)和若干個(gè)其一個(gè)程序可由一個(gè)主函數(shù)和若干個(gè)其他函數(shù)構(gòu)成。由主函數(shù)調(diào)用其他函數(shù),他函數(shù)構(gòu)成。由主函數(shù)調(diào)用其他函數(shù),其他函數(shù)也可以互相調(diào)用。同一個(gè)函數(shù)其他函數(shù)也可以互相調(diào)用。同一個(gè)函數(shù)可以被一個(gè)或多個(gè)函數(shù)調(diào)用任意多次可以被一個(gè)或多個(gè)函數(shù)調(diào)用任意多次7.1
4、函數(shù)是什么函數(shù)是什么p1687.1 函數(shù)是什么函數(shù)是什么p168mainabcfghdeie除了可以使用庫函數(shù)外,除了可以使用庫函數(shù)外,還可以還可以編寫一編寫一些些本領(lǐng)域或本單位常用到一些專用函數(shù),本領(lǐng)域或本單位常用到一些專用函數(shù),供本領(lǐng)域或本單位的人員使用供本領(lǐng)域或本單位的人員使用。、。、在程序設(shè)計(jì)中要善于利用函數(shù),可以減在程序設(shè)計(jì)中要善于利用函數(shù),可以減少各人重復(fù)編寫程序段的工作量,同時(shí)少各人重復(fù)編寫程序段的工作量,同時(shí)可以方便地實(shí)現(xiàn)模塊化的程序設(shè)計(jì)??梢苑奖愕貙?shí)現(xiàn)模塊化的程序設(shè)計(jì)。7.1 函數(shù)是什么函數(shù)是什么p1687.1 函數(shù)是什么函數(shù)是什么p168例例7.1 輸出以下的結(jié)果,用函數(shù)調(diào)
5、用實(shí)現(xiàn)。輸出以下的結(jié)果,用函數(shù)調(diào)用實(shí)現(xiàn)。 * how do you do! *7.1 函數(shù)是什么函數(shù)是什么p168解題思路:解題思路:u在輸出的文字上下分別有一行在輸出的文字上下分別有一行“*”號(hào),顯然不號(hào),顯然不必重復(fù)寫這段代碼,用一個(gè)函數(shù)必重復(fù)寫這段代碼,用一個(gè)函數(shù)print_star來來實(shí)現(xiàn)輸出一行實(shí)現(xiàn)輸出一行“*”號(hào)的功能。號(hào)的功能。u再寫一個(gè)再寫一個(gè)print_message函數(shù)來輸出中間一函數(shù)來輸出中間一行文字信息行文字信息u用主函數(shù)分別調(diào)用這兩個(gè)函數(shù)用主函數(shù)分別調(diào)用這兩個(gè)函數(shù)#include void main()void print_star(); void print_mes
6、sage(); print_star(); print_message(); print_star(); void print_star () printf(*n);void print_message() printf( how do you do!n);輸出輸出18個(gè)個(gè)*輸出一行文字輸出一行文字#include void main()void print_star(); void print_message(); print_star(); print_message(); print_star(); void print_star () printf(*n);void print_mes
7、sage() printf( how do you do!n);聲明函數(shù)聲明函數(shù)定義函數(shù)定義函數(shù)說明:說明:(1) 一個(gè)程序由一個(gè)或多個(gè)程序模塊組成一個(gè)程序由一個(gè)或多個(gè)程序模塊組成,每一個(gè)程序模塊作為一個(gè)源程序文件。對于較每一個(gè)程序模塊作為一個(gè)源程序文件。對于較大的程序,一般不把所有內(nèi)容全放在一個(gè)源程大的程序,一般不把所有內(nèi)容全放在一個(gè)源程序文件中,而是將它們分別放在若干個(gè)源文件序文件中,而是將它們分別放在若干個(gè)源文件中,由若干個(gè)源程序文件組成一個(gè)中,由若干個(gè)源程序文件組成一個(gè)c程序。這程序。這樣便于分別編寫、分別編譯,提高調(diào)試效率。樣便于分別編寫、分別編譯,提高調(diào)試效率。一個(gè)源程序文件可以為
8、多個(gè)一個(gè)源程序文件可以為多個(gè)c程序所調(diào)用。程序所調(diào)用。說明:說明:(2) 一個(gè)源程序文件由一個(gè)或多個(gè)函數(shù)以及其一個(gè)源程序文件由一個(gè)或多個(gè)函數(shù)以及其他有關(guān)內(nèi)容組成。一個(gè)源程序文件是一個(gè)編譯他有關(guān)內(nèi)容組成。一個(gè)源程序文件是一個(gè)編譯單位,在程序編譯時(shí)是以源程序文件為單位進(jìn)單位,在程序編譯時(shí)是以源程序文件為單位進(jìn)行編譯的,而不是以函數(shù)為單位進(jìn)行編譯的。行編譯的,而不是以函數(shù)為單位進(jìn)行編譯的。說明:說明:(3) 不論不論main函數(shù)出現(xiàn)在什么位置,函數(shù)出現(xiàn)在什么位置,總是從總是從main函數(shù)開始執(zhí)行函數(shù)開始執(zhí)行。如果在。如果在main函數(shù)中調(diào)函數(shù)中調(diào)用其他函數(shù),在調(diào)用后流程返回到用其他函數(shù),在調(diào)用后流程
9、返回到main函數(shù)函數(shù),在,在main函數(shù)中結(jié)束整個(gè)程序的運(yùn)行。函數(shù)中結(jié)束整個(gè)程序的運(yùn)行。說明:說明:(4) 所有函數(shù)都是平行的,即在定義函數(shù)時(shí)是所有函數(shù)都是平行的,即在定義函數(shù)時(shí)是分別進(jìn)行的,是分別進(jìn)行的,是互相獨(dú)立的互相獨(dú)立的。一個(gè)函數(shù)并不從。一個(gè)函數(shù)并不從屬于另一個(gè)函數(shù),即函數(shù)屬于另一個(gè)函數(shù),即函數(shù)不能嵌套定義不能嵌套定義。函數(shù)。函數(shù)間可以互相調(diào)用,但不能調(diào)用間可以互相調(diào)用,但不能調(diào)用main函數(shù)。函數(shù)。main函數(shù)是由系統(tǒng)調(diào)用的。函數(shù)是由系統(tǒng)調(diào)用的。說明:說明: (5) 從用戶使用的角度看,函數(shù)有兩種。從用戶使用的角度看,函數(shù)有兩種。u庫函數(shù)庫函數(shù),它是由系統(tǒng)提供的,用戶不必自己定,它
10、是由系統(tǒng)提供的,用戶不必自己定義而直接使用它們。應(yīng)該說明,不同的義而直接使用它們。應(yīng)該說明,不同的c語言語言編譯系統(tǒng)提供的庫函數(shù)的數(shù)量和功能會(huì)有一些編譯系統(tǒng)提供的庫函數(shù)的數(shù)量和功能會(huì)有一些不同,當(dāng)然許多基本的函數(shù)是共同的。不同,當(dāng)然許多基本的函數(shù)是共同的。u用戶用戶自己自己定義的函數(shù)定義的函數(shù)。它是用以解決用戶專門。它是用以解決用戶專門需要的函數(shù)。需要的函數(shù)。說明:說明:(6) 從函數(shù)的形式看,函數(shù)分兩類。從函數(shù)的形式看,函數(shù)分兩類。 無參函數(shù)無參函數(shù)。函數(shù)沒有參數(shù),一般用來執(zhí)行。函數(shù)沒有參數(shù),一般用來執(zhí)行固定的一組操作。無參函數(shù)可以帶回或不帶回固定的一組操作。無參函數(shù)可以帶回或不帶回函數(shù)值,
11、但一般以不帶回函數(shù)值的居多。函數(shù)值,但一般以不帶回函數(shù)值的居多。 有參函數(shù)有參函數(shù)。在調(diào)用函數(shù)時(shí),要給出實(shí)參。在調(diào)用函數(shù)時(shí),要給出實(shí)參。主調(diào)函數(shù)在調(diào)用被調(diào)用函數(shù)時(shí),通過參數(shù)向被主調(diào)函數(shù)在調(diào)用被調(diào)用函數(shù)時(shí),通過參數(shù)向被調(diào)用函數(shù)傳遞數(shù)據(jù),一般情況下,執(zhí)行被調(diào)用調(diào)用函數(shù)傳遞數(shù)據(jù),一般情況下,執(zhí)行被調(diào)用函數(shù)時(shí)會(huì)得到一個(gè)函數(shù)值,供主調(diào)函數(shù)使用。函數(shù)時(shí)會(huì)得到一個(gè)函數(shù)值,供主調(diào)函數(shù)使用。7.2 函數(shù)的定義和調(diào)用函數(shù)的定義和調(diào)用7.2.1 為什么要定義函數(shù)為什么要定義函數(shù)7.2.2 函數(shù)定義函數(shù)定義7.2.3 函數(shù)的調(diào)用函數(shù)的調(diào)用7.2.4 對被調(diào)用函數(shù)的聲明和函數(shù)原型對被調(diào)用函數(shù)的聲明和函數(shù)原型p170c語
12、言要求,在程序中用到的所有函數(shù),語言要求,在程序中用到的所有函數(shù),必須必須“先定義,后使用先定義,后使用”指定函數(shù)指定函數(shù)名字名字、函數(shù)、函數(shù)返回值類型返回值類型、函數(shù)、函數(shù)實(shí)現(xiàn)的實(shí)現(xiàn)的功能功能以及以及參數(shù)的個(gè)數(shù)與類型參數(shù)的個(gè)數(shù)與類型,將,將這些信息通知編譯系統(tǒng)。這些信息通知編譯系統(tǒng)。7.2.1 為什么要定義函數(shù)為什么要定義函數(shù)p170指定函數(shù)的名字,以便以后按名調(diào)用指定函數(shù)的名字,以便以后按名調(diào)用指定函數(shù)類型,即函數(shù)返回值的類型指定函數(shù)類型,即函數(shù)返回值的類型指定函數(shù)參數(shù)的名字和類型,以便在調(diào)指定函數(shù)參數(shù)的名字和類型,以便在調(diào)用函數(shù)時(shí)向它們傳遞數(shù)據(jù)用函數(shù)時(shí)向它們傳遞數(shù)據(jù)指定函數(shù)的功能。這是最
13、重要的,這是指定函數(shù)的功能。這是最重要的,這是在函數(shù)體中解決的在函數(shù)體中解決的7.2.1 為什么要定義函數(shù)為什么要定義函數(shù)p170如果程序中要調(diào)用庫函數(shù),只需用如果程序中要調(diào)用庫函數(shù),只需用#include指令把有關(guān)的頭文件包含到指令把有關(guān)的頭文件包含到本文件模塊中即可。本文件模塊中即可。如果想使用庫函數(shù)中沒有的函數(shù),需要如果想使用庫函數(shù)中沒有的函數(shù),需要程序設(shè)計(jì)者在程序中自己定義。程序設(shè)計(jì)者在程序中自己定義。7.2.1 為什么要定義函數(shù)為什么要定義函數(shù)p1707.2.2 函數(shù)定義函數(shù)定義1.怎樣定義無參函數(shù)怎樣定義無參函數(shù)函數(shù)名后面圓括號(hào)中空的,沒有參數(shù)函數(shù)名后面圓括號(hào)中空的,沒有參數(shù)定義無
14、參函數(shù)的一般形式為定義無參函數(shù)的一般形式為: 類型名類型名 函數(shù)名()函數(shù)名() 函數(shù)體函數(shù)體 p171包括聲明部分和包括聲明部分和語句部分語句部分指定函數(shù)指定函數(shù)值的類型值的類型7.2.2 函數(shù)定義函數(shù)定義1.怎樣定義無參函數(shù)怎樣定義無參函數(shù)函數(shù)名后面圓括號(hào)中空的,沒有參數(shù)函數(shù)名后面圓括號(hào)中空的,沒有參數(shù)定義無參函數(shù)的一般形式為定義無參函數(shù)的一般形式為: 類型名類型名 函數(shù)名()函數(shù)名() 函數(shù)體函數(shù)體 p171表示不需要表示不需要帶回函數(shù)值帶回函數(shù)值void7.2.2 函數(shù)定義函數(shù)定義2. 怎樣定義有參函數(shù)怎樣定義有參函數(shù)定義有參函數(shù)的一般形式為定義有參函數(shù)的一般形式為: 類型標(biāo)識(shí)符類型標(biāo)
15、識(shí)符 函數(shù)名(形式參數(shù)表列)函數(shù)名(形式參數(shù)表列) 函數(shù)體函數(shù)體 p1717.2.2 函數(shù)定義函數(shù)定義2. 怎樣定義有參函數(shù)怎樣定義有參函數(shù) int max (int x,int y) int z; if(xy) z=x; else z=y; return(z); p171函數(shù)的功能函數(shù)的功能是什么?是什么?求求x和和y二者二者中大者中大者7.2.3 函數(shù)的調(diào)用函數(shù)的調(diào)用1.調(diào)用無參函數(shù)的形式調(diào)用無參函數(shù)的形式 函數(shù)名函數(shù)名() 如如print_star()2. 調(diào)用無參函數(shù)的形式調(diào)用無參函數(shù)的形式 函數(shù)名(實(shí)參表列)函數(shù)名(實(shí)參表列)如如max(a,b)p172如果有多個(gè)如果有多個(gè)參數(shù),用逗
16、參數(shù),用逗號(hào)隔開號(hào)隔開例例7.2 輸入兩個(gè)整數(shù),輸出二者中的輸入兩個(gè)整數(shù),輸出二者中的大者。要求在主函數(shù)中輸入兩個(gè)整大者。要求在主函數(shù)中輸入兩個(gè)整數(shù),用一個(gè)函數(shù)數(shù),用一個(gè)函數(shù)max求出其中的大求出其中的大者,并在主函數(shù)中輸出此值。者,并在主函數(shù)中輸出此值。解題思路:解題思路:題目要求用一個(gè)題目要求用一個(gè)max函數(shù)實(shí)現(xiàn)比較兩個(gè)函數(shù)實(shí)現(xiàn)比較兩個(gè)整數(shù),并將得到的大數(shù)帶回主函數(shù)。顯整數(shù),并將得到的大數(shù)帶回主函數(shù)。顯然,二個(gè)整數(shù)中的大者也應(yīng)該是整數(shù),然,二個(gè)整數(shù)中的大者也應(yīng)該是整數(shù),因此因此max函數(shù)應(yīng)當(dāng)是函數(shù)應(yīng)當(dāng)是int型型。兩個(gè)數(shù)是在主函數(shù)中輸入的,在兩個(gè)數(shù)是在主函數(shù)中輸入的,在max函函數(shù)中進(jìn)行比
17、較,因此應(yīng)該定義為有參函數(shù)中進(jìn)行比較,因此應(yīng)該定義為有參函數(shù),在函數(shù)調(diào)用時(shí)進(jìn)行數(shù)據(jù)的傳遞數(shù),在函數(shù)調(diào)用時(shí)進(jìn)行數(shù)據(jù)的傳遞。#include int max(int x,int y) int z; if (xy) z=x; else z=y; return(z); 參數(shù)類型參數(shù)類型函數(shù)類型函數(shù)類型定義函數(shù)定義函數(shù)定義函數(shù)內(nèi)定義函數(shù)內(nèi)使用的變量使用的變量#include void main() int max(int x,int y); int a,b,c; printf(”please input two number:”); scanf(“%d,%d”,&a,&b); c = m
18、ax(a,b); printf(“max is %dn”,c); int max(int x,int y) int z; if (xy) z=x; else z=y; return(z); 調(diào)用函數(shù)調(diào)用函數(shù) c=max(a,b); (main函數(shù))函數(shù))int max(int x, int y) (max函數(shù))函數(shù)) int z; z=xy?x:y; return(z); #include void main() int max(int x,int y); int a,b,c; printf(”please input two number:”); scanf(“%d,%d”,&a,&
19、amp;b); c = max(a,b); printf(“max is %dn”,c); int max(int x,int y) int z; if (xy) z=x; else z=y; return(z); if (xy) return(x);else return(y);#include void main() int max(int x,int y); int a,b,c; printf(”please input two number:”); scanf(“%d,%d”,&a,&b); c = max(a,b); printf(“max is %dn”,c); i
20、nt max(int x,int y) int z; if (xy) z=x; else z=y; return(z); 形式參數(shù)形式參數(shù)實(shí)際參數(shù)實(shí)際參數(shù)函數(shù)調(diào)用的函數(shù)調(diào)用的過程過程:在定義函數(shù)中指定的形參,在未出現(xiàn)函數(shù)在定義函數(shù)中指定的形參,在未出現(xiàn)函數(shù)調(diào)用時(shí),它們并不占內(nèi)存中的存儲(chǔ)單元。調(diào)用時(shí),它們并不占內(nèi)存中的存儲(chǔ)單元。在發(fā)生函數(shù)調(diào)用時(shí),函數(shù)在發(fā)生函數(shù)調(diào)用時(shí),函數(shù)max的形參被臨的形參被臨時(shí)分配內(nèi)存單元。時(shí)分配內(nèi)存單元。2a3bxy23實(shí)參實(shí)參形參形參函數(shù)調(diào)用的函數(shù)調(diào)用的過程過程:2a3bxy23實(shí)參實(shí)參形參形參調(diào)用結(jié)束,形參單元被釋放調(diào)用結(jié)束,形參單元被釋放實(shí)參單元仍保留并維持原值,沒
21、有改變實(shí)參單元仍保留并維持原值,沒有改變?nèi)绻趫?zhí)行一個(gè)被調(diào)用函數(shù)時(shí),形參的值如果在執(zhí)行一個(gè)被調(diào)用函數(shù)時(shí),形參的值發(fā)生改變,不會(huì)改變主調(diào)函數(shù)的實(shí)參的值發(fā)生改變,不會(huì)改變主調(diào)函數(shù)的實(shí)參的值調(diào)用函數(shù)的調(diào)用函數(shù)的方式方式:按函數(shù)在程序中出現(xiàn)的位置來分,可以有按函數(shù)在程序中出現(xiàn)的位置來分,可以有以下以下3種函數(shù)調(diào)用方式種函數(shù)調(diào)用方式. 函數(shù)語句函數(shù)語句調(diào)用沒有返回值的函數(shù),函數(shù)調(diào)用單獨(dú)作調(diào)用沒有返回值的函數(shù),函數(shù)調(diào)用單獨(dú)作為一個(gè)語句為一個(gè)語句 如例如例7.1中的中的“print_star();”調(diào)用函數(shù)的調(diào)用函數(shù)的方式方式:按函數(shù)在程序中出現(xiàn)的位置來分,可以有按函數(shù)在程序中出現(xiàn)的位置來分,可以有以下以下
22、3種函數(shù)調(diào)用方式種函數(shù)調(diào)用方式. 函數(shù)表達(dá)式函數(shù)表達(dá)式函數(shù)出現(xiàn)在一個(gè)表達(dá)式中,這種表達(dá)式稱函數(shù)出現(xiàn)在一個(gè)表達(dá)式中,這種表達(dá)式稱為函數(shù)表達(dá)式為函數(shù)表達(dá)式 如例如例7.2中的中的“c=max(a,b);”調(diào)用函數(shù)的調(diào)用函數(shù)的方式方式:按函數(shù)在程序中出現(xiàn)的位置來分,可以有按函數(shù)在程序中出現(xiàn)的位置來分,可以有以下以下3種函數(shù)調(diào)用方式種函數(shù)調(diào)用方式. 函數(shù)參數(shù)函數(shù)參數(shù)函數(shù)調(diào)用作為一個(gè)函數(shù)的實(shí)參函數(shù)調(diào)用作為一個(gè)函數(shù)的實(shí)參 如如printf (%d, max (a,b);7.2.4 對被調(diào)用函數(shù)的聲明對被調(diào)用函數(shù)的聲明和函數(shù)原型和函數(shù)原型p175在一個(gè)函數(shù)中調(diào)用另一個(gè)函數(shù)需要具備如在一個(gè)函數(shù)中調(diào)用另一個(gè)函數(shù)
23、需要具備如下條件:下條件:(1) 被調(diào)用函數(shù)必須是已經(jīng)定義的函數(shù)(是庫被調(diào)用函數(shù)必須是已經(jīng)定義的函數(shù)(是庫函數(shù)或用戶自己定義的函數(shù))函數(shù)或用戶自己定義的函數(shù))。(2) 如果使用庫函數(shù),應(yīng)該在本文件開頭加相如果使用庫函數(shù),應(yīng)該在本文件開頭加相應(yīng)的應(yīng)的#include指令指令。(3) 如果使用自己定義的函數(shù),而該函數(shù)的位如果使用自己定義的函數(shù),而該函數(shù)的位置在調(diào)用它的函數(shù)后面置在調(diào)用它的函數(shù)后面,應(yīng)該應(yīng)該進(jìn)行函數(shù)進(jìn)行函數(shù)聲明聲明7.2.4 對被調(diào)用函數(shù)的聲明對被調(diào)用函數(shù)的聲明和函數(shù)原型和函數(shù)原型p175函數(shù)原型的一般形式有兩種:函數(shù)原型的一般形式有兩種:如如 int max(int x,int y
24、); int max(int,int);原型說明可以放在文件的開頭,這時(shí)本文原型說明可以放在文件的開頭,這時(shí)本文件中所有函數(shù)都可以使用此函數(shù)件中所有函數(shù)都可以使用此函數(shù)7.3 函數(shù)的嵌套調(diào)用和遞歸調(diào)用函數(shù)的嵌套調(diào)用和遞歸調(diào)用p1777.3.1 函數(shù)的嵌套調(diào)用函數(shù)的嵌套調(diào)用7.3.2 函數(shù)的遞歸調(diào)用函數(shù)的遞歸調(diào)用7.3.1 函數(shù)的嵌套調(diào)用函數(shù)的嵌套調(diào)用調(diào)用一個(gè)函數(shù)的過程中,又可以調(diào)調(diào)用一個(gè)函數(shù)的過程中,又可以調(diào)用另一個(gè)函數(shù)用另一個(gè)函數(shù)p1777.3.1 函數(shù)的嵌套調(diào)用函數(shù)的嵌套調(diào)用p177main函數(shù)函數(shù)調(diào)用調(diào)用a函數(shù)函數(shù)結(jié)束結(jié)束a函數(shù)函數(shù)調(diào)用調(diào)用b函數(shù)函數(shù)b函數(shù)函數(shù) 例例7.3 輸入輸入4個(gè)整
25、數(shù),找出其中最大的數(shù)。個(gè)整數(shù),找出其中最大的數(shù)。用一個(gè)函數(shù)來實(shí)現(xiàn)。用一個(gè)函數(shù)來實(shí)現(xiàn)。解題思路:解題思路:u定義定義max_4函數(shù),找函數(shù),找4個(gè)數(shù)中最大者個(gè)數(shù)中最大者umax_4中再多次調(diào)用中再多次調(diào)用max,找,找4個(gè)數(shù)中的大個(gè)數(shù)中的大者,然后把它作為函數(shù)值返回者,然后把它作為函數(shù)值返回main函數(shù)函數(shù)#include void main() int max_4(int a,int b,int c,int d); int a,b,c,d,max; printf(“4 interger numbers:); scanf(%d%d%d%d,&a,&b,&c,&d)
26、; max=max_4(a,b,c,d); printf(max=%d n,max); 主函數(shù)主函數(shù)對對max_4 函數(shù)聲明函數(shù)聲明#include void main() int max_4(int a,int b,int c,int d); int a,b,c,d,max; printf(“4 interger numbers:); scanf(%d%d%d%d,&a,&b,&c,&d); max=max_4(a,b,c,d); printf(max=%d n,max); 主函數(shù)主函數(shù)輸入輸入4個(gè)整數(shù)個(gè)整數(shù)#include void main() int m
27、ax_4(int a,int b,int c,int d); int a,b,c,d,max; printf(“4 interger numbers:); scanf(%d%d%d%d,&a,&b,&c,&d); max=max_4(a,b,c,d); printf(max=%d n,max); 主函數(shù)主函數(shù)調(diào)用后肯定是調(diào)用后肯定是4個(gè)數(shù)中最大者個(gè)數(shù)中最大者輸出最大者輸出最大者int max_4(int a,int b,int c,int d) int max(int a,int b); int m; m=max(a,b); m=max(m,c); m=max(
28、m,d); return(m); max_4函數(shù)函數(shù)對對max 函數(shù)聲明函數(shù)聲明int max_4(int a,int b,int c,int d) int max(int a,int b); int m; m=max(a,b); m=max(m,c); m=max(m,d); return(m); max_4函數(shù)函數(shù)a,b中較大者中較大者a,b,c中較大者中較大者a,b,c,d中最大者中最大者int max_4(int a,int b,int c,int d) int max(int a,int b); int m; m=max(a,b); m=max(m,c); m=max(m,d); r
29、eturn(m); max_4函數(shù)函數(shù)int max(int x,int y) if(xy) return x; else return y; max函數(shù)函數(shù)找找x,y中較大者中較大者int max_4(int a,int b,int c,int d) int max(int a,int b); int m; m=max(a,b); m=max(m,c); m=max(m,d); return(m); max_4函數(shù)函數(shù)int max(int x,int y) if(xy) return x; else return y; max函數(shù)函數(shù)return(xy?x:y);int max_4(int
30、 a,int b,int c,int d)int max(int a,int b); m=max(a,b);m=max(m,c);m=max(m,d); return(m); int max(int x,int y) return(xy?x:y); #include void main() max=max_4(a,b,c,d); 7.3.2 函數(shù)的遞歸調(diào)用函數(shù)的遞歸調(diào)用p179在調(diào)用一個(gè)函數(shù)的過程中又出現(xiàn)直接或間在調(diào)用一個(gè)函數(shù)的過程中又出現(xiàn)直接或間接地調(diào)用該函數(shù)本身,稱為函數(shù)的接地調(diào)用該函數(shù)本身,稱為函數(shù)的遞歸調(diào)遞歸調(diào)用用。語言的特點(diǎn)之一就在于允許函數(shù)的遞歸語言的特點(diǎn)之一就在于允許函數(shù)的遞歸調(diào)
31、用。調(diào)用。7.3.2 函數(shù)的遞歸調(diào)用函數(shù)的遞歸調(diào)用p179 f2函數(shù)函數(shù)調(diào)用調(diào)用f1函數(shù)函數(shù) int f(int x) int y,z; z=f(y); return (2*z); f函數(shù)函數(shù)調(diào)用調(diào)用f函數(shù)函數(shù) f1函數(shù)函數(shù)調(diào)用調(diào)用f2函數(shù)函數(shù)應(yīng)使用應(yīng)使用if語句控制結(jié)束調(diào)用語句控制結(jié)束調(diào)用直接調(diào)用本函數(shù)直接調(diào)用本函數(shù)間接調(diào)用本函數(shù)間接調(diào)用本函數(shù) 例例7.6 有有5個(gè)學(xué)生坐在一起個(gè)學(xué)生坐在一起u問第問第5個(gè)學(xué)生多少歲?他說比第個(gè)學(xué)生多少歲?他說比第4個(gè)學(xué)生大個(gè)學(xué)生大2歲歲u問第問第4個(gè)學(xué)生歲數(shù),他說比第個(gè)學(xué)生歲數(shù),他說比第3個(gè)學(xué)生大個(gè)學(xué)生大2歲歲u問第問第3個(gè)學(xué)生,又說比第個(gè)學(xué)生,又說比第2個(gè)
32、學(xué)生大個(gè)學(xué)生大2歲歲u問第問第2個(gè)學(xué)生,說比第個(gè)學(xué)生,說比第1個(gè)學(xué)生大個(gè)學(xué)生大2歲歲u最后問第最后問第1個(gè)學(xué)生,他說是個(gè)學(xué)生,他說是10歲歲u請問第請問第5個(gè)學(xué)生多大個(gè)學(xué)生多大解題思路:解題思路:u要求第個(gè)年齡,就必須先知道第個(gè)年齡要求第個(gè)年齡,就必須先知道第個(gè)年齡u要求第個(gè)年齡必須先知道第個(gè)年齡要求第個(gè)年齡必須先知道第個(gè)年齡u第個(gè)年齡又取決于第個(gè)年齡第個(gè)年齡又取決于第個(gè)年齡u第個(gè)年齡取決于第個(gè)年齡第個(gè)年齡取決于第個(gè)年齡u每個(gè)學(xué)生年齡都比其前個(gè)學(xué)生的年齡大每個(gè)學(xué)生年齡都比其前個(gè)學(xué)生的年齡大解題思路:解題思路:age(5)=age(4)+2age(4)=age(3)+2age(3)=age(2)
33、+2age(2)=age(1)+2age(1)=10) 1(2) 1()() 1(10)(nnagenagennage age(5)=age(4)+2 age(4)=age(3)+2 age(3)=age(2)+2 age(2)=age(1)+2 age(1) =10 age(2) =12 age(3) =14 age(4) =16 age(5) =18 回溯階段回溯階段 遞推階段遞推階段 age(5)=age(4)+2 age(4)=age(3)+2 age(3)=age(2)+2 age(2)=age(1)+2 age(1) =10 age(2) =12 age(3) =14 age(4)
34、 =16 age(5) =18 回回溯溯階段階段 遞推階段遞推階段結(jié)束遞歸的條件結(jié)束遞歸的條件#include int age(int n) int c; if(n=1) c=10; else c=age(n-1)+2; return(c); void main() printf(“%dn,age(5); age(5)輸出輸出age(5)mainc=age(4)+2age函數(shù)函數(shù)n=5c=age(3)+2age函數(shù)函數(shù)n=4c=age(1)+2age函數(shù)函數(shù)n=2c=age(2)+2age函數(shù)函數(shù)n=3c=10age函數(shù)函數(shù)n=1age(1)=10age(2)=12age(3)=14age(4
35、)=16age(5)=1818例例7.5 分別用遞推方法和遞歸方法求分別用遞推方法和遞歸方法求!,即,即12 n。1.用遞推方法求用遞推方法求!解題思路:解題思路:u從從1開始,乘開始,乘2,再乘,再乘3一直乘到一直乘到n。這種。這種方法容易理解,也容易實(shí)現(xiàn)。遞推法的特點(diǎn)是方法容易理解,也容易實(shí)現(xiàn)。遞推法的特點(diǎn)是從一個(gè)已知的事實(shí)出發(fā),按一定規(guī)律推下一個(gè)從一個(gè)已知的事實(shí)出發(fā),按一定規(guī)律推下一個(gè)事實(shí),再從這個(gè)新的已知的事實(shí)出發(fā),再向下事實(shí),再從這個(gè)新的已知的事實(shí)出發(fā),再向下推出一個(gè)新的事實(shí)推出一個(gè)新的事實(shí)這是和遞歸不同的。這是和遞歸不同的。#include void main() long fac
36、(int n); int n; long fact=0; printf(“input an integer number:”); scanf(“%d”,&n); fact=fac(n); printf(“%d!=%ldn”,n,fact); long fac(int n) int i; long fact=1; for(i=1;i=n;i+) fact=fact*i; return fact;2.用遞歸方法求用遞歸方法求!解題思路:解題思路:u遞歸的思路和遞推是相反的,并不是先求遞歸的思路和遞推是相反的,并不是先求1 再再 求求1 2再再 3,直到,直到 n,而是直接,而是直接從目標(biāo)出
37、發(fā)提出問題:從目標(biāo)出發(fā)提出問題: !等于等于!,而,而!,而,而1!是已知的,不必再回溯了是已知的,不必再回溯了) 1() 1() 1 , 0(1!nnnnnn#include void main() long fac(int n); int n,y; printf(input an integer number:); scanf(%d,&n); y=fac(n); printf(%d!=%ldn,n,y);long fac(int n) long f; if(n0) printf(“n0,data error!”); else if(n=0 | n=1) f=1; else f=fa
38、c(n-1)*n; return(f); fac(5)輸出輸出fac(5)mainf=fac(4)5fac函數(shù)函數(shù)n=5f=fac(3)4fac函數(shù)函數(shù)n=4f=fac(1)2fac函數(shù)函數(shù)n=2f=fac(2)3fac函數(shù)函數(shù)n=3f=1fac函數(shù)函數(shù)n=1fac(1)=1fac(2)=2fac(3)=6fac(4)=24fac(5)=120120遞歸調(diào)用的特點(diǎn):遞歸調(diào)用的特點(diǎn):執(zhí)行執(zhí)行“未知未知未知未知遞歸邊界條件已知遞歸邊界條件已知已知已知已知已知”的過程。的過程。用遞歸方法解題的條件:用遞歸方法解題的條件:(1)所求解的問題能轉(zhuǎn)化為用同一方法解決的所求解的問題能轉(zhuǎn)化為用同一方法解決的子
39、問題。子問題。(2) 子問題的規(guī)模比原問題的規(guī)模小。子問題的規(guī)模比原問題的規(guī)模小。(3) 必須要有遞歸結(jié)束條件,停止遞歸,否必須要有遞歸結(jié)束條件,停止遞歸,否則形成無窮遞歸,系統(tǒng)無法實(shí)現(xiàn)。則形成無窮遞歸,系統(tǒng)無法實(shí)現(xiàn)。7.4 數(shù)組作為函數(shù)參數(shù)數(shù)組作為函數(shù)參數(shù)7.4.1 數(shù)組元素作函數(shù)實(shí)參數(shù)組元素作函數(shù)實(shí)參7.4.2 數(shù)組名作函數(shù)參數(shù)數(shù)組名作函數(shù)參數(shù)p1847.4.1 數(shù)組元素作函數(shù)實(shí)參數(shù)組元素作函數(shù)實(shí)參 由于實(shí)參可以是表達(dá)式,而數(shù)組元素可以由于實(shí)參可以是表達(dá)式,而數(shù)組元素可以是表達(dá)式的組成部分,因此數(shù)組元素可以是表達(dá)式的組成部分,因此數(shù)組元素可以作為函數(shù)的實(shí)參。作為函數(shù)的實(shí)參。p185例例7.
40、6 有兩個(gè)運(yùn)動(dòng)隊(duì)有兩個(gè)運(yùn)動(dòng)隊(duì)a和和b,各有,各有10個(gè)隊(duì)員個(gè)隊(duì)員,每個(gè)隊(duì)員有一個(gè)綜合成績。將兩個(gè)隊(duì)的,每個(gè)隊(duì)員有一個(gè)綜合成績。將兩個(gè)隊(duì)的每個(gè)隊(duì)員的成績按順序一一對應(yīng)地逐個(gè)比每個(gè)隊(duì)員的成績按順序一一對應(yīng)地逐個(gè)比較(即較(即a隊(duì)第隊(duì)第1個(gè)隊(duì)員與個(gè)隊(duì)員與b隊(duì)第隊(duì)第1個(gè)隊(duì)員比個(gè)隊(duì)員比,)。如果)。如果a隊(duì)隊(duì)員的成績高于隊(duì)隊(duì)員的成績高于b隊(duì)相隊(duì)相應(yīng)隊(duì)員成績的數(shù)目多于應(yīng)隊(duì)員成績的數(shù)目多于b隊(duì)隊(duì)員成績高于隊(duì)隊(duì)員成績高于a隊(duì)相應(yīng)隊(duì)員成績的數(shù)目隊(duì)相應(yīng)隊(duì)員成績的數(shù)目(例如,例如,a隊(duì)蠃隊(duì)蠃6次次,b隊(duì)蠃隊(duì)蠃4次次),則認(rèn)為,則認(rèn)為a隊(duì)勝。統(tǒng)計(jì)出兩隊(duì)勝。統(tǒng)計(jì)出兩隊(duì)隊(duì)員比較的結(jié)果隊(duì)隊(duì)員比較的結(jié)果(a隊(duì)高于、等于和低于
41、隊(duì)高于、等于和低于b隊(duì)的次數(shù)隊(duì)的次數(shù))。解題思路:解題思路:u設(shè)兩個(gè)數(shù)組設(shè)兩個(gè)數(shù)組a和和b,各有,各有10個(gè)元素,分別存放個(gè)元素,分別存放10個(gè)隊(duì)員的成績個(gè)隊(duì)員的成績u將兩個(gè)數(shù)組的相應(yīng)元素逐個(gè)比較,用將兩個(gè)數(shù)組的相應(yīng)元素逐個(gè)比較,用3個(gè)變量個(gè)變量n,m,k分別累計(jì)分別累計(jì)a隊(duì)隊(duì)員高于、等于和低于隊(duì)隊(duì)員高于、等于和低于b隊(duì)隊(duì)員的次數(shù)隊(duì)隊(duì)員的次數(shù)u用一個(gè)函數(shù)用一個(gè)函數(shù)higher來判斷每一次比較的結(jié)果來判斷每一次比較的結(jié)果,如果,如果a隊(duì)員高于隊(duì)員高于b隊(duì)員,結(jié)果為隊(duì)員,結(jié)果為1,二者相,二者相等,結(jié)果為等,結(jié)果為0,a隊(duì)員低于隊(duì)員低于b隊(duì)員,結(jié)果為隊(duì)員,結(jié)果為-1。最后比較。最后比較n和和k即可
42、得到哪隊(duì)勝的結(jié)果即可得到哪隊(duì)勝的結(jié)果#include void main() int higher(int x,int y); int a10,b10,i,n=0,m=0,k=0; printf(enter array a:n); for(i=0;i10;i+) scanf(%d,&ai); printf(n); printf(“enter array b:n”); for(i=0;i10;i+) scanf(%d,&bi); printf(n);輸入輸入a隊(duì)隊(duì)員成績隊(duì)隊(duì)員成績輸入輸入b隊(duì)隊(duì)員成績隊(duì)隊(duì)員成績for(i=0;ik) printf(a wins!n); else i
43、f (ny) flag=1; else if(xy) flag=-1; else flag=0; return(flag); 7.4.2 數(shù)組名作函數(shù)參數(shù)數(shù)組名作函數(shù)參數(shù)p186希望在函數(shù)中處理整個(gè)數(shù)組的元素時(shí),可希望在函數(shù)中處理整個(gè)數(shù)組的元素時(shí),可以用數(shù)組名作為函數(shù)實(shí)參以用數(shù)組名作為函數(shù)實(shí)參注意,此時(shí)只是將數(shù)組的首元素的地址傳注意,此時(shí)只是將數(shù)組的首元素的地址傳遞給所對應(yīng)的形參,因此對應(yīng)的形參應(yīng)當(dāng)遞給所對應(yīng)的形參,因此對應(yīng)的形參應(yīng)當(dāng)是指針變量是指針變量(見第見第8章章)。例例7.7 有有10個(gè)學(xué)生成績,用一個(gè)函數(shù)求全個(gè)學(xué)生成績,用一個(gè)函數(shù)求全體學(xué)生的平均成績。體學(xué)生的平均成績。解題思路:解題
44、思路:u在主函數(shù)中定義一個(gè)實(shí)型數(shù)組在主函數(shù)中定義一個(gè)實(shí)型數(shù)組score,將輸入,將輸入的的10個(gè)學(xué)生成績存放在數(shù)組中個(gè)學(xué)生成績存放在數(shù)組中u設(shè)計(jì)函數(shù)設(shè)計(jì)函數(shù)average,用來求學(xué)生平均成績,用來求學(xué)生平均成績u需要把數(shù)組有關(guān)信息傳遞給需要把數(shù)組有關(guān)信息傳遞給average函數(shù)函數(shù)u采取用數(shù)組名作為實(shí)參,把數(shù)組地址傳給采取用數(shù)組名作為實(shí)參,把數(shù)組地址傳給average函數(shù),在該函數(shù)中對數(shù)組進(jìn)行處理函數(shù),在該函數(shù)中對數(shù)組進(jìn)行處理#include void main() float average(float array10); float score10,aver; int i; printf(
45、input 10 scores:n); for(i=0;i10;i+) scanf(%f,&scorei); aver=average(score); printf(average score is %5.2fn,aver); 數(shù)組名作實(shí)參數(shù)組名作實(shí)參float average(float array10) int i; float aver,sum=array0; for(i=1;i10;i+) sum=sum+arrayi; aver=sum/10; return(aver); 與與score共占同一存儲(chǔ)單元共占同一存儲(chǔ)單元實(shí)參、形參都是實(shí)參、形參都是float型型相當(dāng)于相當(dāng)于sc
46、ore0相當(dāng)于相當(dāng)于scorei例例7.8 有兩個(gè)班,學(xué)生數(shù)不同,編寫一有兩個(gè)班,學(xué)生數(shù)不同,編寫一個(gè)函數(shù),用來分別求各班的平均成績。個(gè)函數(shù),用來分別求各班的平均成績。解題思路:解題思路:u問題的關(guān)鍵是用同一個(gè)函數(shù)求不同人數(shù)的班問題的關(guān)鍵是用同一個(gè)函數(shù)求不同人數(shù)的班級平均成績級平均成績u在定義形參時(shí)不指定大小,函數(shù)對不同人數(shù)在定義形參時(shí)不指定大小,函數(shù)對不同人數(shù)的班級都是適用的班級都是適用u由于數(shù)組名傳遞的是數(shù)組首地址,可以利用由于數(shù)組名傳遞的是數(shù)組首地址,可以利用同一個(gè)函數(shù)求人數(shù)不同的班平均成績同一個(gè)函數(shù)求人數(shù)不同的班平均成績u在定義在定義average函數(shù)時(shí),增加一個(gè)參數(shù)函數(shù)時(shí),增加一個(gè)參
47、數(shù)n,用來指定當(dāng)前班級的人數(shù),用來指定當(dāng)前班級的人數(shù)#include void main() float average(float array ,int n); float score_15=98.5,97,91.5,60,55; float score_210=67.5,89.5,99,69.5, 77,89.5,76.5,54,60,99.5; printf(“%6.2fn”,average(score_1,5); printf(“%6.2fn”,average(score_2,10); float average(float array ,int n) int i; float ave
48、r,sum=array0; for(i=1;in;i+) sum=sum+arrayi; aver=sum/n; return(aver);調(diào)用形式為調(diào)用形式為average(score_1,5)時(shí)時(shí)相當(dāng)于相當(dāng)于score_10相當(dāng)于相當(dāng)于score_1i相當(dāng)于相當(dāng)于5float average(float array ,int n) int i; float aver,sum=array0; for(i=1;in;i+) sum=sum+arrayi; aver=sum/n; return(aver);調(diào)用形式為調(diào)用形式為average(score_2,10)時(shí)時(shí)相當(dāng)于相當(dāng)于score_20
49、相當(dāng)于相當(dāng)于score_2i相當(dāng)于相當(dāng)于10例例7.9 用一個(gè)函數(shù)實(shí)現(xiàn)用選擇法對用一個(gè)函數(shù)實(shí)現(xiàn)用選擇法對10個(gè)個(gè)整數(shù)按升序排列。整數(shù)按升序排列。解題思路:解題思路:u所謂選擇法就是先將所謂選擇法就是先將10個(gè)數(shù)中最小的數(shù)個(gè)數(shù)中最小的數(shù)與與a0對換;再將對換;再將a1到到a9中最小的中最小的數(shù)與數(shù)與a1對換對換每比較一輪,找出一每比較一輪,找出一個(gè)未經(jīng)排序的數(shù)中最小的一個(gè)個(gè)未經(jīng)排序的數(shù)中最小的一個(gè)u共比較共比較9輪輪a0 a1 a2 a3 a4 3 6 1 9 4 1 6 3 9 4 1 3 6 9 4 1 3 4 9 6 1 3 4 6 9小到大排序小到大排序#include void mai
50、n()void sort(int array,int n); int a10,i; printf(enter the array:n); for(i=0;i10;i+) scanf(%d,&ai); sort(a,10); printf(the sorted array:n); for(i=0;i10;i+) printf(%d ,ai); printf(n); void sort(int array,int n) int i,j,k,t; for(i=0;in-1;i+) k=i; for(j=i+1;jn;j+) if(arrayjarrayk) k=j; t=arrayk; ar
51、rayk=arrayi; arrayi=t;在在sortisort9中,中,找最小數(shù)下標(biāo)找最小數(shù)下標(biāo)在在sortisort9中,中,最小數(shù)與最小數(shù)與sorti對換對換例例7.10 有有4個(gè)學(xué)生,個(gè)學(xué)生,5門課的成績,設(shè)計(jì)門課的成績,設(shè)計(jì)一個(gè)函數(shù),用來求出其中的最高成績。一個(gè)函數(shù),用來求出其中的最高成績。解題思路:解題思路:u先使變量先使變量max的初值為二維數(shù)組中第一個(gè)的初值為二維數(shù)組中第一個(gè)元素的值,然后將二維數(shù)組中各個(gè)元素的元素的值,然后將二維數(shù)組中各個(gè)元素的值與值與max相比,每次比較后都把相比,每次比較后都把“大者大者”存放在存放在max中,取代中,取代max的原值。全部元的原值。全部
52、元素比較完后,素比較完后,max 的值就是所有元素的最的值就是所有元素的最大值。大值。#include void main()float highest_score(float array45); float score45=61,73,85.5,87,90, 72,84,66,88,78, 75,87,93.5,81,96, 65,85,64,76,71 ; printf(“%6.2fn,highest_score(score);float highest_score(float array45) int i,j; float max; max=array00; for(i=0;i4;i+)
53、 for(j=0;jmax) max=arrayij; return (max);7.5 變量的作用域和生存期變量的作用域和生存期7.5.1 變量的作用域變量的作用域-局部變量和全局變量局部變量和全局變量7.5.2 變量的存儲(chǔ)方式和生存期變量的存儲(chǔ)方式和生存期7.5.3 作用域和生存期的小結(jié)作用域和生存期的小結(jié)p1927.5.1 變量的作用域變量的作用域局部變量和全局變量局部變量和全局變量1 局部變量局部變量u在函數(shù)和復(fù)合語句內(nèi)定義的變量,稱為內(nèi)部在函數(shù)和復(fù)合語句內(nèi)定義的變量,稱為內(nèi)部變量或變量或局部變量局部變量u只在只在本函數(shù)或復(fù)合語句內(nèi)本函數(shù)或復(fù)合語句內(nèi)范圍內(nèi)有效范圍內(nèi)有效(從定從定義點(diǎn)開
54、始到函數(shù)或復(fù)合語句結(jié)束義點(diǎn)開始到函數(shù)或復(fù)合語句結(jié)束)u在此函數(shù)或復(fù)合語句以外是不能使用這些變在此函數(shù)或復(fù)合語句以外是不能使用這些變量的量的p192說明說明:(1) 主函數(shù)中定義的變量也只在主函數(shù)中有效主函數(shù)中定義的變量也只在主函數(shù)中有效,主函數(shù)也不能使用其他函數(shù)中定義的變量。,主函數(shù)也不能使用其他函數(shù)中定義的變量。(2) 不同函數(shù)中可以使用相同名字的變量,它不同函數(shù)中可以使用相同名字的變量,它們代表不同的對象,們代表不同的對象,互不干擾互不干擾。(3) 形式參數(shù)也是局部變量。在函數(shù)中可以使形式參數(shù)也是局部變量。在函數(shù)中可以使用本函數(shù)定義的形參,在函數(shù)外不能引用它。用本函數(shù)定義的形參,在函數(shù)外不
55、能引用它。(4) 在一個(gè)函數(shù)內(nèi)部,可以在復(fù)合語句中定義在一個(gè)函數(shù)內(nèi)部,可以在復(fù)合語句中定義變量,這些變量只在本復(fù)合語句中有效。變量,這些變量只在本復(fù)合語句中有效。2 全局變量全局變量u一個(gè)程序可以包含一個(gè)或若干個(gè)源程序文件一個(gè)程序可以包含一個(gè)或若干個(gè)源程序文件(即程序模塊即程序模塊),而一個(gè)源文件可以包含一個(gè)或,而一個(gè)源文件可以包含一個(gè)或若干個(gè)函數(shù)若干個(gè)函數(shù)u在函數(shù)之外定義的變量是外部變量,也稱為在函數(shù)之外定義的變量是外部變量,也稱為全局變量全局變量(或全程變量或全程變量)u全局變量的有效范圍為從定義變量的位置開全局變量的有效范圍為從定義變量的位置開始到本源文件結(jié)束,在此范圍內(nèi)可以為本文件始到
56、本源文件結(jié)束,在此范圍內(nèi)可以為本文件中所有函數(shù)所共用中所有函數(shù)所共用2 全局變量全局變量u在一個(gè)函數(shù)中既可以使用本函數(shù)中的局部變在一個(gè)函數(shù)中既可以使用本函數(shù)中的局部變量,又可以使用有效的全局變量。量,又可以使用有效的全局變量。u如果在同一個(gè)源文件中,外部變量與局部變?nèi)绻谕粋€(gè)源文件中,外部變量與局部變量同名,則在局部變量的作用范圍內(nèi),外部量同名,則在局部變量的作用范圍內(nèi),外部變量被變量被“屏蔽屏蔽”了,即它不起作用,此時(shí)局了,即它不起作用,此時(shí)局部變量是有效的。部變量是有效的。 例例7.11有有4個(gè)學(xué)生,個(gè)學(xué)生,5門課的成績,要求門課的成績,要求輸出其中的最高成績以及它屬于第幾個(gè)輸出其中的最
57、高成績以及它屬于第幾個(gè)學(xué)生、第幾門課程。學(xué)生、第幾門課程。解題思路:解題思路:u在例在例7.10中,通過調(diào)用中,通過調(diào)用highest_score函數(shù),得到最高分函數(shù),得到最高分u除了輸出最高分以外,還要輸出該分?jǐn)?shù)是屬除了輸出最高分以外,還要輸出該分?jǐn)?shù)是屬于第幾個(gè)學(xué)生、笫幾門課的信息,即需要輸于第幾個(gè)學(xué)生、笫幾門課的信息,即需要輸出出3個(gè)結(jié)果個(gè)結(jié)果u調(diào)用一個(gè)函數(shù)只能得到一個(gè)函數(shù)值,因此例調(diào)用一個(gè)函數(shù)只能得到一個(gè)函數(shù)值,因此例7.10程序無法解決這個(gè)問題程序無法解決這個(gè)問題u可以使用全局變量,通過全局變量從函數(shù)中可以使用全局變量,通過全局變量從函數(shù)中得到所需要的值得到所需要的值#include
58、int row,column; void main() float highest_score(float array45); float score45=61,73,85.5,87,90, 72,84,66,88,78,75,87,93.5,81,96, 65,85,64,76,71; printf(“he highest score is %6.2fn, highest_score(score); printf(student no.is %dn course no. is %dn,row,column);定義全局變量定義全局變量float highest_score(float arra
59、y45) int i,j; float max; max=array00; for(i=0;i4;i+) for(j=0;jmax) max=arrayij; row=i; column=j; return (max);行的序號(hào)賦給全局變量行的序號(hào)賦給全局變量row將列的序號(hào)賦給全局變量將列的序號(hào)賦給全局變量column score 函數(shù)調(diào)用函數(shù)調(diào)用 row column array max row columnmain函數(shù)函數(shù)highest_score函數(shù)函數(shù)建議不在必要時(shí)不要使用全局變量建議不在必要時(shí)不要使用全局變量全局變量全局變量rowcolumn7.5.2 變量的存儲(chǔ)方式和生存期變量的
60、存儲(chǔ)方式和生存期變量的變量的生存期生存期:變量值存在的時(shí)間:變量值存在的時(shí)間變量的兩種變量的兩種存儲(chǔ)方式存儲(chǔ)方式:靜態(tài)存儲(chǔ)方式和:靜態(tài)存儲(chǔ)方式和動(dòng)態(tài)存儲(chǔ)方式動(dòng)態(tài)存儲(chǔ)方式u靜態(tài)靜態(tài)存儲(chǔ)方式是指在程序運(yùn)行期間由系統(tǒng)分存儲(chǔ)方式是指在程序運(yùn)行期間由系統(tǒng)分配固定的存儲(chǔ)空間的方式配固定的存儲(chǔ)空間的方式u動(dòng)態(tài)動(dòng)態(tài)存儲(chǔ)方式是在程序運(yùn)行期間根據(jù)需要進(jìn)存儲(chǔ)方式是在程序運(yùn)行期間根據(jù)需要進(jìn)行動(dòng)態(tài)的分配存儲(chǔ)空間的方式行動(dòng)態(tài)的分配存儲(chǔ)空間的方式p1957.5.2 變量的存儲(chǔ)方式和生存期變量的存儲(chǔ)方式和生存期全局變量采用靜態(tài)存儲(chǔ)方式全局變量采用靜態(tài)存儲(chǔ)方式,在程序開,在程序開始執(zhí)行時(shí)給全局變量分配存儲(chǔ)區(qū),程序始執(zhí)行時(shí)給全局變量分配存儲(chǔ)區(qū),程序執(zhí)行完畢釋放。在程序執(zhí)行過程中它們執(zhí)行完畢釋放。在程序執(zhí)行過程中它們占據(jù)固定的存儲(chǔ)單元,而不是動(dòng)態(tài)地進(jìn)占據(jù)固定的存儲(chǔ)單元,而不是動(dòng)態(tài)地進(jìn)行分配和釋放。行分
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五版房屋代持業(yè)務(wù)合同范本3篇
- 二零二五版電機(jī)維修智能化改造合同范本3篇
- 二零二五年度房地產(chǎn)經(jīng)紀(jì)服務(wù)合同7篇
- 二零二五版購房借款及房地產(chǎn)開發(fā)商風(fēng)險(xiǎn)控制擔(dān)保服務(wù)合同3篇
- 二零二五版商業(yè)地產(chǎn)買賣合同模板下載3篇
- 二零二五年度高等教育機(jī)構(gòu)外國專家項(xiàng)目合作合同參考書3篇
- 二零二五版家用空調(diào)安裝與室內(nèi)環(huán)境改善合同3篇
- 二零二五年度成都上灶師父招聘與餐飲業(yè)人才服務(wù)合同2篇
- 展會(huì)創(chuàng)意展示合同(2篇)
- 2025年度油氣田2#配電房土建安裝與防爆電氣設(shè)備合同3篇
- 下肢皮牽引護(hù)理PPT課件(19頁P(yáng)PT)
- 臺(tái)資企業(yè)A股上市相關(guān)資料
- 電 梯 工 程 預(yù) 算 書
- 參會(huì)嘉賓簽到表
- 機(jī)械車間員工績效考核表
- 形式發(fā)票格式2 INVOICE
- 2.48低危胸痛患者后繼治療評估流程圖
- 人力資源管理之績效考核 一、什么是績效 所謂績效簡單的講就是對
- 山東省醫(yī)院目錄
- 云南地方本科高校部分基礎(chǔ)研究
- 廢品管理流程圖
評論
0/150
提交評論