第7章函數(shù)-模塊化程序設(shè)計(jì)-預(yù)處理命令_第1頁(yè)
第7章函數(shù)-模塊化程序設(shè)計(jì)-預(yù)處理命令_第2頁(yè)
第7章函數(shù)-模塊化程序設(shè)計(jì)-預(yù)處理命令_第3頁(yè)
第7章函數(shù)-模塊化程序設(shè)計(jì)-預(yù)處理命令_第4頁(yè)
第7章函數(shù)-模塊化程序設(shè)計(jì)-預(yù)處理命令_第5頁(yè)
已閱讀5頁(yè),還剩83頁(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、第7章 函數(shù)-模塊化程序設(shè)計(jì) C語(yǔ)言程序設(shè)計(jì) 第七章第七章 函數(shù)函數(shù)概述函數(shù)定義的一般形式函數(shù)參數(shù)和函數(shù)的值函數(shù)的調(diào)用函數(shù)的嵌套調(diào)用函數(shù)的遞歸調(diào)用數(shù)組作為函數(shù)參數(shù)局部變量和全局變量(自習(xí))變量的存儲(chǔ)類別(自習(xí))內(nèi)部函數(shù)和外部函數(shù)(自習(xí))運(yùn)行一個(gè)多文件的程序(自習(xí))本章學(xué)習(xí)目標(biāo):本章學(xué)習(xí)目標(biāo): C語(yǔ)言程序設(shè)計(jì) 第七章第七章 函數(shù)函數(shù)認(rèn)識(shí)到函數(shù)是一種簡(jiǎn)化程序結(jié)構(gòu)的重要手段;認(rèn)識(shí)到函數(shù)是一種簡(jiǎn)化程序結(jié)構(gòu)的重要手段;理解函數(shù)調(diào)用和函數(shù)調(diào)用過(guò)程中的參數(shù)傳遞;理解函數(shù)調(diào)用和函數(shù)調(diào)用過(guò)程中的參數(shù)傳遞;理解函數(shù)原型理解函數(shù)原型(聲明聲明)和怎樣寫(xiě)函數(shù)原型;和怎樣寫(xiě)函數(shù)原型;能夠用前幾章的知識(shí)實(shí)現(xiàn)簡(jiǎn)單的函數(shù);能

2、夠用前幾章的知識(shí)實(shí)現(xiàn)簡(jiǎn)單的函數(shù);能夠用能夠用return語(yǔ)句實(shí)現(xiàn)函數(shù)的返回值;語(yǔ)句實(shí)現(xiàn)函數(shù)的返回值;能夠理解函數(shù)調(diào)用過(guò)程中形式參數(shù)和實(shí)際參能夠理解函數(shù)調(diào)用過(guò)程中形式參數(shù)和實(shí)際參數(shù)的關(guān)系,理解數(shù)組名作為函數(shù)參數(shù)時(shí)代表的數(shù)的關(guān)系,理解數(shù)組名作為函數(shù)參數(shù)時(shí)代表的意義;意義;能夠理解函數(shù)的嵌套調(diào)用和遞歸調(diào)用機(jī)制能夠理解函數(shù)的嵌套調(diào)用和遞歸調(diào)用機(jī)制 。7.1 概述概述函數(shù)的概念函數(shù)的概念 C語(yǔ)言程序設(shè)計(jì) 第七章第七章 函數(shù)函數(shù) 一個(gè)大的程序一般應(yīng)分為若干個(gè)程序模塊,每個(gè)模塊實(shí)一個(gè)大的程序一般應(yīng)分為若干個(gè)程序模塊,每個(gè)模塊實(shí)現(xiàn)一個(gè)特定的功能,這些模塊稱為子程序,在現(xiàn)一個(gè)特定的功能,這些模塊稱為子程序,在C

3、 C語(yǔ)言中子程語(yǔ)言中子程序用函數(shù)實(shí)現(xiàn)。序用函數(shù)實(shí)現(xiàn)。函數(shù)是函數(shù)是C語(yǔ)言中模塊化編程的最小單位。語(yǔ)言中模塊化編程的最小單位。mainabca1abb1b2不能被調(diào)用不能被調(diào)用所有函數(shù)都是所有函數(shù)都是平行的,不能平行的,不能嵌套定義嵌套定義分為分為:庫(kù)函數(shù)和庫(kù)函數(shù)和自定義函數(shù)自定義函數(shù) C語(yǔ)言程序設(shè)計(jì) 第七章第七章 函數(shù)函數(shù)多個(gè)函數(shù)的常用調(diào)用方法多個(gè)函數(shù)的常用調(diào)用方法一、常規(guī)方法:一、常規(guī)方法:各函數(shù)包含在一個(gè)文件中各函數(shù)包含在一個(gè)文件中例例T7-1.c #include void main( ) void printstar( ); void print_message( ); printsta

4、r( ); print_message( ); printstar( ); void printstar( ) printf (“* n” ); void print_message( ) printf (“ How do you do!n”) ; 運(yùn)行結(jié)果:運(yùn)行結(jié)果: * How do you do! * * C語(yǔ)言程序設(shè)計(jì) 第七章第七章 函數(shù)函數(shù)二二 、文件包含的方法、文件包含的方法 在主函數(shù)中使用文件包含預(yù)編譯命令(宏定義),將在主函數(shù)中使用文件包含預(yù)編譯命令(宏定義),將不在本文件而在其它文件中的函數(shù)進(jìn)行預(yù)編譯處理把各文不在本文件而在其它文件中的函數(shù)進(jìn)行預(yù)編譯處理把各文件中的函數(shù)包含到

5、本文件中來(lái),然后一起進(jìn)行編譯、連接件中的函數(shù)包含到本文件中來(lái),然后一起進(jìn)行編譯、連接、運(yùn)行。、運(yùn)行。 T7-1-1.c p1( ) printf (“* n”); T7-1-2.c p2( ) printf (“ How do you do! n”); T7-1-3.c #include “T7-1-1.c”#include “T7-1-2.c”main( ) p1( ); p2( ) ; p1( ) ; 運(yùn)行結(jié)果同上運(yùn)行結(jié)果同上幾點(diǎn)說(shuō)明:幾點(diǎn)說(shuō)明:(1)(1)一個(gè)源文件由一個(gè)或者多個(gè)函數(shù)組成。一個(gè)源文件由一個(gè)或者多個(gè)函數(shù)組成。(2)(2)一個(gè)一個(gè)C C程序由一個(gè)或者多個(gè)源文件組成。程序由一個(gè)

6、或者多個(gè)源文件組成。(3)C(3)C程序的執(zhí)行從程序的執(zhí)行從main main 函數(shù)開(kāi)始。函數(shù)開(kāi)始。(4)(4)所有的子函數(shù)都是平行的。所有的子函數(shù)都是平行的。(5)(5)從用戶的角度看,函數(shù)分庫(kù)函數(shù)和自定義從用戶的角度看,函數(shù)分庫(kù)函數(shù)和自定義函數(shù)。函數(shù)。(6)(6)函數(shù)形式:函數(shù)形式:主調(diào)函數(shù)無(wú)數(shù)據(jù)傳送給被調(diào)函主調(diào)函數(shù)無(wú)數(shù)據(jù)傳送給被調(diào)函數(shù)數(shù),可帶或不帶返回值??蓭Щ虿粠Х祷刂?。主調(diào)函數(shù)與被調(diào)函數(shù)間有參數(shù)主調(diào)函數(shù)與被調(diào)函數(shù)間有參數(shù)傳遞傳遞,主調(diào)函數(shù)可將實(shí)參傳送給被調(diào)函數(shù)的主調(diào)函數(shù)可將實(shí)參傳送給被調(diào)函數(shù)的形參形參, 被調(diào)函數(shù)的數(shù)據(jù)可返回主調(diào)函數(shù)。被調(diào)函數(shù)的數(shù)據(jù)可返回主調(diào)函數(shù)。 C語(yǔ)言程序設(shè)計(jì) 第

7、七章第七章 函數(shù)函數(shù)根據(jù)根據(jù)(1)(2)(3)可知,邏輯上一個(gè)可知,邏輯上一個(gè)C語(yǔ)言程語(yǔ)言程序是由函數(shù)構(gòu)成的,序是由函數(shù)構(gòu)成的,C語(yǔ)言程序從語(yǔ)言程序從主函數(shù)主函數(shù)開(kāi)始執(zhí)行,在主函數(shù)中調(diào)用其他函數(shù),開(kāi)始執(zhí)行,在主函數(shù)中調(diào)用其他函數(shù),這些函數(shù)可能又調(diào)用別的函數(shù),主函數(shù)這些函數(shù)可能又調(diào)用別的函數(shù),主函數(shù)執(zhí)行完畢代表整個(gè)程序結(jié)束。主函數(shù)只執(zhí)行完畢代表整個(gè)程序結(jié)束。主函數(shù)只能調(diào)用不能被調(diào)用。能調(diào)用不能被調(diào)用。一個(gè)程序由一個(gè)或者若干個(gè)文件一個(gè)程序由一個(gè)或者若干個(gè)文件(源文件源文件)構(gòu)成,函數(shù)分別放置在這些文件中。構(gòu)成,函數(shù)分別放置在這些文件中。7.2 函數(shù)定義的一般形式函數(shù)定義的一般形式無(wú)參函數(shù)的定義形式

8、無(wú)參函數(shù)的定義形式v類型標(biāo)識(shí)符:類型標(biāo)識(shí)符:l用于指定函數(shù)帶回的值的類型,不寫(xiě)時(shí)為用于指定函數(shù)帶回的值的類型,不寫(xiě)時(shí)為int型。型。l不帶回值時(shí)可以不寫(xiě)。不帶回值時(shí)可以不寫(xiě)。 C語(yǔ)言程序設(shè)計(jì) 第七章第七章 函數(shù)函數(shù)類型標(biāo)識(shí)符類型標(biāo)識(shí)符 函數(shù)名函數(shù)名()() 說(shuō)明部分說(shuō)明部分 語(yǔ)句語(yǔ)句例例 無(wú)參函數(shù)無(wú)參函數(shù) printstar( ) printf(“*n”); 或或 printstar(void ) printf(“*n”); 有參函數(shù)定義的一般形式有參函數(shù)定義的一般形式 C語(yǔ)言程序設(shè)計(jì) 第七章第七章 函數(shù)函數(shù)類型標(biāo)識(shí)符類型標(biāo)識(shí)符 函數(shù)名函數(shù)名(形式參數(shù)表列形式參數(shù)表列) 說(shuō)明部分說(shuō)明部分 語(yǔ)句

9、語(yǔ)句例例 有參函數(shù)有參函數(shù) int max(int x,int y) int z; z=xy?x:y; return(z); 例例 有參函數(shù)有參函數(shù) int max(int x, y) int z; z=xy?x:y; return(z); 空函數(shù)空函數(shù)v為擴(kuò)充功能預(yù)留,在主調(diào)函數(shù)中先占一個(gè)位置。為擴(kuò)充功能預(yù)留,在主調(diào)函數(shù)中先占一個(gè)位置。 C語(yǔ)言程序設(shè)計(jì) 第七章第七章 函數(shù)函數(shù)類型標(biāo)識(shí)符類型標(biāo)識(shí)符 函數(shù)名函數(shù)名()() 例例 空函數(shù)空函數(shù) dummy( ) 7.3 函數(shù)參數(shù)和函數(shù)的值函數(shù)參數(shù)和函數(shù)的值形式參數(shù)和實(shí)際參數(shù)形式參數(shù)和實(shí)際參數(shù)v形式參數(shù):定義函數(shù)時(shí)函數(shù)名后面括號(hào)中的變量名形式參數(shù):定

10、義函數(shù)時(shí)函數(shù)名后面括號(hào)中的變量名v實(shí)際參數(shù):調(diào)用函數(shù)時(shí)函數(shù)名后面括號(hào)中的表達(dá)式實(shí)際參數(shù):調(diào)用函數(shù)時(shí)函數(shù)名后面括號(hào)中的表達(dá)式 C語(yǔ)言程序設(shè)計(jì) 第七章第七章 函數(shù)函數(shù)例例7.2比較兩個(gè)數(shù)并輸出大者比較兩個(gè)數(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);max(int x, int y) int z; z=xy?x:y; return(z);形參形參實(shí)參實(shí)參c=max(a,b);(main 函數(shù))函數(shù))(max

11、 函數(shù))函數(shù))max(int x, int y) int z; z=xy?x:y; return(z); 運(yùn)行:運(yùn)行:7,8 Max is 8v幾點(diǎn)說(shuō)明:幾點(diǎn)說(shuō)明:l實(shí)參可以是常量、變量或表達(dá)式。必須有確定的實(shí)參可以是常量、變量或表達(dá)式。必須有確定的值。值。當(dāng)函數(shù)調(diào)用時(shí),將實(shí)參的值傳遞給形參,若當(dāng)函數(shù)調(diào)用時(shí),將實(shí)參的值傳遞給形參,若是數(shù)組名,則傳送的是數(shù)組是數(shù)組名,則傳送的是數(shù)組首地址首地址。 l形參必須指定類型,只能是簡(jiǎn)單變量或數(shù)組,不形參必須指定類型,只能是簡(jiǎn)單變量或數(shù)組,不能是常量或表達(dá)式能是常量或表達(dá)式l形參與實(shí)參形參與實(shí)參類型一致,個(gè)數(shù)相同順序相同。類型一致,個(gè)數(shù)相同順序相同。l若形

