土木-課件ch04函數(shù)_第1頁(yè)
土木-課件ch04函數(shù)_第2頁(yè)
土木-課件ch04函數(shù)_第3頁(yè)
土木-課件ch04函數(shù)_第4頁(yè)
土木-課件ch04函數(shù)_第5頁(yè)
已閱讀5頁(yè),還剩119頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第七章函數(shù)7.1函數(shù)概述7.2函數(shù)的定義和調(diào)用7.3函數(shù)調(diào)用中的參數(shù)傳遞7.4函數(shù)的嵌套調(diào)用和遞歸調(diào)用7.5函數(shù)的返回值為指針7.6

函數(shù)的作用域和

類(lèi)別7.7

函數(shù)和外部函數(shù)結(jié)構(gòu)化程序設(shè)計(jì)的一個(gè)重要特點(diǎn):模塊化設(shè)計(jì),即用一個(gè)函數(shù)表示

一個(gè)模塊,完成若干特定的功能。函數(shù)是構(gòu)成C++程序的基本構(gòu)件。C++的程序是由一個(gè)主函數(shù)和≥0個(gè)其它函數(shù)組成。編譯以源程序文件為單位,不以函數(shù)為單位。7.1

函數(shù)概述7.1

函數(shù)概述不管main函數(shù)(主函數(shù))出現(xiàn)在程序中的哪個(gè)位置,

C++程序的執(zhí)行都以main函數(shù)開(kāi)始,隨著main函數(shù)的

結(jié)束而結(jié)束。所有的函數(shù)獨(dú)立定義,main函數(shù)可以調(diào)用其他任意函數(shù),其他函數(shù)之間可以互相調(diào)用,但是任何其他函數(shù)都不能調(diào)用main函數(shù)。函數(shù)體中使用其它函數(shù)函數(shù)的分類(lèi)庫(kù)函數(shù):由C++編譯系統(tǒng)提供,供用戶(hù)直接使用用戶(hù)自定義函數(shù):根據(jù)實(shí)際需要,由程序員自己編寫(xiě),實(shí)現(xiàn)特定功能有參函數(shù):函數(shù)帶有參數(shù)(有自變量)例如sqrt(x);無(wú)參函數(shù):函數(shù)沒(méi)有參數(shù)例如getchar();有返回值函數(shù):函數(shù)被調(diào)用以后返回一個(gè)值例如getchar();sin(x);無(wú)返回值函數(shù):函數(shù)被調(diào)用以后沒(méi)有返回值例:函數(shù)調(diào)用的簡(jiǎn)單例子。#include

……void

myprint(){ inti=0;for(i=1;i<=18;i++)cout<<"*";cout<<“\n”;}void

myprint_n(int

n){ inti

=0;for(i=1;i<=n;i++)cout<<"*";cout<<"\n";}/*

調(diào)用一次輸出一行固定個(gè)數(shù)的“*”(18顆)

*//*

調(diào)用一次輸出一行6顆“*”*//*

調(diào)用一次輸出一行12顆“*”*//*

調(diào)用一次輸出一行固定個(gè)數(shù)的“*”(18顆)

*/intmain(){myprint();myprint_n(6);myprint_n(12);myprint();return

0;}自定義函數(shù),無(wú)參數(shù),無(wú)返回值自定義函數(shù),有參數(shù),無(wú)返回值調(diào)用后返回調(diào)用的地方繼續(xù)往下執(zhí)行例:從鍵盤(pán)輸入x和y的值,計(jì)算xy的值(設(shè)y為整型量)。算法一:調(diào)用C++中的庫(kù)函數(shù)pow,計(jì)算xy的值。#include<iostream>#include

<cmath>/*

pow函數(shù)的原型在cmath中

,所以應(yīng)加此行

*/using

namespace

std;int

main(){double

x

=

0,

z

=0;int

y

=0;cout<<"Input

data:

";cin>>x>>y;z=pow(x,y);

/*

調(diào)用庫(kù)函數(shù)pow計(jì)算xy的值*/cout<<x<<endl<<y<<endl<<z<<endl;return

0;}庫(kù)函數(shù),有參數(shù),有返回值算法二:自定義函數(shù)mypow,計(jì)算xy的值。#include

……/*

自定義函數(shù)mypow開(kāi)始*/double

mypow(double

x,

int

y){int

i

=

0;double

z

=

1.0;for(i=1;

i<=y;

i++)z

=

z

*

x;return

z;}

/*

自定義函數(shù)mypow結(jié)束*/int

main(

){double

x

= 0,

z

=0;int

y

=

0;cout<<"Input

data:

";cin>>x>>y;z

=

mypow(x,

y);/*

主函數(shù)*//*

調(diào)用自定義函數(shù)mypow

*/cout<<x<<endl<<y<<endl<<z<<endl;return

0;}自定義函數(shù),有參數(shù),有返回值引入函數(shù)的目的1.增強(qiáng)可讀性,使主函數(shù)盡可能短,把功能實(shí)現(xiàn)放到子函數(shù)里,主函數(shù)只要調(diào)用子函數(shù)即可。2.模塊化設(shè)計(jì)。復(fù)雜的程序,先寫(xiě)主函數(shù),把每個(gè)功能用一個(gè)模塊(子函數(shù))實(shí)現(xiàn),可以交由多個(gè)人同時(shí)編寫(xiě)。3.加強(qiáng)程序的可移植性,避免重復(fù)編寫(xiě)。需要實(shí)現(xiàn)某個(gè)功能,只要接口的要求一樣,可以直接使用已有的模塊(子函數(shù))。注意:實(shí)參與形參的類(lèi)型必須一致(字符型與整型通用);形參為變量名時(shí),對(duì)應(yīng)實(shí)參應(yīng)為表達(dá)式,調(diào)用函數(shù)時(shí)把實(shí)參值單向傳遞給形參;形參和實(shí)參

表示未具體給定的量,不賦值1、定義函數(shù)時(shí)、函數(shù)名后面括號(hào)中的變量名、數(shù)組名等稱(chēng)為形式參數(shù),簡(jiǎn)稱(chēng)形參。2、調(diào)用函數(shù)時(shí)、函數(shù)名后面括號(hào)中的變量名、數(shù)組名等稱(chēng)為實(shí)際參數(shù),簡(jiǎn)稱(chēng)實(shí)參。必須已賦值、其值用來(lái)傳遞給形參,單向傳遞實(shí)參形參×形參和實(shí)參x2g(x,

y)

y2x,y:形式參數(shù)函數(shù)定義時(shí),括號(hào)中的變量稱(chēng)為形式參數(shù),簡(jiǎn)稱(chēng)形參32

42

5g(3,4)

