C語言用函數(shù)實現(xiàn)模塊化程序設(shè)計市公開課金獎市賽課一等獎?wù)n件_第1頁
C語言用函數(shù)實現(xiàn)模塊化程序設(shè)計市公開課金獎市賽課一等獎?wù)n件_第2頁
C語言用函數(shù)實現(xiàn)模塊化程序設(shè)計市公開課金獎市賽課一等獎?wù)n件_第3頁
C語言用函數(shù)實現(xiàn)模塊化程序設(shè)計市公開課金獎市賽課一等獎?wù)n件_第4頁
C語言用函數(shù)實現(xiàn)模塊化程序設(shè)計市公開課金獎市賽課一等獎?wù)n件_第5頁
已閱讀5頁,還剩223頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第7章 用函數(shù)實現(xiàn)模塊化程序設(shè)計7.1為何要用函數(shù) 7.2怎樣定義函數(shù)7.3調(diào)用函數(shù)7.4對被調(diào)用函數(shù)申明和函數(shù)原型7.5函數(shù)嵌套調(diào)用 7.6函數(shù)遞歸調(diào)用7.7數(shù)組作為函數(shù)參數(shù) 7.8局部變量和全局變量7.9變量存放方式和生存期7.10 關(guān)于變量申明和定義7.11 內(nèi)部函數(shù)和外部函數(shù)第1頁7.1為何要用函數(shù)問題:假如程序功效比較多,規(guī)模比較大,把全部代碼都寫在main函數(shù)中,就會使主函數(shù)變得龐雜、頭緒不清,閱讀和維護變得困難有時程序中要屢次實現(xiàn)某一功效,就需要屢次重復(fù)編寫實現(xiàn)此功效程序代碼,這使程序冗長,不精煉第2頁7.1為何要用函數(shù)處理方法:用模塊化程序設(shè)計思緒采取“組裝”方法簡化程序設(shè)計過

2、程事先編好一批實現(xiàn)各種不一樣功效函數(shù)把它們保留在函數(shù)庫中,需要時直接用第3頁7.1為何要用函數(shù)處理方法:用模塊化程序設(shè)計思緒函數(shù)就是功效每一個函數(shù)用來實現(xiàn)一個特定功效函數(shù)名字應(yīng)反應(yīng)其代表功效第4頁7.1為何要用函數(shù)在設(shè)計一個較大程序時,往往把它分為若干個程序模塊,每一個模塊包含一個或多個函數(shù),每個函數(shù)實現(xiàn)一個特定功效程序可由一個主函數(shù)和若干個其它函數(shù)組成主函數(shù)調(diào)用其它函數(shù),其它函數(shù)也能夠相互調(diào)用同一個函數(shù)能夠被一個或多個函數(shù)調(diào)用任意屢次第5頁7.1為何要用函數(shù)mainabcfghdeie第6頁7.1為何要用函數(shù)能夠使用庫函數(shù)能夠使用自己編寫函數(shù)在程序設(shè)計中要善于利用函數(shù),能夠降低重復(fù)編寫程序段

3、工作量,同時能夠方便地實現(xiàn)模塊化程序設(shè)計第7頁7.1為何要用函數(shù)例7.1 輸出以下結(jié)果,用函數(shù)調(diào)用實現(xiàn)。 * How do you do! *第8頁7.1為何要用函數(shù)解題思緒:在輸出文字上下分別有一行“*”號,顯然無須重復(fù)寫這段代碼,用一個函數(shù)print_star來實現(xiàn)輸出一行“*”號功效。再寫一個print_message函數(shù)來輸出中間一行文字信息用主函數(shù)分別調(diào)用這兩個函數(shù)第9頁#include int main() void print_star(); void print_message(); print_star(); print_message(); print_star(); re

4、turn 0;void print_star() printf(“*n”); void print_message() printf(“ How do you do!n”); 輸出16個*輸出一行文字第10頁#include int main() void print_star(); void print_message(); print_star(); print_message(); print_star(); return 0;void print_star() printf(“*n”); void print_message() printf(“ How do you do!n”);

5、申明函數(shù)定義函數(shù)第11頁#include int main() void print_star(); void print_message(); print_star(); print_message(); print_star(); return 0;void print_star() printf(“*n”); void print_message() printf(“ How do you do!n”); 第12頁說明: (1) 一個程序由一個或多個程序模塊組成,每一個程序模塊作為一個源程序文件。對較大程序,一般不希望把全部內(nèi)容全放在一個文件中,而是將它們分別放在若干個源文件中,由若干個

6、源程序文件組成一個C程序。這么便于分別編寫、分別編譯,提高調(diào)試效率。一個源程序文件可認(rèn)為多個C程序共用。第13頁說明: (2) 一個源程序文件由一個或多個函數(shù)以及其它相關(guān)內(nèi)容(如預(yù)處理指令、數(shù)據(jù)申明與定義等)組成。一個源程序文件是一個編譯單位,在程序編譯時是以源程序文件為單位進行編譯,而不是以函數(shù)為單位進行編譯。第14頁說明: (3) 程序執(zhí)行是從main函數(shù)開始,假如在main函數(shù)中調(diào)用其它函數(shù),在調(diào)用后流程返回到main函數(shù),在main函數(shù)中結(jié)束整個程序運行。第15頁說明: (4) 全部函數(shù)都是平行,即在定義函數(shù)時是分別進行,是相互獨立。一個函數(shù)并不隸屬于另一個函數(shù),即函數(shù)不能嵌套定義。函

