ch07用函數(shù)實(shí)現(xiàn)模塊化程序設(shè)計(jì)10學(xué)時(shí)_第1頁
ch07用函數(shù)實(shí)現(xiàn)模塊化程序設(shè)計(jì)10學(xué)時(shí)_第2頁
ch07用函數(shù)實(shí)現(xiàn)模塊化程序設(shè)計(jì)10學(xué)時(shí)_第3頁
ch07用函數(shù)實(shí)現(xiàn)模塊化程序設(shè)計(jì)10學(xué)時(shí)_第4頁
ch07用函數(shù)實(shí)現(xiàn)模塊化程序設(shè)計(jì)10學(xué)時(shí)_第5頁
已閱讀5頁,還剩192頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第7章用函數(shù)實(shí)現(xiàn)模塊化程序設(shè)計(jì)函數(shù)是什么函數(shù)的定義和調(diào)用函數(shù)的嵌套調(diào)用和遞歸調(diào)用數(shù)組作為函數(shù)參數(shù)變量的作用域和生存期函數(shù)和外部函數(shù)提高部分27.1

函數(shù)是什么問題:如果程序的功能比較多,規(guī)模比較大,把所有的程序代碼都寫在一個(gè)主函數(shù)中,就會(huì)使主函數(shù)變得龐雜、頭緒不清,使閱讀和程序變得。37.1

函數(shù)是什么問題:有時(shí)程序中要多次實(shí)現(xiàn)某能,就需要多次重復(fù)編寫實(shí)現(xiàn)此功能的程序代碼。這使程序冗長(zhǎng),不精煉。457.1

函數(shù)是什么解決辦法:采用“組裝”的辦法簡(jiǎn)化程序設(shè)計(jì)過程事先編好一批函數(shù),實(shí)現(xiàn)各種不同的功能用到什么函數(shù)就直接使用就可以這就是模塊化的程序設(shè)計(jì)67.1

函數(shù)是什么函數(shù)(function)就是功能每一個(gè)函數(shù)被用來實(shí)現(xiàn)一個(gè)特定的功能函數(shù)的名字應(yīng)反映其代表的功能77.1

函數(shù)是什么在設(shè)計(jì)一個(gè)較大的程序時(shí),往往把它分為若干個(gè)程序模塊,每一個(gè)模塊包括一個(gè)或多個(gè)函數(shù),每個(gè)函數(shù)實(shí)現(xiàn)一個(gè)特定的功能。一個(gè)C程序可由一個(gè)主函數(shù)和若干個(gè)其他函數(shù)構(gòu)成。由主函數(shù)調(diào)用其他函數(shù),其他函數(shù)也可以互相調(diào)用。同一個(gè)函數(shù)可以被一個(gè)或多個(gè)函數(shù)調(diào)用任意多次。7.1

函數(shù)是什么mainabcfghdeie87.1

函數(shù)是什么可以使用庫(kù)函數(shù)可以使用自己編寫的函數(shù)在程序設(shè)計(jì)中要利用函數(shù),可以減少重復(fù)編寫程序段的工作量,同時(shí)可以方便地實(shí)現(xiàn)模塊化的程序設(shè)計(jì)9107.1

函數(shù)是什么例7.1

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

do

you

do!******************117.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>int

main(){void

print_star();void

print_message();print_star();print_message();print_star();return

0;}void

print_star(){}輸出18個(gè)*printf("******************\n");輸出文字消息void

