第7章 用函數(shù)實現(xiàn)模塊化程序設(shè)計_第1頁
第7章 用函數(shù)實現(xiàn)模塊化程序設(shè)計_第2頁
第7章 用函數(shù)實現(xiàn)模塊化程序設(shè)計_第3頁
第7章 用函數(shù)實現(xiàn)模塊化程序設(shè)計_第4頁
第7章 用函數(shù)實現(xiàn)模塊化程序設(shè)計_第5頁
已閱讀5頁,還剩103頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、7.1為什么要用函數(shù)為什么要用函數(shù) 7.2怎樣定義函數(shù)怎樣定義函數(shù)7.3調(diào)用函數(shù)調(diào)用函數(shù)7.4對被調(diào)用函數(shù)的聲明和函數(shù)原型對被調(diào)用函數(shù)的聲明和函數(shù)原型7.5函數(shù)的嵌套調(diào)用函數(shù)的嵌套調(diào)用 7.6函數(shù)的遞歸調(diào)用函數(shù)的遞歸調(diào)用7.7數(shù)組作為函數(shù)參數(shù)數(shù)組作為函數(shù)參數(shù) 7.8局部變量和全局變量局部變量和全局變量7.9變量的存儲方式和生存期變量的存儲方式和生存期7.10 關(guān)于變量的聲明和定義關(guān)于變量的聲明和定義7.11 內(nèi)部函數(shù)和外部函數(shù)內(nèi)部函數(shù)和外部函數(shù)問題:問題:u如果程序的功能比較多,規(guī)模比較大,把所有代如果程序的功能比較多,規(guī)模比較大,把所有代碼都寫在碼都寫在main函數(shù)中,就會使主函數(shù)變得龐雜、

2、函數(shù)中,就會使主函數(shù)變得龐雜、頭緒不清,閱讀和維護變得困難頭緒不清,閱讀和維護變得困難u有時程序中要多次實現(xiàn)某一功能,就需要多次重有時程序中要多次實現(xiàn)某一功能,就需要多次重復(fù)編寫實現(xiàn)此功能的程序代碼復(fù)編寫實現(xiàn)此功能的程序代碼,這使程序冗長,這使程序冗長,不精煉不精煉解決的方法:用解決的方法:用模塊化程序設(shè)計的思路模塊化程序設(shè)計的思路u采用采用“組裝組裝”的辦法簡化程序設(shè)計的過程的辦法簡化程序設(shè)計的過程u事先編好一批實現(xiàn)各種不同功能的函數(shù)事先編好一批實現(xiàn)各種不同功能的函數(shù)u把它們保存在函數(shù)庫中把它們保存在函數(shù)庫中,需要時需要時直接用直接用解決的方法:用解決的方法:用模塊化程序設(shè)計的思路模塊化程序

3、設(shè)計的思路u函數(shù)就是功能函數(shù)就是功能u每一個函數(shù)用來實現(xiàn)一個特定的功能每一個函數(shù)用來實現(xiàn)一個特定的功能u函數(shù)的名字應(yīng)反映其代表的功能函數(shù)的名字應(yīng)反映其代表的功能在設(shè)計一個較大的程序時,往往把它分為若干個在設(shè)計一個較大的程序時,往往把它分為若干個程序模塊,每一個模塊包括一個或多個函數(shù),每程序模塊,每一個模塊包括一個或多個函數(shù),每個函數(shù)實現(xiàn)一個特定的功能個函數(shù)實現(xiàn)一個特定的功能程序可由一個主函數(shù)和若干個其他函數(shù)構(gòu)成程序可由一個主函數(shù)和若干個其他函數(shù)構(gòu)成主函數(shù)調(diào)用其他函數(shù),其他函數(shù)也可以互相調(diào)用主函數(shù)調(diào)用其他函數(shù),其他函數(shù)也可以互相調(diào)用同一個函數(shù)可以被一個或多個函數(shù)調(diào)用任意多次同一個函數(shù)可以被一個或