7、數(shù)間能夠相互調(diào)用,但不能調(diào)用main函數(shù)。main函數(shù)是被操作系統(tǒng)調(diào)用。第16頁說明: (5) 從用戶使用角度看,函數(shù)有兩種。庫函數(shù),它是由系統(tǒng)提供,用戶無須自己定義而直接使用它們。應(yīng)該說明,不一樣C語言編譯系統(tǒng)提供庫函數(shù)數(shù)量和功效會有一些不一樣,當(dāng)然許多基本函數(shù)是共同。用戶自己定義函數(shù)。它是用以處理用戶專門需要函數(shù)。第17頁說明:(6) 從函數(shù)形式看,函數(shù)分兩類。 無參函數(shù)。無參函數(shù)普通用來執(zhí)行指定一組操作。無參函數(shù)能夠帶回或不帶回函數(shù)值,但普通以不帶回函數(shù)值居多。 有參函數(shù)。在調(diào)用函數(shù)時,主調(diào)函數(shù)在調(diào)用被調(diào)用函數(shù)時,經(jīng)過參數(shù)向被調(diào)用函數(shù)傳遞數(shù)據(jù),普通情況下,執(zhí)行被調(diào)用函數(shù)時會得到一個函數(shù)值

8、,供主調(diào)函數(shù)使用。第18頁7.2 怎樣定義函數(shù)7.2.1 為何要定義函數(shù)7.2.2 定義函數(shù)方法第19頁7.2.1 為何要定義函數(shù)C語言要求,在程序中用到全部函數(shù),必須“先定義,后使用”指定函數(shù)名字、函數(shù)返回值類型、函數(shù)實現(xiàn)功效以及參數(shù)個數(shù)與類型,將這些信息通知編譯系統(tǒng)。第20頁7.2.1 為何要定義函數(shù)指定函數(shù)名字,方便以后按名調(diào)用指定函數(shù)類型,即函數(shù)返回值類型指定函數(shù)參數(shù)名字和類型,方便在調(diào)用函數(shù)時向它們傳遞數(shù)據(jù)指定函數(shù)功效。這是最主要,這是在函數(shù)體中處理第21頁7.2.1 為何要定義函數(shù)對于庫函數(shù),程序設(shè)計者只需用#include指令把相關(guān)頭文件包含到本文件模塊中即可程序設(shè)計者需要在程序

9、中自己定義想用而庫函數(shù)并沒有提供函數(shù)第22頁7.2.2 定義函數(shù)方法1.定義無參函數(shù)定義無參函數(shù)普通形式為:類型名 函數(shù)名(void) 函數(shù)體 類型名 函數(shù)名() 函數(shù)體 包含申明部分和語句部分包含申明部分和語句部分第23頁7.2.2 定義函數(shù)方法1.定義無參函數(shù)定義無參函數(shù)普通形式為:類型名 函數(shù)名(void) 函數(shù)體 類型名 函數(shù)名() 函數(shù)體 指定函數(shù)值類型指定函數(shù)值類型第24頁7.2.2 定義函數(shù)方法2.定義有參函數(shù)定義有參函數(shù)普通形式為:類型名 函數(shù)名(形式參數(shù)表列) 函數(shù)體 第25頁7.2.2 定義函數(shù)方法3. 定義空函數(shù)定義空函數(shù)普通形式為:類型名 函數(shù)名( ) 先用空函數(shù)占一個

10、位置,以后逐步擴充好處:程序結(jié)構(gòu)清楚,可讀性好,以后擴充新功效方便,對程序結(jié)構(gòu)影響不大第26頁7.3 調(diào)用函數(shù)7.3.1函數(shù)調(diào)用形式7.3.2函數(shù)調(diào)用時數(shù)據(jù)傳遞7.3.3函數(shù)調(diào)用過程7.3.4函數(shù)返回值第27頁7.3.1函數(shù)調(diào)用形式函數(shù)調(diào)用普通形式為: 函數(shù)名(實參表列)假如是調(diào)用無參函數(shù),則“實參表列”能夠沒有,但括號不能省略假如實參表列包含多個實參,則各參數(shù)間用逗號隔開第28頁7.3.1函數(shù)調(diào)用形式按函數(shù)調(diào)用在程序中出現(xiàn)形式和位置來分,能夠有以下3種函數(shù)調(diào)用方式:. 函數(shù)調(diào)用語句把函數(shù)調(diào)用單獨作為一個語句 如printf_star();這時不要求函數(shù)帶回值,只要求函數(shù)完成一定操作第29頁7

