第七講-函數(shù)(一)_第1頁
第七講-函數(shù)(一)_第2頁
第七講-函數(shù)(一)_第3頁
第七講-函數(shù)(一)_第4頁
第七講-函數(shù)(一)_第5頁
已閱讀5頁,還剩43頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

《C++語言及編程技巧》主講:匡綱要國防科技大學電子科學與工程學院·湖南長沙·81第7講函數(shù)82第7講函數(shù)(一)

4.1函數(shù)概述

4.2函數(shù)定義與函數(shù)調(diào)用

4.3函數(shù)原型

4.4函數(shù)嵌套調(diào)用與遞歸調(diào)用

834.1函數(shù)概述

C++語言認為函數(shù)是一個能完成某一獨立功能的子程序,也就是程序模塊。 函數(shù)就是對復雜問題的一種“自頂向下,逐步求精”思想的體現(xiàn)。 編程者可以將一個大而復雜的程序分解為若干個相對獨立而且功能單一的小塊程序(函數(shù))進行編寫,并通過在各個函數(shù)之間進行調(diào)用,來實現(xiàn)總體的功能。84使用函數(shù)的優(yōu)點:(1)可讀性好;(2)易于查錯和修改;(3)便于分工編寫,分階段調(diào)試;(4)各個函數(shù)之間接口清晰,便于相互間交換信息和使用;(5)節(jié)省程序代碼和存儲空間;(6)減少用戶總的工作量;(7)成為實現(xiàn)結(jié)構(gòu)程序設(shè)計思想的重要工具;(8)擴充語言和計算機的原設(shè)計能力;(9)便于驗證程序正確性。4.1函數(shù)概述85 設(shè)計C++程序的過程,實際上就是編寫函數(shù)的過程,至少也要編寫一個main()函數(shù)。 執(zhí)行C++程序,也就是執(zhí)行相應(yīng)的main()函數(shù)。即從main()函數(shù)的第一個左花括號“{”開始,依次執(zhí)行后面的語句,直到最后一個右花括號“}”為止。如果在執(zhí)行過程中遇到其他的函數(shù),則調(diào)用其他函數(shù)。調(diào)用完后,返回到剛才調(diào)用函數(shù)的下一條語句繼續(xù)執(zhí)行。而其他函數(shù)也只有在執(zhí)行main()函數(shù)的過程中被調(diào)用時才會執(zhí)行。4.1函數(shù)概述86

函數(shù)可以被一個函數(shù)調(diào)用,也可以調(diào)用另一個函數(shù),它們之間可以存在著調(diào)用上的嵌套關(guān)系。但是,C++不允許函數(shù)的定義嵌套,即在函數(shù)定義中再定義一個函數(shù)是非法的。

C++函數(shù)是一個獨立完成某個功能的語句塊,函數(shù)與函數(shù)之間通過輸入和輸出來聯(lián)系。