12、參與實(shí)參類型不一致,自動(dòng)若形參與實(shí)參類型不一致,自動(dòng)按形參類型轉(zhuǎn)按形參類型轉(zhuǎn)換換函數(shù)調(diào)用轉(zhuǎn)換函數(shù)調(diào)用轉(zhuǎn)換l形參在函數(shù)被調(diào)用前不占內(nèi)存形參在函數(shù)被調(diào)用前不占內(nèi)存;函數(shù)調(diào)用時(shí)為形函數(shù)調(diào)用時(shí)為形參分配內(nèi)存;調(diào)用結(jié)束,內(nèi)存釋放參分配內(nèi)存;調(diào)用結(jié)束,內(nèi)存釋放l實(shí)參對(duì)形參的數(shù)據(jù)傳送是值傳送,也是單向傳送,實(shí)參對(duì)形參的數(shù)據(jù)傳送是值傳送,也是單向傳送,當(dāng)被調(diào)函數(shù)的形參發(fā)生變化時(shí),并不改變主調(diào)函當(dāng)被調(diào)函數(shù)的形參發(fā)生變化時(shí),并不改變主調(diào)函數(shù)實(shí)參的值。數(shù)實(shí)參的值。形、實(shí)參占據(jù)的是不同的存儲(chǔ)單元形、實(shí)參占據(jù)的是不同的存儲(chǔ)單元 C語(yǔ)言程序設(shè)計(jì) 第七章第七章 函數(shù)函數(shù) C語(yǔ)言程序設(shè)計(jì) 第七章第七章 函數(shù)函數(shù)例:例:形、實(shí)