11、.3.1函數(shù)調(diào)用形式按函數(shù)調(diào)用在程序中出現(xiàn)形式和位置來分,能夠有以下3種函數(shù)調(diào)用方式:. 函數(shù)表示式函數(shù)調(diào)用出現(xiàn)在另一個表示式中 如c=max(a,b);這時要求函數(shù)帶回一個確定值以參加表示式運算第30頁7.3.1函數(shù)調(diào)用形式按函數(shù)調(diào)用在程序中出現(xiàn)形式和位置來分,能夠有以下3種函數(shù)調(diào)用方式:. 函數(shù)參數(shù)函數(shù)調(diào)用作為另一函數(shù)調(diào)用時實參 如mmax(a,max(b,c);其中max(b,c)是一次函數(shù)調(diào)用,它值作為max另一次調(diào)用實參第31頁7.3.2 函數(shù)調(diào)用時數(shù)據(jù)傳遞1.形式參數(shù)和實際參數(shù)在調(diào)用有參函數(shù)時,主調(diào)函數(shù)和被調(diào)用函數(shù)之間有數(shù)據(jù)傳遞關(guān)系定義函數(shù)時函數(shù)名后面變量名稱為“形式參數(shù)”(簡稱“

12、形參”)主調(diào)函數(shù)中調(diào)用一個函數(shù)時,函數(shù)名后面參數(shù)稱為“實際參數(shù)”(簡稱“實參”) 實際參數(shù)能夠是常量、變量或表示式第32頁7.3.2 函數(shù)調(diào)用時數(shù)據(jù)傳遞2. 實參和形參間數(shù)據(jù)傳遞在調(diào)用函數(shù)過程中,系統(tǒng)會把實參值傳遞給被調(diào)用函數(shù)形參或者說,形參從實參得到一個值該值在函數(shù)調(diào)用期間有效,能夠參加被調(diào)函數(shù)中運算第33頁7.3.2 函數(shù)調(diào)用時數(shù)據(jù)傳遞 例7.2 輸入兩個整數(shù),要求輸出其中值較大者。要求用函數(shù)來找到大數(shù)。解題思緒:(1)函數(shù)名應(yīng)是見名知意,故定名為max(2) 因為給定兩個數(shù)是整數(shù),返回主調(diào)函數(shù)值(即較大數(shù))應(yīng)該是整型(3)max函數(shù)應(yīng)該有兩個參數(shù),方便從主函數(shù)接收兩個整數(shù),所以參數(shù)類型應(yīng)

13、該是整型第34頁7.3.2 函數(shù)調(diào)用時數(shù)據(jù)傳遞先編寫max函數(shù):int max(int x,int y) int z; z=xy?x:y; return(z); 第35頁7.3.2 函數(shù)調(diào)用時數(shù)據(jù)傳遞在max函數(shù)上面,再編寫主函數(shù)#include int main() int max(int x,int y); int a,b,c; printf(“two integer numbers: ); scanf(“%d,%d”,&a,&b); c=max(a,b); printf(“max is %dn”,c); return 0;實參能夠是常量、變量或表示式第36頁7.3.2 函數(shù)調(diào)用時數(shù)據(jù)傳遞

14、 c=max(a,b); (main函數(shù))int max(int x, int y) (max函數(shù)) int z; z=xy?x:y; return(z); 第37頁7.3.3 函數(shù)調(diào)用過程在定義函數(shù)中指定形參,在未出現(xiàn)函數(shù)調(diào)用時,它們并不占內(nèi)存中存放單元。在發(fā)生函數(shù)調(diào)用時,函數(shù)max形參被暫時分配內(nèi)存單元。2a3bxy23實參形參第38頁7.3.3 函數(shù)調(diào)用過程調(diào)用結(jié)束,形參單元被釋放實參單元仍保留并維持原值,沒有改變假如在執(zhí)行一個被調(diào)用函數(shù)時,形參值發(fā)生改變,不會改變主調(diào)函數(shù)實參值2a3bxy23實參形參第39頁7.3.4. 函數(shù)返回值通常,希望經(jīng)過函數(shù)調(diào)用使主調(diào)函數(shù)能得到一個確定值,這就

15、是函數(shù)值(函數(shù)返回值)函數(shù)返回值是經(jīng)過函數(shù)中return語句取得。一個函數(shù)中能夠有一個以上return語句,執(zhí)行到哪一個return語句,哪一個就起作用return語句后面括號能夠不要第40頁7.3.4. 函數(shù)返回值通常,希望經(jīng)過函數(shù)調(diào)用使主調(diào)函數(shù)能得到一個確定值,這就是函數(shù)值(函數(shù)返回值)(2) 函數(shù)值類型。應(yīng)該在定義函數(shù)時指定函數(shù)值類型第41頁7.3.4. 函數(shù)返回值通常,希望經(jīng)過函數(shù)調(diào)用使主調(diào)函數(shù)能得到一個確定值,這就是函數(shù)值(函數(shù)返回值)(3)在定義函數(shù)時指定函數(shù)類型普通應(yīng)該和return語句中表示式類型一致假如函數(shù)值類型和return語句中表示式值不一致,則以函數(shù)類型為準(zhǔn)第42頁7.

16、3.4. 函數(shù)返回值例7.3將例7.2稍作改動,將在max函數(shù)中定義變量z改為float型。函數(shù)返回值類型與指定函數(shù)類型不一樣,分析其處理方法。解題思緒:假如函數(shù)返回值類型與指定函數(shù)類型不一樣,按照賦值規(guī)則處理。第43頁#include int main() int max(float x,float y); float a,b; int c; scanf(%f,%f,&a,&b); c=max(a,b); printf(max is %dn,c); return 0; int max(float x,float y) float z; z=xy?x:y; return( z ) ;1.52.

17、62.62變?yōu)?第44頁7.4對被調(diào)用函數(shù)申明和函數(shù)原型在一個函數(shù)中調(diào)用另一個函數(shù)需要具備以下條件:(1) 被調(diào)用函數(shù)必須是已經(jīng)定義函數(shù)(是庫函數(shù)或用戶自己定義函數(shù))(2) 假如使用庫函數(shù),應(yīng)該在本文件開頭加對應(yīng)#include指令(3) 假如使用自己定義函數(shù),而該函數(shù)位置在調(diào)用它函數(shù)后面,應(yīng)該申明第45頁7.4對被調(diào)用函數(shù)申明和函數(shù)原型 例7.4 輸入兩個實數(shù),用一個函數(shù)求出它們之和。解題思緒:用add函數(shù)實現(xiàn)。首先要定義add函數(shù),它為float型,它應(yīng)有兩個參數(shù),也應(yīng)為float型。尤其要注意是:要對add函數(shù)進行申明。第46頁7.4對被調(diào)用函數(shù)申明和函數(shù)原型分別編寫add函數(shù)和main