4、多個函數(shù)調(diào)用任意多次一個較大的程序可分為若干個程序模塊程序模塊,每一個模塊用來實現(xiàn)一個特定的功能。在高級語言中用子程序子程序?qū)崿F(xiàn)模塊的功能。子程序由函數(shù)來完成。一個程序可由一個主函數(shù)和若干個其他函數(shù)構(gòu)成。由主函數(shù)調(diào)用其他函數(shù),其他函數(shù)也可以互相調(diào)用。由主函數(shù)調(diào)用其他函數(shù),其他函數(shù)也可以互相調(diào)用。同一個函數(shù)可以被一個或多個函數(shù)調(diào)用任意多次。同一個函數(shù)可以被一個或多個函數(shù)調(diào)用任意多次。函數(shù)間的調(diào)用關(guān)系函數(shù)間的調(diào)用關(guān)系可以使用庫函數(shù)可以使用庫函數(shù)可以使用自己編寫的函數(shù)可以使用自己編寫的函數(shù)在程序設(shè)計中要善于利用函數(shù),可以減少在程序設(shè)計中要善于利用函數(shù),可以減少重復(fù)編寫程序段的工作量,同時可以方便重復(fù)

5、編寫程序段的工作量,同時可以方便地實現(xiàn)模塊化的程序設(shè)計地實現(xiàn)模塊化的程序設(shè)計例例7.1 輸出以下的結(jié)果,用函數(shù)調(diào)用實現(xiàn)。輸出以下的結(jié)果,用函數(shù)調(diào)用實現(xiàn)。 * How do you do! *main()PrintStar();PrintMessage();PrintStar();PrintStar()printf(“*n”);PrintMessage()printf(“ Hellon”);PrintStar函數(shù)PrintMessage函數(shù)main函數(shù)主函數(shù)兩個自定義函數(shù)* Hello*7.2.1 為什么要定義函數(shù)為什么要定義函數(shù)7.2.2 定義函數(shù)的方法定義函數(shù)的方法C語言要求,在程序中用到的

6、所有函數(shù),語言要求,在程序中用到的所有函數(shù),必須必須“先定義,后使用先定義,后使用”指定指定函數(shù)函數(shù)名字名字、函數(shù)、函數(shù)返回值類型返回值類型、函數(shù)、函數(shù)實現(xiàn)的實現(xiàn)的功能功能以及以及參數(shù)的個數(shù)與類型參數(shù)的個數(shù)與類型,將,將這些信息通知編譯系統(tǒng)。這些信息通知編譯系統(tǒng)。指定函數(shù)的名字,以便以后按名調(diào)用指定函數(shù)的名字,以便以后按名調(diào)用指定函數(shù)類型,即函數(shù)返回值的類型指定函數(shù)類型,即函數(shù)返回值的類型指定函數(shù)參數(shù)的名字和類型,以便在調(diào)指定函數(shù)參數(shù)的名字和類型,以便在調(diào)用函數(shù)時向它們傳遞數(shù)據(jù)用函數(shù)時向它們傳遞數(shù)據(jù)指定函數(shù)的功能。這是最重要的,這是指定函數(shù)的功能。這是最重要的,這是在函數(shù)體中解決的在函數(shù)體中解

7、決的對于對于庫函數(shù),程序設(shè)計者只需用庫函數(shù),程序設(shè)計者只需用#include指令把有關(guān)的頭文件包含到指令把有關(guān)的頭文件包含到本文件模塊中即可本文件模塊中即可程序設(shè)計者需要在程序中自己定義想用程序設(shè)計者需要在程序中自己定義想用的而庫函數(shù)并沒有提供的函數(shù)的而庫函數(shù)并沒有提供的函數(shù)函數(shù)定義的一般形式函數(shù)定義的一般形式類型符類型符 函數(shù)名函數(shù)名(形式參數(shù)說明表形式參數(shù)說明表)說明部分說明部分語句部分語句部分函數(shù)首部函數(shù)首部函數(shù)體函數(shù)體完整的函數(shù)定義完整的函數(shù)定義無參函數(shù)定義無參函數(shù)定義空函數(shù)定義空函數(shù)定義int read() int x;scanf(“%d”,&x);return x; o 例