13、參占據(jù)的是不同的存儲(chǔ)單元形、實(shí)參占據(jù)的是不同的存儲(chǔ)單元#include int add(int x,int y) ;void main( ) int a=2,b=3; printf (“a=%d, b=%dn”,a, b); printf(“&a=%x,&b=%xn” ,&a,&b); add(a,b); printf(“a=%d,b=%dn”, a,b); printf(“&a=%x,&b=%xn”, &a,&b); add(int x,int y) x=x+8; y=y+12; printf(“x=%d,y=%dn”,x,y)

14、; printf(“&x=%x,&y=%xn”,&x,&y); 2+8=103+12=1523ffd2ffd4ffd6ffd8xayb運(yùn)行結(jié)果:運(yùn)行結(jié)果: a=2,b=3&a=18ffd6,&b=18ffd8 x=10,y=15 &x=18ffd2,&y=18ffd4a=2, b=3&a=18ffd6,&b=18ffd8函數(shù)的返回值函數(shù)的返回值v返回語(yǔ)句形式:返回語(yǔ)句形式: return(表達(dá)式表達(dá)式);或或 return 表達(dá)式表達(dá)式; v功能:使程序控制從被調(diào)用函數(shù)返回到功能:使程序控制從被調(diào)用函數(shù)返回到調(diào)用函

15、數(shù)中,同時(shí)把返值帶給調(diào)用函數(shù)調(diào)用函數(shù)中,同時(shí)把返值帶給調(diào)用函數(shù) C語(yǔ)言程序設(shè)計(jì) 第七章第七章 函數(shù)函數(shù)15v說(shuō)明:說(shuō)明:l函數(shù)的返回值,必須用函數(shù)的返回值,必須用 return 語(yǔ)句帶回。語(yǔ)句帶回。lreturn 語(yǔ)句只能把一個(gè)返值傳遞給調(diào)用函數(shù)。語(yǔ)句只能把一個(gè)返值傳遞給調(diào)用函數(shù)。l函數(shù)中可有多個(gè)函數(shù)中可有多個(gè)return語(yǔ)句,語(yǔ)句,執(zhí)行哪一個(gè)由執(zhí)行哪一個(gè)由程序執(zhí)行情況來(lái)定。程序執(zhí)行情況來(lái)定。 if(ab) return(a); else return(b); lreturn 后的值可以是一個(gè)表達(dá)式,如:后的值可以是一個(gè)表達(dá)式,如:return(x y ? x : y);l返回值的類型為返回值

16、的類型為定義的函數(shù)類型定義的函數(shù)類型,不指定的,不指定的按整型處理。按整型處理。如:如: int max(int x, int y) float min(float a,float b) double abc(float d1,float d2)l若若 return 語(yǔ)句中表達(dá)式類型與函數(shù)類型不一語(yǔ)句中表達(dá)式類型與函數(shù)類型不一致,則轉(zhuǎn)換為致,則轉(zhuǎn)換為函數(shù)類型函數(shù)類型。l若無(wú)若無(wú)return語(yǔ)句,遇語(yǔ)句,遇時(shí),自動(dòng)返回調(diào)用函數(shù)。時(shí),自動(dòng)返回調(diào)用函數(shù)??赡芊祷匾粋€(gè)不確定或無(wú)用的值可能返回一個(gè)不確定或無(wú)用的值 。l無(wú)返回值的函數(shù),定義為無(wú)返回值的函數(shù),定義為 void 類型。類型。 C語(yǔ)言程序設(shè)計(jì)

17、第七章第七章 函數(shù)函數(shù) printstar() printf(*);main() int a; a=printstar(); printf(%d,a);例:例:無(wú)無(wú)return語(yǔ)句,語(yǔ)句,函數(shù)帶回不確定值函數(shù)帶回不確定值輸出:輸出:*10void printstar() printf(*);main() int a; a=printstar(); printf(%d,a);編譯錯(cuò)誤!編譯錯(cuò)誤! C語(yǔ)言程序設(shè)計(jì) 第七章第七章 函數(shù)函數(shù) void swap(int x,int y ) int temp; temp=x; x=y; y=temp; 例:無(wú)返回值函數(shù)例:無(wú)返回值函數(shù)例例7.3: 函數(shù)返

18、回值類型轉(zhuǎn)換函數(shù)返回值類型轉(zhuǎn)換#include void 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);max(float x, float y) float z; z=xy?x:y; return(z);輸入:輸入:1.5,2.5輸出:輸出:Max is 27.4 函數(shù)的調(diào)用函數(shù)的調(diào)用主調(diào)函數(shù):主調(diào)函數(shù):主動(dòng)去調(diào)用其它函數(shù)主動(dòng)去調(diào)用其它函數(shù) 被調(diào)函數(shù):被其它函數(shù)所調(diào)用被調(diào)函數(shù):被其它函數(shù)所調(diào)用函數(shù)調(diào)用的一般形式函數(shù)調(diào)

19、用的一般形式函數(shù)名(實(shí)參表列)函數(shù)名(實(shí)參表列)v說(shuō)明:說(shuō)明:l實(shí)參表列:有確定值的數(shù)據(jù)或表達(dá)式實(shí)參表列:有確定值的數(shù)據(jù)或表達(dá)式l實(shí)參與形參實(shí)參與形參個(gè)數(shù)相等,類型一致,按順序一個(gè)數(shù)相等,類型一致,按順序一一對(duì)應(yīng),一對(duì)應(yīng),當(dāng)有多個(gè)實(shí)參時(shí),實(shí)參間用當(dāng)有多個(gè)實(shí)參時(shí),實(shí)參間用“ ,”分隔分隔l實(shí)參表求值順序,因編譯器而定(一般實(shí)參表求值順序,因編譯器而定(一般 自右自右向左向左)l調(diào)用無(wú)參函數(shù)時(shí),實(shí)參表列為空,但調(diào)用無(wú)參函數(shù)時(shí),實(shí)參表列為空,但( )不不能省能省 C語(yǔ)言程序設(shè)計(jì) 第七章第七章 函數(shù)函數(shù) C語(yǔ)言程序設(shè)計(jì) 第七章第七章 函數(shù)函數(shù)#include void main() int f(int

20、 a,int b); int i=2,p; p=f(i,+i); printf(%d,p);int f(int a, int b) int c; if(ab) c=1; else if(a=b) c=0; else c=-1; return(c);例例7.4 參數(shù)求值順序參數(shù)求值順序按自右向左求值按自右向左求值函數(shù)調(diào)用等于函數(shù)調(diào)用等于f(3,3)運(yùn)行結(jié)果:運(yùn)行結(jié)果:0按自左向右求值按自左向右求值函數(shù)調(diào)用等于函數(shù)調(diào)用等于f(2,3)運(yùn)行結(jié)果:運(yùn)行結(jié)果:- 1為使程序有通用性:為使程序有通用性:Printf(“%d,%d”,i,i+); /*同樣存在此情況同樣存在此情況*/函數(shù)調(diào)用的方式函數(shù)調(diào)用的

