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

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

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

4.1函數概述

4.2函數定義與函數調用

4.3函數原型

4.4函數嵌套調用與遞歸調用

834.1函數概述

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

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

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

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

/*函說明部分數執行部分體}

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

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

return(表達式);或

return表達式;若函數沒有返回值

return;或

/*不要return;語句*/(無需return語句,執行到函數體的

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

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

a,doubleb){doublec;c=sqrt(pow(a,2)+pow(b,2));return(c);}函數定義示例4.2函數定義與函數調用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);}函數定義示例4.2函數定義與函數調用811例4計算前n(n

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

4.2函數定義與函數調用813無參函數調用的一般形式函數調用

函數名()有參函數調用的一般形式

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

函數調用可出現在表達式中例6承例3,設已說明實型變量s,可寫s=area(3.0,4.0,5.0);Cout<<"Theareais:”<<s<<endl;或寫Cout<<"Theareais:”<<area(3.0,4.0,5.0)<<endl;函數調用方式Theareais:6.000000.4.2函數定義與函數調用815方式二

可作為函數調用語句出現設定義無返回值函數printvoidprint()/*或寫voidprint(void)*/{

inti;

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

cout<<"**********\n";}可寫如下函數調用語句print();**************************************************函數調用方式4.2函數定義與函數調用816例7:求整數的立方體,并以列表形式輸出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函數定義與函數調用8174.3函數原型函數說明又稱函數原型。函數說明告知編譯器:函數返回的數據類型函數所接收的參數個數函數所接收的參數類型函數所接收的參數順序編譯器用函數說明檢驗函數調用。

函數說明

8184.3函數原型

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

cout<<"Entertwointegernumbers:";

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

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

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

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

cout<<"Entertwointegernumbers:";

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

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

被調用函數的返回值為int型或char型時,可省寫函數說明語句函數說明示例4.3函數原型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);}函數說明中省略形參名函數說明示例4.3函數原型822簡化程序之三/*programfindmax3.cpp*/#include<iostream.h> intmax(inti,intj)/*函數定義*/{intk;k=(i>j)?i:j;return(k);}main(){inta,b,c;/*函數定義在先,可省略函數說明語句*/

cout<<"Entertwointegernumbers:";

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

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

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

cout<<"Theareais“<<s<<“.\n";}函數說明示例4.3函數原型824/*以下為函數定義*/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.函數說明示例4.3函數原型825示例

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

numbersquarecube____________________

111248392741664525125636216749343864512981729101001000

4.3函數原型826/*programnsc.cpp.tableofnumberandit'ssquare,cube*/#include<iostream.h>#include<iomanip.h>#defineN10intsquare(int);/*函數說明*/intcube(int);/*函數說明*/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;}} /*函數調用函數調用*/函數定義、函數調用與函數說明使用示例4.3函數原型827/*函數定義*/intsquare(intx){return(x*x);}/*函數定義*/intcube(intx){return(x*x*x);}函數定義、函數調用與函數說明使用示例4.3函數原型8284.4函數的嵌套調用與遞歸調用C語言不允許嵌套定義函數,但允許嵌套調用函數,還可遞歸調用函數嵌套調用就是一個函數調用另一函數,而另一函數又調用再一函數,如此繼續遞歸調用就是一個函數可間接地或直接地調用自身函數的嵌套調用與遞歸調用8294.4函數的嵌套調用與遞歸調用例10下述程序體現了函數的嵌套調用。/*programnestedcalls.cpp*/#include<iostream.h>voidgreeting()/*函數定義*/{

cout<<“Goodmorning!”<<endl;

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

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

cout<<"CHATTER...";

cout<<endl;}

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

cout<<"Goodtohearthatthingsaregoingwell.\n";

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

cout<<"Hello.”<<endl;talk(); /*函數調用*/

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

遞歸的概念8354.4函數的嵌套調用與遞歸調用示例

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

......遞歸的概念8364.4函數的嵌套調用與遞歸調用示例計算阿克曼(Ackermann)函數的遞推算法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函數的嵌套調用與遞歸調用例11計算某非負整數n的階乘的遞歸函數定義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遞歸函數定義示例8384.4函數的嵌套調用與遞歸調用例12求兩個非負整數m、n最大公因子的遞歸函數定義intgcd(int

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

n

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

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

遞歸函數應用示例8404.4函數的嵌套調用與遞歸調用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;}

遞歸函數應用示例8414.4函數的嵌套調用與遞歸調用Inputn(0<=n<=30):24

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

-6

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

0112358

遞歸函數應用示例8424.4函數的嵌套調用與遞歸調用示例承例13,求序號為n(n

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

遞歸函數定義示例8434.4函數的嵌套調用與遞歸調用例14

求n(n

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

溫馨提示

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

評論

0/150

提交評論