8、7.2實參和形參void main() int a=15,b=20,c;c=max(a+10,b); printf(“Max=%d”,c);int max(int x,int y) int z;z=xy?x:y;return z; main函數(shù)函數(shù)max函數(shù)函數(shù)形參形參實參實參15207.3.1函數(shù)調(diào)用的形式函數(shù)調(diào)用的形式7.3.2函數(shù)調(diào)用時的數(shù)據(jù)傳遞函數(shù)調(diào)用時的數(shù)據(jù)傳遞7.3.3函數(shù)調(diào)用的過程函數(shù)調(diào)用的過程7.3.4函數(shù)的返回值函數(shù)的返回值函數(shù)調(diào)用的一般形式函數(shù)名(實參表) 如果是調(diào)用無參函數(shù),則實參表可以沒有,但括號不能省略。如果實參表包含多個實參,則各參數(shù)之間用逗號隔開。實參與形參的個數(shù)

9、應(yīng)相等,類型應(yīng)一致。實參與形參按順序?qū)?yīng),一一傳遞數(shù)據(jù)。如:p=power(2.5,4);/* ok */q=power(2.5,3.8);/* error */s=power(2.5);/* error */t=power(5,3);/* ok */ 函數(shù)調(diào)用的方式1函數(shù)語句:即把函數(shù)調(diào)用作為一個語句。如:printStar();printf(“*”); 這時不要求函數(shù)帶回值,只要求完成一定的操作,通常將函數(shù)字義為“void”類型。2函數(shù)表達(dá)式:函數(shù)出現(xiàn)在可以寫表達(dá)式的地方,此時需要的是函數(shù)的值。如:1.形式參數(shù)和實際參數(shù)形式參數(shù)和實際參數(shù)u在調(diào)用有參函數(shù)時,主調(diào)函數(shù)和被調(diào)用函在調(diào)用有參函數(shù)

10、時,主調(diào)函數(shù)和被調(diào)用函數(shù)之間有數(shù)據(jù)傳遞關(guān)系數(shù)之間有數(shù)據(jù)傳遞關(guān)系u定義函數(shù)時函數(shù)名后面的變量名稱為定義函數(shù)時函數(shù)名后面的變量名稱為“形形式參數(shù)式參數(shù)”(簡稱(簡稱“形參形參”)u主調(diào)函數(shù)中調(diào)用一個函數(shù)時,函數(shù)名后面主調(diào)函數(shù)中調(diào)用一個函數(shù)時,函數(shù)名后面參數(shù)稱為參數(shù)稱為“實際參數(shù)實際參數(shù)”(簡稱(簡稱“實參實參”)u 實際參數(shù)可以是常量、變量或表達(dá)式實際參數(shù)可以是常量、變量或表達(dá)式2. 實參和形參間的數(shù)據(jù)傳遞實參和形參間的數(shù)據(jù)傳遞u在調(diào)用函數(shù)過程中,系統(tǒng)會把實參的值傳在調(diào)用函數(shù)過程中,系統(tǒng)會把實參的值傳遞給被調(diào)用函數(shù)的形參遞給被調(diào)用函數(shù)的形參u或者說,形參從實參得到一個值或者說,形參從實參得到一個值

11、u該值在函數(shù)調(diào)用期間有效,可以參加該值在函數(shù)調(diào)用期間有效,可以參加被調(diào)被調(diào)函數(shù)中的運算函數(shù)中的運算 例例7.3 輸入兩個整數(shù),要求輸出其中值較輸入兩個整數(shù),要求輸出其中值較大者。要求用函數(shù)來找到大數(shù)。大者。要求用函數(shù)來找到大數(shù)。先編寫先編寫max函數(shù):函數(shù):int max(int x,int y) int z; z=xy?x:y; return(z); 在在max函數(shù)上面函數(shù)上面,再編寫主函數(shù)再編寫主函數(shù)#include int main() int max(int x,int y); int a,b,c; printf(“two integer numbers: ); scanf(“%d,%

12、d”,&a,&b); c=max(a,b); printf(“max is %dn”,c); 實參可以是常量、變量或表達(dá)式實參可以是常量、變量或表達(dá)式 c=max(a,b); (main函數(shù))函數(shù))int max(int x, int y) (max函數(shù))函數(shù)) int z; z=xy?x:y; return(z); 在定義函數(shù)中指定的形參,在未出現(xiàn)函數(shù)在定義函數(shù)中指定的形參,在未出現(xiàn)函數(shù)調(diào)用時,它們并不占內(nèi)存中的存儲單元。調(diào)用時,它們并不占內(nèi)存中的存儲單元。在發(fā)生函數(shù)調(diào)用時,函數(shù)在發(fā)生函數(shù)調(diào)用時,函數(shù)max的形參被臨的形參被臨時分配內(nèi)存單元。時分配內(nèi)存單元。2a3bxy23實