4.1函數(shù)概述874.2函數(shù)定義與函數(shù)調(diào)用無參函數(shù)定義函數(shù)定義函數(shù)類型標識符函數(shù)名()/*函數(shù)首部*/{

/*函說明部分數(shù)執(zhí)行部分體}

*/有參函數(shù)定義函數(shù)類型標識符函數(shù)名(形式參數(shù)及類型說明表){

說明部分執(zhí)行部分}形式參數(shù)及類型說明表類型名1形式參數(shù)1,類型名2形式參數(shù)2,...88函數(shù)體里經(jīng)常要用到一個指示返回函數(shù)結(jié)果值的語句—return語句。若函數(shù)確實返回一個值:return語句

return(表達式);或

return表達式;若函數(shù)沒有返回值

return;或

/*不要return;語句*/(無需return語句,執(zhí)行到函數(shù)體的

}時,流程控制返回函數(shù)調(diào)用點)4.2函數(shù)定義與函數(shù)調(diào)用89例1已知兩實型數(shù)的值,求其和數(shù)floatfadd(float

x,floaty){return(x+y);}例2已知某直角三角形的兩直角邊,求其斜邊長doublehypo(double

a,doubleb){doublec;c=sqrt(pow(a,2)+pow(b,2));return(c);}函數(shù)定義示例4.2函數(shù)定義與函數(shù)調(diào)用810例3已給某三角形的三邊長,求該三角形的面積floatarea(float

a,float

b,floatc){floatl,s;l=(a+b+c)/2;s=sqrt(l*(l-a)*(l-b)*(l-c));return(s);}函數(shù)定義示例4.2函數(shù)定義與函數(shù)調(diào)用811例4計算前n(n

1)項自然數(shù)之和intsum(intn){inti,total=0;for(i=1;i<=n;i++)total+=i;return(total);}函數(shù)定義示例4.2函數(shù)定義與函數(shù)調(diào)用812例5實現(xiàn):若ch的值是英文大寫(小寫)字母,則返回相對應(yīng)的英文小寫(大寫)字母;若ch的值是任意其他字符,則返回原字符值不變。charchange(charch){charc=ch;if(ch>='A'&&ch<='Z')c=ch+32;elseif(ch>='a'&&ch<='z')c=ch-32;return(c);}函數(shù)定義示例

4.2函數(shù)定義與函數(shù)調(diào)用813無參函數(shù)調(diào)用的一般形式函數(shù)調(diào)用

函數(shù)名()有參函數(shù)調(diào)用的一般形式

函數(shù)名(實參1,實參2,……)要求實參和形參:參數(shù)個數(shù)相等順序一一對應(yīng)類型賦值匹配4.2函數(shù)定義與函數(shù)調(diào)用814方式一

函數(shù)調(diào)用可出現(xiàn)在表達式中例6承例3,設(shè)已說明實型變量s,可寫s=area(3.0,4.0,5.0);Cout<<"Theareais:”<<s<<endl;或?qū)慍out<<"Theareais:”<<area(3.0,4.0,5.0)<<endl;函數(shù)調(diào)用方式Theareais:6.000000.4.2函數(shù)定義與函數(shù)調(diào)用815方式二

可作為函數(shù)調(diào)用語句出現(xiàn)設(shè)定義無返回值函數(shù)printvoidprint()/*或?qū)憊oidprint(void)*/{

inti;

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

cout<<"**********\n";}可寫如下函數(shù)調(diào)用語句print();**************************************************函數(shù)調(diào)用方式4.2函數(shù)定義與函數(shù)調(diào)用816例7:求整數(shù)的立方體,并以列表形式輸出10、20、30、……、100及其立方體。//programc04_01.cpp#include<iostream.h>#include<iomanip.h>longcube(intn){

return(n*n*n);}voidmain(){

int

i,n=10; longl;

cout<<"n\tn*n*n"<<endl<<endl;

cout<<setiosflags(ios::left);

for(i=1;i<=10;i++) { l=cube(n);

cout<<setw(8)<<n<<setw(8)<<l<<endl; n+=10; }}運行示例:nn*n*n10008000270006400012500021600034300051200072900010010000004.2函數(shù)定義與函數(shù)調(diào)用8174.3函數(shù)原型函數(shù)說明又稱函數(shù)原型。函數(shù)說明告知編譯器:函數(shù)返回的數(shù)據(jù)類型函數(shù)所接收的參數(shù)個數(shù)函數(shù)所接收的參數(shù)類型函數(shù)所接收的參數(shù)順序編譯器用函數(shù)說明檢驗函數(shù)調(diào)用。

函數(shù)說明

8184.3函數(shù)原型

無參函數(shù)說明語句的一般形式函數(shù)類型標識符函數(shù)名();有參函數(shù)說明語句的一般形式函數(shù)類型標識符函數(shù)名(類型名1形參1,類型名2形參2,...);或函數(shù)類型標識符函數(shù)名(類型名1,類型名2,...);函數(shù)說明819例8編寫程序,求兩個已給整數(shù)中的大者并輸出結(jié)果。/*programfindmax.cpp*/#include<iostream.h>main(){inta,b,c;intmax(inti,intj);/*函數(shù)說明*/