18、函數(shù),它們組成一個源程序文件main函數(shù)位置在add函數(shù)之前在main函數(shù)中對add函數(shù)進行申明第47頁#include int main() float add(float x, float y); float a,b,c; printf(Please enter a and b:); scanf(%f,%f,&a,&b); c=add(a,b); printf(sum is %fn,c); return 0;float add(float x,float y) float z; z=x+y; return(z); 求兩個實數(shù)之和,函數(shù)值也是實型對add函數(shù)申明第48頁#include in

19、t main() float add(float x, float y); float a,b,c; printf(Please enter a and b:); scanf(%f,%f,&a,&b); c=add(a,b); printf(sum is %fn,c); return 0;float add(float x,float y) float z; z=x+y; return(z); 只差一個分號第49頁#include int main() float add(float x, float y); float a,b,c; printf(Please enter a and b:)

20、; scanf(%f,%f,&a,&b); c=add(a,b); printf(sum is %fn,c); return 0;float add(float x,float y) float z; z=x+y; return(z); 定義add函數(shù)調(diào)用add函數(shù)第50頁函數(shù)原型普通形式有兩種:如 float add(float x, float y); float add(float, float);原型說明能夠放在文件開頭,這時全部函數(shù)都能夠使用此函數(shù)第51頁7.5 函數(shù)嵌套調(diào)用語言函數(shù)定義是相互平行、獨立即函數(shù)不能嵌套定義但能夠嵌套調(diào)用函數(shù)即調(diào)用一個函數(shù)過程中,又能夠調(diào)用另一個函數(shù)第5

21、2頁7.5 函數(shù)嵌套調(diào)用main函數(shù)調(diào)用a函數(shù)結(jié)束a函數(shù)調(diào)用b函數(shù)b函數(shù)第53頁7.5 函數(shù)嵌套調(diào)用 例7.5 輸入4個整數(shù),找出其中最大數(shù)。用函數(shù)嵌套調(diào)用來處理。解題思緒:main中調(diào)用max4函數(shù),找4個數(shù)中最大者max4中再調(diào)用max2,找兩個數(shù)中大者max4中屢次調(diào)用max2,可找4個數(shù)中大者,然后把它作為函數(shù)值返回main函數(shù)main函數(shù)中輸出結(jié)果第54頁#include int main() int max4(int a,int b,int c,int d); int a,b,c,d,max; printf(“4 integer numbers:); scanf(%d%d%d%d,

22、&a,&b,&c,&d); max=max4(a,b,c,d); printf(max=%d n,max); return 0; 主函數(shù)對max4 函數(shù)申明第55頁#include int main() int max4(int a,int b,int c,int d); int a,b,c,d,max; printf(“4 integer numbers:); scanf(%d%d%d%d,&a,&b,&c,&d); max=max4(a,b,c,d); printf(max=%d n,max); return 0; 主函數(shù)輸入4個整數(shù)第56頁#include int main() int

23、max4(int a,int b,int c,int d); int a,b,c,d,max; printf(“4 integer numbers:); scanf(%d%d%d%d,&a,&b,&c,&d); max=max4(a,b,c,d); printf(max=%d n,max); return 0; 主函數(shù)調(diào)用后必定是4個數(shù)中最大者輸出最大者第57頁int max4(int a,int b,int c,int d) int max2(int a,int b); int m; m=max2(a,b); m=max2(m,c); m=max2(m,d); return(m); max4

24、函數(shù)對max2 函數(shù)申明第58頁int max4(int a,int b,int c,int d) int max2(int a,int b); int m; m=max2(a,b); m=max2(m,c); m=max2(m,d); return(m); max4函數(shù)a,b中較大者a,b,c中較大者a,b,c,d中最大者第59頁int max4(int a,int b,int c,int d) int max2(int a,int b); int m; m=max2(a,b); m=max2(m,c); m=max2(m,d); return(m); max4函數(shù)int max2(int

25、a,int b) if(a=b) return a; else return b; max2函數(shù)找a,b中較大者第60頁int max4(int a,int b,int c,int d) int max2(int a,int b); int m; m=max2(a,b); m=max2(m,c); m=max2(m,d); return(m); max4函數(shù)int max2(int a,int b) if(a=b) return a; else return b; max2函數(shù)return(ab?a:b);第61頁int max4(int a,int b,int c,int d) int ma