13、參實參形參形參調(diào)用結(jié)束,形參單元被釋放調(diào)用結(jié)束,形參單元被釋放實參單元仍保留并維持原值,沒有改變實參單元仍保留并維持原值,沒有改變?nèi)绻趫?zhí)行一個被調(diào)用函數(shù)時,形參的值如果在執(zhí)行一個被調(diào)用函數(shù)時,形參的值發(fā)生改變,不會改變主調(diào)函數(shù)的實參的值發(fā)生改變,不會改變主調(diào)函數(shù)的實參的值2a3bxy23實參實參形參形參通常,在調(diào)用一個函數(shù)時,都希望被調(diào)函數(shù)通常,在調(diào)用一個函數(shù)時,都希望被調(diào)函數(shù)能返回一個確定的值。這就是函數(shù)的返回值。能返回一個確定的值。這就是函數(shù)的返回值。函數(shù)的返回值是通過返回語句函數(shù)的返回值是通過返回語句return實現(xiàn)實現(xiàn)的,返回語句的形式為:的,返回語句的形式為:return; 或 r

14、eturn 表達(dá)式;前一種形式,函數(shù)返回值是不確定的,這時前一種形式,函數(shù)返回值是不確定的,這時調(diào)用者一般對返回值不感興趣,同時將函數(shù)調(diào)用者一般對返回值不感興趣,同時將函數(shù)說明成說明成void類型。后一種形式,函數(shù)要把類型。后一種形式,函數(shù)要把“表達(dá)式表達(dá)式”的值返回給調(diào)用者。的值返回給調(diào)用者。 在一個函數(shù)中調(diào)用另一個函數(shù)需要具備如在一個函數(shù)中調(diào)用另一個函數(shù)需要具備如下條件:下條件:(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)

15、的應(yīng)的#include指令指令(3) 如果使用自己定義的函數(shù),而該函數(shù)的位如果使用自己定義的函數(shù),而該函數(shù)的位置在調(diào)用它的函數(shù)后面,應(yīng)該聲明置在調(diào)用它的函數(shù)后面,應(yīng)該聲明對被調(diào)函數(shù)的聲明 void main() int a=10,b=20,c; c=max(a,b); printf(“%dn”,c);int max(int x, int y) return xy?x:y;o怎樣使這些信息正確呢?C編譯系統(tǒng)假定: 1、函數(shù)名:max 2、函數(shù)類型:int根據(jù)掃描得知: 3、有兩個參數(shù) 4、每一個參數(shù)的類型均為int該函數(shù)與已知信息相符。由于類型的變化,使該函數(shù)與已知信息不相符。這句有錯誤!o函數(shù)

16、聲明有三種格式:n格式1:函數(shù)類型 函數(shù)名(形參說明表);n格式2:函數(shù)類型 函數(shù)名(形參類型表);n格式3:函數(shù)類型 函數(shù)名( );o如:nint max(int x,int y);nint max(int,int);nint max();o例7.4 求最大值函數(shù)原型#include float max(float x,float y) return xy?x:y;main()float a=10,b=20,c;c=max(a,b);printf(%fn,c);保存:返回地址當(dāng)前現(xiàn)場恢復(fù):主調(diào)程序現(xiàn)場返回地址main( )調(diào)fun( )結(jié)束fun()返回圖7.1 函數(shù)調(diào)用的過程o 練習(xí):1.