cout<<"Entertwointegernumbers:";

cin>>a>>b;c=max(a,b);

cout<<"Themaximumvalueis“<<c<<“.\n";}intmax(inti,intj)/*函數(shù)定義*/{intk;k=(i>j)?i:j;return(k);}函數(shù)說明示例Entertwointegernumbers:25

Themaximumvalueis5.4.3函數(shù)原型820簡化程序之一/*programfindmax1.cpp*/#include<iostream.h> main(){inta,b,c;

intmax(inti,intj);/*函數(shù)說明*/

cout<<"Entertwointegernumbers:";

cin>>a>>b;c=max(a,b);

cout<<"Themaximumvalueis“<<c”.\n";}max(inti,intj)/*函數(shù)返回值類型缺省時,隱含為int型*/{intk;k=(i>j)?i:j;return(k);}

被調(diào)用函數(shù)的返回值為int型或char型時,可省寫函數(shù)說明語句函數(shù)說明示例4.3函數(shù)原型821簡化程序之二/*programfindmax2.cpp*/#include<iostream.h> main(){inta,b,c;intmax(int,int);

cout<<"Entertwointegernumbers:";

cin>>a>>b;c=max(a,b);

cout<<“Themaximumvalueis“<<c<<”.\n";}intmax(inti,intj)/*此處不能寫成intmax(int,int)*/{intk;k=(i>j)?i:j;return(k);}函數(shù)說明中省略形參名函數(shù)說明示例4.3函數(shù)原型822簡化程序之三/*programfindmax3.cpp*/#include<iostream.h> intmax(inti,intj)/*函數(shù)定義*/{intk;k=(i>j)?i:j;return(k);}main(){inta,b,c;/*函數(shù)定義在先,可省略函數(shù)說明語句*/

cout<<"Entertwointegernumbers:";

cin>>a>>b;c=max(a,b);

cout<<"Themaximumvalueis“<<c<<“.\n";}函數(shù)說明示例4.3函數(shù)原型823例9

輸入三個正實數(shù),計算三角形面積并輸出結(jié)果。/*programfindarea.cpp*/#include<iostream.h>#include<math.h>/*包含求平方根函數(shù)sqrt*/main(){floata,b,c,s;floatarea(floata,floatb,floatc);/*函數(shù)說明*/do{

cout<<"Enterthreerealnumbers(>0):";

cin>>a>>b>>c;}while(!(a>0&&b>0&&c>0&&a+b>c&&b+c>a&&c+a>b));s=area(a,b,c);/*函數(shù)調(diào)用*/

cout<<"Theareais“<<s<<“.\n";}函數(shù)說明示例4.3函數(shù)原型824/*以下為函數(shù)定義*/floatarea(floata,floatb,floatc){floatl,s;l=(a+b+c)/2;s=sqrt(l*(l-a)*(l-b)*(l-c));return(s);}Enterthreerealnumbers(>0):3.04.05.0

Theareais6.000000.函數(shù)說明示例4.3函數(shù)原型825示例

編寫程序,輸出1到10之間所有自然數(shù)及其平方、立方表:函數(shù)定義、函數(shù)調(diào)用與函數(shù)說明使用示例

numbersquarecube____________________

111248392741664525125636216749343864512981729101001000

4.3函數(shù)原型826/*programnsc.cpp.tableofnumberandit'ssquare,cube*/#include<iostream.h>#include<iomanip.h>#defineN10intsquare(int);/*函數(shù)說明*/intcube(int);/*函數(shù)說明*/main(){inti,sq,cu;

cout<<"\nnumber\tsquare\tcube\n";

cout<<setiosflags(ios::left);for(i=1;i<=20;i++)

cout"_";