26、x2(int a,int b); int m; m=max2(a,b); m=max2(m,c); m=max2(m,d); return(m); max4函數(shù)int max2(int a,int b) return(ab?a:b); 第62頁int max4(int a,int b,int c,int d) int max2(int a,int b); int m; m=max2(a,b); m=max2(m,c); m=max2(m,d); return(m); max4函數(shù)m=max2(max2(a,b),c);int max2(int a,int b) return(ab?a:b);

27、第63頁int max4(int a,int b,int c,int d) int max2(int a,int b); int m; m=max2(a,b); m=max2(m,c); m=max2(m,d); return(m); max4函數(shù)m=max2(max2(max2(a,b),c),d);int max2(int a,int b) return(ab?a:b); 第64頁int max4(int a,int b,int c,int d) int max2(int a,int b); int m; m=max2(a,b); m=max2(m,c); m=max2(m,d); ret

28、urn(m); max4函數(shù)ruturn max2(max2(max2(a,b),c),d);int max2(int a,int b) return(ab?a:b); 第65頁int max4(int a,int b,int c,int d) int max2(int a,int b); ruturn max2(max2(max2(a,b),c),d);int max2(int a,int b) return(ab?a:b); #include int main() max=max4(a,b,c,d); 第66頁課堂練習(xí)寫一個函數(shù),輸入一個4位數(shù)字,要求輸出這四個數(shù)字字符,但每兩個數(shù)字之間空

29、一個空格。如輸入,應(yīng)該輸出“2 0 1 3”。 第67頁課堂練習(xí)編程實現(xiàn)1-100累加。要求使用自定義函數(shù),該函數(shù)可求自然數(shù)m-n累加和,m、n由用戶從鍵盤輸入。第68頁#include int sum(int m,int n);int main( )int a,b,c; scanf(“%d%d”,&a,&b) c=sum(a,b); printf(“%d到%d自然數(shù)之和=%d,a,b,c); return 0;int sum(int x,int y)int i,s=0; i=x; while(i=y) s=s+i; i+; return s;第69頁7.6 函數(shù)遞歸調(diào)用在調(diào)用一個函數(shù)過程中又

30、出現(xiàn)直接或間接地調(diào)用該函數(shù)本身,稱為函數(shù)遞歸調(diào)用。語言特點之一就在于允許函數(shù)遞歸調(diào)用。第70頁 f2函數(shù)調(diào)用f1函數(shù) 7.6 函數(shù)遞歸調(diào)用int f(int x) int y,z; z=f(y); return (2*z); f函數(shù)調(diào)用f函數(shù) f1函數(shù)調(diào)用f2函數(shù)應(yīng)使用if語句控制結(jié)束調(diào)用直接調(diào)用本函數(shù)間接調(diào)用本函數(shù)第71頁7.6 函數(shù)遞歸調(diào)用 例7.6 有5個學(xué)生坐在一起問第5個學(xué)生多少歲?他說比第4個學(xué)生大2歲問第4個學(xué)生歲數(shù),他說比第3個學(xué)生大2歲問第3個學(xué)生,又說比第2個學(xué)生大2歲問第2個學(xué)生,說比第1個學(xué)生大2歲最終問第1個學(xué)生,他說是10歲請問第5個學(xué)生多大第72頁7.6 函數(shù)遞歸

31、調(diào)用解題思緒:要求第個年紀(jì),就必須先知道第個年紀(jì)要求第個年紀(jì)必須先知道第個年紀(jì)第個年紀(jì)又取決于第個年紀(jì)第個年紀(jì)取決于第個年紀(jì)每個學(xué)生年紀(jì)都比其前個學(xué)生年紀(jì)大第73頁7.6 函數(shù)遞歸調(diào)用解題思緒:age(5)=age(4)+2age(4)=age(3)+2age(3)=age(2)+2age(2)=age(1)+2age(1)=10第74頁 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 回溯階段 遞推階段第

32、75頁 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 回溯階段 遞推階段結(jié)束遞歸條件第76頁#include int main() int age(int n); printf(NO.5,age:%dn,age(5); return 0; int age(int n) int c; if(n=1) c=10; else c=age(n-1)+2; return(c); 第77頁age(5)輸出age(5)

33、mainc=age(4)+2age函數(shù)n=5c=age(3)+2age函數(shù)n=4c=age(1)+2age函數(shù)n=2c=age(2)+2age函數(shù)n=3c=10age函數(shù)n=1age(1)=10age(2)=12age(3)=14age(4)=16age(5)=1818第78頁例7.7 用遞歸方法求!。解題思緒:求!能夠用遞推方法:即從開始,乘,再乘一直乘到。遞推法特點是從一個已知事實(如1!=1)出發(fā),按一定規(guī)律推出下一個事實(如2!=1!*2),再從這個新已知事實出發(fā),再向下推出一個新事實(3!=3*2!)。n!=n*(n-1)!。第79頁例7.7 用遞歸方法求!。解題思緒:求!也能夠用遞

34、歸方法,即!等于!,而!,!可用下面遞歸公式表示:第80頁#include int main() int fac(int n); int n; int y; printf(input an integer number:); scanf(%d,&n); y=fac(n); printf(%d!=%dn,n,y); return 0;第81頁int fac(int n) int f; if(n0) printf(ncn1:hanoi(n-1, a, c, b)a-chanoi(n-1, b, a, c)注意用遞歸調(diào)用結(jié)果,不關(guān)注該結(jié)果怎樣取得細(xì)節(jié)第123頁#include int main()