17、計算n!的數(shù)學(xué)定義為:請編寫函數(shù)fact()求n!。2.在上題基礎(chǔ)上編寫函數(shù)求 。m與n通過鍵盤輸入,注意判斷m與n的關(guān)系。1)!1(101!nnnnnn或)!( !nmnmCnmo 語言不能嵌套定義函數(shù),但可以嵌套調(diào)用函數(shù),也就是說,在調(diào)用一個函數(shù)的過程中,又調(diào)用另一個函數(shù)。 例例7.5 輸入輸入4個整數(shù),找出其中最大的數(shù)。個整數(shù),找出其中最大的數(shù)。用函數(shù)的嵌套調(diào)用來處理。用函數(shù)的嵌套調(diào)用來處理。解題思路:解題思路:umain中調(diào)用中調(diào)用max4函數(shù),找函數(shù),找4個數(shù)中最大者個數(shù)中最大者umax4中再調(diào)用中再調(diào)用max2,找兩個數(shù)中的大者找兩個數(shù)中的大者umax4中多次調(diào)用中多次調(diào)用max2

18、,可找,可找4個數(shù)中的大個數(shù)中的大者,然后把它作為函數(shù)值返回者,然后把它作為函數(shù)值返回main函數(shù)函數(shù)umain函數(shù)中輸出結(jié)果函數(shù)中輸出結(jié)果#include int main() int max4(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=max4(a,b,c,d); printf(max=%d n,max); return 0; 主函數(shù)主函數(shù)對對max4 函數(shù)聲明函數(shù)聲明輸入輸入4個整數(shù)個整數(shù)

19、調(diào)用后肯定是調(diào)用后肯定是4個數(shù)中最大者個數(shù)中最大者輸出最大者輸出最大者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ù)函數(shù)對對max2 函數(shù)聲明函數(shù)聲明a,b中較大者中較大者a,b,c中較大者中較大者a,b,c,d中最大者中最大者int max2(int a,int b) if(a=b) return a; else return b; 找找a,b中較大者中較大者return(ab?a:b);int ma

20、x4(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); 在調(diào)用一個函數(shù)的過程中又出現(xiàn)直接或間在調(diào)用一個函數(shù)的過程中又出現(xiàn)直接或間接地調(diào)用該函數(shù)本身,稱為函數(shù)的接地調(diào)用該函數(shù)本身,稱為函數(shù)的遞歸調(diào)遞歸調(diào)用用。語言的特點之一就在于允許函數(shù)的遞歸語言的特點之一就在于允許函數(shù)的遞歸調(diào)用。調(diào)用。 例例7.6 有有5個學(xué)生坐在一起個學(xué)生坐在一起

21、u問第問第5個學(xué)生多少歲?他說比第個學(xué)生多少歲?他說比第4個學(xué)生大個學(xué)生大2歲歲u問第問第4個學(xué)生歲數(shù),他說比第個學(xué)生歲數(shù),他說比第3個學(xué)生大個學(xué)生大2歲歲u問第問第3個學(xué)生,又說比第個學(xué)生,又說比第2個學(xué)生大個學(xué)生大2歲歲u問第問第2個學(xué)生,說比第個學(xué)生,說比第1個學(xué)生大個學(xué)生大2歲歲u最后問第最后問第1個學(xué)生,他說是個學(xué)生,他說是10歲歲u請問第請問第5個學(xué)生多大個學(xué)生多大 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 a

22、ge(5) =18 回溯階段回溯階段 遞推階段遞推階段結(jié)束遞歸的條件結(jié)束遞歸的條件#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); 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

23、)=10age(2)=12age(3)=14age(4)=16age(5)=1818例例7.7 用遞歸方法求!。用遞歸方法求!。#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;int fac(int n) int f; if(n0) printf(n0,data error!); else if(n=0 | | n=1) f=1; else f=fac(n-1)

24、*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 例例7.8 Hanoi(漢諾)塔問題。古代有一(漢諾)塔問題。古代有一個梵塔,塔內(nèi)有個梵塔,塔內(nèi)有3個座個座A、B、C,開始時,開始時座上有座上有64個盤子,盤子大小不等,大的個盤子,盤子大小不等,大的在下,小的在上。有一個老和尚想把這在下,