cout<<endl<<endl;for(i=1;i<=N;i++){sq=square(i);cu=cube(i);

cout<<setw(8)<<i<<setw(8)<<sq<<setw(8)<<cu;}} /*函數(shù)調(diào)用函數(shù)調(diào)用*/函數(shù)定義、函數(shù)調(diào)用與函數(shù)說明使用示例4.3函數(shù)原型827/*函數(shù)定義*/intsquare(intx){return(x*x);}/*函數(shù)定義*/intcube(intx){return(x*x*x);}函數(shù)定義、函數(shù)調(diào)用與函數(shù)說明使用示例4.3函數(shù)原型8284.4函數(shù)的嵌套調(diào)用與遞歸調(diào)用C語言不允許嵌套定義函數(shù),但允許嵌套調(diào)用函數(shù),還可遞歸調(diào)用函數(shù)嵌套調(diào)用就是一個函數(shù)調(diào)用另一函數(shù),而另一函數(shù)又調(diào)用再一函數(shù),如此繼續(xù)遞歸調(diào)用就是一個函數(shù)可間接地或直接地調(diào)用自身函數(shù)的嵌套調(diào)用與遞歸調(diào)用8294.4函數(shù)的嵌套調(diào)用與遞歸調(diào)用例10下述程序體現(xiàn)了函數(shù)的嵌套調(diào)用。/*programnestedcalls.cpp*/#include<iostream.h>voidgreeting()/*函數(shù)定義*/{

cout<<“Goodmorning!”<<endl;

cout<<"Howareyou?”<<endl;}voidsmalltalk()/*函數(shù)定義*/{inti;

cout<<"SMALLTALK...”<<endl;for(i=1;i<=3;i++)

cout<<"CHATTER...";

cout<<endl;}