print_message(){printf("How

do

you

do!\n");}12#include

<stdio.h>int

main(){void

print_star();void

print_message();print_star();print_message();print_star();return

0;}void

print_star(){printf("******************\n");}函數(shù)函數(shù)定義void

print_message(){printf("How

do

you

do!\n");}1314說明:(1)一個(gè)C程序由一個(gè)或多個(gè)程序模塊組成,每一個(gè)程序模塊作為一個(gè)源程序文件。對(duì)于較大的程序,一般不把所有內(nèi)容全放在一個(gè)源程序文件中,而是將它們分別放在若干個(gè)源文件中,由若干個(gè)源程序文件組成一個(gè)C程序。這樣便于分別編寫、分別編譯,提高調(diào)試效率。一個(gè)源程序文件可以為多個(gè)C程序所調(diào)用。說明:(2)一個(gè)源程序文件由一個(gè)或多個(gè)函數(shù)以及其他有關(guān)內(nèi)容(如預(yù)處理指令、數(shù)據(jù)與定義等)組成。一個(gè)源程序文件是一個(gè)編譯單位,在程序編譯時(shí)是以源程序文件為單位進(jìn)行編譯的,而不是以函數(shù)為單位進(jìn)行編譯的。1516說明:(3)不論main函數(shù)出現(xiàn)在什么位置,總是從main函數(shù)開始執(zhí)行。如果在main函數(shù)中調(diào)用其他函數(shù),在調(diào)用后流程返回到main函數(shù),在main函數(shù)中結(jié)束整個(gè)程序的運(yùn)行。17說明:(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)用的。18說明:(5)從用戶使用的角度看,函數(shù)有兩種。庫(kù)函數(shù),它是由系統(tǒng)提供的,用戶不必自己定義而直接使用它們。應(yīng)該說明,不同的C語言編譯系統(tǒng)提供的庫(kù)函數(shù)的數(shù)量和功能會(huì)有一些不同,當(dāng)然許多基本的函數(shù)是共同的。用戶自己定義的函數(shù)。它是用以解決用戶專門需要的函數(shù)。19說明:(6)從函數(shù)的形式看,函數(shù)分兩類。①無參函數(shù)。函數(shù)沒有參數(shù),一般用來執(zhí)行固定的一組操作。無參函數(shù)可以帶回或不帶回函數(shù)值,但一般以不帶回函數(shù)值的居多。②有參函數(shù)。在調(diào)用函數(shù)時(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ù)使用。7.2

函數(shù)的定義和調(diào)用1.

為什么要定義函數(shù)函數(shù)定義函數(shù)的調(diào)用對(duì)被調(diào)用函數(shù)的和函數(shù)原型20217.2.1

為什么要定義函數(shù)C語言要求,在程序中用到的所有函數(shù),必須“先定義,后使用”指定函數(shù)名字、函數(shù)返回值類型、函數(shù)實(shí)現(xiàn)的功能以及參數(shù)的個(gè)數(shù)與類型,將這些信息通知編譯系統(tǒng)。227.2.1

為什么要定義函數(shù)指定函數(shù)的名字,以便以后按名調(diào)用指定函數(shù)類型,即函數(shù)返回值的類型指定函數(shù)參數(shù)的名字和類型,以便在調(diào)用函數(shù)時(shí)向它們傳遞數(shù)據(jù)指定函數(shù)的功能。這是最重要的,這是在函數(shù)體中解決的237.2.1

為什么要定義函數(shù)如果程序中要調(diào)用庫(kù)函數(shù),只需用#include指令把有關(guān)的頭文件包含到本文件模塊中即可。如果想使用庫(kù)函數(shù)中沒有的函數(shù),需要程序設(shè)計(jì)者在程序中自己定義。7.2.2

函數(shù)定義}包括

部分和語句部分1.怎樣定義無參函數(shù)函數(shù)名后的圓括號(hào)中為空,沒有參數(shù)定義無參函數(shù)的一般形式為:類型名

函數(shù)名(){

指定函數(shù)值的類型函數(shù)體247.2.2

函數(shù)定義1.怎樣定義無參函數(shù)函數(shù)名后的圓括號(hào)中為空,沒有參數(shù)定義無參函數(shù)的一般形式為:函數(shù)名()void{

表示函數(shù)沒有返回值函數(shù)體}25267.2.2

函數(shù)定義2.怎樣定義有參函數(shù)定義有參函數(shù)的一般形式為:類型名函數(shù)名(形式參數(shù)表列){函數(shù)體}7.2.2

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

max

(int

x,int

y){int

z;if(x>y)z=x;elsez=y;return

z;}函數(shù)的功能是什么?27287.2.2

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

){

}先用空函數(shù)占一個(gè)位置,以后逐步擴(kuò)充好處:程序結(jié)構(gòu)清楚,可讀性好,以后擴(kuò)充新功能方便,對(duì)程序結(jié)構(gòu)影響不大7.2.3

函數(shù)的調(diào)用1.調(diào)用無參函數(shù)的形式函數(shù)名()如print_star()2.調(diào)用有參函數(shù)的形式函數(shù)名(實(shí)參表列)如max(a,b)如果有多個(gè)參數(shù),用逗號(hào)隔開2930例7.2輸入兩個(gè)整數(shù),輸出二者中的大者。要求在主函數(shù)中輸入兩個(gè)整數(shù),用一個(gè)函數(shù)max求出其中的大者,并在主函數(shù)中輸出此值。31解題思路:題目要求用一個(gè)max函數(shù)實(shí)現(xiàn)比較兩個(gè)整數(shù),并將得到的大數(shù)返回主函數(shù)。顯然,二個(gè)整數(shù)中的大者也應(yīng)該是整數(shù),因此max函數(shù)應(yīng)當(dāng)是int型。兩個(gè)數(shù)是在主函數(shù)中輸入的,在max函數(shù)中進(jìn)行比較,因此應(yīng)該定義為有參函數(shù),在函數(shù)調(diào)用時(shí)進(jìn)行數(shù)據(jù)的傳遞。int

max(int

x,int

y){int

z;if(x>y)函數(shù)類型 參數(shù)類型定義函數(shù)內(nèi)使用的變量z=x;elsez=y;return

z;}32int

max(int

x,int

y){int

z;if(x>y)z=x;elsez=y;return

z;}3334#include

<stdio.h>int

main(){int

max(int

x,int

y);int

a,b,c;printf("please

input

two

numbers:");scanf("%d,%d",&a,&b);c

=

max(a,b);printf("max

is

%d\n",c);return

0;}int

max(int

x,int

y){int

z;if(x>y)z=x;elsez=y;return

z;}if(x>y)return

x;elsereturn

y;c

=

max(a,b);int

max

(int

x,int

y){int

z;if(x>y)z=x;elsez=y;return

z;}函數(shù)調(diào)用時(shí)的參數(shù)傳遞53#include

<stdio.h>int

main(){int

max(int

x,int

y);int

a,b,c;printf("please

input

two

numbers:");scanf("%d,%d",&a,&b);c

=

max(a,b);printf("max

is

%d\n",c);return

0;}int

max

(int

x

int

y){if(x>y)return

x;elsereturn

y;}函數(shù)調(diào)用時(shí)的參數(shù)傳遞實(shí)際參數(shù)形式參數(shù)36函數(shù)調(diào)用時(shí)的參數(shù)傳遞函數(shù)調(diào)用的過程:在函數(shù)定義中指定的形參,在未出現(xiàn)函數(shù)調(diào)用時(shí),它們并不占內(nèi)存中的單元。在發(fā)生函數(shù)調(diào)用時(shí),函數(shù)的形參被臨時(shí)分配內(nèi)存單元。并將實(shí)參的值

到相應(yīng)的形參的內(nèi)存單元中。abxy232337函數(shù)調(diào)用時(shí)的參數(shù)傳遞函數(shù)調(diào)用的過程:調(diào)用結(jié)束,形參單元被實(shí)參單元仍保留并維持原值,沒有改變?nèi)绻趫?zhí)行一個(gè)被調(diào)用函數(shù)時(shí),形參的值發(fā)生改變,不會(huì)改變主調(diào)函數(shù)的實(shí)參的值abxy23233839調(diào)用函數(shù)的方式按函數(shù)在程序中出現(xiàn)的位置來分,可以有以下3種函數(shù)調(diào)用方式1.函數(shù)語句調(diào)用沒有返回值的函數(shù),函數(shù)調(diào)用單獨(dú)作為一個(gè)語句如例7.1中的:print_star();40調(diào)用函數(shù)的方式按函數(shù)在程序中出現(xiàn)的位置來分,可以有以下3種函數(shù)調(diào)用方式2.函數(shù)表達(dá)式函數(shù)出現(xiàn)在一個(gè)表達(dá)式中,這種表達(dá)式稱為函數(shù)表達(dá)式如例7.2中的:c=max(a,b);41調(diào)用函數(shù)的方式按函數(shù)在程序中出現(xiàn)的位置來分,可以有以下3種函數(shù)調(diào)用方式3.函數(shù)參數(shù)函數(shù)調(diào)用作為一個(gè)函數(shù)的實(shí)參如:printf

(″%d″,

max

(a,b));7.2.4

對(duì)被調(diào)用函數(shù)的

和函數(shù)原型在一個(gè)函數(shù)中調(diào)用另一個(gè)函數(shù)需要具備如下條件:被調(diào)用函數(shù)必須是已經(jīng)定義的函數(shù)(是庫(kù)函數(shù)或用戶自己定義的函數(shù))。如果使用庫(kù)函數(shù),應(yīng)該在本文件開頭加相應(yīng)的#include指令。如果使用自己定義的函數(shù),而該函數(shù)的定義位置在調(diào)用它的函數(shù)后面,應(yīng)該進(jìn)行函數(shù)427.2.4

對(duì)被調(diào)用函數(shù)的型和函數(shù)原函數(shù)原型的一般形式有兩種:int

max(int

x,

int

y);int

max(int,

int);原型說明可以放在文件的開頭,這時(shí)本文件中所有函數(shù)都可以使用此函數(shù)43447.3

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

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

函數(shù)的嵌套調(diào)用main函數(shù)①調(diào)用a函數(shù)⑨結(jié)束a函數(shù)③調(diào)用b函數(shù)⑦②⑧b函數(shù)⑤④⑥4647例7.3輸入4個(gè)整數(shù),找出其中最大的數(shù)。用一個(gè)函數(shù)來實(shí)現(xiàn)。解題思路:定義max_4函數(shù),找4個(gè)數(shù)中最大者max_4中再多次調(diào)用max,找4個(gè)數(shù)中的大者,然后把它作為函數(shù)值返回main函數(shù)#include

<stdio.h>int

main(){int

max_4(int

a,

int

b,

int

c,

int

d);int

a,b,c,d,max;printf("4

integer

numbers:");scanf("%d%d%d%d",&a,&b,&c,&d);max=max_4(a,b,c,d);printf("max=%d

\n",max);return

0;}對(duì)max_4

函數(shù)48#include

<stdio.h>int

main(){int

max_4(int

a,

int

b,

int

c,

int

d);int

a,b,c,d,max;printf("4

integer

numbers:");scanf("%d%d%d%d",&a,&b,&c,&d);max=max_4(a,b,c,d);printf("max=%d

\n",max);return

0;}輸入4個(gè)整數(shù)49#include

<stdio.h>int

main(){int

max_4(int

a,

int

b,

int

c,

int

d);int

a,b,c,d,max;printf("4

integer

numbers:");scanf("%d%d%d%d",&a,&b,&c,&d);max=max_4(a,b,c,d);}printf("max=%d

\n",max);return

0;輸出最大者調(diào)用求4個(gè)數(shù)中最大的50int

max_4(int

a,int

b,int

c,int

d){int

max(int

a,int

b);int

m;m=max(a,b);m=max(m,c);m=max(m,d);return

m;}對(duì)max函數(shù)51int

max_4(int

a,int

b,int

c,int

d){int

max(int

a,int

b);int

m;m=max(a,b);m=max(m,c);m=max(m,d);return

m;}a,b中較大的a,b,c中較大的a,b,c,d中較大的52int

max_4(int

a,int

b,int

c,int

d){int

max(int

a,int

b);int

m;m=max(a,b);m=max(m,c);m=max(m,d);return

m;}a,b中較大的a,b,c中較大的a,b,c,d中較大的int

max

(int

x,int

y){if(x>y)return

x;elsereturn

y;}找x,y中較大的53int

max_4(int

a,int

b,int

c,int

d){int

max(int

a,int

b);int

m;m=max(a,b);m=max(m,c);m=max(m,d);return

m;}a,b中較大的a,b,c中較大的a,b,c,d中較大的int

max

(int

x,int

y){if(x>y)return

x;elsereturn

y;}return(x>y?x:y);54#include

<stdio.h>int

main(){int

max_4(int

a,

int

b,

int

c,

int

d);int

a,b,c,d,max;printf("4

integer

numbers:");scanf("%d%d%d%d",&a,&b,&c,&d);max=max_4(a,b,c,d);printf("max=%d

\n",max);return

0;}int

max_4(int

a,int

b,int

c,int

d){int

max(int

a,int

b);int

m;m=max(a,b);

m=max(m,c);

m=max(m,d);return

m;}int

max(int

x,int

y){return(x>y?x:y);}55#include

<stdio.h>int

max_4(int

a,

int

b,

int

c,

int

d);int

max(int

a,int

b);int

main(){int

a,b,c,d,max;printf("4

integer

numbers:");scanf("%d%d%d%d",&a,&b,&c,&d);max=max_4(a,b,c,d);printf("max=%d

\n",max);return

0;}int

max_4(int

a,int

b,int

c,int

d){int

m;m=max(a,b);m=max(m,c);m=max(m,d);return

m;}int

max(int

x,int

y){return(x>y?x:y);}56C語言規(guī)范

做法德羅斯特效應(yīng)的得名于荷蘭著名品牌德羅斯特(Droste)可可粉的包裝盒。包裝盒上的圖案是一位護(hù)士拿著一個(gè)有及紙盒的托盤,而杯子及紙盒上的圖案和整張圖片相同。這張從1904年起開始使用,數(shù)十只進(jìn)行了一些小幅的調(diào)整,后來成為一個(gè)家喻戶曉的概念。57

mons.wikimedia.

/wiki/File%3ADroste.jpg58http:/

/UEZWe.jpg工程師給孩子的睡前故事從前有個(gè)公司,公司里有個(gè)老工程師和小工程師,有一天,老工程師對(duì)小工程師說,從前有個(gè)公司,公司里有個(gè)老工程師和小工程師,有一天,老工程師對(duì)小工程師說,...,聽完這個(gè)故事你就會(huì)明白什么叫遞歸了,你知道故事了嗎?小工程師說,謝謝,聽完這個(gè)故事我就明白什么叫遞歸了。,聽完這個(gè)故事你就會(huì)明白什么叫遞歸了,你知道故事了嗎?小工程師說,謝謝,聽完這個(gè)故事我就明白什么叫遞歸了。7.3.2

函數(shù)的遞歸調(diào)用在調(diào)用一個(gè)函數(shù)的過程中又出現(xiàn)直接或間接地調(diào)用該函數(shù)本身,稱為函數(shù)的遞歸調(diào)用。C語言的特點(diǎn)之一就在于允許函數(shù)的遞歸調(diào)用。的兩個(gè)要素:遞歸程序最遞歸項(xiàng)遞歸結(jié)束條件60617.3.2

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

<stdio.h>int

sum(int

n);int

main(){int

num,add;printf("Enter

a

positiveinteger:\n");scanf("%d",&num);add=sum(num);printf("sum=%d",add);}int

sum(int

n){if(n==0)return

n;elsereturn

n+sum(n-1);/*對(duì)函數(shù)sum(int)的自我調(diào)用*/}7.3.2

函數(shù)的遞歸調(diào)用f2函數(shù)調(diào)用f1函數(shù)f函數(shù)調(diào)用f函數(shù)f1函數(shù)調(diào)用f2函數(shù)直接調(diào)用本函數(shù)間接調(diào)用本函數(shù)6263例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é)生多大,就必須先知道第4個(gè)年解題思路:要求第5個(gè)齡要求第4個(gè)必須先知道第3個(gè)第3個(gè)

又取決于第2個(gè)第2個(gè)

取決于第1個(gè)每個(gè)學(xué)生

都比其前1個(gè)學(xué)生的

大264解題思路:age(5)=age(4)+2age(4)=age(3)+2age(3)=age(2)+2age(2)=age(1)+2age(1)=1065age(5)=age(4)+2

age(4)

=age(3)+2

age(3)

=age(2)+2

age(2)

=age(1)+2age(3)

=14age(2)=12

age(4)

=16age(5)=18age(1)

=10回溯階段遞推階段66age(5)=age(4)+2

age(4)

=age(3)+2

age(3)

=age(2)+2age(2)=age(1)+2age(2)=12age(3)

=14

age(4)

=16age(5)=18結(jié)束遞歸的條件age(1)

=10回溯階段遞推階段67#include

<stdio.h>int

age(int

n){printf("Computeint

c;if(n==1){c=10;of

Student

No.%d\n",n);printf("Age

of

Student

No.1

is

10\n");}else{c=age(n-1)+2;printf("Age

of

Student

No.%d

is

%d\n",n,c);}return

c;}int

main(){printf("%d\n",

age(5));return

0;}68age(5)輸出age(5)main函數(shù)c=age(4)+2age函數(shù)n=5c=age(3)+2age函數(shù)n=4c=age(1)+2c=age(2)+2c=10age(1)=1069age(2)=12age(3)=14age(4)=16age函數(shù)n=3age(5)=18age函數(shù)n=218age函數(shù)n=170例7.5

分別用遞推方法和遞歸方法求n!,即1×2×…×n。1.用遞推方法求n!解題思路:從1開始,乘2,再乘3……一直乘到n。這種方法容易理解,也容易實(shí)現(xiàn)。遞推法的特點(diǎn)是從一個(gè)已知的事實(shí)出發(fā),按一定規(guī)律推下一個(gè)事實(shí),再?gòu)倪@個(gè)新的已知的事實(shí)出發(fā),再向下推出一個(gè)新的事實(shí)……這是和遞歸不同的。71#include

<stdio.h>int

main(){long

fac(int

n);int

n;long

result=0;

printf("input

an

integer:");scanf("%d",&n);result=fac(n);printf("%d!=%ld\n",n,result);return

0;}long

fac(int

n){int

i;long

result=1;for(i=1;i<=n;i++)result=result*i;return

result;}2.用遞歸方法求n!解題思路:遞歸的思路和遞推是相反的,并不是先求1再求1×2再×3…,直到×n,而是直接從目標(biāo)出發(fā)提出問題:5!等于4!×5,而4!=3!×4…,而1!是已知的,不必再回溯了7273#include

<stdio.h>int

main(){long

fac(int

n);int

n;long

result;printf("input

an

integer:");scanf("%d",&n);

result=fac(n);printf(“%d!=%ld\n",n,result);return0;}long

fac(int

n){long

f;if(n<0)printf("n<0,data

error!");elseif(n==0||n==1)f=1;elsef=fac(n-1)*n;return(f);}fac(5)輸出fac(5)main函數(shù)f=fac(4)×5fac函數(shù)n=5f=fac(3)×4fac函數(shù)n=4f=fac(1)×2f=fac(2)×3f=1fac(1)=174fac(2)=2fac(3)=6fac(4)=24fac函數(shù)n=3fac(5)=120fac函數(shù)n=2120fac函數(shù)n=175遞歸調(diào)用的特點(diǎn):執(zhí)行“未知→未知→……遞歸邊界條件已知→已知→已知”的過程。76遞歸小結(jié)用遞歸方法解題的條件:(1)所求解的問題能轉(zhuǎn)化為用同一方法解決的子問題。子問題的規(guī)模比原問題的規(guī)模小。必須要有遞歸結(jié)束條件,停止遞歸,否則形成無窮遞歸,系統(tǒng)無法實(shí)現(xiàn)。777.4

數(shù)組作為函數(shù)參數(shù)數(shù)組元素作函數(shù)實(shí)參數(shù)組名作函數(shù)參數(shù)787.4.1

數(shù)組元素作函數(shù)實(shí)參由于實(shí)參可以是表達(dá)式,而數(shù)組元素可以是表達(dá)式的組成部分,因此數(shù)組元素可以作為函數(shù)的實(shí)參。例7.6有兩個(gè)運(yùn)動(dòng)隊(duì)a和b,各有10個(gè)隊(duì)員,每個(gè)隊(duì)員有一個(gè)綜

績(jī)。將兩個(gè)隊(duì)的每個(gè)隊(duì)員的成績(jī)按順序一一對(duì)應(yīng)地逐個(gè)比較(即a隊(duì)第1個(gè)隊(duì)員與b隊(duì)第1個(gè)隊(duì)員比,……)。如果a隊(duì)隊(duì)員的成績(jī)高于b隊(duì)相應(yīng)隊(duì)員成績(jī)的數(shù)目多于b隊(duì)隊(duì)員成績(jī)高于a隊(duì)相應(yīng)隊(duì)員成績(jī)的數(shù)目(例如,a隊(duì)蠃6次,b隊(duì)蠃4次),則認(rèn)為a隊(duì)勝。統(tǒng)計(jì)出兩隊(duì)隊(duì)員比較的結(jié)果(a隊(duì)高于、等于和低于b隊(duì)的次數(shù))。7980解題思路:設(shè)兩個(gè)數(shù)組a和b,各有10個(gè)元素,分別存放10個(gè)隊(duì)員的成績(jī)將兩個(gè)數(shù)組的相應(yīng)元素逐個(gè)比較,用3個(gè)變量n,m,k分別累計(jì)a隊(duì)隊(duì)員高于、等于和低于b隊(duì)隊(duì)員的次數(shù)用一個(gè)函數(shù)higher來判斷每一次比較的結(jié)果,如果a隊(duì)員高于b隊(duì)員,結(jié)果為1,二者相等,結(jié)果為0,a隊(duì)員低于b隊(duì)員,結(jié)果為-1。最后比較n和k即可得到哪隊(duì)勝的結(jié)果81#include

<stdio.h>int

main(){int

higher(int

x,

int

y);int

a[10],b[10],i,n=0,m=0,k=0;printf("enter

array

a:\n");for(i=0;i<10;i++)scanf("%d",

&a[i]);printf("\n");printf("enter

array

b:\n");for(i=0;i<10;i++)scanf("%d",&b[i]);printf("\n");//輸入a隊(duì)隊(duì)員成績(jī)//輸入b隊(duì)隊(duì)員成績(jī)82for(i=0;i<10;i++){if(higher(a[i],b[i])==1)n++;else

if(higher(a[i],b[i])==0)m++;elsek=k+1;}printf("a

higher

than

b

%d

times\n",n);printf("a

equal

to

b

%d

times\n",m);printf("b

higher

than

a

%d

times\n”,k);//比較10個(gè)隊(duì)員//與變量作為實(shí)參一樣83if(n>k)printf("a

wins!\n");else

if

(n<k)printf("b

wins!\n");elseprintf("a

and

b

ties!\n");}84int

higher(int

x,

int

y){if(x>y)return

1;else

if(x<y)return

-1;elsereturn

0;}85問題擴(kuò)展田忌賽馬如何在已知雙方成績(jī)的情況下,通過適當(dāng)調(diào)整一方的隊(duì)員順序,取得最優(yōu)比賽結(jié)果?867.4.2

數(shù)組名作函數(shù)參數(shù)希望在函數(shù)中處理整個(gè)數(shù)組的元素時(shí),可以用數(shù)組名作為函數(shù)實(shí)參注意,此時(shí)只是將數(shù)組的首元素的地址傳遞給所對(duì)應(yīng)的形參,因此對(duì)應(yīng)的形參應(yīng)當(dāng)是指針變量(見第8章)。87例7.7

有10個(gè)學(xué)生成績(jī),用一個(gè)函數(shù)求全體學(xué)生的平均成績(jī)。解題思路:在主函數(shù)中定義一個(gè)實(shí)型數(shù)組score,將輸入的10個(gè)學(xué)生成績(jī)存放在數(shù)組中設(shè)計(jì)函數(shù)average,用來求學(xué)生平均成績(jī)需要把數(shù)組有關(guān)信息傳遞給average函數(shù)–采取用數(shù)組名作為實(shí)參,把數(shù)組地址傳給average函數(shù),在該函數(shù)中對(duì)數(shù)組進(jìn)行處理88#include

<stdio.h>int

main(){float

average(float

array[10]);float

score[10],

aver;int

i;printf("input

10

scores:\n");for(i=0;i<10;i++)scanf("%f",&score[i]);aver=average(score);

//數(shù)組名作實(shí)參

printf("average

score

is%5.2f\n",aver);return

0;}float

average(float

array[10]){int

i;float

aver,

sum=array[0];for(i=1;i<10;i++)sum=sum+array[i];aver=sum/10;retur

;}//array與score共占同一

單元//實(shí)參、形參都是float型數(shù)組相當(dāng)于

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

score[0]8990例7.8有兩個(gè)班,學(xué)生數(shù)不同,編寫一個(gè)函數(shù),用來分別求各班的平均成績(jī)。91解題思路:?jiǎn)栴}的關(guān)鍵是用同一個(gè)函數(shù)求不同人數(shù)的班級(jí)平均成績(jī)?cè)诙x形參時(shí)不指定大小,函數(shù)對(duì)不同人數(shù)的班級(jí)都是適用由于數(shù)組名傳遞的是數(shù)組首地址,可以利用同一個(gè)函數(shù)求人數(shù)不同的班平均成績(jī)?cè)诙xaverage函數(shù)時(shí),增加一個(gè)參數(shù)n,用來指定當(dāng)前班級(jí)的人數(shù)92#include

<stdio.h>int

main(){float

average(float

array[

],int

n);float

score_1[5]={98.5,97,91.5,60,55};float

score_2[10]={67.5,89.5,99,69.5,77,89.5,76.5,54,60,99.5};printf("%6.2f\n",

average(score_1,

5));printf("%6.2f\n",

average(score_2,

10));return

0;}sum=sum+array[i];aver=sum/n;retur

;float

average(float

array[],int

n){int

i;float

aver,

sum=array[0];for(i=1;i<n;i++)/*調(diào)用形式為average(score_1,5)時(shí)*/}相當(dāng)于

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

score_1[i]n=593sum=sum+array[i];aver=sum/n;retur

;}相當(dāng)于

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

score_2[i]n=10float

average(float

array[],int

n){int

i;float

aver,

sum=array[0];for(i=1;i<n;i++)/*調(diào)用形式為average(score_2,10)時(shí)*/94例7.9用一個(gè)函數(shù)實(shí)現(xiàn)用選擇法對(duì)10個(gè)整數(shù)按升序排列。解題思路:所謂選擇法就是先將10個(gè)數(shù)中最小的數(shù)與a[0]對(duì)換;再將a[1]到a[9]中最小的數(shù)與a[1]對(duì)換……每比較一輪,找出一個(gè)

排序的數(shù)中最小的一個(gè)共比較9輪95a[0]a[1]a[2]a[3]a[4]3694134961346996從小到大排序97#include

<stdio.h>void

selectionSort(int

array[],

int

n,int

order);void

printArray(int

array[],int

n);int

main(){int

array[]={70,60,50,40,30,20,10};printArray(array,7);selectionSort(array,7,1);printArray(array,7);return

0;}/*函數(shù)說明:將數(shù)組array的內(nèi)容輸出到標(biāo)準(zhǔn)輸出參數(shù)說明:int

array[]待輸出的數(shù)組;int

n數(shù)組array的大小*/void

printArray(int

array[],int

n){int

i;for(i=0;i<n;i++)printf("%d

",array[i]);printf("\n");}/**函數(shù)說明:對(duì)數(shù)組array進(jìn)行選擇排序,參數(shù)order用于指定排序結(jié)果為升序或降序參數(shù)說明:array待排序的整型數(shù)組;

n數(shù)組array的大小; order=0升序,1降序*/void

selectionSort(int

array[],int

n,int

order){int

i,j,select,tmp;for(j=0;j<n-1;j++){select=j;for(i=j;i<n-1;i++){if(order==0){//升序排序

if(array[select]>array[i+1])select=i+1;}else{//降序排序if(array[select]<array[i+1])select=i+1;}}//將array[j]與當(dāng)前的最值array[select]交換if(j!=select){tmp=array[j];array[j]=array[select];array[select]=tmp;}else{printf("本輪不必交換\n");}}}在array[i]到array[n-1]中,找到最?。ㄗ畲螅?shù)的下標(biāo)98在array[i]到array[n-1]中,將最?。ㄗ畲螅?shù)與array[i]交換99100例7.10有4個(gè)學(xué)生,5門課的成績(jī),設(shè)計(jì)一個(gè)函數(shù),用來求出其中的最高成績(jī)。解題思路:–先使變量max的初值為二維數(shù)組中第一個(gè)元素的值,然后將二維數(shù)組中各個(gè)元素的值與max相比,每次比較后都把“大者”存放在max中,取代max的原值。全部元素比較完后,max

的值就是所有元素的最大值。101#include<stdio.h>int

main(){float

highest_score(float

array[4][5]);float

score[4][5]={{61,73,85.5,87,90},{72,84,66,88,78},{75,87,93.5,81,96},{65,85,64,76,71}};printf("%6.2f\n",highest_score(score));return

0;}102float

highest_score(float

array[4][5]){int

i,j;float

max;max=array[0][0];for(i=0;i<4;i++)for(j=0;j<5;j++)if(array[i][j]>max)max=array[i][j];return

max;}7.5

變量的作用域和生存期1.

變量的作用域-局部變量和全局變量變量的

方式和生存期作用域和生存期的小結(jié)1031047.5.1

變量的作用域——局部變量和全局變量1

局部變量在函數(shù)和復(fù)合語句內(nèi)定義的變量,稱為內(nèi)部變量或局部變量只在本函數(shù)或復(fù)合語句內(nèi)范圍內(nèi)有效(從定義點(diǎn)開始到函數(shù)或復(fù)合語句結(jié)束)在此函數(shù)或復(fù)合語句以外是不能使用這些變量的說明:主函數(shù)中定義的變量也只在主函數(shù)中有效,主函數(shù)也不能使用其他函數(shù)中定義的變量。不同函數(shù)中可以使用相同名字的變量,它們代表不同的對(duì)象,互不干擾。形式參數(shù)也是局部變量。在函數(shù)中可以使用本函數(shù)定義的形參,在函數(shù)外不能 它。在一個(gè)函數(shù) ,可以在復(fù)合語句中定義變量,這些變量只在本復(fù)合語句中有效。1051062

全局變量一個(gè)程序可以包含一個(gè)或若干個(gè)源程序文件(即程序模塊),而一個(gè)源文件可以包含一個(gè)或若干個(gè)函數(shù)在函數(shù)之外定義的變量是外部變量,也稱為全局變量(或全程變量)全局變量的有效范圍為從定義變量的位置開始到本源文件結(jié)束,在此范圍內(nèi)可以為本文件中所有函數(shù)所共用2

全局變量在一個(gè)函數(shù)中既可以使用本函數(shù)中的局部變量,又可以使用有效的全局變量。如果在同一個(gè)源文件中,外部變量與局部變量同名,則在局部變量的作用范圍內(nèi),外部變量被“”了,即它不起作用,此時(shí)局部變量是有效的。107108例若外部變量與局部變量同名,分析結(jié)果。#include

<stdio.h>int

a=3,b=5;int

main(){int

max(int

a,int

b);int

a=8;printf("max=%d\n",

max(a,b));return

0;}int

max(int

a,int

b){return

a>b?a:b;}a為局部變量,僅在此函數(shù)內(nèi)有效b為全局變量109#include

<stdio.h>int

a=3,b=5;int

main(){int

max(int

a,int

b);int

a=8;printf("max=%d\n",

max(a,b));return

0;}int

max(int

a,int

b){return

a>b?a:b;}a、b為局部變量,僅在此函數(shù)內(nèi)有效111例7.11有4個(gè)學(xué)生,5門課的成績(jī),要求輸出其中的最高成績(jī)以及它屬于第幾個(gè)學(xué)生、第幾門課程。112解題思路:在例7.10中,通過調(diào)用highest_score函數(shù),得到最高分除了輸出最高分以外,還要輸出該分?jǐn)?shù)是屬于第幾個(gè)學(xué)生、笫幾門課的信息,即需要輸出3個(gè)結(jié)果調(diào)用一個(gè)函數(shù)只能得到一個(gè)函數(shù)值,因此例7.10程序無法解決這個(gè)問題可以使用全局變量,通過全局變量從函數(shù)中得到所需要的值113#include

<stdio.h>int

Row,Column;int

main(){float

highest_score(float

array[4][5]);float

score[4][5]={{61,73,85.5,87,90},{72,84,66,88,78},{75,87,93.5,81,96},{65,85,64,76,71}};float

h_score=highest_score(score);printf("The

highest

score

is

%6.2f\n",

h_score);printf("Student

No.is

%d\nCourse

No.

is

%d\n",

Row,

Column);return

0;}//定義全局變量114float

highest_score(float

array[4][5]){int

i,j;float

max;max=array[0][0];for(i=0;i<4;i++)for(j=0;j<5;j++)if(array[i][j]>max){max=array[i][j];Row=i;Column=j;}return

max;}//將行的序號(hào)賦給全局變量Row//將列的序號(hào)賦給全局變量Columnscoreh_score

Row

Columnarray

max

Row

Columnmain函數(shù)highest_score函數(shù)建議不在必要時(shí)不要使用全局變量115全局變量RowColumn實(shí)參—>形參返回值7.5.2

變量的方式和生存期變量的生存期:變量值存在的時(shí)間變量的兩種

方式:靜態(tài)

方式和動(dòng)態(tài)方式靜態(tài)

方式是指在程序運(yùn)行期間由系統(tǒng)分配固定的

空間的方式動(dòng)態(tài)

方式是在程序運(yùn)行期間根據(jù)需要進(jìn)行動(dòng)態(tài)的分配

空間的方式1167.5.2

變量的方式和生存期全局變量采用靜態(tài)

方式,在程序開始執(zhí)行時(shí)給全局變量分配

區(qū),程序執(zhí)行完畢。在程序執(zhí)行過程中它們占據(jù)固定的存儲(chǔ)單元,而不是動(dòng)態(tài)地進(jìn)行分配和

。1177.5.2

變量的方式和生存期在函數(shù)中定義的變量,在函數(shù)調(diào)用開始時(shí)分配動(dòng)態(tài)

空間,函數(shù)結(jié)束時(shí)

這些空間。在程序執(zhí)行過程中,這種分配和

是動(dòng)態(tài)的。1187.5.2

變量的方式和生存期每一個(gè)變量和函數(shù)都有兩個(gè)屬性:數(shù)據(jù)類型和數(shù)據(jù)的

類別數(shù)據(jù)類型,如整型、浮點(diǎn)型等類別指的是數(shù)據(jù)在內(nèi)存中

的方式(如靜態(tài) 和動(dòng)態(tài)

)119auto—

自動(dòng)變量(auto變量)函數(shù)中的形參和在函數(shù)中定義的變量(包括在復(fù)合語句中定義的變量),都屬于此類在調(diào)用該函數(shù)時(shí),系統(tǒng)給這些變量分配存儲(chǔ)空間,在函數(shù)調(diào)用結(jié)束時(shí)就自動(dòng)這些空間。因此這類局部變量稱為自動(dòng)變量。自動(dòng)變量用關(guān)鍵字auto作類別的120int

f(int

a){auto

int

b,c=3;……}可以省略1212.static—

靜態(tài)變量以下情況需要指定static

類別:-

希望函數(shù)中的局部變量值在函數(shù)調(diào)用結(jié)束后不

而繼續(xù)保留原值,即其占用的存儲(chǔ)單元不

,在下一次該函數(shù)調(diào)用時(shí),

該變量已有值,就是上一次函數(shù)調(diào)用結(jié)束時(shí)的值。這時(shí)就應(yīng)用關(guān)鍵字static指定該局部變量為“靜態(tài)局部變量”。122123例7.12

輸出1到5的階乘值。解題思路:可以編一個(gè)函數(shù)用來進(jìn)行一次累乘如第1次調(diào)用時(shí)進(jìn)行1乘1第2次調(diào)用時(shí)再乘以2第3次調(diào)用時(shí)再乘以3依此規(guī)律進(jìn)行下去這時(shí)希望上一次求出的連乘值保留,以便下一次再乘上一個(gè)數(shù)。可以用static。#include

<stdio.h>int

main(){int

fac(int

n);int

i;for(i=1;i<=5;i++)printf("%d!=%d\n",

i,

fac(i));return

0;}調(diào)用五次每調(diào)用一次,開辟新n,但f不是124int

fac(int

n){static

int

f=1;f=f*n;return

f;}#include

<stdio.h>int

main(){int

fac(int

n);int

i;for(i=1;i<=5;i++)printf("%d!=%d\n",

i,

fac(i));return

0;}int

fac(int

n){static

int

f=1;f=f*n;return

f;}i=1:第一次調(diào)用1251f#include

<stdio.h>int

main(){int

fac(int

n);int

i;for(i=1;i<=5;i++)printf("%d!=%d\n",

i,

fac(i));return

0;}int

fac(int

n){static

int

f=1;f=f*n;return

f;}i=2:第二次調(diào)用126f2#include

<stdio.h>int

main(){int

fac(int

n);int

i;for(i=1;i<=5;i++)printf("%d!=%d\n",

i,

fac(i));return

0;}int

fac(int

n){static

int

f=1;f=f*n;return

f;}i=3:第三次調(diào)用127f6#include

<stdio.h>int

main(){int

fac(int

n);int

i;for(i=1;i<=5;i++)printf("%d!=%d\n",

i,

fac(i));return

0;}int

fac(int

n){static

int

f=1;f=f*n;return

f;}i=4:第四次調(diào)用128f24#include

<stdio.h>int

main(){int

fac(int

n);int

i;for(i=1;i<=5;i++)printf("%d!=%d\n",

i,

fac(i));return

0;}int

fac(int

n){static

int

f=1;f=f*n;return

f;}i=5:第五次調(diào)用129f120對(duì)靜態(tài)局部變量的說明:(1)靜態(tài)局部變量屬于靜態(tài)類別,在靜態(tài)區(qū)內(nèi)分配單元。在程序整個(gè)運(yùn)行期間都不。而自動(dòng)變量(即動(dòng)態(tài)局部變量)屬于動(dòng)態(tài)

類別,占動(dòng)態(tài)

區(qū)空間而不占靜態(tài)區(qū)空間,函數(shù)調(diào)用結(jié)束后即130131對(duì)靜態(tài)局部變量的說明:(2)對(duì)靜態(tài)局部變量是在編譯時(shí)賦初值的,即只賦初值一次,在程序運(yùn)行時(shí)它已有初值。以后每次調(diào)用函數(shù)時(shí)不再重新賦初值而只是保留上次函數(shù)調(diào)用結(jié)束時(shí)的值。而對(duì)自動(dòng)變量賦初值,不是在編譯時(shí)進(jìn)行的,而是在函數(shù)調(diào)用時(shí)進(jìn)行,每調(diào)用一次函數(shù)重新給一次初值,相當(dāng)于執(zhí)行一次賦值語句。對(duì)靜態(tài)局部變量的說明:(3)如在定義局部變量時(shí)不賦初值的話,則對(duì)靜態(tài)局部變量來說,編譯時(shí)自動(dòng)賦初值0(對(duì)數(shù)值型變量)或空字符(對(duì)字符變量)。而對(duì)自動(dòng)變量來說,如果不賦初值則它的值是一個(gè)不確定的值。這是由于每次函數(shù)調(diào)用結(jié)束后單元已 ,下次調(diào)用時(shí)又重新另分配存儲(chǔ)單元,而所分配的單元中的值是不可知的。132對(duì)靜態(tài)局部變量的說明:(4)雖然靜態(tài)局部變量在函數(shù)調(diào)用結(jié)束后仍它的。因?yàn)樗荒鼙黄淙淮嬖?,但其他函?shù)是不能是局部變量,只能被本函數(shù)他函數(shù)。133對(duì)靜態(tài)局部變量的說明:(5)用靜態(tài)要多占內(nèi)存(長(zhǎng)期占用不釋放,而不能像動(dòng)態(tài)那樣一個(gè)單元可供多個(gè)變量使用,節(jié)約內(nèi)存),而且降低了程序的可讀性,當(dāng)調(diào)用次數(shù)多時(shí)往往弄不清靜態(tài)局部變量的當(dāng)前值是什么。因此,若非必要,不要多用靜態(tài)局部變量。134register—

寄存器變量一般情況下,變量(包括靜態(tài)方式和動(dòng)態(tài)方式)的值是存放在內(nèi)存中的寄存器變量允許將局部變量的值放在CPU中的寄存器中現(xiàn)在的計(jì)算機(jī)能夠識(shí)別使用頻繁的變量,從而自動(dòng)地將這些變量放在寄存器中,而不需要程序設(shè)計(jì)者指定1354.extern—

外部變量的作用范圍(1)在一個(gè)文件內(nèi)擴(kuò)展外部變量的作用域如果外部變量不在文件的開頭定義,其有效的作用范圍只限于定義處到文件結(jié)束如果由于某種考慮,在定義點(diǎn)之前的函數(shù)需字extern對(duì)該變量作“外部變量要

該外部變量,則應(yīng)該在

之前用關(guān)鍵”1364.extern—

外部變量的作用范圍(2)將外部變量的作用域擴(kuò)展到其他文件在任一個(gè)文件中定義外部變量,而在另一文件中用extern對(duì)該變量作外部變量1377.5.3

作用域和生存期的小結(jié)對(duì)一個(gè)變量的屬性可以從兩個(gè)方面分析,一是變量的作用域,一是變量的生存期。前者是從空間的角度,后者是從時(shí)間的角度。二者有聯(lián)系但不是同一回事作用域:指在代碼的什么位置可以 該變量(復(fù)合語句內(nèi),函數(shù)內(nèi)、文件內(nèi)、任何位置)生存期:指在什么時(shí)間可以該變量(復(fù)合語句執(zhí)行時(shí),函數(shù)執(zhí)行時(shí)、程序執(zhí)行時(shí))138#include<stdio.h>int

a;int

main(

){…

f2();

… f1();

…}void

f1(){auto

int

b;…

f2();

…}void

f2(){static

int

c;…

…}//a的作用域//b的作用域//c的作用域

139文件:file1.ca生存期b生存期c生存期mainf2f1mainf2f1main140各種類型變量的作用域和存在性的情況變量

類別函數(shù)內(nèi)函數(shù)外作用域存在性作用域存在性自動(dòng)變量和寄存器變量∨∨╳╳靜態(tài)局部變量∨∨╳∨靜態(tài)外部變量∨∨∨(只限本文件)∨外部變量∨∨∨∨1417.6函數(shù)和外部函數(shù)函數(shù)外部函數(shù)1427.6.1函數(shù)如果一個(gè)函數(shù)只能被本文件中其他函數(shù)所調(diào)用,它稱為

函數(shù)。在定義

函數(shù)時(shí),在函數(shù)名和函數(shù)類型的前面加static,即:static

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

函數(shù)又稱靜態(tài)函數(shù),因?yàn)樗怯胹tatic聲明的通常把只能由本文件使用的函數(shù)和外部變量放在文件的開頭,前面都冠以static使之局部化,其他文件不能提高了程序的可靠性1441457.6.2

外部函數(shù)如果在定義函數(shù)時(shí),在函數(shù)首部的最左端加關(guān)鍵字extern,則此函數(shù)是外部函數(shù),可供其他文件調(diào)用。如函數(shù)首部可以為extern

intfun

(inta,

int

b)-

如果在定義函數(shù)時(shí)省略extern,則默認(rèn)為外部函數(shù)146例7.13有一個(gè)字符串,內(nèi)有若干個(gè)字符,今輸入一個(gè)字符,要求程序?qū)⒆址性撟址麆h去。用外部函數(shù)實(shí)現(xiàn)。j=0假設(shè)刪除空格,刪除空格的思路為Iamhappy\0……非空空

非空非空空

非空非空非空非空非空結(jié)束Iamhappy\0y\0……\0i=05814710#include

<stdio.h>int

main(){extern

void

enter_string(char

str[]);extern

void

delete_string(char

str[],

char

ch);extern

void

print_string(char

str[]);char

c,

str[81];printf("Input

string:");enter_string(str);printf("Input

the

char

to

be

removed:");scanf("%c",

&c);delete_string(str,c);print_string(str);return

0;}在本函數(shù)中將要調(diào)用的已在其他文件中定義的3個(gè)函數(shù)文件:rm_c.c148}149#include

<stdio.h>void

print_string(char

str[]){puts(str);}#include

<stdio.h>void

delete_string(char

str[],

char

ch){int

i,j=0;for(i=0;str[i]!='\0';i++){if(str[i]!=ch){str[j]=str[i];j++;}}str[j]='\0';}#include

<stdio.h>void

enter_string(char

str[81]){gets(str);文件:print_string.c文件:delete_string.c文件:enter_string.c1507.7

提高部分1.

實(shí)參求值的順序漢諾(Hanoi)塔問題算術(shù)運(yùn)算測(cè)試-延伸1517.7.1

實(shí)參求值的順序如果實(shí)參表列包括多個(gè)實(shí)參,對(duì)實(shí)參求值的順序并不是確定的有的系統(tǒng)按自左至右順序求實(shí)參的值有的系統(tǒng)(如Turbo

C

2.0,

Turbo

C++3.0,VC++6.0)則按自右至左順序求值。152#include

<stdio.h>int

main(void){int

i=8;printf("%d

%d

%d

%d\n”,++i,++i,—i,--i);printf("%d\n”,i);return

0;}執(zhí)行結(jié)果是什么?操作系統(tǒng)編譯器執(zhí)行結(jié)果備注執(zhí)行后i值LinuxGCC8

8

8

899

9

97

8

7

8++i,++i,-

-i,-

-i++i,++i, i,-

-ii++,++i,i-

-,-

-i898Mac

OS

XLLVM編譯不通過Multiple

unsequencedmodifications

to'i'WindowsMSVC8

7

6

78

7

7

8++i,++i,-

-i,-

-i++i,i++,-

-i,i-

-88153漢諾塔問題(Tower

of

Hanoi)例7.8

Hanoi(漢諾)塔問題。古代有一個(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座。要求:編程解n階漢諾塔問題,輸出移動(dòng)盤子的步驟。漢諾塔問題(Tower

of

Hanoi)154http://w

mons/6/60/Tower_of_Hanoi_4.gif

mons/4/4f/Tower_of_Hanoi.gif/games/towerofhanoi.html四階漢諾塔三階漢諾塔ABC155解題思路:老和尚會(huì)這樣想:假

另外一個(gè)和尚能有辦法將上面63個(gè)盤子從一個(gè)座移到另一座。那么,問題就解決了。此時(shí)老和尚只需這樣做:(1)命令第2個(gè)和尚將63個(gè)盤子從A座移到B座(2)自己將1個(gè)盤子(最

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

B

C156由上面的分析可知:將n個(gè)盤子從A座移到C座可以分解為以下3個(gè)步驟:(1)將A上n-1個(gè)盤借助C座先移到B座上把A座上剩下的一個(gè)盤移到C座上將n-1個(gè)盤從B座借助于A座移到C座上A

B

C157可以將第(1)步和第(3)步表示為:將“x”座上n-1個(gè)盤移到“y”座(借助“z”座)。在第(1)步和第(3)步中,x、y、z和A、B、C的對(duì)應(yīng)關(guān)系不同。對(duì)第(1)步,對(duì)應(yīng)關(guān)系是x對(duì)應(yīng)A,y對(duì)應(yīng)B,z對(duì)應(yīng)C。對(duì)第(3)步,對(duì)應(yīng)關(guān)系是x對(duì)應(yīng)B,y對(duì)應(yīng)C,z對(duì)應(yīng)A。A

B

C158把上面3個(gè)步驟分成兩類操作:(1)將n-1個(gè)盤從一個(gè)座移到另一個(gè)座上(n>1)。這就是大和尚讓小和尚做的工作,它是一個(gè)遞歸的過程,即和尚將任務(wù)層層下放,直到第64個(gè)和尚為止。(2)將1個(gè)盤子從一個(gè)座上移到另一座上。這是大和尚自己做的工作。A

B

C159ABC將63個(gè)盤子從A移動(dòng)到B第1個(gè)和尚的做法……160ABC將63個(gè)盤子從A移動(dòng)到B第1個(gè)和尚的做法……161ABC將1個(gè)盤子從A移動(dòng)到C第1個(gè)和尚的做法……162ABC將1個(gè)盤子從A移動(dòng)到C第1個(gè)和尚的做法……163ABC將63個(gè)盤子從B移動(dòng)到C第1個(gè)和尚的做法……164ABC將63個(gè)盤子從B移動(dòng)到C第1個(gè)和尚的做法……165ABC將62個(gè)盤子從A移動(dòng)到C第2個(gè)和尚的做法……166ABC將6

溫馨提示

  • 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. 人人文庫(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)論