3,4:實(shí)際參數(shù)函數(shù)調(diào)用時(shí),括號(hào)中的參數(shù)稱(chēng)為實(shí)際參數(shù),簡(jiǎn)稱(chēng)實(shí)參5:函數(shù)值函數(shù)定義函數(shù)調(diào)用7.2

函數(shù)定義和調(diào)用變量定義和

部分執(zhí)行語(yǔ)句[函數(shù)類(lèi)型名]

函數(shù)名([形參及形參

表]){}注意:函數(shù)在定義后,并沒(méi)有馬上執(zhí)行,只有當(dāng)函數(shù)被調(diào)用時(shí),程序才轉(zhuǎn)到函數(shù)去執(zhí)行。函數(shù)調(diào)用的格式函數(shù)名([實(shí)參列表])方括號(hào)部分可省略函數(shù)定義的格式無(wú)參函數(shù)的定義無(wú)參函數(shù)定義的格式變量定義和執(zhí)行語(yǔ)句[函數(shù)類(lèi)型名]

函數(shù)名(){部分}void

myprint(){ inti=0;for(i=1;i<=18;i++)cout<<"*";cout<<“\n”;}有參函數(shù)的定義有參函數(shù)定義的格式表)變量定義和

部分執(zhí)行語(yǔ)句[函數(shù)類(lèi)型名]

函數(shù)名(形參及形參{}double

mypow(double

x,

int

y){inti=0;double

z

=1.0;for(i=1;i<=y;i++)z=z*

x;return

z;}還沒(méi)有具體值,調(diào)用時(shí)才有,相當(dāng)于定義了變量x和y,可以在函數(shù)體內(nèi)使用它們空函數(shù)的定義空函數(shù)定義的格式[函數(shù)類(lèi)型名]{}函數(shù)名()在程序中占一個(gè)位置,等擴(kuò)充函數(shù)功能的時(shí)候補(bǔ)充函數(shù)的返回值函數(shù)的返回值通過(guò)return語(yǔ)句獲得,格式:return

(表達(dá)式);或者return

表達(dá)式;注意:一個(gè)函數(shù)只能返回一個(gè)確定的值。但是一個(gè)函數(shù)可以出現(xiàn)多條return語(yǔ)句,即多個(gè)出口。int

max(int

x,

int

y){if(x>y)returnx;elsereturny;}函數(shù)的返回值函數(shù)返回值的類(lèi)型取決于函數(shù)的類(lèi)型。int

max(float

x,

float

y)z=x;z=y;{ float

z;if(x>y)elsereturn

z;}如果一個(gè)函數(shù)沒(méi)有返回值,則可以不加return語(yǔ)句?;蛘遰eturn后不跟表達(dá)式。無(wú)返回值的函數(shù),類(lèi)型為void。返回值是float型還是int型?int型!A.無(wú)參無(wú)返回值函數(shù)的定義與調(diào)用void

print_star(){cout<<"**********\n";}intmain(){int

i;for(i=5;i<10;i++)print_star();return0;}函數(shù)類(lèi)型void(空類(lèi)型),表示沒(méi)有返回值函數(shù)名:print_star#includ

…無(wú)參數(shù)函數(shù)定義以語(yǔ)句方式調(diào)用函數(shù)B.有參無(wú)返回值函數(shù)的定義與調(diào)用#includ

…void

print_star(int

n){ int

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

cout<<"*"cout<<"\n";}intmain(){ int

i;for(i=0;i<10;i++)print_star(10);return0;}函數(shù)類(lèi)型void(空類(lèi)型),表示沒(méi)有返回值函數(shù)名:print_star有參數(shù),n,為int型函數(shù)定義以語(yǔ)句方式調(diào)用函數(shù)函數(shù)體內(nèi)不能再定義變量n實(shí)參改成i,輸出是什么?C.有返回值函數(shù)的定義與調(diào)用int

max(int

x,

int

y){ int

z;if(x>y)

z=x;

elsez=y;return(z);}intmain(){ int

a,

b,

c;cin>>

a>>b;c

=

max(a,

b);cout<<"max

is"<<c;return0;}函數(shù)類(lèi)型如果是

int(可以省略),函數(shù)返回值為整型函數(shù)名:max#includ

…不能寫(xiě)成int

x,y函數(shù)定義max函數(shù)的返回值賦給cReturn后返回值的括號(hào)可加可不加,返回值可以是表達(dá)式。#include

…int

max(int

x,

int

y){int

z;z

=x

>y

?

x

:y;return

z;}int

main(){int

a,

b,

c;cin>>

a>>b;cout<<

"

sin(max(a,b))

=

"<<sin(max(a,

b));return

0;}作為函數(shù)的參數(shù)使用式函數(shù)的調(diào)用方1.無(wú)返回值函數(shù):把函數(shù)調(diào)用作為一條語(yǔ)句使用,例如前例中的print_star(10);2.有返回值函數(shù):(1)作為表達(dá)式的一部分參與運(yùn)算(作為一個(gè)值用):例如c=max(a,b);y=sin(x)*cos(x+2);(2)作為函數(shù)的實(shí)參(作為一個(gè)值用):例如sqrt(sin(x));(3)也可作為一條語(yǔ)句使用,但是返回值沒(méi)有被保存下來(lái):例如putchar(‘a(chǎn)’);函數(shù)調(diào)用的格式:函數(shù)名(實(shí)參列表)#include

<iostream>#include

<cmath>using

namespace

std;void

prime(int

m){ intj,k;k=sqrt(m);for(j=2;j<=k;j++)if(m%j==0)break;if(j>k)

cout<<m<<" is

aprielse

cout<<m<<" is

not

a

primber";mber";}int

main(){ int

n;cin>>n;prime(n);

return

0;}沒(méi)有返回值函數(shù)調(diào)用作為函數(shù)語(yǔ)句。#include

<iostream>#include

<cmath>using

namespace

std;prime(int

m){ int

j,k,f;

k=sqrt(m);for(j=2;j<=k;j++)if(m%j==0)break;if(j>k)

f=1;else

f=0;return

f;}int

main(){ int

n;cin>>n;if(prime(n))

cout<<n<<" is

a

prielse

cout<<n<<" is

not

a

primber";mber";return

0;}有返回值,int類(lèi)型,省略函數(shù)調(diào)用作為表達(dá)式。函數(shù)調(diào)用的條件1.被調(diào)函數(shù)是庫(kù)函數(shù)或者已經(jīng)存在的