35、void hanoi(int n,char one, char two,char three); int m; printf(“the number of diskes:); scanf(%d,&m); printf(move %d diskes:n,m); hanoi(m,A,B,C);第124頁void hanoi(int n,char one,char two, char three) void move(char x,char y); if(n=1) move(one,three); else hanoi(n-1,one,three,two); move(one,three); han

36、oi(n-1,two,one,three); 第125頁void move(char x,char y) printf(%c-%cn,x,y); 第126頁課堂練習(xí)小猴子第一天摘下若干桃子,當(dāng)即吃掉二分之一,又多吃一個.第二天早上又將剩下桃子吃二分之一,又多吃一個.以后天天早上吃前一天剩下二分之一另一個.到第10天早上猴子想再吃時發(fā)覺,只剩下一個桃子了.問第一天猴子共摘多少個桃子?第127頁遞推方法循環(huán)結(jié)構(gòu)#includeint main()int i,s=1;for(i=9;i=1;i-) s=(s+1)*2; printf(第%d天有%d個桃子n,i,s); return 0;第128頁函

37、數(shù)遞歸調(diào)用取代循環(huán)結(jié)構(gòu)#includeint f(int n)int s;if(n=10) s=1;else s=(f(n+1)+1)*2;return s;int main() printf(第1天有%d個桃子n,f(1); return 0;第129頁7.7數(shù)組作為函數(shù)參數(shù)7.7.1數(shù)組元素作函數(shù)實參7.7.2數(shù)組名作函數(shù)參數(shù)7.7.3多維數(shù)組名作函數(shù)參數(shù)第130頁7.7.1數(shù)組元素作函數(shù)實參 例7.9 輸入10個數(shù),要求輸出其中值最大元素和該數(shù)是第幾個數(shù)。第131頁7.7.1數(shù)組元素作函數(shù)實參解題思緒:定義數(shù)組a,用來存放10個數(shù)設(shè)計函數(shù)max,用來求兩個數(shù)中大者在主函數(shù)中定義變量m,初

38、值為a0,每次調(diào)用max函數(shù)后返回值存放在m中用“打擂臺”算法,依次將數(shù)組元素a1到a9與m比較,最終得到m值就是10個數(shù)中最大者第132頁#include int main() int max(int x,int y); int a10,m,n,i; printf(“10 integer numbers:n); for(i=0;i10;i+) scanf(%d,&ai); printf(n);第133頁 for(i=1,m=a0,n=0;im) m=max(m,ai); n=i; printf(“l(fā)argest number is %dn,m); printf(“%dth number.n“

39、,n+1);int max(int x,int y) return(xy?x:y); 第134頁7.7.2數(shù)組名作函數(shù)參數(shù)除了能夠用數(shù)組元素作為函數(shù)參數(shù)外,還能夠用數(shù)組名作函數(shù)參數(shù)(包含實參和形參)用數(shù)組元素作實參時,向形參變量傳遞是數(shù)組元素值用數(shù)組名作函數(shù)實參時,向形參傳遞是數(shù)組首元素地址第135頁7.7.2數(shù)組名作函數(shù)參數(shù) 例7.10 有一個一維數(shù)組score,內(nèi)放10個學(xué)生成績,求平均成績。解題思緒:用函數(shù)average求平均成績,用數(shù)組名作為函數(shù)實參,形參也用數(shù)組名在average函數(shù)中引用各數(shù)組元素,求平均成績并返回main函數(shù)第136頁#include int main() flo

40、at average(float array10); float score10,aver; int i; printf(input 10 scores:n); for(i=0;i10;i+) scanf(%f,&scorei); printf(n); aver=average(score); printf(%5.2fn,aver); return 0; 定義實參數(shù)組第137頁float average(float array10) int i; float aver,sum=array0; for(i=1;i10;i+) sum=sum+arrayi; aver=sum/10; return

41、(aver);定義形參數(shù)組相當(dāng)于score0相當(dāng)于scorei第138頁 例7.11 有兩個班級,分別有35名和30名學(xué)生,調(diào)用一個average函數(shù),分別求這兩個班學(xué)生平均成績。第139頁解題思緒:需要處理怎樣用同一個函數(shù)求兩個不一樣長度數(shù)組平均值問題定義average函數(shù)時不指定數(shù)組長度,在形參表中增加一個整型變量i從主函數(shù)把數(shù)組實際長度從實參傳遞給形參i這個i用來在average函數(shù)中控制循環(huán)次數(shù)為簡化,設(shè)兩個班學(xué)生數(shù)分別為5和10第140頁#include int main() float average(float array ,int n); float score15=98.5,

42、97,91.5,60,55; float score210=67.5,89.5,99,69.5, 77,89.5,76.5,54,60,99.5; printf(“%6.2fn”,average(score1,5); printf(“%6.2fn”,average(score2,10); return 0;第141頁float 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)用形式為average(score1,5

43、)時相當(dāng)于score10相當(dāng)于score1i相當(dāng)于5第142頁float 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)用形式為average(score2,10)時相當(dāng)于score20相當(dāng)于score2i相當(dāng)于10第143頁 例7.12用選擇法對數(shù)組中10個整數(shù)按由小到大排序。解題思緒:所謂選擇法就是先將10個數(shù)中最小數(shù)與a0對換;再將a1到a9中最小數(shù)與a1對換每比較一輪,找出一個未經(jīng)排序數(shù)中最小一個共比較9

