計(jì)算機(jī)軟件及應(yīng)用第7講 函數(shù)1_第1頁
計(jì)算機(jī)軟件及應(yīng)用第7講 函數(shù)1_第2頁
計(jì)算機(jī)軟件及應(yīng)用第7講 函數(shù)1_第3頁
計(jì)算機(jī)軟件及應(yīng)用第7講 函數(shù)1_第4頁
計(jì)算機(jī)軟件及應(yīng)用第7講 函數(shù)1_第5頁
已閱讀5頁,還剩206頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第7講函數(shù)

7.1為什么要用函數(shù)7.2怎樣定義函數(shù)

7.3調(diào)用函數(shù)

7.4對(duì)被調(diào)用函數(shù)的聲明和函數(shù)原型

7.5函數(shù)的嵌套調(diào)用7.6函數(shù)的遞歸調(diào)用

7.7數(shù)組作為函數(shù)參數(shù)7.8局部變量和全局變量

7.9變量的存儲(chǔ)方式和生存期

7.10關(guān)于變量的聲明和定義

7.11內(nèi)部函數(shù)和外部函數(shù)

7.1為什么要用函數(shù)

?問題:

?如果程序的功能比較多,規(guī)模比較大,把所有代

碼都寫在main函數(shù)中,就會(huì)使主函數(shù)變得龐雜、

頭緒不清,閱讀和維護(hù)變得困難

?有時(shí)程序中要多次實(shí)現(xiàn)某一功能,就需要多次重

復(fù)編寫實(shí)現(xiàn)此功能的程序代碼,這使程序冗長,

不精煉

7.1為什么要用函數(shù)

A解決的方法:用模塊化程序設(shè)計(jì)的思路

?采用“組裝”的辦法簡化程序設(shè)計(jì)的過程

?事先編好一批實(shí)現(xiàn)各種不同功能的函數(shù)

?把它們保存在函數(shù)庫中,需要時(shí)直接用

7.1為什么要用函數(shù)

A解決的方法:用模塊化程序設(shè)計(jì)的思路

?函數(shù)就是功能

?每一個(gè)函數(shù)用來實(shí)現(xiàn)一個(gè)特定的功能

?函數(shù)的名字應(yīng)反映其代表的功能

7.1為什么要用函數(shù)

?在設(shè)計(jì)一個(gè)較大的程序時(shí),往往把它分為若干個(gè)

程序模塊,每一個(gè)模塊包括一個(gè)或多個(gè)函數(shù),每

個(gè)函數(shù)實(shí)現(xiàn)一個(gè)特定的功能

>C程序可由一個(gè)主函數(shù)和若干個(gè)其他函數(shù)構(gòu)成

A主函數(shù)調(diào)用其他函數(shù),其他函數(shù)也可以互相調(diào)用

>同一個(gè)函數(shù)可以被一個(gè)或多個(gè)函數(shù)調(diào)用任意多次

7.1為什么要用函數(shù)

7.1為什么要用函數(shù)

?可以使用庫函數(shù)

?可以使用自己編寫的函數(shù)

?在程序設(shè)計(jì)中要善于利用函數(shù),可以減少

重復(fù)編寫程序段的工作量,同時(shí)可以方便

地實(shí)現(xiàn)模塊化的程序設(shè)計(jì)

7.1為什么要用函數(shù)

例7.1輸出以下的結(jié)果,用函數(shù)調(diào)用實(shí)現(xiàn)。

******************

Howdoyoudo!

******************

7.1為什么要用函數(shù)

?解題思路:

[?在輸出的文字上下分別有一行“*”號(hào),顯然不必

重復(fù)寫這段代碼,用一個(gè)函數(shù)print_star來實(shí)

現(xiàn)輸出一行“*”號(hào)的功能。

?再寫一個(gè)print_message函數(shù)來輸出中間一

行文字信息

?用主函數(shù)分別調(diào)用這兩個(gè)函數(shù)

#include<stdio.h>

intmain()

{voidprint_star();

voidprint_message();

print_star();print_message();

print_star();

return0;輸出16個(gè)*

)

voidprint_star()

**********;*******、)