定義函數(shù)。2.要讓編譯器知道這是一個(gè)函數(shù)2.1如果被調(diào)函數(shù)是庫(kù)函數(shù),要在文件開(kāi)頭將相關(guān)頭文件包含進(jìn)來(lái)(#include)2.2如果被調(diào)函數(shù)是自定義函數(shù),一般要在調(diào)用前進(jìn)行函數(shù)原型

,

的格式是函數(shù)類(lèi)型名函數(shù)名(形參名及其類(lèi)型表);或者函數(shù)類(lèi)型名函數(shù)名(形參類(lèi)型表);例如int或者intmax(intx,

int

y);max(int

,

int

);如果被調(diào)函數(shù)定義

,調(diào)用在后,那么可以不加函數(shù)原型函數(shù)原型方式1.在主調(diào)函數(shù)2.在函數(shù)的外部,一般放在所有函數(shù)定義之前#include…int

main(

){

float

add(float

x,float

y);float

a,b,c;cin>>a>>b;c=add(a,b);cout<<“sum

is

”<<c ;

return

0;}float

add

(

float

x,float

y

){float

z;z=x+y;return

z;}1)在主調(diào)函數(shù)對(duì)被調(diào)函數(shù)add的被調(diào)函數(shù)add2)如在所有函數(shù)定義之前,在函數(shù)外。例如:char

str(int

a);float

f(float

b);main(){

……

}char

str(int

a){

……

}float

f(float

b){

……

}3)對(duì)庫(kù)函數(shù)的調(diào)用不需要再作

,但必須把該函數(shù)的頭文件用include命令包含在源文件前部。對(duì)str函數(shù)和f函數(shù)預(yù)先作了說(shuō)明4)當(dāng)被調(diào)函數(shù)的函數(shù)定義出現(xiàn)在主調(diào)函數(shù)之前時(shí),。在主調(diào)函數(shù)中也可以不對(duì)被調(diào)函數(shù)再作#include…float

add

(

float

x,float

y

);{float

z;z=x+y;return

z;}int

main(

){

float

a,b,c;cin>>a>>b;c=add(a,b);cout<<“sum

is

”<<c

;

return

0;}不必對(duì)被調(diào)函數(shù)作函數(shù)定義和函數(shù)的區(qū)別構(gòu)成不同,作用不同函數(shù)定義是指對(duì)函數(shù)功能的確立,包括指定函數(shù)名、函數(shù)的類(lèi)型、形參及其類(lèi)型以及函數(shù)體等。它是一個(gè)完整的、獨(dú)立的函數(shù)單位。函數(shù)

是把函數(shù)的名字、函數(shù)類(lèi)型以及形參的類(lèi)型、個(gè)數(shù)和順序通知編譯系統(tǒng),以便在調(diào)用該函數(shù)時(shí)系統(tǒng)按此進(jìn)行對(duì)照檢查(例如,函數(shù)名是否正確,實(shí)參與形參的類(lèi)型和個(gè)數(shù)是否一致),它不包含函數(shù)體。7.3

函數(shù)調(diào)用中的參數(shù)傳遞對(duì)于無(wú)參函數(shù),形參列表和實(shí)參列表均為空,括號(hào)不能省略,例如:add()。對(duì)于有參函數(shù),實(shí)參和形參的個(gè)數(shù)應(yīng)該相等,順序應(yīng)該對(duì)應(yīng),類(lèi)型一致或者賦值相容。實(shí)參可以是常量,變量或者表達(dá)式。例如函數(shù)原型int

max(int

x,inty);調(diào)用時(shí):max(500,a+20)或者max(a[i],y[j*3])例:

#include…

int

mult(int

n){n

*=

10;return(n);}int

main(){int

number;

int

result;number

=

668;result

=

mult(number);cout<<"number

=

"<<number<<endl;cout<<"result

=

"<<result<<endl;return

0;}調(diào)用前:形參n在mult函數(shù)定義時(shí)指定,但是,mult函數(shù)未被調(diào)用時(shí),n不占

單元。number=668,n不存在調(diào)用時(shí):執(zhí)行到函數(shù)調(diào)用語(yǔ)句的時(shí)候才給形參分配單元,并將實(shí)參number的值傳遞給形參n,形參實(shí)參占用的

空間不同。number=668,n=668單向值傳遞例:#include…

int

mult(int

n){n

*=10;return(n);}int

main(){int

number;int

result;number

=

668;result

=

mult(number);cout<<"number

=

"<<number<<endl;cout<<"result

=

"<<result<<endl;return

0;}調(diào)用中:函數(shù)mult在調(diào)用過(guò)程中,n的值發(fā)生變化:

n=6680,而number的值不變,還是668調(diào)用后:mult函數(shù)調(diào)用結(jié)束時(shí),形參所占用的內(nèi)存單元被實(shí)參number的值不變。number=668,n不存在void

main(

){

int x=3

,

y=7;change

(

x

,

y

);cout<<x<<“,”<<y ;

}

void

change

(

int a

,int b

)c=a

;

a=b

;

b=c

;}結(jié)果:3,737{

int c

;

實(shí)參和形參占用不同的

單元a,b交換x、y值不變a7x3b3y7單向值傳遞函數(shù)調(diào)用中發(fā)生的數(shù)據(jù)傳送是單向的。即只能把實(shí)參的值傳送給形參,而不能把形參的值反向地傳送給實(shí)參。因此在函數(shù)調(diào)用過(guò)程中,形參的值發(fā)生改變,而實(shí)參中的值不會(huì)變化。實(shí)參形參x=x*5y=y*5×

×void

main(){ int

n;cout<<"input

number\n";cin>>n;s(n);cout<<"n="<<n<<endl;}int

s(int

n){ int

i;for(i=n-1;i>=1;i--)n=n+i;cout<<"n="<<n<<endl;}輸入:6輸出:n=21n=6in56+5=11411+4=15315+3=18218+2=20120+1=21n=6即使形參實(shí)參的變量名相同,也是不同的變量,占不同的內(nèi)存單元void

main(){int

i,j;i=2;j=3;fun(i,j);}void

s(int

i,int

j){}×

×i*=10;

j*=5;怎么在被調(diào)函數(shù)里改變主調(diào)函數(shù)里的變量值?2.指針變量作為函數(shù)參數(shù)主調(diào)函數(shù)a被調(diào)函數(shù)*q實(shí)參:指針p&a形參:指針q&a例:#include…

int

main(){

void

swap(int

*pl,

int

*p2);inta,b;int

*pointer1,

*pointer2;cin>>a>>b;/*

指針變量獲

量a的地址

*//*

指針變量

得變量b的地址

*/pointerl

=&a;pointer2

=&b;if(a<

b)swap(pointer1,pointer2) /*

兩個(gè)指針變量作實(shí)參

*/cout<<"max=

"

<<a<<

"

,

min

=

" <<

b;return

0;}void

swap(int

*pl,

int

*p2){ int

*temp;temp=pl;p1=

p2;p2=temp;}輸入:6,8↙輸出:max=6,min=8改變形參指針的值,無(wú)法實(shí)現(xiàn)a/*

和b兩個(gè)變量值的交換例:#include…

int

main(){ void

swap(int

*pl,

int*p2);inta,b;int

*pointer1,

*pointer2;cin>>a>>b;/*

指針變量

得變量a的地址

*//*指針

量獲得變量b的地址

*/pointerl

=&a;pointer2

=&b;if(a<

b)swap(pointer1,point

2);

/*

兩個(gè)指針變量作實(shí)參*/cout<<"max="

<<a<<

"

,

min

=

" <<

b;return

0;}void

swap(int

*pl,int

*p2) /*

指針變量pl、p2作形參*/{ int

temp;temp=*pl;*p1

=

*p2;*p2

=

temp;}輸入:6,8↙輸出:max=8,min=6改變形參指針指向單元的值,才能實(shí)現(xiàn)a

和b兩個(gè)變量值的交換如果要通過(guò)函數(shù)調(diào)用得到n個(gè)要改變的值,方法:1.主調(diào)函數(shù):設(shè)置n個(gè)變量a1,a2,…,an,分別存放

n個(gè)要改變的值,它們的指針?lè)謩e為pointer1=&a1,pointer2=&a2,…pointern=&an。2.被調(diào)函數(shù):設(shè)置n個(gè)指針變量p1,p2,…pn作為形參,函數(shù)體改變*p1,*p2,…,*pn的值。3.函數(shù)調(diào)用:主調(diào)函數(shù)以pointer1,pointer2,…pointern為實(shí)參,將a1,a2,…,an的地址傳遞給形參p1,p2,…pn,于是,被調(diào)函數(shù)改變*p1,*p2,…,*pn的值,實(shí)際上就是改變a1,a2,…,an的值。函數(shù)調(diào)用結(jié)束時(shí),主調(diào)函數(shù)中的值發(fā)生了改變例、swap(int

*p1,int

*p2){int

temp;temp=*p1;*p1=*p2;*p2=temp;}int