44、輪第144頁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小到大排序第145頁#include int main() void sort(int array,int n); int a10,i; printf(enter 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); return 0; 第146頁void sort

45、(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; arrayk=arrayi; arrayi=t; 在sortisort9中,最小數(shù)與sorti對換第147頁課堂練習(xí)寫一個函數(shù),可對任意個整數(shù)進行起泡排序(升序,降序可選) 第148頁7.7.3多維數(shù)組名作函數(shù)參數(shù) 例7.13 有一個矩陣,求全部元素中最大值。解題思緒:先使變量max初值等于矩陣中第一個元素值,然后將矩陣中各個元素值與max相比,每次比較后都把“大者”存放在max中,全部元素比

46、較完后,max 值就是全部元素最大值。第149頁#include int main() int max_value(int array4); int a34=1,3,5,7,2,4,6,8, 15,17,34,12; printf(“Max value is %dn”, max_value(a); return 0;能夠省略不能省略要與實參數(shù)組第二維大小相同第150頁int max_value(int array4) int i,j,max; max = array00; for (i=0;i3;i+) for(j=0;jmax) max = arrayij; return (max);要與實

47、參數(shù)組第二維大小相同第151頁7.8局部變量和全局變量7.8.1 局部變量7.8.2 全局變量第152頁7.8.1 局部變量定義變量可能有三種情況:在函數(shù)開頭定義在函數(shù)內(nèi)復(fù)合語句內(nèi)定義在函數(shù)外部定義第153頁7.8.1 局部變量在一個函數(shù)內(nèi)部定義變量只在本函數(shù)范圍內(nèi)有效在復(fù)合語句內(nèi)定義變量只在本復(fù)合語句范圍內(nèi)有效在函數(shù)內(nèi)部或復(fù)合語句內(nèi)部定義變量稱為“局部變量”第154頁float f1( int a) int b,c; char f2(int x,int y) int i,j; int main( ) int m,n; return 0; a、b、c僅在此函數(shù)內(nèi)有效x、y、i、j僅在此函數(shù)內(nèi)有

48、效m、n僅在此函數(shù)內(nèi)有效第155頁float f1( int a) int b,c; char f2(int x,int y) int i,j; int main( ) int a,b; return 0; 類似于不一樣班同名學(xué)生a、b也僅在此函數(shù)內(nèi)有效第156頁int main ( ) int a,b; int c; c=a+b; c僅在此復(fù)合語句內(nèi)有效a、b僅在此復(fù)合語句內(nèi)有效第157頁7.8.2全局變量在函數(shù)內(nèi)定義變量是局部變量,而在函數(shù)之外定義變量稱為外部變量外部變量是全局變量(也稱全程變量)全局變量可認(rèn)為本文件中其他函數(shù)所共用有效范圍為從定義變量位置開始到根源文件結(jié)束第158頁int

49、 p=1,q=5float f1(int a) int b,c; char c1,c2;char f2 (int x, int y) int i,j; int main ( ) int m,n; return 0;p、q、c1、c2為全局變量第159頁int p=1,q=5float f1(int a) int b,c; char c1,c2;char f2 (int x, int y) int i,j; int main ( ) int m,n; return 0;p、q有效范圍c1、c2有效范圍第160頁 例7.14 有一個一維數(shù)組,內(nèi)放10個學(xué)生成績,寫一個函數(shù),當(dāng)主函數(shù)調(diào)用此函數(shù)后,能

50、求出平均分、最高分和最低分。解題思路:調(diào)用一個函數(shù)可以得到一個函數(shù)返回值,現(xiàn)在希望通過函數(shù)調(diào)用能得到3個結(jié)果。可以利用全局變量來達(dá)到此目。第161頁#include float Max=0,Min=0; int main() float average(float array ,int n); float ave,score10; int i; printf(Please enter 10 scores:n); for(i=0;i10;i+) scanf(%f,&scorei); ave=average(score,10); printf(max=%6.2fnmin=%6.2fn averag

51、e=%6.2fn,Max,Min,ave); return 0; 第162頁float average(float array ,int n) int i; float aver,sum=array0; Max=Min=array0; for(i=1;iMax) Max=arrayi; else if(arrayiMin) Min=arrayi; sum=sum+arrayi; aver=sum/n; return(aver); 第163頁 ave score 10 Max Min aver array n Max Minmain函數(shù)average函數(shù)提議不在必要時不要使用全局變量第164頁

52、例7.15 若外部變量與局部變量同名,分析結(jié)果。第165頁#include int a=3,b=5; int main() int max(int a,int b); int a=8; printf(“max=%dn”,max(a,b); return 0; int max(int a,int b) int c; c=ab?a:b; return(c); a為局部變量,僅在此函數(shù)內(nèi)有效b為全局變量第166頁#include int a=3,b=5; int main() int max(int a,int b); int a=8; printf(“max=%dn”,max(a,b); retu

