版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、7.1為什么要用函數(shù)為什么要用函數(shù) 7.2怎樣定義函數(shù)怎樣定義函數(shù) 7.3調(diào)用函數(shù)調(diào)用函數(shù) 7.4對(duì)被調(diào)用函數(shù)的聲明和函數(shù)原型對(duì)被調(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變量的存儲(chǔ)方式和生存期變量的存儲(chǔ)方式和生存期 7.10 關(guān)于變量的聲明和定義關(guān)于變量的聲明和定義 7.11 內(nèi)部函數(shù)和外部函數(shù)內(nèi)部函數(shù)和外部函數(shù) 問題:?jiǎn)栴}: u如果程序的功能比較多,規(guī)模比較大,把所有代如果程序的功能比較多,規(guī)模比較大,把所有代 碼都寫在碼都寫在main函數(shù)中,就
2、會(huì)使主函數(shù)變得龐雜、函數(shù)中,就會(huì)使主函數(shù)變得龐雜、 頭緒不清,閱讀和維護(hù)變得困難頭緒不清,閱讀和維護(hù)變得困難 u有時(shí)程序中要多次實(shí)現(xiàn)某一功能,就需要多次重有時(shí)程序中要多次實(shí)現(xiàn)某一功能,就需要多次重 復(fù)編寫實(shí)現(xiàn)此功能的程序代碼復(fù)編寫實(shí)現(xiàn)此功能的程序代碼,這使程序冗長(zhǎng),這使程序冗長(zhǎng), 不精煉不精煉 解決的方法:用解決的方法:用模塊化程序設(shè)計(jì)的思路模塊化程序設(shè)計(jì)的思路 u采用采用“組裝組裝”的辦法簡(jiǎn)化程序設(shè)計(jì)的過程的辦法簡(jiǎn)化程序設(shè)計(jì)的過程 u事先編好一批實(shí)現(xiàn)各種不同功能的函數(shù)事先編好一批實(shí)現(xiàn)各種不同功能的函數(shù) u把它們保存在函數(shù)庫(kù)中把它們保存在函數(shù)庫(kù)中,需要時(shí)需要時(shí)直接用直接用 解決的方法:用解決的
3、方法:用模塊化程序設(shè)計(jì)的思路模塊化程序設(shè)計(jì)的思路 u函數(shù)就是功能函數(shù)就是功能 u每一個(gè)函數(shù)用來(lái)實(shí)現(xiàn)一個(gè)特定的功能每一個(gè)函數(shù)用來(lái)實(shí)現(xiàn)一個(gè)特定的功能 u函數(shù)的名字應(yīng)反映其代表的功能函數(shù)的名字應(yīng)反映其代表的功能 在設(shè)計(jì)一個(gè)較大的程序時(shí),往往把它分為若干個(gè)在設(shè)計(jì)一個(gè)較大的程序時(shí),往往把它分為若干個(gè) 程序模塊,每一個(gè)模塊包括一個(gè)或多個(gè)函數(shù),每程序模塊,每一個(gè)模塊包括一個(gè)或多個(gè)函數(shù),每 個(gè)函數(shù)實(shí)現(xiàn)一個(gè)特定的功能個(gè)函數(shù)實(shí)現(xiàn)一個(gè)特定的功能 程序可由一個(gè)主函數(shù)和若干個(gè)其他函數(shù)構(gòu)成程序可由一個(gè)主函數(shù)和若干個(gè)其他函數(shù)構(gòu)成 主函數(shù)調(diào)用其他函數(shù),其他函數(shù)也可以互相調(diào)用主函數(shù)調(diào)用其他函數(shù),其他函數(shù)也可以互相調(diào)用 同一個(gè)函
4、數(shù)可以被一個(gè)或多個(gè)函數(shù)調(diào)用任意多次同一個(gè)函數(shù)可以被一個(gè)或多個(gè)函數(shù)調(diào)用任意多次 main abc fghdei e 可以使用庫(kù)函數(shù)可以使用庫(kù)函數(shù) 可以使用自己編寫的函數(shù)可以使用自己編寫的函數(shù) 在程序設(shè)計(jì)中要善于利用函數(shù),可以減少在程序設(shè)計(jì)中要善于利用函數(shù),可以減少 重復(fù)編寫程序段的工作量,同時(shí)可以方便重復(fù)編寫程序段的工作量,同時(shí)可以方便 地實(shí)現(xiàn)模塊化的程序設(shè)計(jì)地實(shí)現(xiàn)模塊化的程序設(shè)計(jì) 例例7.1 輸出以下的結(jié)果,用函數(shù)調(diào)用實(shí)現(xiàn)。輸出以下的結(jié)果,用函數(shù)調(diào)用實(shí)現(xiàn)。 * How do you do! * 解題思路:解題思路: u在輸出的文字上下分別有一行在輸出的文字上下分別有一行“*”號(hào),顯然不號(hào),顯然
5、不 必重復(fù)寫這段代碼,用一個(gè)函數(shù)必重復(fù)寫這段代碼,用一個(gè)函數(shù)print_star來(lái)來(lái) 實(shí)現(xiàn)輸出一行實(shí)現(xiàn)輸出一行“*”號(hào)的功能。號(hào)的功能。 u再寫一個(gè)再寫一個(gè)print_message函數(shù)來(lái)輸出中間一函數(shù)來(lái)輸出中間一 行文字信息行文字信息 u用主函數(shù)分別調(diào)用這兩個(gè)函數(shù)用主函數(shù)分別調(diào)用這兩個(gè)函數(shù) #include int main() void print_star(); void print_message(); print_star(); print_message(); print_star(); return 0; void print_star() printf(“*n”); void
6、print_message() printf(“ How do you do!n”); 輸出輸出16個(gè)個(gè)* 輸出一行文字輸出一行文字 #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”); 聲明函數(shù)聲明函數(shù) 定義函數(shù)定義函數(shù) #include int main(
7、) 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”); 說明:說明: (1) 一個(gè)程序由一個(gè)或多個(gè)程序模塊組成,一個(gè)程序由一個(gè)或多個(gè)程序模塊組成, 每一個(gè)程序模塊作為一個(gè)源程序文件。對(duì)較大每一個(gè)程序模塊作為一個(gè)源程序文件。對(duì)較大 的程序,一般不希望把所有內(nèi)容全放在一個(gè)文的程序,一般不希望把所有內(nèi)容
8、全放在一個(gè)文 件中,而是將它們分別放在若干個(gè)源文件中,件中,而是將它們分別放在若干個(gè)源文件中, 由若干個(gè)源程序文件組成一個(gè)由若干個(gè)源程序文件組成一個(gè)C程序。這樣便程序。這樣便 于分別編寫、分別編譯,提高調(diào)試效率。一個(gè)于分別編寫、分別編譯,提高調(diào)試效率。一個(gè) 源程序文件可以為多個(gè)源程序文件可以為多個(gè)C程序共用。程序共用。 說明:說明: (2) 一個(gè)源程序文件由一個(gè)或多個(gè)函數(shù)以及其一個(gè)源程序文件由一個(gè)或多個(gè)函數(shù)以及其 他有關(guān)內(nèi)容(如預(yù)處理指令、數(shù)據(jù)聲明與定義他有關(guān)內(nèi)容(如預(yù)處理指令、數(shù)據(jù)聲明與定義 等)組成。一個(gè)源程序文件是一個(gè)編譯單位,等)組成。一個(gè)源程序文件是一個(gè)編譯單位, 在程序編譯時(shí)是以源
9、程序文件為單位進(jìn)行編譯在程序編譯時(shí)是以源程序文件為單位進(jìn)行編譯 的,而不是以函數(shù)為單位進(jìn)行編譯的。的,而不是以函數(shù)為單位進(jìn)行編譯的。 說明:說明: (3) 程序的執(zhí)行是從程序的執(zhí)行是從main函數(shù)開始的,如函數(shù)開始的,如 果在果在main函數(shù)中調(diào)用其他函數(shù),在調(diào)用后流函數(shù)中調(diào)用其他函數(shù),在調(diào)用后流 程返回到程返回到main函數(shù),在函數(shù),在main函數(shù)中結(jié)束整函數(shù)中結(jié)束整 個(gè)程序的運(yùn)行。個(gè)程序的運(yùn)行。 說明:說明: (4) 所有函數(shù)都是平行的,即在定義函數(shù)時(shí)是所有函數(shù)都是平行的,即在定義函數(shù)時(shí)是 分別進(jìn)行的,是互相獨(dú)立的。一個(gè)函數(shù)并不從分別進(jìn)行的,是互相獨(dú)立的。一個(gè)函數(shù)并不從 屬于另一個(gè)函數(shù),即
10、函數(shù)不能嵌套定義。函數(shù)屬于另一個(gè)函數(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庫(kù)函數(shù),它是由系統(tǒng)提供的,用戶不必自己定庫(kù)函數(shù),它是由系統(tǒng)提供的,用戶不必自己定 義而直接使用它們。應(yīng)該說明,不同的義而直接使用它們。應(yīng)該說明,不同的C語(yǔ)言語(yǔ)言 編譯系統(tǒng)提供的庫(kù)函數(shù)的數(shù)量和功能會(huì)有一些編譯系統(tǒng)提供的庫(kù)函數(shù)的數(shù)量和功能會(huì)有一些 不同,當(dāng)然許多基本的函數(shù)是共同的。不同,當(dāng)然許多基本的函數(shù)是共同的。
11、u用戶自己定義的函數(shù)。它是用以解決用戶專門用戶自己定義的函數(shù)。它是用以解決用戶專門 需要的函數(shù)。需要的函數(shù)。 說明:說明: (6) 從函數(shù)的形式看,函數(shù)分兩類。從函數(shù)的形式看,函數(shù)分兩類。 無(wú)參函數(shù)。無(wú)參函數(shù)一般用來(lái)執(zhí)行指定的一無(wú)參函數(shù)。無(wú)參函數(shù)一般用來(lái)執(zhí)行指定的一 組操作。無(wú)參函數(shù)可以帶回或不帶回函數(shù)值,組操作。無(wú)參函數(shù)可以帶回或不帶回函數(shù)值, 但一般以不帶回函數(shù)值的居多。但一般以不帶回函數(shù)值的居多。 有參函數(shù)。在調(diào)用函數(shù)時(shí),主調(diào)函數(shù)在調(diào)有參函數(shù)。在調(diào)用函數(shù)時(shí),主調(diào)函數(shù)在調(diào) 用被調(diào)用函數(shù)時(shí),通過參數(shù)向被調(diào)用函數(shù)傳遞用被調(diào)用函數(shù)時(shí),通過參數(shù)向被調(diào)用函數(shù)傳遞 數(shù)據(jù),一般情況下,執(zhí)行被調(diào)用函數(shù)時(shí)會(huì)
12、得到數(shù)據(jù),一般情況下,執(zhí)行被調(diào)用函數(shù)時(shí)會(huì)得到 一個(gè)函數(shù)值,供主調(diào)函數(shù)使用。一個(gè)函數(shù)值,供主調(diào)函數(shù)使用。 7.2.1 為什么要定義函數(shù)為什么要定義函數(shù) 7.2.2 定義函數(shù)的方法定義函數(shù)的方法 C語(yǔ)言要求,在程序中用到的所有函數(shù),語(yǔ)言要求,在程序中用到的所有函數(shù), 必須必須“先定義,后使用先定義,后使用” 指定指定函數(shù)函數(shù)名字名字、函數(shù)、函數(shù)返回值類型返回值類型、函數(shù)、函數(shù) 實(shí)現(xiàn)的實(shí)現(xiàn)的功能功能以及以及參數(shù)的個(gè)數(shù)與類型參數(shù)的個(gè)數(shù)與類型,將,將 這些信息通知編譯系統(tǒng)。這些信息通知編譯系統(tǒng)。 指定函數(shù)的名字,以便以后按名調(diào)用指定函數(shù)的名字,以便以后按名調(diào)用 指定函數(shù)類型,即函數(shù)返回值的類型指定函數(shù)類
13、型,即函數(shù)返回值的類型 指定函數(shù)參數(shù)的名字和類型,以便在調(diào)指定函數(shù)參數(shù)的名字和類型,以便在調(diào) 用函數(shù)時(shí)向它們傳遞數(shù)據(jù)用函數(shù)時(shí)向它們傳遞數(shù)據(jù) 指定函數(shù)的功能。這是最重要的,這是指定函數(shù)的功能。這是最重要的,這是 在函數(shù)體中解決的在函數(shù)體中解決的 對(duì)于對(duì)于庫(kù)函數(shù),程序設(shè)計(jì)者只需用庫(kù)函數(shù),程序設(shè)計(jì)者只需用 #include指令把有關(guān)的頭文件包含到指令把有關(guān)的頭文件包含到 本文件模塊中即可本文件模塊中即可 程序設(shè)計(jì)者需要在程序中自己定義想用程序設(shè)計(jì)者需要在程序中自己定義想用 的而庫(kù)函數(shù)并沒有提供的函數(shù)的而庫(kù)函數(shù)并沒有提供的函數(shù) 1.定義無(wú)參函數(shù)定義無(wú)參函數(shù) 定義無(wú)參函數(shù)的一般形式為定義無(wú)參函數(shù)的一般形
14、式為: 類型名類型名 函數(shù)名函數(shù)名(void) 函數(shù)體函數(shù)體 類型名類型名 函數(shù)名函數(shù)名() 函數(shù)體函數(shù)體 包括聲明部分包括聲明部分 和語(yǔ)句部分和語(yǔ)句部分 包括聲明部分和包括聲明部分和 語(yǔ)句部分語(yǔ)句部分 1.定義無(wú)參函數(shù)定義無(wú)參函數(shù) 定義無(wú)參函數(shù)的一般形式為定義無(wú)參函數(shù)的一般形式為: 類型名類型名 函數(shù)名函數(shù)名(void) 函數(shù)體函數(shù)體 類型名類型名 函數(shù)名函數(shù)名() 函數(shù)體函數(shù)體 指定函數(shù)指定函數(shù) 值的類型值的類型 指定函數(shù)指定函數(shù) 值的類型值的類型 2.定義有參函數(shù)定義有參函數(shù) 定義有參函數(shù)的一般形式為定義有參函數(shù)的一般形式為: 類型名類型名 函數(shù)名(形式參數(shù)表列)函數(shù)名(形式參數(shù)表列)
15、函數(shù)體函數(shù)體 3. 定義空函數(shù)定義空函數(shù) 定義定義空空函數(shù)的一般形式為函數(shù)的一般形式為: 類型名類型名 函數(shù)名(函數(shù)名( ) 先用空函數(shù)占一個(gè)位置,以后先用空函數(shù)占一個(gè)位置,以后逐步逐步擴(kuò)充擴(kuò)充 好處:好處:程序結(jié)構(gòu)清楚,可讀性好,以后程序結(jié)構(gòu)清楚,可讀性好,以后 擴(kuò)充新功能方便,對(duì)程序結(jié)構(gòu)影響不大擴(kuò)充新功能方便,對(duì)程序結(jié)構(gòu)影響不大 7.3.1函數(shù)調(diào)用的形式函數(shù)調(diào)用的形式 7.3.2函數(shù)調(diào)用時(shí)的數(shù)據(jù)傳遞函數(shù)調(diào)用時(shí)的數(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ù)名(實(shí)參表列) 如果是調(diào)用無(wú)
16、參函數(shù),則如果是調(diào)用無(wú)參函數(shù),則“實(shí)參表列實(shí)參表列” 可以沒有,但括號(hào)不能省略可以沒有,但括號(hào)不能省略 如果實(shí)參表列包含多個(gè)實(shí)參,則各參數(shù)如果實(shí)參表列包含多個(gè)實(shí)參,則各參數(shù) 間用逗號(hào)隔開間用逗號(hào)隔開 按函數(shù)調(diào)用在程序中出現(xiàn)的形式和位置按函數(shù)調(diào)用在程序中出現(xiàn)的形式和位置 來(lái)分,可以有以下來(lái)分,可以有以下3種函數(shù)調(diào)用方式種函數(shù)調(diào)用方式: . 函數(shù)調(diào)用語(yǔ)句函數(shù)調(diào)用語(yǔ)句 把函數(shù)調(diào)用單獨(dú)作為一個(gè)語(yǔ)句把函數(shù)調(diào)用單獨(dú)作為一個(gè)語(yǔ)句 如如printf_star(); 這時(shí)不要求函數(shù)帶回值,只要求函數(shù)完這時(shí)不要求函數(shù)帶回值,只要求函數(shù)完 成一定的操作成一定的操作 按函數(shù)調(diào)用在程序中出現(xiàn)的形式和位置按函數(shù)調(diào)用在程序
17、中出現(xiàn)的形式和位置 來(lái)分,可以有以下來(lái)分,可以有以下3種函數(shù)調(diào)用方式種函數(shù)調(diào)用方式: . 函數(shù)表達(dá)式函數(shù)表達(dá)式 函數(shù)調(diào)用出現(xiàn)在另一個(gè)表達(dá)式中函數(shù)調(diào)用出現(xiàn)在另一個(gè)表達(dá)式中 如如c=max(a,b); 這時(shí)要求函數(shù)帶回一個(gè)確定的值以參加這時(shí)要求函數(shù)帶回一個(gè)確定的值以參加 表達(dá)式的運(yùn)算表達(dá)式的運(yùn)算 按函數(shù)調(diào)用在程序中出現(xiàn)的形式和位置按函數(shù)調(diào)用在程序中出現(xiàn)的形式和位置 來(lái)分,可以有以下來(lái)分,可以有以下3種函數(shù)調(diào)用方式種函數(shù)調(diào)用方式: . 函數(shù)參數(shù)函數(shù)參數(shù) 函數(shù)調(diào)用作為另一函數(shù)調(diào)用時(shí)的實(shí)參函數(shù)調(diào)用作為另一函數(shù)調(diào)用時(shí)的實(shí)參 如如mmax(a,max(b,c); 其中其中max(b,c)是一次函數(shù)調(diào)用,它的
18、是一次函數(shù)調(diào)用,它的 值作為值作為max另一次調(diào)用的實(shí)參另一次調(diào)用的實(shí)參 1.形式參數(shù)和實(shí)際參數(shù)形式參數(shù)和實(shí)際參數(shù) u在調(diào)用有參函數(shù)時(shí),主調(diào)函數(shù)和被調(diào)用函在調(diào)用有參函數(shù)時(shí),主調(diào)函數(shù)和被調(diào)用函 數(shù)之間有數(shù)據(jù)傳遞關(guān)系數(shù)之間有數(shù)據(jù)傳遞關(guān)系 u定義函數(shù)時(shí)函數(shù)名后面的變量名稱為定義函數(shù)時(shí)函數(shù)名后面的變量名稱為“形形 式參數(shù)式參數(shù)”(簡(jiǎn)稱(簡(jiǎn)稱“形參形參”) u主調(diào)函數(shù)中調(diào)用一個(gè)函數(shù)時(shí),函數(shù)名后面主調(diào)函數(shù)中調(diào)用一個(gè)函數(shù)時(shí),函數(shù)名后面 參數(shù)稱為參數(shù)稱為“實(shí)際參數(shù)實(shí)際參數(shù)”(簡(jiǎn)稱(簡(jiǎn)稱“實(shí)參實(shí)參”) u 實(shí)際參數(shù)可以是常量、變量或表達(dá)式實(shí)際參數(shù)可以是常量、變量或表達(dá)式 2. 實(shí)參和形參間的數(shù)據(jù)傳遞實(shí)參和形參間
19、的數(shù)據(jù)傳遞 u在調(diào)用函數(shù)過程中,系統(tǒng)會(huì)把實(shí)參的值傳在調(diào)用函數(shù)過程中,系統(tǒng)會(huì)把實(shí)參的值傳 遞給被調(diào)用函數(shù)的形參遞給被調(diào)用函數(shù)的形參 u或者說,形參從實(shí)參得到一個(gè)值或者說,形參從實(shí)參得到一個(gè)值 u該值在函數(shù)調(diào)用期間有效,可以參加該值在函數(shù)調(diào)用期間有效,可以參加被調(diào)被調(diào) 函數(shù)中的運(yùn)算函數(shù)中的運(yùn)算 例例7.2 輸入兩個(gè)整數(shù),要求輸出其中值較輸入兩個(gè)整數(shù),要求輸出其中值較 大者。要求用函數(shù)來(lái)找到大數(shù)。大者。要求用函數(shù)來(lái)找到大數(shù)。 解題思路:解題思路: (1)函數(shù)名應(yīng)是見名知意,今定名為函數(shù)名應(yīng)是見名知意,今定名為max (2) 由于給定的兩個(gè)數(shù)是整數(shù),返回主調(diào)函數(shù)的由于給定的兩個(gè)數(shù)是整數(shù),返回主調(diào)函數(shù)的
20、 值值(即較大數(shù))(即較大數(shù))應(yīng)該是整型應(yīng)該是整型 (3)max函數(shù)應(yīng)當(dāng)有兩個(gè)參數(shù),以便從主函數(shù)接函數(shù)應(yīng)當(dāng)有兩個(gè)參數(shù),以便從主函數(shù)接 收兩個(gè)整數(shù),收兩個(gè)整數(shù),因此因此參數(shù)的類型應(yīng)當(dāng)是整型參數(shù)的類型應(yīng)當(dāng)是整型 先編寫先編寫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,%d”, c=ma
21、x(a,b); printf(“max is %dn”,c); 實(shí)參可以是常量、變量或表達(dá)式實(shí)參可以是常量、變量或表達(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)用時(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)存單元。 2a3b xy23 實(shí)參實(shí)參 形參形參 調(diào)用結(jié)束,形參
22、單元被釋放調(diào)用結(jié)束,形參單元被釋放 實(shí)參單元仍保留并維持原值,沒有改變實(shí)參單元仍保留并維持原值,沒有改變 如果在執(zhí)行一個(gè)被調(diào)用函數(shù)時(shí),形參的值如果在執(zhí)行一個(gè)被調(diào)用函數(shù)時(shí),形參的值 發(fā)生改變,不會(huì)改變主調(diào)函數(shù)的實(shí)參的值發(fā)生改變,不會(huì)改變主調(diào)函數(shù)的實(shí)參的值 2a3b xy23 實(shí)參實(shí)參 形參形參 通常,希望通過函數(shù)調(diào)用使主調(diào)函數(shù)能得通常,希望通過函數(shù)調(diào)用使主調(diào)函數(shù)能得 到一個(gè)確定的值,這就是函數(shù)值到一個(gè)確定的值,這就是函數(shù)值(函數(shù)的返函數(shù)的返 回值回值) (1)函數(shù)的返回值是通過函數(shù)中的函數(shù)的返回值是通過函數(shù)中的return語(yǔ)語(yǔ) 句獲得的。句獲得的。 u一個(gè)函數(shù)中可以有一個(gè)以上的一個(gè)函數(shù)中可以有一
23、個(gè)以上的return語(yǔ)句,語(yǔ)句, 執(zhí)行到哪一個(gè)執(zhí)行到哪一個(gè)return語(yǔ)句,哪一個(gè)語(yǔ)句,哪一個(gè)就就起作用起作用 ureturn語(yǔ)句后面的括號(hào)可以不要語(yǔ)句后面的括號(hào)可以不要 通常,希望通過函數(shù)調(diào)用使主調(diào)函數(shù)能得通常,希望通過函數(shù)調(diào)用使主調(diào)函數(shù)能得 到一個(gè)確定的值,這就是函數(shù)值到一個(gè)確定的值,這就是函數(shù)值(函數(shù)的返函數(shù)的返 回值回值) (2) 函數(shù)值的類型。應(yīng)當(dāng)在定義函數(shù)時(shí)指定函數(shù)值的類型。應(yīng)當(dāng)在定義函數(shù)時(shí)指定 函數(shù)值的類型函數(shù)值的類型 通常,希望通過函數(shù)調(diào)用使主調(diào)函數(shù)能得通常,希望通過函數(shù)調(diào)用使主調(diào)函數(shù)能得 到一個(gè)確定的值,這就是函數(shù)值到一個(gè)確定的值,這就是函數(shù)值(函數(shù)的返函數(shù)的返 回值回值)
24、(3)在定義函數(shù)時(shí)指定的函數(shù)類型一般應(yīng)該在定義函數(shù)時(shí)指定的函數(shù)類型一般應(yīng)該 和和return語(yǔ)句中的表達(dá)式類型一致語(yǔ)句中的表達(dá)式類型一致 u如果函數(shù)值的類型和如果函數(shù)值的類型和return語(yǔ)句中表達(dá)式的語(yǔ)句中表達(dá)式的 值不一致,則以函數(shù)類型為準(zhǔn)值不一致,則以函數(shù)類型為準(zhǔn) 例例7.3將例將例7.2稍作改動(dòng),將在稍作改動(dòng),將在max函數(shù)中定函數(shù)中定 義的變量義的變量z改為改為float型。函數(shù)返回值的類型型。函數(shù)返回值的類型 與指定的函數(shù)類型不同,分析其處理方法。與指定的函數(shù)類型不同,分析其處理方法。 解題思路:如果函數(shù)返回值的類型與指定解題思路:如果函數(shù)返回值的類型與指定 的函數(shù)類型不同,按照賦
25、值規(guī)則處理。的函數(shù)類型不同,按照賦值規(guī)則處理。 #include int main() int max(float x,float y); float a,b; int c; scanf(%f,%f, 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.6 2.6 2 變?yōu)樽優(yōu)? 在一個(gè)函數(shù)中調(diào)用另一個(gè)函數(shù)需要具備如在一個(gè)函數(shù)中調(diào)用另一個(gè)函數(shù)需要具備如 下條件:下條件: (1) 被調(diào)用函數(shù)必須是已經(jīng)定義的函數(shù)(是庫(kù)被調(diào)用函數(shù)必須是已經(jīng)
26、定義的函數(shù)(是庫(kù) 函數(shù)或用戶自己定義的函數(shù))函數(shù)或用戶自己定義的函數(shù)) (2) 如果使用庫(kù)函數(shù),應(yīng)該在本文件開頭如果使用庫(kù)函數(shù),應(yīng)該在本文件開頭加相加相 應(yīng)的應(yīng)的#include指令指令 (3) 如果使用自己定義的函數(shù),而該函數(shù)的位如果使用自己定義的函數(shù),而該函數(shù)的位 置在調(diào)用它的函數(shù)后面,應(yīng)該聲明置在調(diào)用它的函數(shù)后面,應(yīng)該聲明 例例7.4 輸入兩個(gè)實(shí)數(shù),用一個(gè)函數(shù)求出它輸入兩個(gè)實(shí)數(shù),用一個(gè)函數(shù)求出它 們之和。們之和。 解題思路:用解題思路:用add函數(shù)實(shí)現(xiàn)。首先要定義函數(shù)實(shí)現(xiàn)。首先要定義 add函數(shù),它為函數(shù),它為float型,它應(yīng)有兩個(gè)參型,它應(yīng)有兩個(gè)參 數(shù),也應(yīng)為數(shù),也應(yīng)為float型。
27、特別要注意的是:型。特別要注意的是: 要對(duì)要對(duì)add函數(shù)進(jìn)行聲明。函數(shù)進(jìn)行聲明。 分別編寫分別編寫add函數(shù)和函數(shù)和main函數(shù),它們組函數(shù),它們組 成一個(gè)源程序文件成一個(gè)源程序文件 main函數(shù)的位置在函數(shù)的位置在add函數(shù)之前函數(shù)之前 在在main函數(shù)中對(duì)函數(shù)中對(duì)add函數(shù)進(jìn)行聲明函數(shù)進(jìn)行聲明 #include int main() float add(float x, float y); float a,b,c; printf(Please enter a and b:); scanf(%f,%f, c=add(a,b); printf(sum is %fn,c); return 0;
28、float add(float x,float y) float z; z=x+y; return(z); 求兩個(gè)實(shí)數(shù)之和,求兩個(gè)實(shí)數(shù)之和, 函數(shù)值也是實(shí)型函數(shù)值也是實(shí)型 對(duì)對(duì)add函數(shù)聲明函數(shù)聲明 #include int main() float add(float x, float y); float a,b,c; printf(Please enter a and b:); scanf(%f,%f, c=add(a,b); printf(sum is %fn,c); return 0; float add(float x,float y) float z; z=x+y; return(
29、z); 只差一個(gè)分號(hào)只差一個(gè)分號(hào) #include int main() float add(float x, float y); float a,b,c; printf(Please enter a and b:); scanf(%f,%f, 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ù)函數(shù) 調(diào)用調(diào)用add函數(shù)函數(shù) 函數(shù)原型的一般形式有兩種函數(shù)原型的一般形式有兩種: 如如 float add(float x, float y
30、); float add(float, float); 原型說明可以放在文件的開頭,這時(shí)所有原型說明可以放在文件的開頭,這時(shí)所有 函數(shù)都可以使用此函數(shù)函數(shù)都可以使用此函數(shù) 語(yǔ)言的函數(shù)定義是互相平行、獨(dú)立的語(yǔ)言的函數(shù)定義是互相平行、獨(dú)立的 即即函數(shù)不能嵌套定義函數(shù)不能嵌套定義 但可以嵌套調(diào)用函數(shù)但可以嵌套調(diào)用函數(shù) 即即調(diào)用一個(gè)函數(shù)的過程中,又調(diào)用一個(gè)函數(shù)的過程中,又可以可以調(diào)用另調(diào)用另 一個(gè)函數(shù)一個(gè)函數(shù) main函數(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.5 輸入輸入4個(gè)整數(shù),找出其中最大的數(shù)。個(gè)整數(shù),找出其中最大的數(shù)。 用函數(shù)的嵌套調(diào)用來(lái)處理。用
31、函數(shù)的嵌套調(diào)用來(lái)處理。 解題思路:解題思路: umain中調(diào)用中調(diào)用max4函數(shù),找函數(shù),找4個(gè)數(shù)中最大者個(gè)數(shù)中最大者 umax4中再調(diào)用中再調(diào)用max2,找兩個(gè)數(shù)中的大者找兩個(gè)數(shù)中的大者 umax4中多次調(diào)用中多次調(diào)用max2,可找,可找4個(gè)數(shù)中的大個(gè)數(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%
32、d%d, max=max4(a,b,c,d); printf(max=%d n,max); return 0; 主函數(shù)主函數(shù) 對(duì)對(duì)max4 函數(shù)聲明函數(shù)聲明 #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, max=max4(a,b,c,d); printf(max=%d n,max); return 0; 主函數(shù)主函數(shù) 輸入輸入4個(gè)整數(shù)個(gè)整數(shù) #include int main() int max4(int
33、a,int b,int c,int d); int a,b,c,d,max; printf(“4 interger numbers:); scanf(%d%d%d%d, max=max4(a,b,c,d); printf(max=%d n,max); return 0; 主函數(shù)主函數(shù) 調(diào)用后肯定是調(diào)用后肯定是4 個(gè)數(shù)中最大者個(gè)數(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函
34、數(shù)函數(shù) 對(duì)對(duì)max2 函數(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ù) a,b中較大者中較大者 a,b,c中較大者中較大者 a,b,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); m
35、ax4函數(shù)函數(shù) int max2(int a,int b) if(a=b) return a; else return b; max2函數(shù)函數(shù) 找找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函數(shù)函數(shù) int max2(int a,int b) if(a=b) return a; else return b; max2函數(shù)函數(shù) return(ab?a:b); int max4(in
36、t 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ù) 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函數(shù)函數(shù) m=max2(max2(a,b),c); int ma
37、x2(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函數(shù)函數(shù) 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
38、=max2(m,c); m=max2(m,d); return(m); max4函數(shù)函數(shù) ruturn 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); 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)用一個(gè)函數(shù)的過程中又出現(xiàn)直
39、接或間在調(diào)用一個(gè)函數(shù)的過程中又出現(xiàn)直接或間 接地調(diào)用該函數(shù)本身,稱為函數(shù)的接地調(diào)用該函數(shù)本身,稱為函數(shù)的遞歸調(diào)遞歸調(diào) 用用。 語(yǔ)言的特點(diǎn)之一就在于允許函數(shù)的遞歸語(yǔ)言的特點(diǎn)之一就在于允許函數(shù)的遞歸 調(diào)用。調(diào)用。 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語(yǔ)句控制結(jié)束調(diào)用語(yǔ)句控制結(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é)生
40、多少歲?他說比第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è)學(xué)生大個(gè)學(xué)生大2歲歲 u問第問第2個(gè)學(xué)生,說比第個(gè)學(xué)生,說比第1個(gè)學(xué)生大個(gè)學(xué)生大2歲歲 u最后問第最后問第1個(gè)學(xué)生,他說是個(gè)學(xué)生,他說是10歲歲 u請(qǐng)問第請(qǐng)問第5個(gè)學(xué)生多大個(gè)學(xué)生多大 解題思路:解題思路: u要求第個(gè)年齡,就必須先知道第個(gè)年齡要求第個(gè)年齡,就必須先知道第個(gè)年齡 u要求第個(gè)年齡必須先知道第個(gè)年齡要求第個(gè)年齡必須先知道第個(gè)年齡 u第個(gè)年齡又取決于第個(gè)年齡第個(gè)年齡又取決于第個(gè)年齡 u第個(gè)年齡取決于第個(gè)年齡第個(gè)年齡取決于
41、第個(gè)年齡 u每個(gè)學(xué)生年齡都比其前個(gè)學(xué)生的年齡大每個(gè)學(xué)生年齡都比其前個(gè)學(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(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
42、 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é)束遞歸的條件結(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) main c=age(4)+2 age
43、函數(shù)函數(shù) n=5 c=age(3)+2 age函數(shù)函數(shù) n=4 c=age(1)+2 age函數(shù)函數(shù) n=2 c=age(2)+2 age函數(shù)函數(shù) n=3 c=10 age函數(shù)函數(shù) n=1 age(1)=10age(2)=12 age(3)=14 age(4)=16age(5)=1818 例例7.7 用遞歸方法求!。用遞歸方法求!。 解題思路:解題思路: u求!可以用遞推方法求!可以用遞推方法:即從開始,乘,即從開始,乘, 再乘再乘一直乘到。一直乘到。 u遞推法的特點(diǎn)是從一個(gè)已知的事實(shí)遞推法的特點(diǎn)是從一個(gè)已知的事實(shí)(如如1!=1) 出發(fā),按一定規(guī)律推出下一個(gè)事實(shí)出發(fā),按一定規(guī)律推出下一個(gè)事實(shí)(
44、如如 2!=1!*2),再?gòu)倪@個(gè)新的已知的事實(shí)出發(fā),再?gòu)倪@個(gè)新的已知的事實(shí)出發(fā), 再向下推出一個(gè)新的事實(shí)再向下推出一個(gè)新的事實(shí)(3!=3*2!)。 n!=n*(n-1)!。 例例7.7 用遞歸方法求!。用遞歸方法求!。 解題思路:解題思路: u求!也可以用遞歸方法,即!等于!求!也可以用遞歸方法,即!等于! ,而!,而!,!,! u可用下面的遞歸公式表示:可用下面的遞歸公式表示: #include int main() int fac(int n); int n; int y; printf(input an integer number:); scanf(%d, y=fac(n); prin
45、tf(%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)*n; return(f); 注意溢出注意溢出 fac(5) 輸出輸出fac(5) main f=fac(4)5 fac函數(shù)函數(shù) n=5 f=fac(3)4 fac函數(shù)函數(shù) n=4 f=fac(1)2 fac函數(shù)函數(shù) n=2 f=fac(2)3 fac函數(shù)函數(shù) n=3 f=1 fac函數(shù)函數(shù) n=1 fac(1)=1fac(2)=2 fac(3)=6 fa
46、c(4)=24fac(5)=120120 例例7.8 Hanoi(漢諾)塔問題。古代有一(漢諾)塔問題。古代有一 個(gè)梵塔,塔內(nèi)有個(gè)梵塔,塔內(nèi)有3個(gè)座個(gè)座A、B、C,開始時(shí),開始時(shí) 座上有座上有64個(gè)盤子,盤子大小不等,大的個(gè)盤子,盤子大小不等,大的 在下,小的在上。有一個(gè)老和尚想把這在下,小的在上。有一個(gè)老和尚想把這64 個(gè)盤子從座移到座,但規(guī)定每次只允個(gè)盤子從座移到座,但規(guī)定每次只允 許移動(dòng)一個(gè)盤,且在移動(dòng)過程中在許移動(dòng)一個(gè)盤,且在移動(dòng)過程中在3個(gè)座個(gè)座 上都始終保持大盤在下,小盤在上。在移上都始終保持大盤在下,小盤在上。在移 動(dòng)過程中可以利用動(dòng)過程中可以利用B座。要求編程序輸出座。要求編程
47、序輸出 移動(dòng)一盤子的步驟。移動(dòng)一盤子的步驟。 ABC 解題思路:解題思路: u要把要把64個(gè)盤子從個(gè)盤子從A座移動(dòng)到座移動(dòng)到C座,需要移動(dòng)大座,需要移動(dòng)大 約約264 次盤子。一般人是不可能直接確定移動(dòng)次盤子。一般人是不可能直接確定移動(dòng) 盤子的每一個(gè)具體步驟的盤子的每一個(gè)具體步驟的 u老和尚會(huì)這樣想:假如有另外一個(gè)和尚能有辦老和尚會(huì)這樣想:假如有另外一個(gè)和尚能有辦 法將上面法將上面63個(gè)盤子從一個(gè)座移到另一座。那個(gè)盤子從一個(gè)座移到另一座。那 么,問題就解決了。此時(shí)老和尚只需這樣做:么,問題就解決了。此時(shí)老和尚只需這樣做: 解題思路:解題思路: (1) 命令第命令第2個(gè)和尚將個(gè)和尚將63個(gè)盤子從
48、個(gè)盤子從A座移到座移到B座座 (2) 自己將自己將1個(gè)盤子(最底下的、最大的盤子)個(gè)盤子(最底下的、最大的盤子) 從從A座移到座移到C座座 (3) 再命令第再命令第2個(gè)和尚將個(gè)和尚將63個(gè)盤子從個(gè)盤子從B座移到座移到C 座座 ABC 將將63個(gè)從個(gè)從A到到B 第第1個(gè)和尚的做法個(gè)和尚的做法 ABC 將將63個(gè)從個(gè)從A到到B 第第1個(gè)和尚的做法個(gè)和尚的做法 ABC 將將1個(gè)從個(gè)從A到到C 第第1個(gè)和尚的做法個(gè)和尚的做法 ABC 將將1個(gè)從個(gè)從A到到C 第第1個(gè)和尚的做法個(gè)和尚的做法 ABC 將將63個(gè)從個(gè)從B到到C 第第1個(gè)和尚的做法個(gè)和尚的做法 ABC 將將63個(gè)從個(gè)從B到到C 第第1個(gè)和尚的
49、做法個(gè)和尚的做法 ABC 將將62個(gè)從個(gè)從A到到C 第第2個(gè)和尚的做法個(gè)和尚的做法 ABC 將將62個(gè)從個(gè)從A到到C 第第2個(gè)和尚的做法個(gè)和尚的做法 ABC 將將1個(gè)從個(gè)從A到到B 第第2個(gè)和尚的做法個(gè)和尚的做法 ABC 將將1個(gè)從個(gè)從A到到B 第第2個(gè)和尚的做法個(gè)和尚的做法 ABC 將將62個(gè)從個(gè)從C到到B 第第2個(gè)和尚的做法個(gè)和尚的做法 ABC 將將62個(gè)從個(gè)從C到到B 第第2個(gè)和尚的做法個(gè)和尚的做法 第第3個(gè)和尚的做法個(gè)和尚的做法 第第4個(gè)和尚的做法個(gè)和尚的做法 第第5個(gè)和尚的做法個(gè)和尚的做法 第第6個(gè)和尚的做法個(gè)和尚的做法 第第7個(gè)和尚的做法個(gè)和尚的做法 第第63個(gè)和尚的做法個(gè)和尚的做
50、法 第第64個(gè)和尚僅做:將個(gè)和尚僅做:將1個(gè)從個(gè)從A移到移到C ABC 將將3個(gè)盤子從個(gè)盤子從A移到移到C的全過程的全過程 將將2個(gè)盤子從個(gè)盤子從A移到移到B ABC 將將3個(gè)盤子從個(gè)盤子從A移到移到C的全過程的全過程 將將2個(gè)盤子從個(gè)盤子從A移到移到B ABC 將將3個(gè)盤子從個(gè)盤子從A移到移到C的全過程的全過程 將將1個(gè)盤子從個(gè)盤子從A移到移到C ABC 將將3個(gè)盤子從個(gè)盤子從A移到移到C的全過程的全過程 將將1個(gè)盤子從個(gè)盤子從A移到移到C ABC 將將3個(gè)盤子從個(gè)盤子從A移到移到C的全過程的全過程 將將2個(gè)盤子從個(gè)盤子從B移到移到C ABC 將將3個(gè)盤子從個(gè)盤子從A移到移到C的全過程的全過
51、程 將將2個(gè)盤子從個(gè)盤子從B移到移到C ABC 將將2個(gè)盤子從個(gè)盤子從A移到移到B的過程的過程 將將1個(gè)盤子從個(gè)盤子從A移到移到C ABC 將將2個(gè)盤子從個(gè)盤子從A移到移到B的過程的過程 將將1個(gè)盤子從個(gè)盤子從A移到移到C ABC 將將2個(gè)盤子從個(gè)盤子從A移到移到B的過程的過程 將將1個(gè)盤子從個(gè)盤子從A移到移到B ABC 將將2個(gè)盤子從個(gè)盤子從A移到移到B的過程的過程 將將1個(gè)盤子從個(gè)盤子從A移到移到B ABC 將將2個(gè)盤子從個(gè)盤子從A移到移到B的過程的過程 將將1個(gè)盤子從個(gè)盤子從C移到移到B ABC 將將2個(gè)盤子從個(gè)盤子從A移到移到B的過程的過程 將將1個(gè)盤子從個(gè)盤子從C移到移到B ABC
52、將將2個(gè)盤子從個(gè)盤子從B移到移到C的過程的過程 ABC 將將2個(gè)盤子從個(gè)盤子從B移到移到C的過程的過程 ABC 將將2個(gè)盤子從個(gè)盤子從B移到移到C的過程的過程 ABC 將將2個(gè)盤子從個(gè)盤子從B移到移到C的過程的過程 由上面的分析可知:將由上面的分析可知:將n個(gè)盤子從個(gè)盤子從A座移座移 到到C座可以分解為以下座可以分解為以下3個(gè)步驟:個(gè)步驟: (1) 將將A上上n-1個(gè)盤借助個(gè)盤借助C座先移到座先移到B座上座上 (2) 把把A座上剩下的一個(gè)盤移到座上剩下的一個(gè)盤移到C座上座上 (3) 將將n-1個(gè)盤從個(gè)盤從B座借助于座移到座借助于座移到C座上座上 可以將第可以將第(1)步和第步和第(3)步表示為
53、:步表示為: u將將“one”座上座上n-1個(gè)盤移到個(gè)盤移到“two”座座( 借助借助“three”座座)。 u在第在第(1)步和第步和第(3)步中,步中,one 、two、 three和和A、B、C的對(duì)應(yīng)關(guān)系不同。的對(duì)應(yīng)關(guān)系不同。 u對(duì)第對(duì)第(1)步,對(duì)應(yīng)關(guān)系是步,對(duì)應(yīng)關(guān)系是one對(duì)應(yīng)對(duì)應(yīng)A, two對(duì)應(yīng)對(duì)應(yīng)B,three對(duì)應(yīng)對(duì)應(yīng)C。 u對(duì)第對(duì)第(3)步,對(duì)應(yīng)關(guān)系是步,對(duì)應(yīng)關(guān)系是one對(duì)應(yīng)對(duì)應(yīng)B, two對(duì)應(yīng)對(duì)應(yīng)C,three對(duì)應(yīng)對(duì)應(yīng)A。 把上面把上面3個(gè)步驟分成兩類操作:個(gè)步驟分成兩類操作: (1) 將將n-1個(gè)盤從一個(gè)座移到另一個(gè)座上(個(gè)盤從一個(gè)座移到另一個(gè)座上(n 1)。這就是大和尚讓
54、小和尚做的工作,)。這就是大和尚讓小和尚做的工作, 它是一個(gè)遞歸的過程,即和尚將任務(wù)層層下它是一個(gè)遞歸的過程,即和尚將任務(wù)層層下 放,直到第放,直到第64個(gè)和尚為止。個(gè)和尚為止。 (2) 將將1個(gè)盤子從一個(gè)座上移到另一座上。這個(gè)盤子從一個(gè)座上移到另一座上。這 是大和尚自己做的工作。是大和尚自己做的工作。 編寫程序。編寫程序。 u用用hanoi函數(shù)實(shí)現(xiàn)第函數(shù)實(shí)現(xiàn)第1類操作(即模擬小和類操作(即模擬小和 尚的任務(wù))尚的任務(wù)) u用用move函數(shù)實(shí)現(xiàn)第函數(shù)實(shí)現(xiàn)第2類操作(模擬大和尚類操作(模擬大和尚 自己移盤)自己移盤) u函數(shù)調(diào)用函數(shù)調(diào)用hanoi(n,one,two.three)表示表示 將將n
55、個(gè)盤子從個(gè)盤子從“one”座移到座移到“three”座的座的 過程過程(借助借助“two”座座) u函數(shù)調(diào)用函數(shù)調(diào)用move(x,y)表示將表示將1個(gè)盤子從個(gè)盤子從x 座座 移到移到y(tǒng) 座的過程。座的過程。x和和y是代表是代表A、B、C座之座之 一,根據(jù)每次不同情況分別取一,根據(jù)每次不同情況分別取A、B、C代入代入 #include int main() void hanoi(int n,char one, char two,char three); int m; printf(“the number of diskes:); scanf(%d, printf(move %d diskes:n
56、,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(char x,char y) printf(%c-%cn,x,y); 7.7.1數(shù)組元素作函數(shù)實(shí)參數(shù)組元素作函數(shù)實(shí)參 7.7.2數(shù)組名作函數(shù)參數(shù)數(shù)組名作函數(shù)參數(shù) 7.7.3多維數(shù)組名作函數(shù)參數(shù)
57、多維數(shù)組名作函數(shù)參數(shù) 例例7.9 輸入輸入10個(gè)數(shù),要求輸出其中值個(gè)數(shù),要求輸出其中值 最大的元素和該數(shù)是第幾個(gè)數(shù)。最大的元素和該數(shù)是第幾個(gè)數(shù)。 解題思路:解題思路: u定義數(shù)組定義數(shù)組a,用來(lái)存放,用來(lái)存放10個(gè)數(shù)個(gè)數(shù) u設(shè)計(jì)函數(shù)設(shè)計(jì)函數(shù)max,用來(lái)求兩個(gè)數(shù)中的大者,用來(lái)求兩個(gè)數(shù)中的大者 u在主函數(shù)中定義變量在主函數(shù)中定義變量m,初值為,初值為a0, 每次調(diào)用每次調(diào)用max函數(shù)后的返回值存放在函數(shù)后的返回值存放在m中中 u用用“打擂臺(tái)打擂臺(tái)”算法,依次將數(shù)組元素算法,依次將數(shù)組元素 a1到到a9與與m比較,最后得到的比較,最后得到的m值值 就是就是10個(gè)數(shù)中的最大者個(gè)數(shù)中的最大者 #incl
58、ude 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, printf(n); 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“,n+1); int max(int x,int y) return(xy?x:y); 除了可以用數(shù)組元素作為函數(shù)參數(shù)外除了可以用數(shù)組元素作為函數(shù)參數(shù)外 ,還可以用數(shù)組名
59、作函數(shù)參數(shù),還可以用數(shù)組名作函數(shù)參數(shù)(包括實(shí)包括實(shí) 參和形參參和形參) 用數(shù)組元素作實(shí)參時(shí),向形參變量傳用數(shù)組元素作實(shí)參時(shí),向形參變量傳 遞的是數(shù)組元素的值遞的是數(shù)組元素的值 用數(shù)組名作函數(shù)實(shí)參時(shí),向形參用數(shù)組名作函數(shù)實(shí)參時(shí),向形參 傳遞傳遞 的是數(shù)組首元素的地址的是數(shù)組首元素的地址 例例7.10 有一個(gè)一維數(shù)組有一個(gè)一維數(shù)組score,內(nèi)放,內(nèi)放 10個(gè)學(xué)生成績(jī),求平均成績(jī)。個(gè)學(xué)生成績(jī),求平均成績(jī)。 解題思路:解題思路: u用函數(shù)用函數(shù)average求平均成績(jī),用數(shù)組名求平均成績(jī),用數(shù)組名 作為函數(shù)實(shí)參,形參也用數(shù)組名作為函數(shù)實(shí)參,形參也用數(shù)組名 u在在average函數(shù)中引用各數(shù)組元素,求
60、函數(shù)中引用各數(shù)組元素,求 平均成績(jī)并返回平均成績(jī)并返回main函數(shù)函數(shù) #include int main() float average(float array10); float score10,aver; int i; printf(input 10 scores:n); for(i=0;i10;i+) scanf(%f, printf(n); aver=average(score); printf(%5.2fn,aver); return 0; 定義實(shí)參數(shù)組定義實(shí)參數(shù)組 float average(float array10) int i; float aver,sum=array0;
溫馨提示
- 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年度環(huán)境污染治理與修復(fù)合同
- 2024年版建筑項(xiàng)目合同樣本
- 永磁同步電機(jī)的課程設(shè)計(jì)
- 企業(yè)建筑施工安全生產(chǎn)管理制度匯編
- 花瓶插花課程設(shè)計(jì)
- 中國(guó)石化安全風(fēng)險(xiǎn)評(píng)估指導(dǎo)意見
- 部編版八年級(jí)《道德與法治》上冊(cè)同步練習(xí)(全冊(cè),含答案)
- 系統(tǒng)文件監(jiān)控課程設(shè)計(jì)
- 網(wǎng)紅飲料制作課程設(shè)計(jì)
- 股市基金課程設(shè)計(jì)
- 醫(yī)療機(jī)構(gòu)資產(chǎn)負(fù)債表(通用模板)
- 廢舊鋰離子電池高值資源化回收利用項(xiàng)目環(huán)評(píng)報(bào)告書
- 審計(jì)英語(yǔ)詞匯大全講課教案
- JIS G3507-1-2021 冷鐓用碳素鋼.第1部分:線材
- 初二家長(zhǎng)會(huì)ppt通用PPT課件
- 小學(xué)生家庭作業(yè)布置存在的誤區(qū)及改進(jìn)策略論文1
- 一元一次含參不等式教學(xué)設(shè)計(jì)83
- 生物醫(yī)學(xué)研究的統(tǒng)計(jì)學(xué)方法課后習(xí)題答案 2014 主編 方積乾
- 牛仔面料成本核算
- 加拿大礦業(yè)政策
- 客情關(guān)系的建立和維護(hù)
評(píng)論
0/150
提交評(píng)論