main(){int

a,b;int

*pointer_1,*pointer_2;cin>>a>>b;pointer_1=&a;pointer_2=&b;if(a<b)

swap(pointer_1,pointer_2);cout<<a<<",

"<<b);

return

0;}實(shí)參實(shí)參輸入:5,9輸出:9,

5例:

下列程序的輸出結(jié)果,分析指針作函數(shù)參數(shù)的特點(diǎn)。#include

…void

func(int,int,int

*);void

main(){int

a=11,b=99,c;func(a,b,&a);func(a,b,&b);func(a,b,&c);/*

func函數(shù)

*//*

第一次調(diào)用func函數(shù)*//*第二次調(diào)用func函數(shù)*//*

第三次調(diào)用func函數(shù)*/cout<<"a="<<a<<“,b="<<b<<",c="<<c<<endl;}void

func(int

x,int

y,int

*z){*z

=y

-

x;}a=88,b=11,c=-77#include

…void

func(int,int,int

*);void

main(){int

a=11,b=99,c=8;cout<<"a="<<a<<“,b="<<b<<",c="<<c<<endl;func(a,b,&a); /*

第一次調(diào)用func函數(shù)*/cout<<"a="<<a<<“,b="<<b<<",c="<<c<<endl;func(a,b,&b); /*

第二次調(diào)用func函數(shù)*/cout<<"a="<<a<<“,b="<<b<<",c="<<c<<endl;func(a,b,&c); /*

第三次調(diào)用func函數(shù)*/cout<<"a="<<a<<“,b="<<b<<",c="<<c<<endl;}void

func(int

x,int

y,int

*z){*z=y-x;}a=11,b=99,c=8a=88,b=99,c=8a=88,b=11,c=8a=88,b=11,c=-77#include

…void

func(int,int,int

*);void

main(){int

a=11,b=99,c;func(a,b,&c);/*第一次調(diào)用func函數(shù)*/cout<<"a="<<a<<“,b="<<b<<",c="<<c<<endl;func(a,b,&b); /*

第二次調(diào)用func函數(shù)*/cout<<"a="<<a<<“,b="<<b<<",c="<<c<<endl;func(a,b,&a); /*

第三次調(diào)用func函數(shù)*/cout<<"a="<<a<<“,b="<<b<<",c="<<c<<endl;}void

func(int

x,int

y,int

*z){*z=y-x;}a=11,

b=99,

c=88a=11,

b=88,

c=88a=77,

b=88,

c=88雖然用指針作函數(shù)的參數(shù)可以使得形參的改變對(duì)相應(yīng)的實(shí)參有效。但是,如果在函數(shù)中反復(fù)使用指針進(jìn)行間接,會(huì)影響程序的可讀性且容易產(chǎn)生錯(cuò)誤,因此在C++語(yǔ)言中擴(kuò)充了的概念,這樣既可以實(shí)現(xiàn)指針?biāo)鶐?lái)的功能,又使程序清晰易讀。1.的概念(p182)

是一種特殊的變量,可以認(rèn)為是一個(gè)變量的別名。定義

的一般格式:名=變量名;類(lèi)型說(shuō)明符&如:

int a

=

1;int &b

=

a;首先定義變量a,并初始化為1,然后定義b,并初始化為a,即b是a的別名,因此a和b是同一個(gè)單元。注意:定義是誰(shuí)的別名。&為時(shí)一定要初始化,指明該

變量符,不代表地址.2.的簡(jiǎn)單使用#include

<iostream.h>void

main(){int

a=1;int

c=10;int

&b

=

a;cout

<<

a

<<

",

"

<<

b

<<",

"

<<

c

<<

endl;b

=

c;cout

<<

a

<<

",

"

<<

b

<<",

"

<<

c

<<

endl;b

=

20;cout

<<

a

<<

",

"

<<

b

<<",

"

<<

c

<<

endl;}程序運(yùn)行結(jié)果:1,1,1010,10,1020,20,10定義b,并將其作為a的別名將c的值賦給b,不是將b作為c的別名3.

作為函數(shù)的參數(shù)例6.18

寫(xiě)一個(gè)函數(shù),用

作為參數(shù),交換函數(shù)中兩個(gè)變量的值。#include

<iostream.h>void

swap(int

&x,

int

&y);void

main(){int

a,

b;a

=

10;b

=

20;swap(a,

b);cout

<<

a

<<

",

"

<<

b<<

endl;}void

swap(int

&x,

int

&y){int

temp;temp

=

x;x

=

y;y

=

temp;}程序運(yùn)行結(jié)果為:20,10例6.18程序運(yùn)行過(guò)程中參數(shù)值的變化圖示10axyab

x20axby10temp20axby10temp10by10temp20202010用注意:

作參數(shù)時(shí),函數(shù)的實(shí)參與形參在內(nèi)存單元,因此形參的變化會(huì)使實(shí)參同時(shí)變化。3.數(shù)組作為函數(shù)參數(shù)A.數(shù)組元素作為函數(shù)參數(shù)——相當(dāng)于簡(jiǎn)單變量作為函數(shù)參數(shù)單向值傳遞B.數(shù)組名作為函數(shù)參數(shù)——相當(dāng)于指針變量作為函數(shù)參數(shù)單向地址傳遞A.數(shù)組元素作為函數(shù)參數(shù)例:有數(shù)組a和b,各含有10個(gè)元素,將它們對(duì)應(yīng)地

逐個(gè)比較(即a[0]與b[0]比,a[1]與b[1]比,……)。

如果a數(shù)組中的元素大于b數(shù)組中的對(duì)應(yīng)元素的數(shù)目多于b數(shù)組中元素大于a數(shù)組中對(duì)應(yīng)元素的數(shù)目(例如,

a[i]>b[i]6次,b[i]>a[i]3次,其中i每次為不同的值),則認(rèn)為a數(shù)組大于b數(shù)組,并分別統(tǒng)計(jì)出兩個(gè)數(shù)組對(duì)應(yīng)元素大于、等于和小于的次數(shù)。large(int

x,

int

y){int

flag;if

(x

>

y)

flag

=1;else

if

(x

<

y)flag

=

-1;else

flag

=

0;return

(flag);}函數(shù)large的功能:判斷形參x和y的大小關(guān)系,返回1,0,-1三種函數(shù)值void

main(){int

large(intx,

int

y);int

a[10],

b[10],

i,

n=0,

m=0,

k=0;for(i

=

0;i

<

10;i++)cin>>a[i]for(i

=

0;i

<

10;i++)

cin>>b[

];for(i

=0;i

<10;i++){ if

(large(a[i],

b[i])

==1)

n++;else if

(large(a[i],

b[i])

==0)

m++;else

k++;}cout<<

"a[i]>b[i]"<<n<<

"times\na[i]=b[i]"

<<m<<

"times\na[i]<b[i]"<<k<<"times\n";if

(n>k) cout<<"array

a

is

larger

than

array

b\n

";else

if

(n

<

k)

cout<<"array

a

is

smaller

than

arrayb\n";else cout<<"array

a

is

equal

to

array

b

\n

";}主函數(shù)部分:以數(shù)組元素作為參數(shù)B.一維數(shù)組名作為參數(shù)數(shù)組名形參接受實(shí)參傳遞的數(shù)組首地址。實(shí)際上,C++編譯系統(tǒng)將形參數(shù)組名作為指針變量來(lái)處理。b為形參數(shù)組名。當(dāng)發(fā)生函數(shù)調(diào)用時(shí),進(jìn)行地址傳送,把實(shí)參數(shù)組a的首地址傳送給形參數(shù)組名b,于是b也取得該地址2000。于是a,b兩數(shù)組共同占有以2000為首地址的一段連續(xù)內(nèi)存單元。例如a[0]和b[0]都占用

2000~2003單元,當(dāng)然a[0]等于b[0]。類(lèi)推則有a[i]等于b[i]。a為實(shí)參數(shù)組,類(lèi)型為整型。a占有以2000為首地址的一塊內(nèi)存區(qū)。數(shù)組名作為函數(shù)參數(shù)用數(shù)組名作函數(shù)參數(shù)與用數(shù)組元素作參數(shù)有幾點(diǎn)不同:用數(shù)組元素作實(shí)參時(shí),并不要求函數(shù)的形參也是

下標(biāo)變量,對(duì)數(shù)組元素的處理是按普通變量對(duì)待的。用數(shù)組名作函數(shù)參數(shù)時(shí),則要求形參和相對(duì)應(yīng)的實(shí)

參都必須是類(lèi)型相同的數(shù)組或指針。當(dāng)形參和實(shí)參

二者不一致時(shí),即會(huì)發(fā)生錯(cuò)誤。在普通變量或下標(biāo)變量作函數(shù)參數(shù)時(shí),形參變量

和實(shí)參變量是由編譯系統(tǒng)分配的兩個(gè)不同的內(nèi)存單

元。在函數(shù)調(diào)用時(shí)是把實(shí)參變量的值賦予形參變量,發(fā)生的值傳送。在用數(shù)組名作函數(shù)參數(shù)時(shí),不是進(jìn)

行值的傳送,是地址的傳送,也就是說(shuō)把實(shí)參數(shù)組

的首地址賦予形參數(shù)組名。形參數(shù)組名取得該首地

址之后,也就等于有了實(shí)在的數(shù)組。實(shí)際上是形參

數(shù)組和實(shí)參數(shù)組為同一數(shù)組,共同擁有一段內(nèi)存空

間。3)在普通變量或下標(biāo)變量作函數(shù)參數(shù)時(shí),值傳送是單向的,即只能從實(shí)參傳向形參,不能從形參傳回實(shí)參。形參的初值和實(shí)參相同,而形參的值發(fā)生改變后,實(shí)參并不變化,兩者的終值是不同的。而當(dāng)用數(shù)組名作函數(shù)參數(shù)時(shí),實(shí)際上形參和實(shí)參為同一數(shù)組,因此當(dāng)形參數(shù)組發(fā)生變化時(shí),實(shí)參數(shù)組也隨之變化。例.數(shù)組a中存放了一個(gè)學(xué)生5門(mén)課程的成績(jī),求平均成績(jī)。float

aver(float

a[5]){

int

i;float

average,s=a[0];for(i=1;i<5;i++)s=s+a[i];average=s/5;retur

age;}void

main(){ float

sco[5],

averageint

i;for(i=0;i<5;i++)cin>>sco[i];average=aver(sco);cout<<average;}輸入:67

69.5

79

91.5

98輸出:average

score

is81.0000定義一個(gè)實(shí)型函數(shù)aver,有一個(gè)形參為實(shí)型數(shù)組a,長(zhǎng)度為5。把各元素值相加求出平均值,返回給主函數(shù)。實(shí)現(xiàn)數(shù)組sco的輸入。以sco作為實(shí)參調(diào)用aver函數(shù),函數(shù)返回值送average,最后輸出average值。例(判別一個(gè)整數(shù)數(shù)組中各元素的值,若大于0則輸出該值,若小于等于0則輸出0值)用數(shù)組名作函數(shù)參數(shù)。void

nzp(int

a[5]){ int

i;cout<<"\nvalues

of

array

a

are:\n";for(i=0;i<5;i++){if(a[i]<0)

a[i]=0;cout<<a[i]<<

"

";}}void

main(){ int

b[5],i;for(i=0;i<5;i++)cin>>b[i];nzp(b);for(i=0;i<5;i++)cout<<b[i]<<

"

";}輸入:67

69

79-1

98輸出:

67

69

79 0

9867

69

79 0

98函數(shù)nzp的形參為整型數(shù)組a,長(zhǎng)度為5。按要求把負(fù)值單元清0,并輸出形參數(shù)組a的值實(shí)參數(shù)組b也為整型,長(zhǎng)度也為5輸入數(shù)組b的值以數(shù)組名b為實(shí)參調(diào)用nzp函數(shù)數(shù)組b的終值和數(shù)組a是相同的一維數(shù)組名作為函數(shù)參數(shù)一維數(shù)組名作為函數(shù)參數(shù)4種等效形式:形參,實(shí)參都用數(shù)組名形參,實(shí)參都用指針變量形參用數(shù)組名,實(shí)參用指針變量形參用指針變量,實(shí)參用數(shù)組名情形一:實(shí)參和形參都是數(shù)組名。#include

…#define N

9void

output(int

a[],int

n){int

i;for(i=0;i<n;

i++)cout<<setw(5)<<acout<<"\n";}void

main(){int

x[N],i;for(i=0;i<N;i++)x[i]=2*i;output(x,N);}形參數(shù)組第一維大小形同虛設(shè),無(wú)論如何定義,函數(shù)調(diào)用以后實(shí)際上是對(duì)實(shí)參數(shù)組進(jìn)行操作,所以可以不指定第一維的大小注意:只能在實(shí)參數(shù)組的大小范圍內(nèi)使用形參數(shù)組為了方便被調(diào)函數(shù)的編寫(xiě),通常另外設(shè)一個(gè)參數(shù),用于傳遞數(shù)組元素的個(gè)數(shù)情形二:實(shí)參和形參都是指向數(shù)組的指針變量。#include

…#define N

9void

output(

int

*p

,int

n){ int

i;for(i=0;i<n;

i++)cout<<setw(5)<<*p++;cout<<"\n";}void

main(){ int

x[N],i;int

*q;for(i=0;i<N;i++)x[i]=2*i;q=x;output(q,N);}情形三:形參為數(shù)組名,實(shí)參為指向數(shù)組的指針變量。#include

…#define N

9void

output(

int

a[]

,int

n){ int

i;for(i=0;i<n;

i++)cout<<setw(5)<<*a++;cout<<"\n";}void

main(){ int

x[N],i;int

*q;for(i=0;i<N;i++)x[i]=2*i;q=x;output(q,N);}a是常量,應(yīng)改為*(a+i)情形四:形參為指向數(shù)組的指針變量,實(shí)參為數(shù)組名。#include

…#define N

9void

output(

int

*p

,int

n){int

i;for(i=0;i<n;

i++)cout<<setw(5)<<*p++;cout<<"\n";}void

main(){int

x[N],i;for(i=0;i<N;i++)x[i]=2*i;output(x,N);}例:編寫(xiě)函數(shù)統(tǒng)計(jì)一個(gè)一維數(shù)組(10個(gè)元素)中非0元素的個(gè)數(shù)。int solve(int

b[],int

n){

int

sum=0,i;for(i

=

0;i

<n;i++)if(b[i]!=

0)sum++;return(sum);}void

main(){int

a[10],num,i;for(i

=0;i

<10;i++)cin>>a[i];num=solve(a,10);cout<<"num

=

"<<num;}/*一維數(shù)組名b作形參*//*一維數(shù)組名a作實(shí)參*/例:編一函數(shù)實(shí)現(xiàn)數(shù)組逆置。{ int

i,j,t;for(i=0,j=n-1;i<j;i++,j--){t=x[i];x[i]=x[j];x[j]=t;}

}void

main(){

int

i,a[10]={1,2,3,4,5,6,7,8,9,0};for(i=0;i<10;i++)

cout<<setw(3)<<a[i];cout<<"\n";fun(a,10);for(i=0;i<10;i++)

cout<<setw(3)<<a[i];}void

fun(

int

x[],int

n)

實(shí)參和形參都是數(shù)組名例:編一函數(shù)實(shí)現(xiàn)數(shù)組逆置。void

fun(

int

*x

,int

n){ int

*i,*j,t,m=(n-1)/2;for(i=x,j=x+n-1;i<=x+m;i++,j--){t=*i;*i=*j;*j=t;}

}void

main(){

int

i,a[10]={1,2,3,4,5,6,7,8,9,0};for(i=0;i<10;i++)

cout<<setw(3)<<a[i];cout<<"\n";fun(a,10);for(i=0;i<10;i++)

cout<<setw(3)<<a[i];}形參為指針變量,實(shí)參為數(shù)組名例:編一函數(shù)實(shí)現(xiàn)數(shù)組逆置。void

fun(

int

x[],int

n){ inti,j,t;for(i=0;i<=n/2;i++){j=n-i-1;

t=x[i];

x[i]=x[j];

x[j]=t;}

}void

main(){

int

i,a[10]={1,2,3,4,5,6,7,8,9,0},*p;for(i=0;i<10;i++)

cout<<setw(3)<<a[i];cout<<"\n";p=a;fun(p,10);for(i=0;i<10;i++)

cout<<setw(3)<<a[i];}形參為數(shù)組名,實(shí)參為指針變量例:編一函數(shù)實(shí)現(xiàn)數(shù)組逆置。void

fun(int

*x,int

n){ int

*i,*j,t,m=(n-1)/2;for(i=x,j=x+n-1;i<=x+m;i++,j--){t=*i;*i=*j;*j=t;}

}void

main(){

int

i,a[10]={1,2,3,4,5,6,7,8,9,0},*p;for(i=0;i<10;i++)

cout<<setw(3)<<a[i];cout<<"\n";p=a;fun(p,10);for(i=0;i<10;i++)

cout<<setw(3)<<a[i];}實(shí)參和形參都是指針變量例:編一函數(shù)實(shí)現(xiàn)采用選擇排序法對(duì)數(shù)組中的整數(shù)按從小到大的順序排列。void main(

){void

select(int

*a,int

n);int

a[10],i;cout<<"Input

10

numbers:";for(i

=0;i

<10;i++)cin>>a[i];cout<<“\n”;select(a,10);for(i

=0;i

<10;i++)cout<<setw(3)<<a[i];}void

select(int

*a,intn){

int

i,j,k,temp;for(i

=0;i<

n

-

1;i++){ k

=

i;for(j

=i+1;j

<

n;j++)if(*(a+j)

<*(a+k))

.k=j;if(k

!=i){ temp

=

*(a+k);*(a+k)

=*(a+i);*(a+i)

=

temp;}}}形參為指針變量,實(shí)參為數(shù)組名數(shù)組名做函數(shù)參數(shù)函數(shù)調(diào)用期間,形參二維數(shù)組就是實(shí)參二維數(shù)組例:有一個(gè)3x4的矩陣,設(shè)計(jì)函數(shù)求該矩陣所有元素中的最大值。void

main(

){ int

max_value(int

array[][4]);inta[3][4]=({1,3,5,7},{2,4,6,8},{15,17,34,12});cout<<"max

value

is

"

<<max_value(a);

}int

max_value(int

array[][4]){ inti,j,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);}形參二維數(shù)組的第一維可以不指定大小,但是第二維必須指定用數(shù)組名作為函數(shù)參數(shù)時(shí)還應(yīng)注意以下幾點(diǎn):形參數(shù)組和實(shí)參數(shù)組的類(lèi)型必須一致,否則將引起錯(cuò)誤。形參數(shù)組和實(shí)參數(shù)組的長(zhǎng)度可以不相同,因?yàn)樵谡{(diào)用時(shí),只傳送首地址而

查形參數(shù)組的長(zhǎng)度。當(dāng)形參數(shù)組的長(zhǎng)度與實(shí)參數(shù)組不一致時(shí),雖不至于出現(xiàn)語(yǔ)法錯(cuò)誤(編譯能通過(guò)),但程序執(zhí)行結(jié)果將與實(shí)際不符,這是應(yīng)予以注意的。void

nzp(int

a[8]){ int

i;cout<<"\nvalues

of

array

a

are:\n";for(i=0;i<8;i++){if(a[i]<0)a[i]=0;cout<<a[i]<<"

";

}}main(){ int

b[5],i;for(i=0;i<5;i++)cin>>b[i];nzp(b);for(i=0;i<5;i++)cout<<b[i]<<"

";}輸入:67

69

79-1

98輸出:

67

69

79

098

4082

256

167

69

79

0

98函數(shù)nzp的形參為整數(shù)組a,長(zhǎng)度為8按要求把負(fù)值單元清0,并輸出形參數(shù)組a的值a[5],a[6],a[7]是無(wú)意義的實(shí)參數(shù)組b也為整型,長(zhǎng)度為5輸入數(shù)組b的值以數(shù)組名b為實(shí)參調(diào)用nzp函數(shù)數(shù)組b的終值和數(shù)組a是不相同的3)在函數(shù)形參表中,允許不給出形參數(shù)組的長(zhǎng)度,或用一個(gè)變量來(lái)表示數(shù)組元素的個(gè)數(shù)。例如可以寫(xiě)為:void