函數(shù)的嵌套調(diào)用示例8304.4函數(shù)的嵌套調(diào)用與遞歸調(diào)用voidtalk()/*函數(shù)定義,包含函數(shù)說明語句*/{voidinquire();/*函數(shù)說明,先使用后定義*/voiddeparture();/*函數(shù)說明,先使用后定義*/inquire();/*函數(shù)調(diào)用*/departure();/*函數(shù)調(diào)用*/}voidinquire()/*函數(shù)定義*/{greeting();/*函數(shù)調(diào)用*/smalltalk();/*函數(shù)調(diào)用*/}voiddeparture()/*函數(shù)定義*/{

cout<<"Goodtohearthatthingsaregoingwell.\n";

cout<<"Haveaniceday.\n";}函數(shù)的嵌套調(diào)用示例8314.4函數(shù)的嵌套調(diào)用與遞歸調(diào)用voidhello() /*函數(shù)定義*/{

cout<<"Hello.”<<endl;talk(); /*函數(shù)調(diào)用*/

cout<<"Goodbye.”<<endl;}main(){hello(); /*函數(shù)調(diào)用*/}Hello.Goodmorning!Howareyou?SMALLTALK...CHATTER...CHATTER...CHATTER...Goodtohearthatthingsaregoingwell.Haveaniceday.Goodbye.函數(shù)的嵌套調(diào)用示例8324.4函數(shù)的嵌套調(diào)用與遞歸調(diào)用假如一個對象,它部分地由自己組成,或者是用自己來定義,則稱它是遞歸的。遞歸問題的共性遞歸的概念(1) 有一個“基本實例”,即結(jié)束遞歸的條件;(2) 問題可轉(zhuǎn)化為相似問題,但較原始問題簡化;(3) 可以應(yīng)用此轉(zhuǎn)化過程使問題獲得解決。遞歸的概念與數(shù)學中的遞推、迭代等概念相似。8334.4函數(shù)的嵌套調(diào)用與遞歸調(diào)用示例計算階乘的遞推算法數(shù)學公式遞推算法遞歸的概念8344.4函數(shù)的嵌套調(diào)用與遞歸調(diào)用示例計算斐波那契數(shù)序列的遞推算法斐波那契數(shù)序列0,1,1,2,3,5,8,13,21,34,55,89,144,233,...

遞歸的概念8354.4函數(shù)的嵌套調(diào)用與遞歸調(diào)用示例

計算n階勒讓德多項式的遞推算法leg(x,1)=xleg(x,2)=(3x2-1)leg(x,3)=(15x3-9x)

......遞歸的概念8364.4函數(shù)的嵌套調(diào)用與遞歸調(diào)用示例計算阿克曼(Ackermann)函數(shù)的遞推算法Ack(0,0)=1Ack(1,0)=2Ack(1,1)=3......Ack(2,2)=?

Ack(1,2)=Ack(0,Ack(1,1))=Ack(0,3)=4Ack(1,3)=Ack(0,Ack(1,2))=Ack(0,4)=5Ack(1,4)=Ack(0,Ack(1,3))=Ack(0,5)=6Ack(1,5)=Ack(0,Ack(1,4))=Ack(0,6)=7Ack(2,0)=Ack(1,1)=3Ack(2,1)=Ack(1,Ack(2,0))=Ack(1,3)=5Ack(2,2)=Ack(1,Ack(2,1))=Ack(1,5)=7

遞歸的概念8374.4函數(shù)的嵌套調(diào)用與遞歸調(diào)用例11計算某非負整數(shù)n的階乘的遞歸函數(shù)定義fac(5)fac(5)返回120

5*fac(4)5*fac(4)返回120

4*fac(3)4*fac(3)返回24

3*fac(2)3*fac(2)返回6

2*fac(1)2*fac(1)返回2

1*fac(0)1*fac(0)返回1

11longfac(intn){longf;if(n==0)f=1;elsef=n*fac(n-1);return(f);}printf("%d\n",fac(5));120遞歸函數(shù)定義示例8384.4函數(shù)的嵌套調(diào)用與遞歸調(diào)用例12求兩個非負整數(shù)m、n最大公因子的遞歸函數(shù)定義intgcd(int

m,intn){intc;if(n==0)c=m;elsec=gcd(n,m%n);return(c);}遞歸函數(shù)定義示例8394.4函數(shù)的嵌套調(diào)用與遞歸調(diào)用例13給定n(0

n

30),用遞歸算法計算斐波那契數(shù)序列的前n+1項(序號從0至n)并輸出結(jié)果。/*programfibonacci.cpp*/#include<iostream.h>#include<iomanip.h>#defineMAX30longfib(intn)/*求序號為n(n>=0)的斐波那契數(shù)*/{longres;/*result*/switch(n){case0:res=0;break;case1:res=1;break;

default:res=fib(n-1)+fib(n-2);}return(res);}

遞歸函數(shù)應(yīng)用示例8404.4函數(shù)的嵌套調(diào)用與遞歸調(diào)用main(){intm,n;do{

cout<<"Inputn(0<=n<=“<<MAX<<“):";

cin>>n;}while(!(n>=0&&n<=MAX));for(m=0;m<=n;m++){

cout<<setw(7)<<fib(m);if((m+1)%8==0)

cout<<endl;}

cout<<endl;}

遞歸函數(shù)應(yīng)用示例8414.4函數(shù)的嵌套調(diào)用與遞歸調(diào)用Inputn(0<=n<=30):24

01123581321345589144233377610987159725844181676510946177112865746368Inputn(0<=n<=30):

-6

Inputn(0<=n<=30):6

0112358

遞歸函數(shù)應(yīng)用示例8424.4函數(shù)的嵌套調(diào)用與遞歸調(diào)用示例承例13,求序號為n(n

0)的斐波那契數(shù)函數(shù)定義的另一語句編碼形式longfib(intn){if(n==0||n==1)return(n);elsereturn(fib(n-1)+fib(n-2));}

遞歸函數(shù)定義示例8434.4函數(shù)的嵌套調(diào)用與遞歸調(diào)用例14

求n(n

0)階勒讓德多項式的遞歸函數(shù)定義f

溫馨提示

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

評論

0/150

提交評論