{printf(ucf.}

voidprint.messageoit^^

{printf("Howdoyoudo!\n");}

include<stdio.h>

聲明函數(shù)

intmain()

{voidprint_star();

voidprintmessage();

print_star();print_message();

print_star();

return0;定義函數(shù)

)

voidprint_star()

******************

printf(n");}

voidprint_message()

{printf("Howdoyoudo!\n");

#include<stdio.h>

intmain()

{voidprint_star();

voidprint_message();

print_star();print_message();

print_star();

return0;

)

voidprint_star()

{printf(u******************\n,J),}

voidprint_message()

{printf("Howdoyoudo!\n");}

A說明:

(1)一個(gè)C程序由一個(gè)或多個(gè)程序模塊組成,

每一個(gè)程序模塊作為一個(gè)源程序文件。對(duì)較大

的程序,一般不希望把所有內(nèi)容全放在一個(gè)文

件中,而是將它們分別放在若干個(gè)源文件中,

由若干個(gè)源程序文件組成一個(gè)C程序。這樣便

于分別編寫、分別編譯,提高調(diào)試效率。一個(gè)

源程序文件可以為多個(gè)C程序共用。

A說明:

(2)一個(gè)源程序文件由一個(gè)或多個(gè)函數(shù)以及其

他有關(guān)內(nèi)容(如預(yù)處理指令、數(shù)據(jù)聲明與定義

等)組成。一個(gè)源程序文件是一個(gè)編譯單位,

在程序編譯時(shí)是以源程序文件為單位進(jìn)行編譯

的,而不是以函數(shù)為單位進(jìn)行編譯的。

Q

A說明:

(3)C程序的執(zhí)行是從main函數(shù)開始的,如

果在main函數(shù)中調(diào)用其他函數(shù),在調(diào)用后流

程返回到main函數(shù),在main函數(shù)中結(jié)束整

個(gè)程序的運(yùn)行。

1

A說明:

(4)所有函數(shù)都是平行的,即在定義函數(shù)時(shí)是

分別進(jìn)行的,是互相獨(dú)立的。一個(gè)函數(shù)并不從

屬于另一個(gè)函數(shù),即函數(shù)不能嵌套定義。函數(shù)

間可以互相調(diào)用,但不能調(diào)用main函數(shù)。

main函數(shù)是被操作系統(tǒng)調(diào)用的。

Q

A說明:

(5)從用戶使用的角度看,函數(shù)有兩種。

?庫函數(shù),它是由系統(tǒng)提供的,用戶不必自己定

義而直接使用它們。應(yīng)該說明,不同的C語言

編譯系統(tǒng)提供的庫函數(shù)的數(shù)量和功能會(huì)有一些

不同,當(dāng)然許多基本的函數(shù)是共同的。

?用戶自己定義的函數(shù)。它是用以解決用戶專門

需要的函數(shù)。

Q

?說明:

(6)從函數(shù)的形式看,函數(shù)分兩類。

①無參函數(shù)。無參函數(shù)一般用來執(zhí)行指定的一

組操作。無參函數(shù)可以帶回或不帶回函數(shù)值,

但一般以不帶回函數(shù)值的居多。

②有參函數(shù)。在調(diào)用函數(shù)時(shí),主調(diào)函數(shù)在調(diào)用

被調(diào)用函數(shù)時(shí),通過參數(shù)向被調(diào)用函數(shù)傳遞數(shù)

據(jù),一般情況下,執(zhí)行被調(diào)用函數(shù)時(shí)會(huì)得到一

個(gè)函數(shù)值,供主調(diào)函數(shù)使用。

C

7.2怎樣定義函數(shù)

7.2.1為什么要定義函數(shù)

7.2.2定義函數(shù)的方法

7.2.1為什么要定義函數(shù)

AC語言要求,在程序中用到的所有函

數(shù),必須“先定義,后使用”

A指定函數(shù)名字、函數(shù)返回值類型、函數(shù)

實(shí)現(xiàn)的功能以及參數(shù)的個(gè)數(shù)與類型,將

這些信息通知編譯系統(tǒng)。

7.2.1為什么要定義函數(shù)

?指定函數(shù)的名字,以便以后按名調(diào)用

A指定函數(shù)類型,即函數(shù)返回值的類型

?指定函數(shù)參數(shù)的名字和類型,以便在調(diào)

用函數(shù)時(shí)向它們傳遞數(shù)據(jù)

?指定函數(shù)的功能。這是最重要的,這是

在函數(shù)體中解決的

7.2.1為什么要定義函數(shù)

?對(duì)于庫函數(shù),程序設(shè)計(jì)者只需用

#inelude指令把有關(guān)的頭文件包含到

本文件模塊中即可

?程序設(shè)計(jì)者需要在程序中自己定義想用

的而庫函數(shù)并沒有提供的函數(shù)

722定義函數(shù)的方法

1.定義無參函數(shù)

定義無參函數(shù)的一般形式為:

類型名函數(shù)名()類型名函數(shù)名(void)

{{

L函數(shù)體:,函數(shù)體

包括聲明部分和

,語句部分

7.2£舉函數(shù)的方法

1定義#指定函數(shù)'

?人,q值的類型

定!義無產(chǎn)或》中式為:

類型名函數(shù)名()類型名函數(shù)名(void)

函數(shù)體函數(shù)體

}}

722定義函數(shù)的方法

2.定義有參函數(shù)

定義有參函數(shù)的一般形式為:

類型名函數(shù)名(形式參數(shù)表列)

函數(shù)體

7.2.2定義函數(shù)的方法

3.定義空函數(shù)

定義空函數(shù)的一般形式為:

類型名函數(shù)名()

{}

?先用空函數(shù)占一個(gè)位置,以后逐步擴(kuò)充

?好處:程序結(jié)構(gòu)清楚,可讀性好,以后

擴(kuò)充新功能方便,對(duì)程序結(jié)構(gòu)影響不大

7.3調(diào)用函數(shù)

7.3.1函數(shù)調(diào)用的形式

7.3.2函數(shù)調(diào)用時(shí)的數(shù)據(jù)傳遞

7.3.3函數(shù)調(diào)用的過程

7.3.4函數(shù)的返回值

Q

7.3,1函數(shù)調(diào)用的形式

?函數(shù)調(diào)用的一般形式為:

函數(shù)名(實(shí)參表列)

?如果是調(diào)用無參函數(shù),則“實(shí)參表列”可

以沒有,但括號(hào)不能省略

A如果實(shí)參表列包含多個(gè)實(shí)參,則各參數(shù)

間用逗號(hào)隔開

7.3,1函數(shù)調(diào)用的形式

A按函數(shù)調(diào)用在程序中出現(xiàn)的形式和位置

來分,可以有以下3種函數(shù)調(diào)用方式:

1.函數(shù)調(diào)用語句

A把函數(shù)調(diào)用單獨(dú)作為一個(gè)語句

如printf_star();

A這時(shí)不要求函數(shù)帶回值,只要求函數(shù)完

成一定的操作

7.3,1函數(shù)調(diào)用的形式

A按函數(shù)調(diào)用在程序中出現(xiàn)的形式和位置

來分,可以有以下3種函數(shù)調(diào)用方式:

2.函數(shù)表達(dá)式

A函數(shù)調(diào)用出現(xiàn)在另一個(gè)表達(dá)式中

^Dc=max(a,b);

A這時(shí)要求函數(shù)帶回一個(gè)確定的值以參加

表達(dá)式的運(yùn)算

7.3,1函數(shù)調(diào)用的形式

A按函數(shù)調(diào)用在程序中出現(xiàn)的形式和位置

來分,可以有以下3種函數(shù)調(diào)用方式:

3.函數(shù)參數(shù)

?函數(shù)調(diào)用作為另一函數(shù)調(diào)用時(shí)的實(shí)參

如m=max(a,max(b,c));

A其中max(b,c)是一次函數(shù)調(diào)用,它的

值作為max另一次調(diào)用的實(shí)參

7.3.2函數(shù)調(diào)用時(shí)的數(shù)據(jù)傳遞

1.形式參數(shù)和實(shí)際參數(shù)

?在調(diào)用有參函數(shù)時(shí),主調(diào)函數(shù)和被調(diào)用函

數(shù)之間有數(shù)據(jù)傳遞關(guān)系

?定義函數(shù)時(shí)函數(shù)名后面的變量名稱為“形式

參數(shù)”(簡稱“形參”)

?主調(diào)函數(shù)中調(diào)用一個(gè)函數(shù)時(shí),函數(shù)名后面

參數(shù)稱為“實(shí)際參數(shù)”(簡稱“實(shí)參”)

?實(shí)際參數(shù)可以是常量、變量或表達(dá)式

7.3.2函數(shù)調(diào)用時(shí)的數(shù)據(jù)傳遞

2.實(shí)參和形參間的數(shù)據(jù)傳遞

?在調(diào)用函數(shù)過程中,系統(tǒng)會(huì)把實(shí)參的值傳

遞給被調(diào)用函數(shù)的形參

?或者說,形參從實(shí)參得到一個(gè)值

?該值在函數(shù)調(diào)用期間有效,可以參加被調(diào)

函數(shù)中的運(yùn)算

7.3.2函數(shù)調(diào)用時(shí)的數(shù)據(jù)傳遞

例7.2輸入兩個(gè)整數(shù),要求輸出其中值較

大者。要求用函數(shù)來找到大數(shù)。

?解題思路:

(1)函數(shù)名應(yīng)是見名知意,今定名為max

(2)由于給定的兩個(gè)數(shù)是整數(shù),返回主調(diào)函數(shù)的

值(即較大數(shù))應(yīng)該是整型

(3)max函數(shù)應(yīng)當(dāng)有兩個(gè)參數(shù),以便從主函數(shù)接

收兩個(gè)整數(shù),因此參數(shù)的類型應(yīng)當(dāng)是整型

7.3.2函數(shù)調(diào)用時(shí)的數(shù)據(jù)傳遞

I先編寫max函數(shù):

intmax(intxjnty)

intz;

z=x>y?x:y;

return(z);

7.3.2函數(shù)調(diào)用時(shí)的數(shù)據(jù)傳遞

在max函數(shù)上面,再編寫主函數(shù)

#include<stdio.h>

intmain()

{intmax(intx,inty);inta5b,c;

printf(£ttwointegernumbers:");

scant(%d,%d5,,&a,&b);

c=max叵功;實(shí)參可以是常量、變量或表達(dá)式

printf(umaxis%d\n",c);

}tuointegerounbers:12,-34

|maxis12

7.3.2函數(shù)調(diào)用時(shí)的數(shù)據(jù)傳遞

c=max(a5b);(main函數(shù))

intmax(intx,inty)(max函數(shù))

intz;

z=x>y?x:y;

return(z);

7.3.3函數(shù)調(diào)用的過程

在定義函數(shù)中指定的形參,在未出現(xiàn)函數(shù)

調(diào)用時(shí),它們并不占內(nèi)存中的存儲(chǔ)單元。

在發(fā)生函數(shù)調(diào)用時(shí),函數(shù)max的形參被臨

時(shí)分配內(nèi)存單元。

7.3.3函數(shù)調(diào)用的過程

A調(diào)用結(jié)束,形參單元被釋放

?實(shí)參單元仍保留并維持原值,沒有改變

A如果在執(zhí)行一個(gè)被調(diào)用函數(shù)時(shí),形參的值

發(fā)生改變,不會(huì)改變主調(diào)函數(shù)的實(shí)參的值

7.3.4.函數(shù)的返回值

A通常,希望通過函數(shù)調(diào)用使主調(diào)函數(shù)能得

到一個(gè)確定的值,這就是函數(shù)值(函數(shù)的返

回值)

(1)函數(shù)的返回值是通過函數(shù)中的return語

句獲得的。

?一個(gè)函數(shù)中可以有一個(gè)以上的return語句,

執(zhí)行到哪一個(gè)return語句,哪一個(gè)就起作用

?return語句后面的括號(hào)可以不要

7.3.4.函數(shù)的返回值

A通常,希望通過函數(shù)調(diào)用使主調(diào)函數(shù)能得

到一個(gè)確定的值,這就是函數(shù)值(函數(shù)的返

回值)

(2)函數(shù)值的類型。應(yīng)當(dāng)在定義函數(shù)時(shí)指定

函數(shù)值的類型

7.3.4.函數(shù)的返回值

A通常,希望通過函數(shù)調(diào)用使主調(diào)函數(shù)能得

到一個(gè)確定的值,這就是函數(shù)值(函數(shù)的返

回值)

(3)在定義函數(shù)時(shí)指定的函數(shù)類型一般應(yīng)該

和return語句中的表達(dá)式類型一致

?如果函數(shù)值的類型和return語句中表達(dá)式的

值不一致,則以函數(shù)類型為準(zhǔn)

7.3.4.函數(shù)的返回值

例7.3將例7.2稍作改動(dòng),將在max函數(shù)中定

義的變量z改為float型。函數(shù)返回值的類型

與指定的函數(shù)類型不同,分析其處理方法。

A解題思路:如果函數(shù)返回值的類型與指定

的函數(shù)類型不同,按照賦值規(guī)則處理。

#include<stdio.h>

intmain()

{intmax(floatx,floaty);

floata,b;intc;

scanf(n%f,%f,\&a,&b);「?5,2.6

c=|max(a、b)|變?yōu)?[maxis2

printf(maxis%d\n",c);

return0;26

intmax(floatx,floaty)

{floatz;

z=x>y?x:y;

return(z);

}亢l=±>2

7.4對(duì)被調(diào)用函數(shù)的聲明和函數(shù)原型

A在一個(gè)函數(shù)中調(diào)用另一個(gè)函數(shù)需要具備如

下條件:

(1)被調(diào)用函數(shù)必須是已經(jīng)定義的函數(shù)(是庫

函數(shù)或用戶自己定義的函數(shù))

(2)如果使用庫函數(shù),應(yīng)該在本文件開頭加相

應(yīng)的#include指令

(3)如果使用自己定義的函數(shù),而該函數(shù)的位

置在調(diào)用它的函數(shù)后面,應(yīng)該聲明_

7.4對(duì)被調(diào)用函數(shù)的聲明和函數(shù)原型

例7.4輸入兩個(gè)實(shí)數(shù),用一個(gè)函數(shù)求出它

們之和。

A解題思路:用add函數(shù)實(shí)現(xiàn)。首先要定義

■add函數(shù),它為float型,它應(yīng)有兩個(gè)參

數(shù),也應(yīng)為float型。特別要注意的是:

要對(duì)add函數(shù)進(jìn)行聲明。

7.4對(duì)被調(diào)用函數(shù)的聲明和函數(shù)原型

A分別編寫add函數(shù)和main函數(shù),它們組

成一個(gè)源程序文件

Amain函數(shù)的位置在add函數(shù)之前

A在main函數(shù)中對(duì)add函數(shù)進(jìn)行聲明

#include<stdio.h>=

對(duì)adch

intmain()I「―

{floatadd(floatx,floaty);

floata,b,c;

printf("Pleaseenteraandb:H);

nn

scanf(%f,%f,&a5&b);

c=add(a,b);

printf("sumis%f\n",c);

return0;

floatadd(floatx,floaty)

{floatz;

求兩個(gè)實(shí)數(shù)之和,z=x+y;

函數(shù)值也是實(shí)型return(z);

#include<stdio.h>廠只差一個(gè)分號(hào)一

intmain()'----------

{floatadd(floatx,floaty);

floata,b,c;

printf("Pleaseenteraandb:H);

scanf(n%f,%fn,&a,&b);

c=add(a,b);

printf("sumis%f\n",c);

return0;

floatadd(floatx,floaty)

){floatz;

z=x+y;

return(z);?

Pleaseenteraandb:3.6^6.5

includesunis10.100000

intmain

{floatadd(floatx,floaty);

floata,b,c;

printf("Pleaseenteraandb:H);

scanf(n%f,%f",&a,&b);1——

c=add(a.b):調(diào)用add函數(shù)

printf("sumis%f\n",c);

return0;

floatadd(floatx,floaty)

){floatz;

r..........-z=x+y;

定義add函數(shù)return(z);

)c

?函數(shù)原型的一般形式有兩種:

如floatadd(floatx,floaty);

floatadd(float,float);

?原型說明可以放在文件的開頭,這時(shí)所有

函數(shù)都可以使用此函數(shù)

Q

7.5函數(shù)的嵌套調(diào)用

AC語言的函數(shù)定義是互相平行、獨(dú)立的

?即函數(shù)不能嵌套定義

?但可以嵌套調(diào)用函數(shù)

?即調(diào)用一個(gè)函數(shù)的過程中,又可以調(diào)用另

一個(gè)函數(shù)

7.5函數(shù)的嵌套調(diào)用

main函數(shù)a函數(shù)b函數(shù)

結(jié)束

7.5函數(shù)的嵌套調(diào)用

例7.5輸入4個(gè)整數(shù),找出其中最大的數(shù)。

用函數(shù)的嵌套調(diào)用來處理。

?解題思路:

?main中調(diào)用max4函數(shù),找4個(gè)數(shù)中最大者

?max4中再調(diào)用max2,找兩個(gè)數(shù)中的大者

?max4中多次調(diào)用max2,可找4個(gè)數(shù)中的大

者,然后把它作為函數(shù)值返回main函數(shù)

?main函數(shù)中輸出結(jié)果1

主函數(shù)

#include<stdio.h>[勺max4函數(shù)聲明一

intmain()

{intmax4(inta,intb,intc,intd);

inta,b3c3d,max;

printf(£<4intergernumbers:");

scant("%d%d%d%d",&a,&b,&c,&d);

max=max4(a3b5c,d);

printf("max=%d\nH,max);

return0;

主函數(shù)

#include<stdio.h>

intmain()

{intmax4(inta,intb,intc,intd);

inta,b3c5d,max;「輸入4個(gè)整數(shù)

printf(£<4intergernumb

scant("%d%d%d%d",&a,&b,&c,&d);

max=max4(a3b5c,d);

printf("max=%d\nH,max);

return0;

主函數(shù)

#include<stdio.h>

intmain()

{intmax4(inta,intb,intc,intd);

inta,b,c,f斕用后肯定是4、

Prmtf(“4個(gè)數(shù)中最大者ers:");

scant("%df;

max=max4(a3b5c,d);

printf("max=%d\nH,max);

return0;j"\

1[輸出最大者

max4函數(shù)

intmax4(inta,intb,intcjntd)

{intmax2(inta,intb);

intm;_

m=max2(a,b);「^max2函數(shù)聲明

m=max2(m,c);

m=max2(m,d);

return(m);

)

c

max4函數(shù)

intmax4(inta,intb,intcjntd)

{intmax2(inta,intb);

intm;___________

m=max2(a,b);中較大者]

m=max2(m,c);中較大者一

m=max2(m,d);—Ja‘b’c’d中最大者

return(m);

)

c

max4函數(shù)

intmax4(inta,intb,intcjntd)

{intmax2(inta,intb);

intm;

m=max2(a5b);

m=max2(m,c);max2函數(shù)

m=max2(m,d);

intmax2(inta,intb)

return(m);{if(a>=b)

returna;

else

returnb;

max4函數(shù)

intmax4(inta,intb,intcjntd)

{intmax2(inta,intb);

intm;

m=max2(a5b);

m=max2(m,c);max2函數(shù)

m=max2(m,d);

intmax2(inta,intb)

return(m);{if(a>=b)

)/returna;

else

returnb;

return(a>b?a:b);

max4函數(shù)

intmax4(inta,intb,intcjntd)

{intmax2(inta,intb);

intm;

m=max2(a5b);

m=max2(m,c);

m=max2(m,d);

return(m);

}

intmax2(inta,intb)

{return(a>b?a:b);}

max4函數(shù)

intmax4(inta,intb,intcjntd)

{intmax2(inta,intb);

intm;m=max2(max2(a5b),c);

m=max2(a,b);;J

m=max2(m,c);

m=max2(m,d);

return(m);

)

intmax2(inta,intb)

{return(a>b?a:b);}

max4函數(shù)

intmax4(inta,intb,intcjntd)

{intmax2(m=max2(max2(max2(a,b),c),d);

intm;J

m=max2(a,b);

m=max2(m,c);

m=max2(m,d);

return(m);

)

intmax2(inta,intb)

{return(a>b?a:b);}

max4函數(shù)

intmaxruturnmax2(max2(max2(ajb),c),d);

{int

intm;

m=max2(a,b);

m=max2(m,c);

m=max2(m,d);

return(m);

}I

intmax2(inta,intb)

{return(a>b?a:b);}

#includ駕84intergernumbers:1245—689

|fnax=89

intmain眄

}…max=彳max4(a5b5c5d);

intmax4yinta,intb,intc,intd)

{intma/<2(intajntb);

ruturnmax2(max2(max2(a,b),c)5d)5

intmax2(intajntN^/

{return(a>b?a:b);}

7.6函數(shù)的遞歸調(diào)用

?在調(diào)用一個(gè)函數(shù)的過程中又出現(xiàn)直接或間

接地調(diào)用該函數(shù)本身,稱為函數(shù)的遞歸調(diào)

用。

>C語言的特點(diǎn)之一就在于允許函數(shù)的遞歸

調(diào)用。

7.6函數(shù)的遞歸調(diào)用

intf(intx)f函數(shù)

I

,直接調(diào)用本函數(shù)

調(diào)用f函數(shù)

z=f(y);---------------------------

returrk(2*z)if1函數(shù)f2函數(shù)

}[間接調(diào)用本函數(shù)廠|

廣\調(diào)用f2函數(shù)調(diào)用f1函數(shù)一

應(yīng)使用if語句控制結(jié)束調(diào)用…」C

7.6函數(shù)的遞歸調(diào)用

例7.6有5個(gè)學(xué)生坐在一起

?問第5個(gè)學(xué)生多少歲?他說比第4個(gè)學(xué)生大2歲

?問第4個(gè)學(xué)生歲數(shù),他說比第3個(gè)學(xué)生大2歲

?問第3個(gè)學(xué)生,又說比第2個(gè)學(xué)生大2歲

?問第2個(gè)學(xué)生,說比第1個(gè)學(xué)生大2歲

?最后問第1個(gè)學(xué)生,他說是10歲

?請(qǐng)問第5個(gè)學(xué)生多大

7.6函數(shù)的遞歸調(diào)用

A解題思路:

?要求第5個(gè)年齡,就必須先知道第4個(gè)年齡

?要求第4個(gè)年齡必須先知道第3個(gè)年齡

?第3個(gè)年齡又取決于第2個(gè)年齡

?第2個(gè)年齡取決于第1個(gè)年齡

?每個(gè)學(xué)生年齡都比其前1個(gè)學(xué)生的年齡大2

7.6函數(shù)的遞歸調(diào)用

?解題思路:

age(5)=age(4)+21

age(4)=age(3)+2

age(3)=age(2)+2-

age(2)=age(1)+2

age(1)=10

age(n)=10(〃=D

age(n)=age(n-1)+25>1)?

age(5)age(5)

=age(4)+2=18

\

age(4)

=age(3)+2=16

\

age(3)京)

=age(2)+2一14

\

age(2)

=age(1)+212

回溯階段遞推階段

=10

age(5)age(5)

=age(4)+2=18

age(4)

age(3)+2=16

age(3)京)

=age(2)^彳=14

結(jié)束遞歸的條件

遞推階段

#inelude<stdio.h>

intmain()

{intage(intn);

printf("N0.5,age:%d\nH,age(5));

return0;

)

intage(intn)

{intc;

if(n==1)c=10;

elsec=age(n-1)+2;

return(c);

[NO.5,age

)

age函數(shù)age函數(shù)

mainn=5n=4

age(5)

c=age£4)+2c=age(3)+2

輸出age(5)

18age(5)=18agd(4JV16

age函數(shù)age函數(shù)

n=1n=2n=3

c=10c=ajge(1)+2c=age(2)+2

age(1)=10age(2)=12age(3)=14應(yīng)

例7.7用遞歸方法求n!o

A解題思路:

?求n!可以用遞推方法:即從1開始,乘2,

再乘3...一直乘到no

?遞推法的特點(diǎn)是從一個(gè)已知的事實(shí)(如1!=1)

出發(fā),按一定規(guī)律推出下一個(gè)事實(shí)(如

2!=1!*2),再從這個(gè)新的已知的事實(shí)出發(fā),

再向下推出一個(gè)新的事實(shí)(3!=3*2!)。

n!=n*(n-1)!。

Q

例7.7用遞歸方法求n!o

A解題思路:

?求n!也可以用遞歸方法,即5!等于4!X

5,而4!=3!義4,一,1!=1

?可用下面的遞歸公式表示:

(nl=1(〃=0,1)

〃!=1

孔?(幾一1)(〃>1)

Q

#include<stdio.h>

intmain()

{intfac(intn);

intn;inty;

printf("inputanintegernumber:'1

scant("%d"3&n);

y=fac(n);

printf("%d!=%d\n"5n,y);

return0;

intfac(intn)

intf;

if(n<0)

printf("n<0,dataerror!");

elseif(n==0||n==1)

f=1;

elsef=fac(n-1)

return(f);

Li,.?'工r

)inputanintegernumber:31

□1?=738197504

fac函數(shù)fac函數(shù)

mainn=5n=4

fac(5)

福而京(5)f=fac(4)X5f=faQ(3)X4

120fac(5)=120fac")、24

fac函數(shù)fac函數(shù)fac函婁

n=1n=2n=3

f=fac(1)X2f=fac(2)X3

fac(1)=1fac(2)=2fac(3)=6r-

例7.8Hanoi(漢諾)塔問題。古代有一

個(gè)梵塔,塔內(nèi)有3個(gè)座A、B、C,開始時(shí)

A座上有64個(gè)盤子,盤子大小不等,大的

在下,小的在上。有一個(gè)老和尚想把這64

個(gè)盤子從A座移到C座,但規(guī)定每次只允

許移動(dòng)一個(gè)盤,且在移動(dòng)過程中在3個(gè)座上

都始終保持大盤在下,小盤在上。在移動(dòng)

過程中可以利用B座。要求編程序輸出移動(dòng)

一盤子的步驟。

C

o

co

<

A解題思路:

?要把64個(gè)盤子從A座移動(dòng)到C座,需要移動(dòng)大

約264次盤子。一般人是不可能直接確定移動(dòng)

盤子的每一個(gè)具體步驟的

?老和尚會(huì)這樣想:假如有另外一個(gè)和尚能有辦

法將上面63個(gè)盤子從一個(gè)座移到另一座。那

么,問題就解決了。此時(shí)老和尚只需這樣做:

A解題思路:

(1)命令第2個(gè)和尚將63個(gè)盤子從A座移到B座

(2)自己將1個(gè)盤子(最底下的、最大的盤子)

從A座移到C座

(3)再命令第2個(gè)和尚將63個(gè)盤子從B座移到C

c

第1個(gè)和尚的做法

將63個(gè)從A到B

ABC

第1個(gè)和尚的做法

將63個(gè)從A到B

ABC

第1個(gè)和尚的做法

將1個(gè)從A到C

ABC

第1個(gè)和尚的做法

(

第1個(gè)和尚的做法

將63個(gè)從B到C

ABC

第1個(gè)和尚的做法

將63個(gè)從B到C

AB

第2個(gè)和尚的做法

將62個(gè)從A至UC

ABC

第2個(gè)和尚的做法

ABC

第2個(gè)和尚的做法

將1個(gè)從A到B

ABC

第2個(gè)和尚的做法

將1個(gè)從A到B

AB

1

第2個(gè)和尚的做法

將62個(gè)從C至UB

ABC

第2個(gè)和尚的做法

將62個(gè)從C至UB

ABC

第3個(gè)和尚的做法

第4個(gè)和尚的做法

第5個(gè)和尚的做法

第6個(gè)和尚的做法

第7個(gè)和尚的做法

第63個(gè)和尚的做法

第64個(gè)和尚僅做:將1個(gè)從A移到C

將3個(gè)盤子從A移到C的全過程

將2個(gè)盤子從A移到B

ABC

將3個(gè)盤子從A移到C的全過程

將2個(gè)盤子從A移到B

ABC

將3個(gè)盤子從A移到C的全過程

將1個(gè)盤子從A移到C

ABC

將3個(gè)盤子從A移到C的全過程

將1個(gè)盤子從A移到C

ABC

Q

將3個(gè)盤子從A移到C的全過程

將2個(gè)盤子從B移到C

ABC

Q

將3個(gè)盤子從A移到C的全過程

將2個(gè)盤子從B移到C

ABC

將2個(gè)盤子從A移到B的過程

將1個(gè)盤子從A移到C

ABC

將2個(gè)盤子從A移到B的過程

將1個(gè)盤子從A移到C

ABC

將2個(gè)盤子從A移到B的過程

將1個(gè)盤子從A移到B

將2個(gè)盤子從A移到B的過程

將1個(gè)盤子從A移到B

AB

Q

將2個(gè)盤子從A移到B的過程

將1個(gè)盤子從C移到B

AB

Q

將2個(gè)盤子從A移到B的過程

將1個(gè)盤子從C移到B

ABC

將2個(gè)盤子從B移到C的過程

ABC

將2個(gè)盤子從B移到C的過程

ABC

將2個(gè)盤子從B移到C的過程

ABC

將2個(gè)盤子從B移到C的過程

ABC

A由上面的分析可知:將n個(gè)盤子從A座移

至IJC座可以分解為以下3個(gè)步驟:

(1)將A上n-1個(gè)盤借助C座先移到B座上

(2)把A座上剩下的一個(gè)盤移到C座上

(3)將n-1個(gè)盤從B座借助于A座移到C座上

?可以將第(1)步和第(3)步表示為:

?將“one”座上n-1個(gè)盤移到“two”座(借

助“three”座)。

?在第(1)步和第(3)步中,one、two、

three和A、B、C的對(duì)應(yīng)關(guān)系不同。

?對(duì)第(1)步,對(duì)應(yīng)關(guān)系是one對(duì)應(yīng)A,two

對(duì)應(yīng)B,three對(duì)應(yīng)C。

?對(duì)第(3)步,對(duì)應(yīng)關(guān)系是one對(duì)應(yīng)B,two

對(duì)應(yīng)C,three對(duì)應(yīng)A。

>把上面3個(gè)步驟分成兩類操作:

(1)將n-1個(gè)盤從一個(gè)座移到另一個(gè)座上(n

>1)O這就是大和尚讓小和尚做的工作,

它是一個(gè)遞歸的過程,即和尚將任務(wù)層層下

放,直到第64個(gè)和尚為止。

(2)將1個(gè)盤子從一個(gè)座上移到另一座上。這

是大和尚自己做的工作。

?編寫程序。

?用hanoi函數(shù)實(shí)現(xiàn)第1類操作(即模擬小和

尚的任務(wù))

?用move函數(shù)實(shí)現(xiàn)第2類操作(模擬大和尚

自己移盤)

?函數(shù)調(diào)用hanoi(n,one』wo.three)表示

將n個(gè)盤子從“one"座移到"three55座的過

程(借助“two”座)

?函數(shù)調(diào)用move(x,y)表示將1個(gè)盤子從x座

移到y(tǒng)座的過程。x和y是代表A、B、C座之

一,根據(jù)每次不同情況分別取A、B、C代入

#include<stdio.h>

intmain()

{voidhanoi(intn,charone,

chartwo,charthree);

intm;

printf(uthenumberofdiskes:");

scant("%d",&m);

printf("move%ddiskes:\n",m);

hanoi(m,,A,,,B,,,C,);

}

(

voidhanoi(intn,charone,chartwo,

charthree)

{voidmove(charx,chary);

if(n==1)

move(one,three);

else

{hanoi(n-1,one,three5two);

move(one5three);

hanoi(n-1,two,one5three);

voidmove(charx5chary)

printf("%c-->%c\nH,x,y);

thenumberofdiskes:3

noue3diskes:

A—>C

A—>B

C—>B

A—>C

B-〉A(chǔ)

B—>C

A—>C

7.7數(shù)組作為函數(shù)參數(shù)

7.7.1數(shù)組元素作函數(shù)實(shí)參

7.7,2數(shù)組名作函數(shù)參數(shù)

7.7.3多維數(shù)組名作函數(shù)參數(shù)

77J數(shù)組元素作函數(shù)實(shí)參

例7.9輸入10個(gè)數(shù),要求輸出其中值

最大的元素和該數(shù)是第幾個(gè)數(shù)。

7.7J數(shù)組元素作函數(shù)實(shí)參

?解題思路:

?定義數(shù)組a,用來存放10個(gè)數(shù)

?設(shè)計(jì)函數(shù)max,用來求兩個(gè)數(shù)中的大者

?在主函數(shù)中定義變量m,初值為a[0],

每次調(diào)用max函數(shù)后的返回值存放在m中

?用“打擂臺(tái)”算法,依次將數(shù)組元素a[1]

到2[9]與m比較,最后得到的m值就是

10個(gè)數(shù)中的最大者

#include<stdio.h>

intmain()

{intmax(intxjnty);

inta[10],m,nJ;

printf(u10integernumbers:\n");

for(i=0;i<10;i++)

scant("%d",&a[i]);

printf("\n");

10integernumbers:

470-343467-4231-76

for(i=1,m=a[0],n=0;i<10;i++)

{if(max(m,a[i])>m)

{m=max(m,a[i]);

n=i;

largestnumberis67

)7thnunber.

)

printf(largestnumberis%d\n",m);

printf(u%dthnumber.\n\n+1);

}

intmax(intx,inty)

{return(x>y?x:y);}

7?7?2數(shù)組名作函數(shù)參數(shù)

A除了可以用數(shù)組元素作為函數(shù)參數(shù)外

,還可以用數(shù)組名作函數(shù)參數(shù)(包括實(shí)

I參和形參)

?用數(shù)組元素作實(shí)參時(shí),向形參變量傳

遞的是數(shù)組元素的值

A用數(shù)組名作函數(shù)實(shí)參時(shí),向形參傳遞

的是數(shù)組首元素的地址

7?7?2數(shù)組名作函數(shù)參數(shù)

例7.10有一個(gè)一維數(shù)組score,內(nèi)放

]110個(gè)學(xué)生成績,求平均成績。

A解題思路:

I?用函數(shù)average求平均成績,用數(shù)組名

I作為函數(shù)實(shí)參,形參也用數(shù)組名

?在average函數(shù)中引用各數(shù)組元素,求

平均成績并返回main函數(shù)

#include<stdio.h><-

定義實(shí)參數(shù)組

intmain()

{floataveragearray[10]);

floatscore[10]5aver;inti;

printf("input10scores:\n");

for(i=0;i<10;i++)

H

scant("%f5&score[i]);

printf("\n");

aver=average(score);

printf("%5.2f\n",aver);

return0;

定義形參數(shù)組

floataverage(floatarray[10])

{inti;

floataver,sum=array[0];

for(i=1;i<10;i++)tl^^score[0]

sum=sum+array[i];L----------------

aver=sum/10;-----------

return(aver);[相當(dāng)于score。]]

input10scores:

10056789867.5995488.57658

77.50

例7.11有兩個(gè)班級(jí),分別有35名和30

名學(xué)生,調(diào)用一個(gè)average函數(shù),分別求

這兩個(gè)班的學(xué)生的平均成績。

?解題思路:

?需要解決怎樣用同一個(gè)函數(shù)求兩個(gè)不同長度的

數(shù)組的平均值的問題

?定義average函數(shù)時(shí)不指定數(shù)組的長度,在

形參表中增加一個(gè)整型變量i

?從主函數(shù)把數(shù)組實(shí)際長度從實(shí)參傳遞給形參i

?這個(gè)i用來在average函數(shù)中控制循環(huán)的次數(shù)

?為簡化,設(shè)兩個(gè)班的學(xué)生數(shù)分別為5和10

#include<stdio.h>

intmain()

{floataverage(floatarray[],intn);

floatscorel[5]={98.5,97,91.5,60,55);

floatscore2[10]={67.5,89.5,99,69.5,

77,89.5,76.5,54,60,99.5};

printf(u%6.2f\rT,average(scorel⑸);

printf("%6.2f\n5J,average(score2,10));

return0;

)

調(diào)用形式為average(scorel,5)時(shí)

floataverage(floatarray[],intn)

{inti;相當(dāng)于5

floataveum=array[0];

for(i=1;i<n;i++)

相當(dāng)于score1[0]

sum=sum+array[i];

aver=sum/n;

相當(dāng)于scorel[i]

return(aver);

調(diào)用形式為average(score2,10)時(shí)

floataverage(floatarray[],intn)

{inti;1相當(dāng)于10;

floatavehx/Urn^array[0];

for(i=1;i<n;i++)^^=Fscore2[0]

sum=sum+array[i]S---------------------

aver=sum/n;---------------

return(aver);[相當(dāng)于score2[i]」

}80.40

?8.20

例7.12用選擇法對(duì)數(shù)組中10個(gè)整數(shù)按由

小到大排序。

A解題思路:

I?所謂選擇法就是先將10個(gè)數(shù)中最小的數(shù)與

a[0]對(duì)換;再將a[1]到a[9]中最小的數(shù)與

a[1]對(duì)換....每比較一輪,找出一個(gè)未經(jīng)排

序的數(shù)中最小的一個(gè)

?共比較9輪

小到大排序

#include<stdio.h>

intmain()

{voidsort(intarray[],intn);

inta[10]J;

printf("enterarray:\n");

for(i=0;i<10;i++)scant("%d",&a[i]);

sort(a,10);

printf("Thesortedarray:\n");

for(i=0;i<10;i++)printf("%dn,a[i]);

printf("\n");

return0;

voidsort(intarray[],intn)

{inti,j,k,t;P^sort[i]?sort[9]中,

for(i=0;i<n-1;i++)最小數(shù)Ksort[i]對(duì)換

{k=i;------

for(j=i+1;jvn;j++)

if(array[j]<array[k])k=j;

t=array[k];

array[k]=array[i];

tenterarray:

45290-3541256633

Thesortedarray:

-302591233455466

7?7.3多維數(shù)組名作函數(shù)參數(shù)

[例7.13有一個(gè)3X4的矩陣,求所有

[元素中的最大值。

?解題思路:先使變量max的初值等于

[矩陣中第一個(gè)元素的值,然后將矩陣

[中各個(gè)元素的值與max相比,每次比

I較后都把“大者”存放在max中,全部

[元素比較完后,max的值就是所有元

素的最大值。

不能省略

#include<stdi形參數(shù)組弟一維大小相同

intmain()一

{intmax_value(intarray[f[4]);

inta[3][4]={{1,35537},{234,658}5

(15,17,34,12));

printf(uMaxvalueis%d\rT,

max_value(a));

return0;

}

要與實(shí)參數(shù)組第二維大小相同

intmax_value(intarray[][4])

{intij,max;

max=array[0][0];

for(i=0;i<3;i++)

for(j=0;j<4;j++)

if(array[i][j]>max)

max=array[i][j];

return(max);

7,8局部變量和全局變量

7.8.1局部變量

7..2全局變量

1

7.8.1局部變量

>定義變量可能有三種情況:

?在函數(shù)的開頭定義

?在函數(shù)內(nèi)的復(fù)合語句內(nèi)定義

?在函數(shù)的外部定義

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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)論