nzp(int

a[])或void

nzp(int

a[],int

n)其中形參數(shù)組a沒(méi)有給出長(zhǎng)度,而由n值動(dòng)態(tài)地表示數(shù)組的長(zhǎng)度。n的值由主調(diào)函數(shù)的實(shí)參進(jìn)行傳送。由此上例可以改寫(xiě)為:void

nzp(int

a[],int

n){ int

i;cout<<"\nvalues

of

array

a

are:\n";for(i=0;i<n;i++){if(a[i]<0)

a[i]=0;cout<<a[i]<<"

";

}}void

main(){ int

b[5],i;cout<<"\ninput

5

numbers:\n";for(i=0;i<5;i++)cin>>b[i];nzp(b,5);for(i=0;i<5;i++)cout<<b[i]<<"

";}其中形參數(shù)組a沒(méi)有給出長(zhǎng)度,而由n值動(dòng)態(tài)地表示數(shù)組的長(zhǎng)度。n的值由主調(diào)函數(shù)的實(shí)參進(jìn)行傳送。在main函數(shù)中,函數(shù)調(diào)用語(yǔ)句為nzp(b,5),其中實(shí)參5將賦予形參n作為形參數(shù)組的長(zhǎng)度。輸入:67

69

79-1

98輸出:67

69

79

0

9867

69

79

0

984)