53、rn 0; int max(int a,int b) int c; c=ab?a:b; return(c); a、b為局部變量,僅在此函數(shù)內(nèi)有效第167頁7.9變量存放方式和生存期7.9.1動態(tài)存放方式與靜態(tài)存放方式7.9.2 局部變量存放類別7.9.3 全局變量存放類別7.9.4 存放類別小結(jié)第168頁7.9.1動態(tài)存放方式與靜態(tài)存放方式從變量作用域角度來觀察,變量能夠分為全局變量和局部變量從變量值存在時間(即生存期)觀察,變量存放有兩種不一樣方式:靜態(tài)存放方式和動態(tài)存放方式靜態(tài)存放方式是指在程序運行期間由系統(tǒng)分配固定存放空間方式動態(tài)存放方式是在程序運行期間依據(jù)需要進行動態(tài)分配存放空間方式第

54、169頁程序區(qū)靜態(tài)存放區(qū)動態(tài)存放區(qū)用戶區(qū)將數(shù)據(jù)存放在此區(qū)全局變量全部存放在靜態(tài)存放區(qū)中函數(shù)形式參數(shù)函數(shù)中定義沒有用關(guān)鍵字static申明變量函數(shù)調(diào)用時現(xiàn)場保護和返回地址等存放在動態(tài)存放區(qū)程序開始執(zhí)行時給全局變量分配存放區(qū),程序執(zhí)行完成就釋放。在程序執(zhí)行過程中占據(jù)固定存放單元函數(shù)調(diào)用開始時分配,函數(shù)結(jié)束時釋放。在程序執(zhí)行過程中,這種分配和釋放是動態(tài)第170頁每一個變量和函數(shù)都有兩個屬性:數(shù)據(jù)類型和數(shù)據(jù)存放類別數(shù)據(jù)類型,如整型、浮點型等存放類別指是數(shù)據(jù)在內(nèi)存中存放方式(如靜態(tài)存放和動態(tài)存放)存放類別包含: 自動、靜態(tài)、存放器、外部依據(jù)變量存放類別,能夠知道變量作用域和生存期第171頁7.9.2 局

55、部變量存放類別1.自動變量(auto變量)局部變量,假如不專門申明存放類別,都是動態(tài)地分配存放空間調(diào)用函數(shù)時,系統(tǒng)會給局部變量分配存放空間,調(diào)用結(jié)束時就自動釋放空間。所以這類局部變量稱為自動變量自動變量用關(guān)鍵字auto作存放類別申明第172頁7.9.2 局部變量存放類別int f(int a) auto int b,c=3; 能夠省略第173頁7.9.2 局部變量存放類別2.靜態(tài)局部變量(static局部變量)希望函數(shù)中局部變量在函數(shù)調(diào)用結(jié)束后不消失而繼續(xù)保留原值,即其占用存放單元不釋放,在下一次再調(diào)用該函數(shù)時,該變量已經(jīng)有值(就是上一次函數(shù)調(diào)用結(jié)束時值),這時就應(yīng)該指定該局部變量為“靜態(tài)局部

56、變量”,用關(guān)鍵字static進行申明第174頁 例7.16 考查靜態(tài)局部變量值。#include int main() int f(int); int a=2,i; for(i=0;i3;i+) printf(“%dn”,f(a); return 0;int f(int a) auto int b=0; static c=3; b=b+1; c=c+1; return(a+b+c);調(diào)用三次每調(diào)用一次,開辟新a和b,但c不是第175頁 例7.16 考查靜態(tài)局部變量值。#include int main() int f(int); int a=2,i; for(i=0;i3;i+) printf

57、(“%dn”,f(a); return 0;int f(int a) auto int b=0; static c=3; b=b+1; c=c+1; return(a+b+c);03bc第一次調(diào)用開始第176頁 例7.16 考查靜態(tài)局部變量值。#include int main() int f(int); int a=2,i; for(i=0;i3;i+) printf(“%dn”,f(a); return 0;int f(int a) auto int b=0; static c=3; b=b+1; c=c+1; return(a+b+c);03bc第一次調(diào)用期間14第177頁 例7.16

58、考查靜態(tài)局部變量值。#include int main() int f(int); int a=2,i; for(i=0;i3;i+) printf(“%dn”,f(a); return 0;int f(int a) auto int b=0; static c=3; b=b+1; c=c+1; return(a+b+c);bc第一次調(diào)用結(jié)束147第178頁 例7.16 考查靜態(tài)局部變量值。#include int main() int f(int); int a=2,i; for(i=0;i3;i+) printf(“%dn”,f(a); return 0;int f(int a) auto

59、 int b=0; static c=3; b=b+1; c=c+1; return(a+b+c);bc第二次調(diào)用開始04第179頁 例7.16 考查靜態(tài)局部變量值。#include int main() int f(int); int a=2,i; for(i=0;i3;i+) printf(“%dn”,f(a); return 0;int f(int a) auto int b=0; static c=3; b=b+1; c=c+1; return(a+b+c);bc第二次調(diào)用期間0451第180頁 例7.16 考查靜態(tài)局部變量值。#include int main() int f(int

60、); int a=2,i; for(i=0;i3;i+) printf(“%dn”,f(a); return 0;int f(int a) auto int b=0; static c=3; b=b+1; c=c+1; return(a+b+c);bc第二次調(diào)用結(jié)束158第181頁 例7.16 考查靜態(tài)局部變量值。#include int main() int f(int); int a=2,i; for(i=0;i3;i+) printf(“%dn”,f(a); return 0;int f(int a) auto int b=0; static c=3; b=b+1; c=c+1; ret

溫馨提示

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

評論

0/150

提交評論