版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 廣東科貿(mào)職業(yè)學(xué)院《管理綜合案例》2023-2024學(xué)年第一學(xué)期期末試卷
- 廣東江門(mén)中醫(yī)藥職業(yè)學(xué)院《康復(fù)機(jī)能評(píng)定》2023-2024學(xué)年第一學(xué)期期末試卷
- 廣東技術(shù)師范大學(xué)《電路與數(shù)字邏輯實(shí)驗(yàn)》2023-2024學(xué)年第一學(xué)期期末試卷
- 廣東財(cái)貿(mào)職業(yè)學(xué)院《網(wǎng)絡(luò)爬蟲(chóng)技術(shù)》2023-2024學(xué)年第一學(xué)期期末試卷
- 《水和冰的結(jié)構(gòu)》課件
- 共青科技職業(yè)學(xué)院《高級(jí)商務(wù)英語(yǔ)2》2023-2024學(xué)年第一學(xué)期期末試卷
- 贛州職業(yè)技術(shù)學(xué)院《湘西民間打擊樂(lè)1》2023-2024學(xué)年第一學(xué)期期末試卷
- 贛南醫(yī)學(xué)院《英語(yǔ)聽(tīng)力Ⅱ》2023-2024學(xué)年第一學(xué)期期末試卷
- 《課件課例研究》課件
- 防疫安全心理課件
- 全球機(jī)場(chǎng)三字碼、四字碼
- 2023-2024學(xué)年重慶市兩江新區(qū)四上數(shù)學(xué)期末質(zhì)量檢測(cè)試題含答案
- 泌尿外科內(nèi)鏡診療技術(shù)質(zhì)量保障措施及應(yīng)急預(yù)案
- M7.5漿砌塊石擋土墻砌筑施工方法
- 2022年度黑龍江省重點(diǎn)新產(chǎn)品名單
- 2023北京朝陽(yáng)區(qū)初三上期末考物理試卷及答案
- 挖掘機(jī)司機(jī)安全培訓(xùn)試題和答案
- 腎內(nèi)科學(xué)篇病例分析1
- 工程電力之DCS系統(tǒng)受電及系統(tǒng)復(fù)原調(diào)試措施
- 我國(guó)成人血脂異常防治指南解讀
- 早爆、拒爆事故預(yù)防與處理
評(píng)論
0/150
提交評(píng)論