




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、燕山大學經濟管理學院燕山大學經濟管理學院7.1為什么要用函數為什么要用函數 7.2怎樣定義函數怎樣定義函數7.3調用函數調用函數7.4對被調用函數的聲明和函數原型對被調用函數的聲明和函數原型7.5函數的嵌套調用函數的嵌套調用 7.6函數的遞歸調用函數的遞歸調用7.7數組作為函數參數數組作為函數參數 7.8局部變量和全局變量局部變量和全局變量7.9變量的存儲方式和生存期變量的存儲方式和生存期7.10 關于變量的聲明和定義關于變量的聲明和定義7.11 內部函數和外部函數內部函數和外部函數燕山大學經濟管理學院燕山大學經濟管理學院問題:問題:u如果程序的功能比較多,規模比較大,把所有代如果程序的功能比
2、較多,規模比較大,把所有代碼都寫在碼都寫在main函數中,就會使主函數變得龐雜、函數中,就會使主函數變得龐雜、頭緒不清,閱讀和維護變得困難頭緒不清,閱讀和維護變得困難u有時程序中要多次實現某一功能,就需要多次重有時程序中要多次實現某一功能,就需要多次重復編寫實現此功能的程序代碼復編寫實現此功能的程序代碼,這使程序冗長,這使程序冗長,不精煉不精煉燕山大學經濟管理學院燕山大學經濟管理學院解決的方法:用解決的方法:用模塊化程序設計的思路模塊化程序設計的思路u采用采用“組裝組裝”的辦法簡化程序設計的過程的辦法簡化程序設計的過程u事先編好一批實現各種不同功能的函數事先編好一批實現各種不同功能的函數u把它
3、們保存在函數庫中把它們保存在函數庫中,需要時需要時直接用直接用燕山大學經濟管理學院燕山大學經濟管理學院解決的方法:用解決的方法:用模塊化程序設計的思路模塊化程序設計的思路u函數就是功能函數就是功能u每一個函數用來實現一個特定的功能每一個函數用來實現一個特定的功能u函數的名字應反映其代表的功能函數的名字應反映其代表的功能燕山大學經濟管理學院燕山大學經濟管理學院在設計一個較大的程序時,往往把它分為若干個在設計一個較大的程序時,往往把它分為若干個程序模塊,每一個模塊包括一個或多個函數,每程序模塊,每一個模塊包括一個或多個函數,每個函數實現一個特定的功能個函數實現一個特定的功能程序可由一個主函數和若干
4、個其他函數構成程序可由一個主函數和若干個其他函數構成主函數調用其他函數,其他函數也可以互相調用主函數調用其他函數,其他函數也可以互相調用同一個函數可以被一個或多個函數調用任意多次同一個函數可以被一個或多個函數調用任意多次燕山大學經濟管理學院燕山大學經濟管理學院mainabcfghdeie燕山大學經濟管理學院燕山大學經濟管理學院可以使用庫函數可以使用庫函數可以使用自己編寫的函數可以使用自己編寫的函數在程序設計中要善于利用函數,可以減少在程序設計中要善于利用函數,可以減少重復編寫程序段的工作量,同時可以方便重復編寫程序段的工作量,同時可以方便地實現模塊化的程序設計地實現模塊化的程序設計燕山大學經濟
5、管理學院燕山大學經濟管理學院例例7.1 輸出以下的結果,用函數調用實現。輸出以下的結果,用函數調用實現。 * How do you do! *燕山大學經濟管理學院燕山大學經濟管理學院解題思路:解題思路:u在輸出的文字上下分別有一行在輸出的文字上下分別有一行“*”號,顯然不號,顯然不必重復寫這段代碼,用一個函數必重復寫這段代碼,用一個函數print_star來來實現輸出一行實現輸出一行“*”號的功能。號的功能。u再寫一個再寫一個print_message函數來輸出中間一函數來輸出中間一行文字信息行文字信息u用主函數分別調用這兩個函數用主函數分別調用這兩個函數燕山大學經濟管理學院燕山大學經濟管理學
6、院#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”); 輸出輸出16個個*輸出一行文字輸出一行文字燕山大學經濟管理學院燕山大學經濟管理學院#include int main() void print_star(); void print_message(); p
7、rint_star(); print_message(); print_star(); return 0;void print_star() printf(“*n”); void print_message() printf(“ How do you do!n”); 聲明函數聲明函數定義函數定義函數燕山大學經濟管理學院燕山大學經濟管理學院#include int main() void print_star(); void print_message(); print_star(); print_message(); print_star(); return 0;void print_star
8、() printf(“*n”); void print_message() printf(“ How do you do!n”); 燕山大學經濟管理學院燕山大學經濟管理學院說明:說明: (1) 一個程序由一個或多個程序模塊組成,一個程序由一個或多個程序模塊組成,每一個程序模塊作為一個源程序文件。對較大每一個程序模塊作為一個源程序文件。對較大的程序,一般不希望把所有內容全放在一個文的程序,一般不希望把所有內容全放在一個文件中,而是將它們分別放在若干個源文件中,件中,而是將它們分別放在若干個源文件中,由若干個源程序文件組成一個由若干個源程序文件組成一個C程序。這樣便程序。這樣便于分別編寫、分別編譯
9、,提高調試效率。一個于分別編寫、分別編譯,提高調試效率。一個源程序文件可以為多個源程序文件可以為多個C程序共用。程序共用。燕山大學經濟管理學院燕山大學經濟管理學院說明:說明: (2) 一個源程序文件由一個或多個函數以及其一個源程序文件由一個或多個函數以及其他有關內容(如預處理指令、數據聲明與定義他有關內容(如預處理指令、數據聲明與定義等)組成。一個源程序文件是一個編譯單位,等)組成。一個源程序文件是一個編譯單位,在程序編譯時是以源程序文件為單位進行編譯在程序編譯時是以源程序文件為單位進行編譯的,而不是以函數為單位進行編譯的。的,而不是以函數為單位進行編譯的。燕山大學經濟管理學院燕山大學經濟管理
10、學院說明:說明: (3) 程序的執行是從程序的執行是從main函數開始的,如函數開始的,如果在果在main函數中調用其他函數,在調用后流函數中調用其他函數,在調用后流程返回到程返回到main函數,在函數,在main函數中結束整函數中結束整個程序的運行。個程序的運行。燕山大學經濟管理學院燕山大學經濟管理學院說明:說明: (4) 所有函數都是平行的,即在定義函數時是所有函數都是平行的,即在定義函數時是分別進行的,是互相獨立的。一個函數并不從分別進行的,是互相獨立的。一個函數并不從屬于另一個函數,即函數不能嵌套定義。函數屬于另一個函數,即函數不能嵌套定義。函數間可以互相調用,但不能調用間可以互相調用
11、,但不能調用main函數。函數。main函數是被操作系統調用的。函數是被操作系統調用的。燕山大學經濟管理學院燕山大學經濟管理學院說明:說明: (5) 從用戶使用的角度看,函數有兩種。從用戶使用的角度看,函數有兩種。u庫函數,它是由系統提供的,用戶不必自己定庫函數,它是由系統提供的,用戶不必自己定義而直接使用它們。應該說明,不同的義而直接使用它們。應該說明,不同的C語言語言編譯系統提供的庫函數的數量和功能會有一些編譯系統提供的庫函數的數量和功能會有一些不同,當然許多基本的函數是共同的。不同,當然許多基本的函數是共同的。u用戶自己定義的函數。它是用以解決用戶專門用戶自己定義的函數。它是用以解決用戶
12、專門需要的函數。需要的函數。燕山大學經濟管理學院燕山大學經濟管理學院說明:說明:(6) 從函數的形式看,函數分兩類。從函數的形式看,函數分兩類。 無參函數。無參函數一般用來執行指定的一無參函數。無參函數一般用來執行指定的一組操作。無參函數可以帶回或不帶回函數值,組操作。無參函數可以帶回或不帶回函數值,但一般以不帶回函數值的居多。但一般以不帶回函數值的居多。 有參函數。在調用函數時,主調函數在調有參函數。在調用函數時,主調函數在調用被調用函數時,通過參數向被調用函數傳遞用被調用函數時,通過參數向被調用函數傳遞數據,一般情況下,執行被調用函數時會得到數據,一般情況下,執行被調用函數時會得到一個函數
13、值,供主調函數使用。一個函數值,供主調函數使用。燕山大學經濟管理學院燕山大學經濟管理學院7.2.1 為什么要定義函數為什么要定義函數7.2.2 定義函數的方法定義函數的方法燕山大學經濟管理學院燕山大學經濟管理學院C語言要求,在程序中用到的所有函數,語言要求,在程序中用到的所有函數,必須必須“先定義,后使用先定義,后使用”指定指定函數函數名字名字、函數、函數返回值類型返回值類型、函數、函數實現的實現的功能功能以及以及參數的個數與類型參數的個數與類型,將,將這些信息通知編譯系統。這些信息通知編譯系統。燕山大學經濟管理學院燕山大學經濟管理學院指定函數的名字,以便以后按名調用指定函數的名字,以便以后按
14、名調用指定函數類型,即函數返回值的類型指定函數類型,即函數返回值的類型指定函數參數的名字和類型,以便在調指定函數參數的名字和類型,以便在調用函數時向它們傳遞數據用函數時向它們傳遞數據指定函數的功能。這是最重要的,這是指定函數的功能。這是最重要的,這是在函數體中解決的在函數體中解決的燕山大學經濟管理學院燕山大學經濟管理學院對于庫函數,程序設計者只需用對于庫函數,程序設計者只需用#include指令把有關的頭文件包含到指令把有關的頭文件包含到本文件模塊中即可本文件模塊中即可程序設計者需要在程序中自己定義想用程序設計者需要在程序中自己定義想用的而庫函數并沒有提供的函數的而庫函數并沒有提供的函數燕山大
15、學經濟管理學院燕山大學經濟管理學院1.定義無參函數定義無參函數定義無參函數的一般形式為定義無參函數的一般形式為:類型名類型名 函數名函數名(void) 函數體函數體 類型名類型名 函數名函數名() 函數體函數體 包括聲明部分包括聲明部分和語句部分和語句部分包括聲明部分和包括聲明部分和語句部分語句部分燕山大學經濟管理學院燕山大學經濟管理學院1.定義無參函數定義無參函數定義無參函數的一般形式為定義無參函數的一般形式為:類型名類型名 函數名函數名(void) 函數體函數體 類型名類型名 函數名函數名() 函數體函數體 指定函數指定函數值的類型值的類型指定函數指定函數值的類型值的類型燕山大學經濟管理學
16、院燕山大學經濟管理學院2.定義有參函數定義有參函數定義有參函數的一般形式為定義有參函數的一般形式為:類型名類型名 函數名(形式參數表列)函數名(形式參數表列) 函數體函數體 燕山大學經濟管理學院燕山大學經濟管理學院3. 定義空函數定義空函數定義定義空空函數的一般形式為函數的一般形式為:類型名類型名 函數名(函數名( ) 先用空函數占一個位置,以后先用空函數占一個位置,以后逐步逐步擴充擴充好處:好處:程序結構清楚,可讀性好,以后程序結構清楚,可讀性好,以后擴充新功能方便,對程序結構影響不大擴充新功能方便,對程序結構影響不大燕山大學經濟管理學院燕山大學經濟管理學院7.3.1函數調用的形式函數調用的
17、形式7.3.2函數調用時的數據傳遞函數調用時的數據傳遞7.3.3函數調用的過程函數調用的過程7.3.4函數的返回值函數的返回值燕山大學經濟管理學院燕山大學經濟管理學院函數調用的一般形式為:函數調用的一般形式為: 函數名(實參表列)函數名(實參表列)如果是調用無參函數,則如果是調用無參函數,則“實參表列實參表列”可以沒有,但括號不能省略可以沒有,但括號不能省略如果實參表列包含多個實參,則各參數如果實參表列包含多個實參,則各參數間用逗號隔開間用逗號隔開燕山大學經濟管理學院燕山大學經濟管理學院按函數調用在程序中出現的形式和位置按函數調用在程序中出現的形式和位置來分,可以有以下來分,可以有以下3種函數
18、調用方式種函數調用方式:. 函數調用語句函數調用語句把函數調用單獨作為一個語句把函數調用單獨作為一個語句 如如printf_star();這時不要求函數帶回值,只要求函數完這時不要求函數帶回值,只要求函數完成一定的操作成一定的操作燕山大學經濟管理學院燕山大學經濟管理學院按函數調用在程序中出現的形式和位置按函數調用在程序中出現的形式和位置來分,可以有以下來分,可以有以下3種函數調用方式種函數調用方式:. 函數表達式函數表達式函數調用出現在另一個表達式中函數調用出現在另一個表達式中 如如c=max(a,b);這時要求函數帶回一個確定的值以參加這時要求函數帶回一個確定的值以參加表達式的運算表達式的運
19、算燕山大學經濟管理學院燕山大學經濟管理學院按函數調用在程序中出現的形式和位置按函數調用在程序中出現的形式和位置來分,可以有以下來分,可以有以下3種函數調用方式種函數調用方式:. 函數參數函數參數函數調用作為另一函數調用時的實參函數調用作為另一函數調用時的實參 如如mmax(a,max(b,c);其中其中max(b,c)是一次函數調用,它的是一次函數調用,它的值作為值作為max另一次調用的實參另一次調用的實參燕山大學經濟管理學院燕山大學經濟管理學院1.形式參數和實際參數形式參數和實際參數u在調用有參函數時,主調函數和被調用函在調用有參函數時,主調函數和被調用函數之間有數據傳遞關系數之間有數據傳遞
20、關系u定義函數時函數名后面的變量名稱為定義函數時函數名后面的變量名稱為“形形式參數式參數”(簡稱(簡稱“形參形參”)u主調函數中調用一個函數時,函數名后面主調函數中調用一個函數時,函數名后面參數稱為參數稱為“實際參數實際參數”(簡稱(簡稱“實參實參”)u 實際參數可以是常量、變量或表達式實際參數可以是常量、變量或表達式燕山大學經濟管理學院燕山大學經濟管理學院2. 實參和形參間的數據傳遞實參和形參間的數據傳遞u在調用函數過程中,系統會把實參的值傳在調用函數過程中,系統會把實參的值傳遞給被調用函數的形參遞給被調用函數的形參u或者說,形參從實參得到一個值或者說,形參從實參得到一個值u該值在函數調用期
21、間有效,可以參加該值在函數調用期間有效,可以參加被調被調函數中的運算函數中的運算燕山大學經濟管理學院燕山大學經濟管理學院 例例7.2 輸入兩個整數,要求輸出其中值較輸入兩個整數,要求輸出其中值較大者。要求用函數來找到大數。大者。要求用函數來找到大數。解題思路:解題思路:(1)函數名應是見名知意,今定名為函數名應是見名知意,今定名為max(2) 由于給定的兩個數是整數,返回主調函數的由于給定的兩個數是整數,返回主調函數的值值(即較大數)(即較大數)應該是整型應該是整型(3)max函數應當有兩個參數,以便從主函數接函數應當有兩個參數,以便從主函數接收兩個整數,收兩個整數,因此因此參數的類型應當是整
22、型參數的類型應當是整型燕山大學經濟管理學院燕山大學經濟管理學院先編寫先編寫max函數:函數:int max(int x,int y) int z; z=xy?x:y; return(z); 燕山大學經濟管理學院燕山大學經濟管理學院在在max函數上面函數上面,再編寫主函數再編寫主函數#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); 實參可以是常量、
23、變量或表達式實參可以是常量、變量或表達式燕山大學經濟管理學院燕山大學經濟管理學院 c=max(a,b); (main函數)函數)int max(int x, int y) (max函數)函數) int z; z=xy?x:y; return(z); 燕山大學經濟管理學院燕山大學經濟管理學院在定義函數中指定的形參,在未出現函數在定義函數中指定的形參,在未出現函數調用時,它們并不占內存中的存儲單元。調用時,它們并不占內存中的存儲單元。在發生函數調用時,函數在發生函數調用時,函數max的形參被臨的形參被臨時分配內存單元。時分配內存單元。2a3bxy23實參實參形參形參燕山大學經濟管理學院燕山大學經濟
24、管理學院調用結束,形參單元被釋放調用結束,形參單元被釋放實參單元仍保留并維持原值,沒有改變實參單元仍保留并維持原值,沒有改變如果在執行一個被調用函數時,形參的值如果在執行一個被調用函數時,形參的值發生改變,不會改變主調函數的實參的值發生改變,不會改變主調函數的實參的值2a3bxy23實參實參形參形參燕山大學經濟管理學院燕山大學經濟管理學院 通常,希望通過函數調用使主調函數能通常,希望通過函數調用使主調函數能得到一個確定的值,這就是函數值得到一個確定的值,這就是函數值(函數函數的返回值的返回值)函數的返回值是通過函數中的函數的返回值是通過函數中的return語語句獲得的。句獲得的。u一個函數中可
25、以有一個以上的一個函數中可以有一個以上的return語句,語句,執行到哪一個執行到哪一個return語句,哪一個語句,哪一個就就起作用起作用ureturn語句后面的括號可以不要語句后面的括號可以不要燕山大學經濟管理學院燕山大學經濟管理學院通常,希望通過函數調用使主調函數能得通常,希望通過函數調用使主調函數能得到一個確定的值,這就是函數值到一個確定的值,這就是函數值(函數的返函數的返回值回值)(2) 函數值的類型。應當在定義函數時指定函數值的類型。應當在定義函數時指定函數值的類型函數值的類型燕山大學經濟管理學院燕山大學經濟管理學院通常,希望通過函數調用使主調函數能得通常,希望通過函數調用使主調函
26、數能得到一個確定的值,這就是函數值到一個確定的值,這就是函數值(函數的返函數的返回值回值)(3)在定義函數時指定的函數類型一般應該在定義函數時指定的函數類型一般應該和和return語句中的表達式類型一致語句中的表達式類型一致u如果函數值的類型和如果函數值的類型和return語句中表達式的語句中表達式的值不一致,則以函數類型為準值不一致,則以函數類型為準燕山大學經濟管理學院燕山大學經濟管理學院例例7.3將例將例7.2稍作改動,將在稍作改動,將在max函數中定函數中定義的變量義的變量z改為改為float型。函數返回值的類型型。函數返回值的類型與指定的函數類型不同,分析其處理方法。與指定的函數類型不
27、同,分析其處理方法。解題思路:如果函數返回值的類型與指定解題思路:如果函數返回值的類型與指定的函數類型不同,按照賦值規則處理。的函數類型不同,按照賦值規則處理。燕山大學經濟管理學院燕山大學經濟管理學院#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.62
28、.62變為變為2燕山大學經濟管理學院燕山大學經濟管理學院在一個函數中調用另一個函數需要具備如在一個函數中調用另一個函數需要具備如下條件:下條件:(1) 被調用函數必須是已經定義的函數(是庫被調用函數必須是已經定義的函數(是庫函數或用戶自己定義的函數)函數或用戶自己定義的函數)(2) 如果使用庫函數,應該在本文件開頭如果使用庫函數,應該在本文件開頭加相加相應的應的#include指令指令(3) 如果使用自己定義的函數,而該函數的位如果使用自己定義的函數,而該函數的位置在調用它的函數后面,應該聲明置在調用它的函數后面,應該聲明燕山大學經濟管理學院燕山大學經濟管理學院 例例7.4 輸入兩個實數,用一
29、個函數求出它輸入兩個實數,用一個函數求出它們之和。們之和。解題思路:用解題思路:用add函數實現。首先要定義函數實現。首先要定義add函數,它為函數,它為float型,它應有兩個參型,它應有兩個參數,也應為數,也應為float型。特別要注意的是:型。特別要注意的是:要對要對add函數進行聲明。函數進行聲明。燕山大學經濟管理學院燕山大學經濟管理學院分別編寫分別編寫add函數和函數和main函數,它們組函數,它們組成一個源程序文件成一個源程序文件main函數的位置在函數的位置在add函數之前函數之前在在main函數中對函數中對add函數進行聲明函數進行聲明燕山大學經濟管理學院燕山大學經濟管理學院#
30、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); 求兩個實數之和,求兩個實數之和,函數值也是實型函數值也是實型對對add函數聲明函數聲明燕山大學經濟管理學院燕山大學經濟管理學院#include int main()
31、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); 只差一個分號只差一個分號燕山大學經濟管理學院燕山大學經濟管理學院#include int main() float add(float x, float y); float a,b,c; printf(P
32、lease 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); 定義定義add函數函數調用調用add函數函數燕山大學經濟管理學院燕山大學經濟管理學院函數原型的一般形式有兩種函數原型的一般形式有兩種:如如 float add(float x, float y); float add(float, float);原型說明可以放在文件的開頭,這時所有原型說明可以放在文件的
33、開頭,這時所有函數都可以使用此函數函數都可以使用此函數燕山大學經濟管理學院燕山大學經濟管理學院練習:練習:以下說法正確的是(以下說法正確的是( )A 實參可以是常量、變量或表達式實參可以是常量、變量或表達式B 形參可以是常量、變量或表達式形參可以是常量、變量或表達式 C 實參可以為任意類型實參可以為任意類型D 形參應與其對應的實參類型一致形參應與其對應的實參類型一致 燕山大學經濟管理學院燕山大學經濟管理學院練習:練習:以下正確的函數形式是(以下正確的函數形式是( )A. double fun(int x,int y) z=x+y;return z; B. fun(int x,y) int z;
34、return z; C. fun(x,y) int x,y; double z; z=x+y; retun z; D. double fun(int x,int y) double z;z=x+y;return z; 燕山大學經濟管理學院燕山大學經濟管理學院練習:練習:語言規定,函數返回值的類型是由語言規定,函數返回值的類型是由()().return語句中的表達式類型所決定語句中的表達式類型所決定B.調用該函數時的主調函數類型所決定調用該函數時的主調函數類型所決定C.調用該函數時系統臨時決定調用該函數時系統臨時決定D.在定義該函數時所指定的函數類型所決定在定義該函數時所指定的函數類型所決定燕山
35、大學經濟管理學院燕山大學經濟管理學院語言的函數定義是互相平行、獨立的語言的函數定義是互相平行、獨立的即函數不能嵌套定義即函數不能嵌套定義但可以嵌套調用函數但可以嵌套調用函數即調用一個函數的過程中,又可以調用另即調用一個函數的過程中,又可以調用另一個函數一個函數燕山大學經濟管理學院燕山大學經濟管理學院main函數函數調用調用a函數函數結束結束a函數函數調用調用b函數函數b函數函數燕山大學經濟管理學院燕山大學經濟管理學院 例例7.5 輸入輸入4個整數,找出其中最大的數。個整數,找出其中最大的數。用函數的嵌套調用來處理。用函數的嵌套調用來處理。解題思路:解題思路:umain中調用中調用max4函數,
36、找函數,找4個數中最大者個數中最大者umax4中再調用中再調用max2,找兩個數中的大者找兩個數中的大者umax4中多次調用中多次調用max2,可找,可找4個數中的大個數中的大者,然后把它作為函數值返回者,然后把它作為函數值返回main函數函數umain函數中輸出結果函數中輸出結果燕山大學經濟管理學院燕山大學經濟管理學院#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,&
37、amp;d); max=max4(a,b,c,d); printf(max=%d n,max); return 0; 主函數主函數對對max4 函數聲明函數聲明燕山大學經濟管理學院燕山大學經濟管理學院#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; 主函
38、數主函數輸入輸入4個整數個整數燕山大學經濟管理學院燕山大學經濟管理學院#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; 主函數主函數調用后肯定是調用后肯定是4個數中最大者個數中最大者輸出最大者輸出最大者燕山大學經濟管理學院燕山大學經濟管理學院int ma
39、x4(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函數函數對對max2 函數聲明函數聲明燕山大學經濟管理學院燕山大學經濟管理學院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函數函數a,b中較大者中較大者a,b,c中較大者中較大者a,b
40、,c,d中最大者中最大者燕山大學經濟管理學院燕山大學經濟管理學院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函數函數int max2(int a,int b) if(a=b) return a; else return b; max2函數函數找找a,b中較大者中較大者燕山大學經濟管理學院燕山大學經濟管理學院int max4(int a,int b,int c,int d) int max2(int a,i
41、nt b); int m; m=max2(a,b); m=max2(m,c); m=max2(m,d); return(m); max4函數函數int max2(int a,int b) if(a=b) return a; else return b; max2函數函數return(ab?a:b);燕山大學經濟管理學院燕山大學經濟管理學院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函數函數int max2
42、(int a,int b) return(ab?a:b); 燕山大學經濟管理學院燕山大學經濟管理學院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函數函數m=max2(max2(a,b),c);int max2(int a,int b) return(ab?a:b); 燕山大學經濟管理學院燕山大學經濟管理學院int max4(int a,int b,int c,int d) int max2(int a,i
43、nt b); int m; m=max2(a,b); m=max2(m,c); m=max2(m,d); return(m); max4函數函數m=max2(max2(max2(a,b),c),d);int max2(int a,int b) return(ab?a:b); 燕山大學經濟管理學院燕山大學經濟管理學院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函數函數ruturn max2(max2(max
44、2(a,b),c),d);int max2(int a,int b) return(ab?a:b); 燕山大學經濟管理學院燕山大學經濟管理學院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); 燕山大學經濟管理學院燕山大學經濟管理學院在調用一個函數的過程中又出現直接或間在調用一個函數的過程中又出現直接或間接地調用該函
45、數本身,稱為函數的接地調用該函數本身,稱為函數的遞歸調遞歸調用用。語言的特點之一就在于允許函數的遞歸語言的特點之一就在于允許函數的遞歸調用。調用。燕山大學經濟管理學院燕山大學經濟管理學院 f2函數函數調用調用f1函數函數 int f(int x) int y,z; z=f(y); return (2*z); f函數函數調用調用f函數函數 f1函數函數調用調用f2函數函數應使用應使用if語句控制結束調用語句控制結束調用直接調用本函數直接調用本函數間接調用本函數間接調用本函數燕山大學經濟管理學院燕山大學經濟管理學院 例例7.6 有有5個學生坐在一起個學生坐在一起u問第問第5個學生多少歲?他說比第個
46、學生多少歲?他說比第4個學生大個學生大2歲歲u問第問第4個學生歲數,他說比第個學生歲數,他說比第3個學生大個學生大2歲歲u問第問第3個學生,又說比第個學生,又說比第2個學生大個學生大2歲歲u問第問第2個學生,說比第個學生,說比第1個學生大個學生大2歲歲u最后問第最后問第1個學生,他說是個學生,他說是10歲歲u請問第請問第5個學生多大個學生多大燕山大學經濟管理學院燕山大學經濟管理學院解題思路:解題思路:u要求第個年齡,就必須先知道第個年齡要求第個年齡,就必須先知道第個年齡u要求第個年齡必須先知道第個年齡要求第個年齡必須先知道第個年齡u第個年齡又取決于第個年齡第個年齡又取決于第個年齡u第個年齡取決
47、于第個年齡第個年齡取決于第個年齡u每個學生年齡都比其前個學生的年齡大每個學生年齡都比其前個學生的年齡大燕山大學經濟管理學院燕山大學經濟管理學院解題思路:解題思路:age(5)=age(4)+2age(4)=age(3)+2age(3)=age(2)+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
48、 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) =16 age(5) =18 回回溯溯階段階段 遞推階段遞推階段結束遞歸的條件結束遞歸的條件燕山大學經濟管理學院燕山大學經濟管理學院#include int main() int age(int n); printf(NO.5,age:%dn,age(5); retur
49、n 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函數函數n=5c=age(3)+2age函數函數n=4c=age(1)+2age函數函數n=2c=age(2)+2age函數函數n=3c=10age函數函數n=1age(1)=10age(2)=12age(3)=14age(4)=16age(5)=1818燕山大學經濟管理學院燕山大學經濟管理學院例例7.7 用遞歸方法求!。用遞歸方法求!。解題思路:解
50、題思路:u求!可以用遞推方法求!可以用遞推方法:即從開始,乘,即從開始,乘,再乘再乘一直乘到。一直乘到。u遞推法的特點是從一個已知的事實遞推法的特點是從一個已知的事實(如如1!=1)出發,按一定規律推出下一個事實出發,按一定規律推出下一個事實(如如2!=1!*2),再從這個新的已知的事實出發,再從這個新的已知的事實出發,再向下推出一個新的事實再向下推出一個新的事實(3!=3*2!)。n!=n*(n-1)!。燕山大學經濟管理學院燕山大學經濟管理學院例例7.7 用遞歸方法求!。用遞歸方法求!。解題思路:解題思路:u求!也可以用遞歸方法,即!等于!求!也可以用遞歸方法,即!等于!,而!,而!,!,!
51、u可用下面的遞歸公式表示:可用下面的遞歸公式表示:) 1() 1() 1 , 0(1!nnnnnn燕山大學經濟管理學院燕山大學經濟管理學院#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 | |
52、n=1) f=1; else f=fac(n-1)*n; return(f); 注意溢出注意溢出燕山大學經濟管理學院燕山大學經濟管理學院fac(5)輸出輸出fac(5)mainf=fac(4)5fac函數函數n=5f=fac(3)4fac函數函數n=4f=fac(1)2fac函數函數n=2f=fac(2)3fac函數函數n=3f=1fac函數函數n=1fac(1)=1fac(2)=2fac(3)=6fac(4)=24fac(5)=120120燕山大學經濟管理學院燕山大學經濟管理學院 例例7.8 Hanoi(漢諾)塔問題。古代有一(漢諾)塔問題。古代有一個梵塔,塔內有個梵塔,塔內有3個座個座A、
53、B、C,開始時,開始時座上有座上有64個盤子,盤子大小不等,大的個盤子,盤子大小不等,大的在下,小的在上。有一個老和尚想把這在下,小的在上。有一個老和尚想把這64個盤子從座移到座,但規定每次只允個盤子從座移到座,但規定每次只允許移動一個盤,且在移動過程中在許移動一個盤,且在移動過程中在3個座個座上都始終保持大盤在下,小盤在上。在移上都始終保持大盤在下,小盤在上。在移動過程中可以利用動過程中可以利用B座。要求編程序輸出座。要求編程序輸出移動一盤子的步驟。移動一盤子的步驟。燕山大學經濟管理學院燕山大學經濟管理學院ABC燕山大學經濟管理學院燕山大學經濟管理學院解題思路:解題思路:u要把要把64個盤子
54、從個盤子從A座移動到座移動到C座,需要移動大座,需要移動大約約264 次盤子。一般人是不可能直接確定移動次盤子。一般人是不可能直接確定移動盤子的每一個具體步驟的盤子的每一個具體步驟的u老和尚會這樣想:假如有另外一個和尚能有辦老和尚會這樣想:假如有另外一個和尚能有辦法將上面法將上面63個盤子從一個座移到另一座。那個盤子從一個座移到另一座。那么,問題就解決了。此時老和尚只需這樣做:么,問題就解決了。此時老和尚只需這樣做:燕山大學經濟管理學院燕山大學經濟管理學院解題思路:解題思路:(1) 命令第命令第2個和尚將個和尚將63個盤子從個盤子從A座移到座移到B座座(2) 自己將自己將1個盤子(最底下的、最
55、大的盤子)個盤子(最底下的、最大的盤子)從從A座移到座移到C座座(3) 再命令第再命令第2個和尚將個和尚將63個盤子從個盤子從B座移到座移到C座座燕山大學經濟管理學院燕山大學經濟管理學院ABC將將63個從個從A到到B第第1個和尚的做法個和尚的做法燕山大學經濟管理學院燕山大學經濟管理學院ABC將將63個從個從A到到B第第1個和尚的做法個和尚的做法燕山大學經濟管理學院燕山大學經濟管理學院ABC將將1個從個從A到到C第第1個和尚的做法個和尚的做法燕山大學經濟管理學院燕山大學經濟管理學院ABC將將1個從個從A到到C第第1個和尚的做法個和尚的做法燕山大學經濟管理學院燕山大學經濟管理學院ABC將將63個從
56、個從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個從個從
57、C到到B第第2個和尚的做法個和尚的做法燕山大學經濟管理學院燕山大學經濟管理學院ABC將將62個從個從C到到B第第2個和尚的做法個和尚的做法燕山大學經濟管理學院燕山大學經濟管理學院第第3個和尚的做法個和尚的做法第第4個和尚的做法個和尚的做法第第5個和尚的做法個和尚的做法第第6個和尚的做法個和尚的做法第第7個和尚的做法個和尚的做法第第63個和尚的做法個和尚的做法第第64個和尚僅做:將個和尚僅做:將1個從個從A移到移到C燕山大學經濟管理學院燕山大學經濟管理學院ABC將將3個盤子從個盤子從A移到移到C的全過程的全過程將將2個盤子從個盤子從A移到移到B燕山大學經濟管理學院燕山大學經濟管理學院ABC將將3
58、個盤子從個盤子從A移到移到C的全過程的全過程將將2個盤子從個盤子從A移到移到B燕山大學經濟管理學院燕山大學經濟管理學院ABC將將3個盤子從個盤子從A移到移到C的全過程的全過程將將1個盤子從個盤子從A移到移到C燕山大學經濟管理學院燕山大學經濟管理學院ABC將將3個盤子從個盤子從A移到移到C的全過程的全過程將將1個盤子從個盤子從A移到移到C燕山大學經濟管理學院燕山大學經濟管理學院ABC將將3個盤子從個盤子從A移到移到C的全過程的全過程將將2個盤子從個盤子從B移到移到C燕山大學經濟管理學院燕山大學經濟管理學院ABC將將3個盤子從個盤子從A移到移到C的全過程的全過程將將2個盤子從個盤子從B移到移到C燕
59、山大學經濟管理學院燕山大學經濟管理學院ABC將將2個盤子從個盤子從A移到移到B的過程的過程將將1個盤子從個盤子從A移到移到C燕山大學經濟管理學院燕山大學經濟管理學院ABC將將2個盤子從個盤子從A移到移到B的過程的過程將將1個盤子從個盤子從A移到移到C燕山大學經濟管理學院燕山大學經濟管理學院ABC將將2個盤子從個盤子從A移到移到B的過程的過程將將1個盤子從個盤子從A移到移到B燕山大學經濟管理學院燕山大學經濟管理學院ABC將將2個盤子從個盤子從A移到移到B的過程的過程將將1個盤子從個盤子從A移到移到B燕山大學經濟管理學院燕山大學經濟管理學院ABC將將2個盤子從個盤子從A移到移到B的過程的過程將將1
60、個盤子從個盤子從C移到移到B燕山大學經濟管理學院燕山大學經濟管理學院ABC將將2個盤子從個盤子從A移到移到B的過程的過程將將1個盤子從個盤子從C移到移到B燕山大學經濟管理學院燕山大學經濟管理學院ABC將將2個盤子從個盤子從B移到移到C的過程的過程燕山大學經濟管理學院燕山大學經濟管理學院ABC將將2個盤子從個盤子從B移到移到C的過程的過程燕山大學經濟管理學院燕山大學經濟管理學院ABC將將2個盤子從個盤子從B移到移到C的過程的過程燕山大學經濟管理學院燕山大學經濟管理學院ABC將將2個盤子從個盤子從B移到移到C的過程的過程燕山大學經濟管理學院燕山大學經濟管理學院由上面的分析可知:將由上面的分析可知:將n個盤子從個盤子從A座移座移到到C座可以分解為以下座可以分解為以下3個步驟:個步驟:(1) 將將A上上n-1個盤借助個盤借助C座先移到座先移到B座上座上(2) 把把A座上剩
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 西安郵電大學《雅思英語閱讀與寫作(上)》2023-2024學年第二學期期末試卷
- 神木職業技術學院《雕塑基礎》2023-2024學年第二學期期末試卷
- 江陽城建職業學院《數字設備與裝備》2023-2024學年第一學期期末試卷
- 山東省萊州市一中2024-2025學年高三數學試題第四次聯考試題含解析
- 遼寧傳媒學院《地質工程》2023-2024學年第二學期期末試卷
- 泉州幼兒師范高等專科學校《金融工程》2023-2024學年第二學期期末試卷
- 神木職業技術學院《生態環境保護基礎》2023-2024學年第二學期期末試卷
- 因狗咬傷賠償協議書模板.二零二五年
- 二零二五版成都存量房屋買賣合同書
- 二零二五版論行政合同書特權的法律規制
- DB11∕T 686-2023 透水磚路面施工與驗收規范
- 山東虛擬電廠商業模式介紹
- 醫療技術臨床應用管理培訓課件
- 敏捷開發管理咨詢合同
- 病區安全管理新護士上崗前培訓課件
- 汽車調光玻璃行業專題報告(技術路徑、市場空間、競爭格局等)-2024-08-零部件
- 12G614-1 砌體填充墻結構構造
- 老年人血脂異常管理中國專家共識(2022版)
- GB/T 44127-2024行政事業單位公物倉建設與運行指南
- 工裝裝修合同電子版
- 2024年鄉村振興(產業、文化、生態)等實施戰略知識考試題庫與答案
評論
0/150
提交評論