數(shù)組也可以作為函數(shù)的參數(shù)。在函數(shù)定義時(shí)對(duì)形參數(shù)組可以指定每一維的長(zhǎng)度,也可省去第一維的長(zhǎng)度。因此,以下寫(xiě)法都是合法的。int

MA(int

a[3][10])或int

MA(int

a[][10])但是如下寫(xiě)法是錯(cuò)誤的:int

MA(int

a[3][

])√×字符數(shù)組作為函數(shù)參數(shù)函數(shù)調(diào)用期間,形參字符串就是實(shí)參字符串例:改用兩個(gè)字符指針變量作形參void

stringcopy

(char

*p,

char

*q){while(

(*p++=*q++)

!=‘\0’

);}例:

編寫(xiě)一個(gè)字符串

函數(shù),并在主函數(shù)中調(diào)用該函數(shù),驗(yàn)證其正確性。#include

…void

stringcopy

(char

s[],

char

*t){int

i=0;while(*t

!=

'\0'){s[i]=*t;i++;t++;}s[i]=

'\0';}void

main(){char

str1[]="I

love

Beijing!"

;char

*str2="I

love

China!

"

;stringcopy

(

str1,

str2

)

;cout<<"str1="<<str1<<"\n"<<"str2="<<str2;}將指向字符串首字符的指針q移到字符串末尾while(*q)