25、小的在上。有一個老和尚想把這64個盤子從座移到座,但規(guī)定每次只允個盤子從座移到座,但規(guī)定每次只允許移動一個盤,且在移動過程中在許移動一個盤,且在移動過程中在3個座個座上都始終保持大盤在下,小盤在上。在移上都始終保持大盤在下,小盤在上。在移動過程中可以利用動過程中可以利用B座。要求編程序輸出座。要求編程序輸出移動一盤子的步驟。移動一盤子的步驟。ABCABC將將63個從個從A到到B第第1個和尚的做法個和尚的做法ABC將將63個從個從A到到B第第1個和尚的做法個和尚的做法ABC將將1個從個從A到到C第第1個和尚的做法個和尚的做法ABC將將1個從個從A到到C第第1個和尚的做法個和尚的做法ABC將將63

26、個從個從B到到C第第1個和尚的做法個和尚的做法ABC將將63個從個從B到到C第第1個和尚的做法個和尚的做法ABC將將62個從個從A到到C第第2個和尚的做法個和尚的做法ABC將將62個從個從A到到C第第2個和尚的做法個和尚的做法ABC將將1個從個從A到到B第第2個和尚的做法個和尚的做法ABC將將1個從個從A到到B第第2個和尚的做法個和尚的做法ABC將將62個從個從C到到B第第2個和尚的做法個和尚的做法ABC將將62個從個從C到到B第第2個和尚的做法個和尚的做法第第3個和尚的做法個和尚的做法第第4個和尚的做法個和尚的做法第第5個和尚的做法個和尚的做法第第6個和尚的做法個和尚的做法第第7個和尚的做法

27、個和尚的做法第第63個和尚的做法個和尚的做法第第64個和尚僅做:將個和尚僅做:將1個從個從A移到移到CABC將將3個盤子從個盤子從A移到移到C的全過程的全過程將將2個盤子從個盤子從A移到移到BABC將將3個盤子從個盤子從A移到移到C的全過程的全過程將將2個盤子從個盤子從A移到移到BABC將將3個盤子從個盤子從A移到移到C的全過程的全過程將將1個盤子從個盤子從A移到移到CABC將將3個盤子從個盤子從A移到移到C的全過程的全過程將將1個盤子從個盤子從A移到移到CABC將將3個盤子從個盤子從A移到移到C的全過程的全過程將將2個盤子從個盤子從B移到移到CABC將將3個盤子從個盤子從A移到移到C的全過程

28、的全過程將將2個盤子從個盤子從B移到移到CABC將將2個盤子從個盤子從A移到移到B的過程的過程將將1個盤子從個盤子從A移到移到CABC將將2個盤子從個盤子從A移到移到B的過程的過程將將1個盤子從個盤子從A移到移到CABC將將2個盤子從個盤子從A移到移到B的過程的過程將將1個盤子從個盤子從A移到移到BABC將將2個盤子從個盤子從A移到移到B的過程的過程將將1個盤子從個盤子從A移到移到BABC將將2個盤子從個盤子從A移到移到B的過程的過程將將1個盤子從個盤子從C移到移到BABC將將2個盤子從個盤子從A移到移到B的過程的過程將將1個盤子從個盤子從C移到移到BABC將將2個盤子從個盤子從B移到移到C的

29、過程的過程ABC將將2個盤子從個盤子從B移到移到C的過程的過程ABC將將2個盤子從個盤子從B移到移到C的過程的過程ABC將將2個盤子從個盤子從B移到移到C的過程的過程由上面的分析可知:將由上面的分析可知:將n個盤子從個盤子從A座移座移到到C座可以分解為以下座可以分解為以下3個步驟:個步驟:(1) 將將A上上n-1個盤借助個盤借助C座先移到座先移到B座上座上(2) 把把A座上剩下的一個盤移到座上剩下的一個盤移到C座上座上(3) 將將n-1個盤從個盤從B座借助于座移到座借助于座移到C座上座上#include int main() void hanoi(int n,char one, char tw