21、方式按函數(shù)在程序中出現(xiàn)的位置,有三種調(diào)用方式:按函數(shù)在程序中出現(xiàn)的位置,有三種調(diào)用方式:v函數(shù)語(yǔ)句:函數(shù)語(yǔ)句:以獨(dú)立的語(yǔ)句去調(diào)用函數(shù)。不要求有以獨(dú)立的語(yǔ)句去調(diào)用函數(shù)。不要求有返回值,僅完成一定的操作。返回值,僅完成一定的操作。 例例 printstar(); printf(“Hello,World!n”);v函數(shù)表達(dá)式:函數(shù)表達(dá)式: 函數(shù)返回一個(gè)確定值,以參加表達(dá)式的運(yùn)算。函數(shù)返回一個(gè)確定值,以參加表達(dá)式的運(yùn)算。不不可用于可用于void定義函數(shù)類型定義函數(shù)類型例例 m=max(a,b)*2;v函數(shù)參數(shù):函數(shù)參數(shù):函數(shù)調(diào)用作為另一個(gè)函數(shù)的參數(shù)。函數(shù)調(diào)用作為另一個(gè)函數(shù)的參數(shù)。 例例 printf(

22、“%d”,max(a,b); /*輸出大數(shù)輸出大數(shù)*/ m=max(a,max(b,c); /*三數(shù)比大小三數(shù)比大小*/ C語(yǔ)言程序設(shè)計(jì) 第七章第七章 函數(shù)函數(shù)對(duì)被調(diào)用函數(shù)的聲明和函數(shù)原型對(duì)被調(diào)用函數(shù)的聲明和函數(shù)原型v對(duì)被調(diào)用函數(shù)要求:對(duì)被調(diào)用函數(shù)要求:l必須是必須是已存在已存在的函數(shù)的函數(shù)l庫(kù)函數(shù)庫(kù)函數(shù): #include l用戶自定義函數(shù):用戶自定義函數(shù):如果被調(diào)函數(shù)定義如果被調(diào)函數(shù)定義在主調(diào)函數(shù)之后,那么在主調(diào)函數(shù)之后,那么在主調(diào)函數(shù)中在主調(diào)函數(shù)中對(duì)被調(diào)函數(shù)作聲明。對(duì)被調(diào)函數(shù)作聲明。 C語(yǔ)言程序設(shè)計(jì) 第七章第七章 函數(shù)函數(shù)22v函數(shù)聲明函數(shù)聲明l一般形式:一般形式:函數(shù)類型函數(shù)類型 函數(shù)

23、名函數(shù)名(形參類型形參類型 形參名形參名,. ); 或或 函數(shù)類型函數(shù)類型 函數(shù)名函數(shù)名();l作用:告訴編譯系統(tǒng)作用:告訴編譯系統(tǒng)函數(shù)類型、參數(shù)個(gè)數(shù)函數(shù)類型、參數(shù)個(gè)數(shù)及類型,以便檢驗(yàn)及類型,以便檢驗(yàn)l函數(shù)定義函數(shù)定義與與函數(shù)聲明函數(shù)聲明不同,不同,函數(shù)聲明只是函數(shù)聲明只是對(duì)編譯系統(tǒng)的一個(gè)說(shuō)明,通知系統(tǒng)在本函對(duì)編譯系統(tǒng)的一個(gè)說(shuō)明,通知系統(tǒng)在本函數(shù)中所調(diào)用的函數(shù)是什么類型,函數(shù)聲明數(shù)中所調(diào)用的函數(shù)是什么類型,函數(shù)聲明是一個(gè)說(shuō)明語(yǔ)句,必須以是一個(gè)說(shuō)明語(yǔ)句,必須以分號(hào)分號(hào)結(jié)束!結(jié)束! 聲明聲明可以不寫(xiě)可以不寫(xiě)形參名形參名,只寫(xiě),只寫(xiě)形參類型形參類型。v函數(shù)聲明位置:函數(shù)聲明位置:程序的數(shù)據(jù)說(shuō)明部分程

24、序的數(shù)據(jù)說(shuō)明部分(函數(shù)內(nèi)或外)(函數(shù)內(nèi)或外) 聲明是不開(kāi)辟內(nèi)存的,僅僅告訴編譯器,要聲明的部分存在,要預(yù)留一點(diǎn)聲明是不開(kāi)辟內(nèi)存的,僅僅告訴編譯器,要聲明的部分存在,要預(yù)留一點(diǎn)空間。定義則需要開(kāi)辟內(nèi)存。空間。定義則需要開(kāi)辟內(nèi)存。 C語(yǔ)言程序設(shè)計(jì) 第七章第七章 函數(shù)函數(shù)#include void main() float add(float x,float y ); /*對(duì)被調(diào)用函數(shù)的聲明對(duì)被調(diào)用函數(shù)的聲明*/ float a,b,c; scanf(%f,%f,&a,&b); c=add(a,b); printf(sum is %f,c);float add(float x, fl

25、oat y) /*函數(shù)首部函數(shù)首部*/ float z; /*函數(shù)體函數(shù)體 z=x+y; return(z); float add(float,float);例例7.5 對(duì)被調(diào)用的函數(shù)作聲明對(duì)被調(diào)用的函數(shù)作聲明輸入:輸入:3.6 ,6.5輸出:輸出:sum is 10.10000024v說(shuō)明:說(shuō)明:l被調(diào)用函數(shù)的定義(程序)在主調(diào)函數(shù)之后,被調(diào)用函數(shù)的定義(程序)在主調(diào)函數(shù)之后,則則必須在主調(diào)函數(shù)里面,對(duì)被調(diào)函數(shù)進(jìn)行聲明必須在主調(diào)函數(shù)里面,對(duì)被調(diào)函數(shù)進(jìn)行聲明。需要說(shuō)明的是,如果在需要說(shuō)明的是,如果在TC編譯環(huán)境里面,當(dāng)被調(diào)函數(shù)編譯環(huán)境里面,當(dāng)被調(diào)函數(shù)是有返回值,且返回值的數(shù)據(jù)類型是整型或字符型

26、是有返回值,且返回值的數(shù)據(jù)類型是整型或字符型,可以不對(duì)被調(diào)函數(shù)加以聲明??梢圆粚?duì)被調(diào)函數(shù)加以聲明。l被調(diào)用函數(shù)的定義(程序)在主調(diào)函數(shù)之前,被調(diào)用函數(shù)的定義(程序)在主調(diào)函數(shù)之前,可以不加函數(shù)聲明??梢圆患雍瘮?shù)聲明。l在所有函數(shù)定義前,已在函數(shù)外部做了函數(shù)聲在所有函數(shù)定義前,已在函數(shù)外部做了函數(shù)聲明,則在各主調(diào)函數(shù)中可以不加函數(shù)聲明。明,則在各主調(diào)函數(shù)中可以不加函數(shù)聲明。 C語(yǔ)言程序設(shè)計(jì) 第七章第七章 函數(shù)函數(shù)#include float add(float x, float y) float z; z=x+y; return(z);main() float a,b,c; scanf(%f,%

27、f,&a,&b); c=add(a,b); printf(sum is %f,c);void main() float a,b; int max(float x,float y); int c; scanf(%f,%f,&a,&b); c=max(a,b); printf(Max is %dn,c);max(float x, float y) float z; z=xy?x:y; return(z);char letter(char,char);float f(float,float);int I(float,float);main()char letter(c

28、har c1,char c2)float f(float x,float y)Int I(float j,float k) C語(yǔ)言程序設(shè)計(jì) 第七章第七章 函數(shù)函數(shù)main()調(diào)調(diào)fun()結(jié)束結(jié)束fun()返回返回保存:保存:返回地址返回地址當(dāng)前現(xiàn)場(chǎng)當(dāng)前現(xiàn)場(chǎng)恢復(fù):恢復(fù):主調(diào)程序現(xiàn)場(chǎng)主調(diào)程序現(xiàn)場(chǎng)返回地址返回地址函數(shù)調(diào)用的執(zhí)行過(guò)程函數(shù)調(diào)用的執(zhí)行過(guò)程7.5 函數(shù)的嵌套調(diào)用函數(shù)的嵌套調(diào)用 C語(yǔ)言程序設(shè)計(jì) 第七章第七章 函數(shù)函數(shù) 不允許嵌套定義不允許嵌套定義,函數(shù)間的關(guān)系是平行的、獨(dú)立的。,函數(shù)間的關(guān)系是平行的、獨(dú)立的。 C中的函數(shù):中的函數(shù): 允許嵌套調(diào)用允許嵌套調(diào)用,即在調(diào)用某函數(shù)過(guò)程中又調(diào)用另一函

29、數(shù)。,即在調(diào)用某函數(shù)過(guò)程中又調(diào)用另一函數(shù)。main( )調(diào)用函數(shù)調(diào)用函數(shù)a結(jié)束結(jié)束a函數(shù)函數(shù)b函數(shù)函數(shù)調(diào)用函數(shù)調(diào)用函數(shù)b27 C語(yǔ)言程序設(shè)計(jì) 第七章第七章 函數(shù)函數(shù)#include int fun1(int x,int y);void main(void) int a,b; scanf(“%d%d”,&a,&b); printf(“The result is:%dn”,fun1(a,b) );int fun1(int x,int y) int fun2(int m); return ( fun2(x)+fun2(y) );int fun2(int m) return (m*m)

30、;例例 輸入兩個(gè)整數(shù),求平方和輸入兩個(gè)整數(shù),求平方和輸入:輸入: 3 4輸出:輸出: The result is: 25 C語(yǔ)言程序設(shè)計(jì) 第七章第七章 函數(shù)函數(shù)#include int dif(int x,int y,int z); int max(int x,int y,int z); int min(int x,int y,int z);void main() int a,b,c,d; scanf(%d%d%d,&a,&b,&c); d=dif(a,b,c); printf(Max-Min=%dn,d);例例 求三個(gè)數(shù)中最大數(shù)和最小數(shù)的差值求三個(gè)數(shù)中最大數(shù)和最小數(shù)的

31、差值int dif(int x,int y,int z) return max(x,y,z)-min(x,y,z); int max(int x,int y,int z) int r; r=xy?x:y; return(rz?r:z);int min(int x,int y,int z) int r; r=xy?x:y; return(rz?r:z);main( )調(diào)用函數(shù)調(diào)用函數(shù)dif輸出輸出結(jié)束結(jié)束dif函數(shù)函數(shù)max函數(shù)函數(shù)調(diào)用函數(shù)調(diào)用函數(shù)max調(diào)用函數(shù)調(diào)用函數(shù)minmin函數(shù)函數(shù)skip7.6 函數(shù)的遞歸調(diào)用函數(shù)的遞歸調(diào)用遞歸:遞歸:在函數(shù)調(diào)用過(guò)程中,直接或間接的調(diào)用自身。在函數(shù)調(diào)用過(guò)

32、程中,直接或間接的調(diào)用自身。遞歸調(diào)用方式遞歸調(diào)用方式v直接遞歸調(diào)用:直接遞歸調(diào)用:在函數(shù)體內(nèi)又調(diào)用自身在函數(shù)體內(nèi)又調(diào)用自身 C語(yǔ)言程序設(shè)計(jì) 第七章第七章 函數(shù)函數(shù)f( )調(diào)調(diào)fint f(int x) int y,z; z=f(y); . return(2*z);30v間接遞歸調(diào)用:間接遞歸調(diào)用:當(dāng)函數(shù)當(dāng)函數(shù)1去調(diào)用另一函數(shù)去調(diào)用另一函數(shù)2時(shí)時(shí),而而另一函數(shù)另一函數(shù)2反過(guò)來(lái)又調(diào)用函數(shù)反過(guò)來(lái)又調(diào)用函數(shù)1自身。自身。 C語(yǔ)言程序設(shè)計(jì) 第七章第七章 函數(shù)函數(shù)調(diào)調(diào)f2調(diào)調(diào)f1f1( )f2( )int f1(int x) int y,z; z=f2(y); . return(2*z);int f2(i

33、nt t) int a,c; c=f1(a); . return(3+c);v解決無(wú)終止遞歸調(diào)用的方法是:確定好結(jié)束遞解決無(wú)終止遞歸調(diào)用的方法是:確定好結(jié)束遞歸的條件。歸的條件。 條件成立,進(jìn)行遞歸條件成立,進(jìn)行遞歸 用用if語(yǔ)句控制語(yǔ)句控制 條件不成立,結(jié)束遞歸條件不成立,結(jié)束遞歸 C語(yǔ)言程序設(shè)計(jì) 第七章第七章 函數(shù)函數(shù)例例7.7 有有5個(gè)人,第個(gè)人,第5個(gè)人比第個(gè)人比第4個(gè)人大個(gè)人大2歲,第歲,第4個(gè)人比第個(gè)人比第3個(gè)人大個(gè)人大2歲,歲,第第2個(gè)人比第個(gè)人比第1個(gè)人大個(gè)人大2歲,第歲,第1個(gè)人個(gè)人10歲,問(wèn)第歲,問(wèn)第5個(gè)人多大?個(gè)人多大? age(5) age(4) age(3) age(

34、2) age(1) =2+age(4) =2+age(3) =2+age(2) =2+age(1) =10=18 =16 =14 =12 10 n=1數(shù)學(xué)模型:數(shù)學(xué)模型:age(n)= age(n-1)+2 n1age(int n) int c; if(n=1) c=10; else c=2+age(n-1); return(c); #include void main( ) printf(“%d n”, age(5);運(yùn)行結(jié)果:運(yùn)行結(jié)果:18有些問(wèn)題,可以用遞推,也可以用遞歸的方法解決。有些問(wèn)題,可以用遞推,也可以用遞歸的方法解決。v遞推遞推:從一個(gè)從一個(gè)已知的事實(shí)已知的事實(shí)出發(fā)出發(fā),按一定

35、規(guī)律推出下按一定規(guī)律推出下一個(gè)事實(shí)一個(gè)事實(shí),再?gòu)囊阎男碌氖聦?shí)再?gòu)囊阎男碌氖聦?shí),推出下一個(gè)新的推出下一個(gè)新的事實(shí)事實(shí). C語(yǔ)言程序設(shè)計(jì) 第七章第七章 函數(shù)函數(shù)例例 用遞推法求用遞推法求n! ,即從即從1開(kāi)始開(kāi)始, 乘乘2, 乘乘3.一直到一直到n #include void main( ) int i, s=1; for(i=1;i=5;i+) s=s* i; printf(“s=%d n”,s); 運(yùn)行結(jié)果:運(yùn)行結(jié)果:s=12033v遞歸遞歸:在函數(shù)調(diào)用自身時(shí)在函數(shù)調(diào)用自身時(shí),要要給出結(jié)束遞歸的條件給出結(jié)束遞歸的條件。l先回推再遞推先回推再遞推l如:如:n!,!, 5!=5 4! 4!=4

36、 3! 3!=3 2! 2!=2 1! 1!=1 0!=1 C語(yǔ)言程序設(shè)計(jì) 第七章第七章 函數(shù)函數(shù) 1 (n=0,1) n!= n*(n-1)! (n1)#include void main() float fac(int n); int n; float y; printf(Input a integer number:); scanf(%d,&n); y=fac(n); printf(%d! =%15d,n,y);float fac(int n) float f; if(n0) printf(n0,data error!); else if(n=0|n=1) f=1; else f

37、=fac(n-1)*n; return(f);運(yùn)行:運(yùn)行:input a integer number:1010! = 3628800例例7.8 用遞歸方法求用遞歸方法求n! C語(yǔ)言程序設(shè)計(jì) 第七章第七章 函數(shù)函數(shù)例例7.9 Hanoi(漢諾)塔問(wèn)題(漢諾)塔問(wèn)題 BCAv方法與步驟方法與步驟l將將A上上n-1個(gè)盤(pán)子借助個(gè)盤(pán)子借助C移到移到B 。l把把A上剩下一個(gè)盤(pán)子送到上剩下一個(gè)盤(pán)子送到Cl將將n-1個(gè)盤(pán)子從個(gè)盤(pán)子從B借助借助A移到移到C C語(yǔ)言程序設(shè)計(jì) 第七章第七章 函數(shù)函數(shù)BCAv簡(jiǎn)化實(shí)例:簡(jiǎn)化實(shí)例:將將A上上3個(gè)盤(pán)子移到個(gè)盤(pán)子移到C步驟:步驟:1. A上兩個(gè)盤(pán)子借助上兩個(gè)盤(pán)子借助C移到

38、移到B 2. A上最后一個(gè)盤(pán)子移到上最后一個(gè)盤(pán)子移到C (可直接完成)(可直接完成) 3. B上兩個(gè)盤(pán)子借助上兩個(gè)盤(pán)子借助A移到移到C 第一步進(jìn)一步分解:第一步進(jìn)一步分解: 1.1 A上一個(gè)盤(pán)子(上一個(gè)盤(pán)子(紅色紅色)從)從AC 1.2 A上一個(gè)盤(pán)子(上一個(gè)盤(pán)子(藍(lán)色藍(lán)色)從)從AB 1.3 C上一個(gè)盤(pán)子(上一個(gè)盤(pán)子(紅色紅色)從)從CB 第三步進(jìn)一步分解:第三步進(jìn)一步分解: 3.1 B上一個(gè)盤(pán)子(上一個(gè)盤(pán)子(紅色紅色)從)從BA 3.2 B上一個(gè)盤(pán)子(上一個(gè)盤(pán)子(藍(lán)色藍(lán)色)從)從BC3.3 A上一個(gè)盤(pán)子(上一個(gè)盤(pán)子(紅色紅色)從)從AC36v結(jié)論:結(jié)論:上面三個(gè)步驟包含兩類操作上面三個(gè)步驟包

39、含兩類操作l步驟步驟1和和3都是將都是將n-1個(gè)盤(pán)子從一個(gè)個(gè)盤(pán)子從一個(gè)移到另一個(gè)移到另一個(gè)上上(n1時(shí)時(shí)),這是一個(gè)遞歸的過(guò)程;,這是一個(gè)遞歸的過(guò)程;方法一樣,只是針的名方法一樣,只是針的名稱不同而已,為使問(wèn)題一般化,將步驟稱不同而已,為使問(wèn)題一般化,將步驟1和和3表示為:將表示為:將one上的上的n-1個(gè)盤(pán)子移到個(gè)盤(pán)子移到two,借助,借助 three,只是對(duì),只是對(duì)應(yīng)關(guān)系不同。應(yīng)關(guān)系不同。第一步對(duì)應(yīng)關(guān)系:第一步對(duì)應(yīng)關(guān)系:one A two B three C 第三步對(duì)應(yīng)關(guān)系:第三步對(duì)應(yīng)關(guān)系:one B two C three A l將將1個(gè)盤(pán)子從一個(gè)針上移到另一針上。個(gè)盤(pán)子從一個(gè)針上移到另

40、一針上。v因此,可以用兩個(gè)函數(shù)分別實(shí)現(xiàn)上面兩類操作,因此,可以用兩個(gè)函數(shù)分別實(shí)現(xiàn)上面兩類操作,用用hanoi函數(shù)實(shí)現(xiàn)第一類操作,用函數(shù)實(shí)現(xiàn)第一類操作,用move函數(shù)實(shí)現(xiàn)第函數(shù)實(shí)現(xiàn)第二類操作。二類操作。lhanoi(n,one,two,three) 將將n個(gè)盤(pán)從個(gè)盤(pán)從 one three借助借助twolmove(x,y) 將將1個(gè)盤(pán)從個(gè)盤(pán)從x y座,座,x、y根據(jù)情況取代根據(jù)情況取代ABC座中的座中的1個(gè)。個(gè)。 C語(yǔ)言程序設(shè)計(jì) 第七章第七章 函數(shù)函數(shù)37 C語(yǔ)言程序設(shè)計(jì) 第七章第七章 函數(shù)函數(shù)例例7.9 用遞歸方法解決用遞歸方法解決Hanoi(漢諾)塔問(wèn)題的程序(漢諾)塔問(wèn)題的程序 #inclu

41、de void main() void hanoi(int n,char one,char two,char three); int m; printf(Input the number of diskes:); scanf(%d,&m); printf(The step to moving %3d diskes:n,m); hanoi(m,A,B,C);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,

42、three,two); move(one,three); hanoi(n-1,two,one,three); void move(char x, char y) printf(%c-%cn,x, y); 運(yùn)行:運(yùn)行: input number of diskes: 3 the step to moving 3 diskes: A C A B C B A C B A B C A C387.7 數(shù)組作為函數(shù)參數(shù)數(shù)組作為函數(shù)參數(shù)數(shù)組元素作函數(shù)實(shí)參數(shù)組元素作函數(shù)實(shí)參值傳遞值傳遞 C語(yǔ)言程序設(shè)計(jì) 第七章第七章 函數(shù)函數(shù)例例8.10 兩個(gè)數(shù)組比較大小兩個(gè)數(shù)組比較大小 432105a562312107688

43、432105b212343986654n=0m=0k=0in=0m=0k=1in=0m=1k=1in=1m=1k=1in=1m=1k=2in=2m=1k=2in=3m=1k=2n=0m=0k=1n=0m=1k=1n=1m=1k=1n=1m=1k=2n=2m=1k=239 C語(yǔ)言程序設(shè)計(jì) 第七章第七章 函數(shù)函數(shù)#include void main() int large(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); pri

44、ntf(Enter array b:n); for(i=0;i10;i+) scanf(%d,&bi); printf(n); for(i=0;ibi%d timesn”,n); printf(“ai=bi%d timesn”,m); printf(“aik) printf(“array a is larger than array bn”); else if(ny) flag=1; else if(x bi 4 time ai = bi 1 time ai bi 5 time array a is large then array b數(shù)組名可作函數(shù)參數(shù)數(shù)組名可作函數(shù)參數(shù)實(shí)參和形參都用

45、數(shù)組名實(shí)參和形參都用數(shù)組名 C語(yǔ)言程序設(shè)計(jì) 第七章第七章 函數(shù)函數(shù)例例7.11 求學(xué)生的平均成績(jī)求學(xué)生的平均成績(jī) float average(float array10) int i; float aver,sum=array0; for( i=1; i10; i+ ) sum=sum+arrayi; aver=sum/10; return (aver);#include void main() float average(float array10); float score10, aver; int i; printf(Input 10 scores: n); for( i=0; i10;

46、 i+ ) scanf(%f, &scorei); printf(“n”); aver=average(score); printf(Average is: %5.2f, aver);.2109score562312.88array幾點(diǎn)說(shuō)明:幾點(diǎn)說(shuō)明: C語(yǔ)言程序設(shè)計(jì) 第七章第七章 函數(shù)函數(shù)v地址傳遞地址傳遞l調(diào)用函數(shù)時(shí),對(duì)形參數(shù)組元素的操作,調(diào)用函數(shù)時(shí),對(duì)形參數(shù)組元素的操作,實(shí)際上也是對(duì)實(shí)參數(shù)組元素的操作。實(shí)際上也是對(duì)實(shí)參數(shù)組元素的操作。v在主調(diào)函數(shù)與被調(diào)函數(shù)分別定義數(shù)組在主調(diào)函數(shù)與被調(diào)函數(shù)分別定義數(shù)組,且類且類型應(yīng)一致型應(yīng)一致l如:如:array是形參數(shù)組名,是形參數(shù)組名,scor

47、e是實(shí)參數(shù)是實(shí)參數(shù)組名。組名。v形參數(shù)組大小形參數(shù)組大小(多維數(shù)組第一維多維數(shù)組第一維)可不指定可不指定l在定義數(shù)組時(shí)在數(shù)組名后面跟一個(gè)空在定義數(shù)組時(shí)在數(shù)組名后面跟一個(gè)空的方括弧的方括弧lC編譯對(duì)形參數(shù)組大小不檢查,即使編譯對(duì)形參數(shù)組大小不檢查,即使定義了也不起作用。定義了也不起作用。v形參數(shù)組名是形參數(shù)組名是地址變量地址變量 l調(diào)用時(shí),只是將實(shí)參數(shù)組的調(diào)用時(shí),只是將實(shí)參數(shù)組的首地址首地址傳傳給形參數(shù)組,給形參數(shù)組,l 因此因此scoren和和arrayn指的是同一單指的是同一單元元43 C語(yǔ)言程序設(shè)計(jì) 第七章第七章 函數(shù)函數(shù)例例7.12 求兩組學(xué)生的平均成績(jī),求兩組學(xué)生的平均成績(jī),形參數(shù)組長(zhǎng)

48、度缺省形參數(shù)組長(zhǎng)度缺省 #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(“The average of clase A is %6.2fn”,average(score_1,5); printf(“The average of clase B is %6.2fn”,average(score_2,10);float average(

49、float array ,int n) int i; float aver,sum=array0; for( i=1; in; i+ ) sum=sum+arrayi; aver=sum/n; return (aver);運(yùn)行:運(yùn)行:The average of class A is 80.40The average of class B is 78.20v數(shù)組名作函數(shù)參數(shù)時(shí),實(shí)參和形參數(shù)組名作函數(shù)參數(shù)時(shí),實(shí)參和形參兩個(gè)數(shù)組兩個(gè)數(shù)組共占同一段內(nèi)存單元共占同一段內(nèi)存單元,形,形參數(shù)組的元素值改變會(huì)使實(shí)參數(shù)組參數(shù)組的元素值改變會(huì)使實(shí)參數(shù)組元素的值同時(shí)變化。元素的值同時(shí)變化。 C語(yǔ)言程序設(shè)計(jì) 第七章

50、第七章 函數(shù)函數(shù)用多維數(shù)組名作函數(shù)參數(shù)用多維數(shù)組名作函數(shù)參數(shù)v可以用多維數(shù)組名作實(shí)參和形參可以用多維數(shù)組名作實(shí)參和形參v形參數(shù)組定義時(shí),形參數(shù)組定義時(shí),只能省略第一維的大小說(shuō)明只能省略第一維的大小說(shuō)明。lC編譯不檢查第一維的大小,而且數(shù)組名作編譯不檢查第一維的大小,而且數(shù)組名作函數(shù)參數(shù)是地址傳送,所以函數(shù)參數(shù)是地址傳送,所以形參數(shù)組第一維形參數(shù)組第一維大小任意,可以和實(shí)參數(shù)組的維數(shù)不同大小任意,可以和實(shí)參數(shù)組的維數(shù)不同。 如,實(shí)參數(shù)組定義:如,實(shí)參數(shù)組定義:int score510,則,則形參數(shù)組可以定義:形參數(shù)組可以定義:int array310 或或 int array810l合法的定義:

51、合法的定義:int array310; 或或 int array 10l錯(cuò)誤的定義:錯(cuò)誤的定義:int array ; int array3 ; C語(yǔ)言程序設(shè)計(jì) 第七章第七章 函數(shù)函數(shù)50 C語(yǔ)言程序設(shè)計(jì) 第七章第七章 函數(shù)函數(shù)例例7.14 求求34矩陣中各元素的最大值矩陣中各元素的最大值 #include void main()int max_value(int array 4); int a34=1,3,5,7,2,4,6,8,15,17,34,12; printf(max value is %dn,max_value(a);int max_value(int array34) int i

52、,j,k,max; max=array00; for(i=0;i3;i+) for(j=0;jmax) max=arrayij; return(max);多維形參數(shù)組第一維維數(shù)多維形參數(shù)組第一維維數(shù)可省略可省略,第二維必須相同第二維必須相同 int array4 C語(yǔ)言程序設(shè)計(jì) 第七章第七章 函數(shù)函數(shù)例例 求求二維數(shù)組中各行元素之和二維數(shù)組中各行元素之和get_sum_row(int x3, int result ,int row, int col) int i,j; for(i=0;irow;i+) resulti=0; for(j=0;jcol;j+) resulti+=xij;main(

53、) int a23=3,6,9,1,4,7; int sum_row2,row=2,col=3,i; get_sum_row(a,sum_row,row,col); for(i=0;irow;i+) printf(The sum of row%d=%dn,i+1,sum_rowi);314679asum_rowxresult1812527.8 局部變量和全局變量局部變量和全局變量變量按其作用域,可分為局部變量和全局變量。變量按其作用域,可分為局部變量和全局變量。局部變量局部變量?jī)?nèi)部變量?jī)?nèi)部變量v定義:在定義:在函數(shù)內(nèi)定義函數(shù)內(nèi)定義,只在本函數(shù)內(nèi)有效只在本函數(shù)內(nèi)有效v說(shuō)明:說(shuō)明:lmain中定義

54、的變量只在中定義的變量只在main中有效中有效l不同函數(shù)中同名變量,占不同內(nèi)存單元不同函數(shù)中同名變量,占不同內(nèi)存單元l形參屬于局部變量形參屬于局部變量l可定義在可定義在復(fù)合語(yǔ)句復(fù)合語(yǔ)句中有效的變量中有效的變量l局部變量可用存儲(chǔ)類型局部變量可用存儲(chǔ)類型:自動(dòng)型(自動(dòng)型(auto),寄),寄存器型(存器型(register),靜態(tài)型(),靜態(tài)型(static) ,默認(rèn)為默認(rèn)為auto C語(yǔ)言程序設(shè)計(jì) 第七章第七章 函數(shù)函數(shù) C語(yǔ)言程序設(shè)計(jì) 第七章第七章 函數(shù)函數(shù)float f1(int a) int b,c; .char f2(int x,int y) int i,j; main() int m,

55、n; .a,b,c有效有效x,y,i,j有效有效m,n有效有效例例 不同函數(shù)中同名變量不同函數(shù)中同名變量void main() int a,b; a=3; b=4; printf(main:a=%d,b=%dn,a,b); sub(); printf(main:a=%d,b=%dn,a,b);sub() int a,b; a=6; b=7; printf(sub:a=%d,b=%dn,a,b);運(yùn)行結(jié)果:main:a=3,b=4sub:a=6,b=7main:a=3,b=4 C語(yǔ)言程序設(shè)計(jì) 第七章第七章 函數(shù)函數(shù)運(yùn)行結(jié)果:5 4 3 2 1例例 復(fù)合語(yǔ)句中變量復(fù)合語(yǔ)句中變量#define N

56、5void main() int i; int aN=1,2,3,4,5; for(i=0;iN/2;i+) int temp; temp=ai; ai=aN-i-1; aN-i-1=temp; for(i=0;iN;i+) printf(%d ,ai);main() int a, b; int c; c=a+b; a,b 范圍范圍c 范圍范圍全局變量全局變量外部變量外部變量v定義:在定義:在函數(shù)外定義函數(shù)外定義,可為,可為本文件所有本文件所有函數(shù)共用,函數(shù)共用,也叫外部變量。也叫外部變量。v有效范圍:從有效范圍:從定義變量的位置開(kāi)始定義變量的位置開(kāi)始到本到本源文件結(jié)束,及有外部型(源文件結(jié)束

57、,及有外部型(extern)說(shuō)明說(shuō)明的其它源文件的其它源文件v幾點(diǎn)說(shuō)明:幾點(diǎn)說(shuō)明:l全局變量的使用全局變量的使用,增加了函數(shù)間數(shù)據(jù)聯(lián)增加了函數(shù)間數(shù)據(jù)聯(lián)系的渠道系的渠道,同一文件中的所有函數(shù)都能同一文件中的所有函數(shù)都能引用全局變量的值引用全局變量的值,當(dāng)某函數(shù)改變了全當(dāng)某函數(shù)改變了全局變量的值時(shí)局變量的值時(shí),便會(huì)影響其它的函數(shù)。便會(huì)影響其它的函數(shù)。 C語(yǔ)言程序設(shè)計(jì) 第七章第七章 函數(shù)函數(shù)l習(xí)慣上,全局變量名的第一個(gè)字母用習(xí)慣上,全局變量名的第一個(gè)字母用大寫(xiě)。大寫(xiě)。l使用全局變量可以減少函數(shù)的實(shí)參和使用全局變量可以減少函數(shù)的實(shí)參和形參個(gè)數(shù)。形參個(gè)數(shù)。l不必要時(shí)不要使用全局變量不必要時(shí)不要使用全局變

58、量u全局變量在程序執(zhí)行的全過(guò)程都占全局變量在程序執(zhí)行的全過(guò)程都占用存儲(chǔ)單元。用存儲(chǔ)單元。u不利于程序的移植。程序的可讀性不利于程序的移植。程序的可讀性變差。變差。l全局與局部變量重名時(shí),在函數(shù)內(nèi)部全局與局部變量重名時(shí),在函數(shù)內(nèi)部將將屏蔽全局變量屏蔽全局變量。 C語(yǔ)言程序設(shè)計(jì) 第七章第七章 函數(shù)函數(shù)int p=1,q=5;float f1(a)int a; int b,c; .int f3().char c1,c2;char f2(int x,int y) int i,j; main() int m,n; .c1,c2的作用范圍的作用范圍p,q的作用范圍的作用范圍 C語(yǔ)言程序設(shè)計(jì) 第七章第七章

59、函數(shù)函數(shù)例例 全局變量的作用域及其使用情況全局變量的作用域及其使用情況int a=1; f1( ) int b; b=a+3; printf(“f1:a=%d, b=%d n”,a, b); f2( ) int a, b; a=5; b=a+3; printf(“f2: a=%d, b=%d n”,a, b); f3( ) int b; a=6; b=a+3; printf(“f3:a=%d, b=%d n”,a, b); void main( ) int b=3; printf(“1.main : a=%d, b=%d n”,a, b); f1( ); printf(“2.main : a=

60、%d, b=%d n”,a, b); f2( ); printf(“3.main : a=%d, b=%d n”,a, b); f3( ); printf(“4.main : a=%d, b=%d n”,a, b); 運(yùn)行:運(yùn)行: 1.main:a=1, b=3 f1:a=1, b=4 2.main:a=1, b=3 f2:a=5, b=8 3.main:a=1, b=3 f3:a=6, b=94.main:a=6, b=3 C語(yǔ)言程序設(shè)計(jì) 第七章第七章 函數(shù)函數(shù)例例7.15 外部變量與局部變量同名外部變量與局部變量同名#include int a=3,b=5;void main() int max(int a, int b); int a=8; printf(max=%d,max(a,b);int max(int a, int b) int c; c=ab?a:b; return(c);運(yùn)行結(jié)果:運(yùn)行結(jié)果:max=8例例 外部變量副作用外部變量副作用int 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)論