q++;q--;while(*q++);q--;√×例:將一個(gè)字符串s1中第k個(gè)字符開(kāi)始的后續(xù)字符組成子串s2void

copysubstring(char

*s1,char

*s2,int

k){ s1=s1+k

-1;while(

*s1!='\0')*s2++=*s1++;*s2=‘\0’;}例.將一個(gè)字符串s1中第k個(gè)字符開(kāi)始的n個(gè)后續(xù)字符組成子串s2,不足則取后續(xù)所有字符void

copysubstring(char

*s1,

char

*s2,

int

k,

int

n){

s1=s1+k-1;while(

n>0

&& *s1

!=

'\0'){

*s2++=*s1++;*s2=‘\0’}n--

}字符指針作函數(shù)參數(shù)例.把一個(gè)字符串的內(nèi)容(1)數(shù)組傳給數(shù)組:void

cpystr(char

pas[],char

pbs[]){int

i=0;while(pas[i]!='\0'){pbs[i]=pas[i];i++;}pbs[i]=‘\0’;}void

main(){char

pa[]=“I

am

a

boy.",pb[20];cpystr(pa,pb);cout<<"a="<<pa<<"\nb="<<pb;}運(yùn)行結(jié)果:a=I

am

a

boy.b=I

am

a

boy.Iamaboy.\0到另一個(gè)字符串中。papbpas[0]pbs[0]pas[i]pbs[i]循環(huán)結(jié)束賦值\0(2)指針傳給數(shù)組:void

cpystr(char

pas[],char

pbs[]){

int

i=0;while(pas[i]!='\0'){pbs[i]=pas[i];i++;}pbs[i]=‘\0’;}void

main(){char

pa[]=“I

am

a

boy.",pb[20];char

*a=pa,*b=pb;cpystr(a,b);cout<<"a="<<a<<"\nb="<<b;}Iamaboy.\0papbpas[0]pbs[0]ab(3)數(shù)組傳給指針:void

cpystr(char

*pas,char

*pbs){

while(*pas!='\0'){*pbs=*pas;pas++;pbs++}*pbs=‘\0’;}void

main(){char

pa[]=“I

am

a

boy.",pb[20];cpystr(pa,pb);cout<<"a="<<pa<<"\nb="<<pb;}Iamaboy.\0papbpaspbs(4)指針傳給指針:void

cpystr(char

*pas,char

*pbs)Iamaboy.\0paspbsab{

while(*pas!='\0'){*pbs=*pas;pas++;pbs++}*pbs=‘\0’;}cpystr函數(shù)體可改寫(xiě):①

while((*pbs=*pas)!='\0'){pas++; pbs++;

}②

while((*pbs++=*pas++)!=‘\0’);③

while(*pas)

*pbs++=*pas++;*pbs=‘\0’④

while(*pbs++=*pas++);7.4

函數(shù)的嵌套和遞歸調(diào)用函數(shù)的嵌套調(diào)用是指一個(gè)函數(shù)在被調(diào)用時(shí)其本身又調(diào)用了其他函數(shù)。123456789例.main

(

)p1(

){

cout<<”m***\n”;{cout<<”p1***\n”;p3

();p2

();cout<<”m+++\n”;p2

();cout<<”p1+++\n”;}cout<<”m!!!\n”;

}p2

(

)p3

(){cout<<”p2\n”;

}{

cout<<”p3***\n”;p2

();cout<<”p3+++\n”;p1

();cout<<”p3!!!\n”;}12453

67891011main

(

){……p3();……p2

();……}P3(){

……p2

();……p1

();……}P2(){

……}P2(){

……}P2(){

……}P1(){

……P2……}void

main(){ int

m,n,t;float

c(int,

int);cin>>m>>n;if(n>m)

cout<<"Input

error";else

cout<<c(m,n);}floatfac(int

t)/*求t!*/{ int

i;float

s=1;for(i=1;i<t;i++)

s*=i;return

s;}{ float

f,fac(int);f=fac(m)

/

(fac(n)*fac(m-n));return

f;}例.求組合數(shù)mC

nMain函數(shù)中調(diào)用C函數(shù)C函數(shù)中三次調(diào)用fac函數(shù)mfloat

c(int

m,

intn) /*求C

n

*/用二分法求下面方程在(-10,10)之間的根2x3-4x2+3x-6=0ab此兩點(diǎn)一定為異號(hào)才有解與a異號(hào),中點(diǎn)2在左邊中點(diǎn)1b與b異號(hào),中點(diǎn)3在左邊中點(diǎn)3中點(diǎn)2#include

…float

f(float

x){return

((2*x-4)*x+3)*x-6;}float

root(float

x1,float

x2){float

x,y,y1;do

{

x=(x1+x2)/2;

y=f(x);

y1=f(x1);if

(y*y1>0)

x1=x;

else

x2=x;(fabs(y)>=1e-6);}whilereturn

x;}void

main(){floatx1,x2;do

{cout<<"input

x1,x2:";cin>>x1>>x2;}while(f(x1)*f(x2)>=0);cout<<"A

root

ofequation

is

"<<root(x1,x2);}計(jì)算2x3-4x2+3x-6的值中點(diǎn)函數(shù)值左邊函數(shù)值以上兩函數(shù)值同號(hào),中點(diǎn)為新的左端點(diǎn),否則中點(diǎn)為新的右端點(diǎn)做到y(tǒng)值近0為止兩邊界點(diǎn)函數(shù)值為異號(hào)才有解直接調(diào)用函數(shù)7.4.2函數(shù)的遞歸調(diào)用函數(shù)的遞歸調(diào)用:在調(diào)用一個(gè)函數(shù)的過(guò)程中又直接或間接的調(diào)用函數(shù)自身.在遞歸調(diào)用中,主調(diào)函數(shù)又是被調(diào)函數(shù)。intf(intx){

int

y;…z=f(y);…

return

z;}直接遞歸調(diào)用7.4.2函數(shù)的遞歸調(diào)用間接遞歸調(diào)用func1(intn){inty;┇func2(y);┇}func2(intx){int

m;┇func1(m);┇}7.4.2函數(shù)的遞歸調(diào)用一個(gè)遞歸函數(shù)運(yùn)行時(shí)有可能無(wú)休止地調(diào)用其自身,這

當(dāng)然是不正確的。為了防止遞歸調(diào)用無(wú)終止地進(jìn)行,

必須加條件判斷,滿(mǎn)足某種條件后就不再作遞歸調(diào)用,然后逐層返回。遞歸函數(shù)的2要素:1.遞歸公式2.遞歸結(jié)束的條件例.

計(jì)算

4!

4!—————————————24↓3!*4————————————6*4=24↓2!*3————————————2*3=6↓1!*2————————————1*2=2↓n>1 n!

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

1終止條件遞歸公式int f

(

int n

){

int m

;if

(

n==1

)

m=1;elsem=

f

(n-1)*n;return

(

m

);}void

main(

){cout<<“

4!=

“<<f

(4)

;}實(shí)參遞歸調(diào)用終止條件例:5個(gè)人坐在一起報(bào)歲數(shù),問(wèn)第5個(gè)人幾歲?他說(shuō)比第4

個(gè)

兩歲;問(wèn)第4個(gè)人幾歲?他說(shuō)比第3個(gè)

兩歲;

問(wèn)第3個(gè)人幾歲?他說(shuō)比第2個(gè)

兩歲;問(wèn)第2個(gè)人幾歲?他說(shuō)比第1個(gè)兩歲;最后問(wèn)第1個(gè)人幾歲?他說(shuō)10歲。這是一個(gè)遞歸問(wèn)題:要求第5個(gè)人的

,要先知道第4個(gè)人的

;要求第4個(gè)人的

,要先知道第3個(gè)人的;要求第3個(gè)人的

,要先知道第2個(gè)人的年齡;……得出:age(5)=age(4)+2age(4)=age(3)+2age(3)=age(2)+2age(2)=age(1)+2age(1)=10得出公式:比前一位

大2歲,無(wú)終止調(diào)用10歲有終止age(n

1)

2n

1n

1age(n)

10遞歸公式12141618int age(

int n

){

int c

;if

(

n==1

)

c=10;else c=

age

(n-1)+2;return

(

c

);}void

main(

){cout<<age

(5)

;}實(shí)參遞歸調(diào)用終止條件函數(shù)的重載(p100)所謂函數(shù)的重載是指完成不同功能的函數(shù)可以具有相同的函數(shù)名。C++的編譯器是根據(jù)函數(shù)的實(shí)參來(lái)確定應(yīng)該調(diào)用哪一個(gè)函數(shù)的。int fun(int

a, intb){ return

a+b;

}int fun

(int

a){ return

a*a;

}void

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論