30、o,char three); int m; printf(“the number of diskes:); scanf(%d,&m); printf(move %d 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,three,two); move(one,three); hanoi(n-1,two,one,three); void move(ch

31、ar x,char y) printf(%c-%cn,x,y); 7.7.1數(shù)組元素作函數(shù)實參數(shù)組元素作函數(shù)實參7.7.2數(shù)組名作函數(shù)參數(shù)數(shù)組名作函數(shù)參數(shù)7.7.3多維數(shù)組名作函數(shù)參數(shù)多維數(shù)組名作函數(shù)參數(shù) 例例7.8 輸入輸入10個數(shù),要求輸出其中值個數(shù),要求輸出其中值最大的元素和該數(shù)是第幾個數(shù)。最大的元素和該數(shù)是第幾個數(shù)。#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); for

32、(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“,n+1);int max(int x,int y) return(xy?x:y); 除了可以用數(shù)組元素作為函數(shù)參數(shù)外,除了可以用數(shù)組元素作為函數(shù)參數(shù)外,還可以用數(shù)組名作函數(shù)參數(shù)還可以用數(shù)組名作函數(shù)參數(shù)(包括實參包括實參和形參和形參)用數(shù)組元素作實參時,向形參變量傳用數(shù)組元素作實參時,向形參變量傳遞的是數(shù)組元素的值遞的是數(shù)組元素的值用數(shù)組名作函數(shù)實參時,向形參用數(shù)組名作函數(shù)實參時,向形參 傳遞傳遞的是數(shù)組首元素的

33、地址的是數(shù)組首元素的地址 例例7.9 有一個一維數(shù)組有一個一維數(shù)組score,內(nèi)放,內(nèi)放10個學(xué)生成績,求平均成績。個學(xué)生成績,求平均成績。#include int main() float 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ù)組定義實參數(shù)組float averag

34、e(float array10) int i; float aver,sum=array0; for(i=1;i10;i+) sum=sum+arrayi; aver=sum/10; return(aver);定義形參數(shù)組定義形參數(shù)組相當(dāng)于相當(dāng)于score0相當(dāng)于相當(dāng)于scorei 例例7.10用選擇法對數(shù)組中用選擇法對數(shù)組中10個整數(shù)按由個整數(shù)按由小到大排序。小到大排序。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 int main() void sort(int arra

35、y,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; 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; arrayk=arrayi; ar

36、rayi=t; 在在sortisort9中,中,最小數(shù)與最小數(shù)與sorti對換對換 例例7.11 有一個的矩陣,求所有有一個的矩陣,求所有元素中的最大值。元素中的最大值。#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ù)組第形參數(shù)組第二二維大小維大小相同相同int max_value(int array4) int i,j,max;

37、 max = array00; for (i=0;i3;i+) for(j=0;jmax) max = arrayij; return (max);要與實參要與實參數(shù)組第數(shù)組第二二維大小維大小相同相同7.8.1 局部變量局部變量7.8.2 全局變量全局變量定義變量可能有三種情況:定義變量可能有三種情況:u在函數(shù)的開頭定義在函數(shù)的開頭定義u在函數(shù)內(nèi)的復(fù)合語句內(nèi)定義在函數(shù)內(nèi)的復(fù)合語句內(nèi)定義u在函數(shù)的外部定義在函數(shù)的外部定義SOUTHWEST UNIVERSITY OF SCIENCE AND TECHNOLOGYchar ch;double fun2(char c) float b;ch=c;int x;main() int m,n; 在函數(shù)內(nèi)部說明的變量是局部變量。作用域:自說明位置起至函數(shù)結(jié)束止。在函數(shù)外部說明的變量是全局部變量。作用域:自說明位置起至文件結(jié)束止。SOUTHWEST UNIVERSITY OF SCIENCE AND TECHNOLOGYo 在定義一個變量時,除了指定其數(shù)據(jù)類型外,還可以指定其存儲類別。o C語言中用四個關(guān)鍵字來表示存儲類別:n auto 自動的n register寄存器的n static 靜態(tài)的n extern 外部的 SOUTHWEST UNIVERSITY OF SCIENCE AND TECHNOL

溫馨提示

  • 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

提交評論