面向對象程序設計3_第1頁
面向對象程序設計3_第2頁
面向對象程序設計3_第3頁
面向對象程序設計3_第4頁
面向對象程序設計3_第5頁
已閱讀5頁,還剩63頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

1、第三章第三章 函數函數華中師范大學物理系華中師范大學物理系C+語言程序設計 前一頁 休息2本章主要內容本章主要內容l函數的聲明和調用函數的聲明和調用l函數間的參數傳遞函數間的參數傳遞l內聯函數內聯函數l帶缺省形參值的函數帶缺省形參值的函數l函數重載函數重載l函數模板函數模板lC+系統函數系統函數 前一頁 休息3函數的聲明函數的聲明l函數是面向對象程序設計中的基本抽象函數是面向對象程序設計中的基本抽象單元,是對功能的抽象單元,是對功能的抽象l函數定義的語法形式函數定義的語法形式類型標識符 函數名(形式參數表) 語句序列函數的聲明與使用若無參數,寫void是被初始化的內部變量,壽命和可見性僅限于函

2、數內部若無返回值,寫void 前一頁 休息4函數的聲明函數的聲明l形式參數表形式參數表 name1, name2, ., namenl函數的返回值函數的返回值 由 return 語句給出,例如:return 0 無返回值的函數(void類型),不必寫return語句。函數的聲明與使用 前一頁 休息5函數的調用函數的調用l調用前先說明函數原型:調用前先說明函數原型: 在調用函數的說明部分,或程序文件開頭所有函數之前,按如下形式說明: 類型標識符 被調用函數名 (含類型說明的形參表);l調用形式調用形式 函數名(實參列表)l嵌套調用嵌套調用 函數不允許嵌套聲明,但可以嵌套調用。l遞歸調用遞歸調用

3、函數直接或間接調用自身。函數的聲明與使用 前一頁 休息6例例3-1編寫一個求編寫一個求x的的n次方的函數次方的函數#include doublepower (double x, int n);void main(void)cout 5 to the power 2 is power(5,2) endl;doublepower (double x, int n)double val = 1.0;while (n-)val = val*x;return(val);函數的聲明與使用 前一頁 休息7運行結果:運行結果:5 to the power 2 is 25例例3-1編寫一個求編寫一個求x的的n次

4、方的函數次方的函數函數的聲明與使用 前一頁 休息8例例3-2 數制轉換數制轉換題目:題目: 輸入一個輸入一個8位二進制數,將其轉換位二進制數,將其轉換為十進制數輸出。為十進制數輸出。例如:例如:000011012 =0(27) +0(26) +0(25) +0(24) +1(23) + 1(22) + 0(21) + 1(20)= 1310 所以,若輸入所以,若輸入00001101,則應輸出,則應輸出13函數的聲明與使用#include double power (double x, int n);void main(void)int i;int value = 0;char ch;cout

5、= 0; i-)cin ch;if (ch = 1)value += int(power(2,i);cout Decimal value is valueendl;double power (double x, int n)double val = 1.0;while (n-)val *= x;return(val);運行結果:運行結果:Enter an 8 bit binary number 01101001Decimal value is 105 前一頁 休息11例例3-3編寫程序求編寫程序求的值的值其中其中arctan用如下形式的級數計算:用如下形式的級數計算:直到級數某項絕對值不大于直

6、到級數某項絕對值不大于10-15為止;為止;和和x均為均為double型。型。函數的聲明與使用2391arctan451arctan16753)arctan(753xxxxx#includevoid main() double a,b; double arctan(double x) ; a=16.0*arctan(1/5.0) ; b=4.0*arctan(1/239.0) ; /注意:因為整數相除結果取整,注意:因為整數相除結果取整, /如果參數寫如果參數寫1/5,1/239,結果就都是,結果就都是0 coutPI=a-b1e-15) f=e/i; r=(i%4=1)? r+f : r-f

7、 ; e=e*sqr; i+=2; return r ;運行結果:運行結果:PI=3.14159運行結果:運行結果:PI=3.14159 前一頁 休息15例例3-4l尋找并輸出尋找并輸出11999之間的數之間的數m,它滿,它滿足足m、m2和和m3均為回文數。均為回文數。 回文:各位數字左右對稱的整數。例如:11滿足上述條件 112=121,113=1331。l分析:分析: 10取余的方法,從最低位開始,依次取出該數的各位數字。按反序重新構成新的數,比較與原數是否相等,若相等,則原數為回文。函數的聲明與使用#include void main() bool symm(long n); long

8、m; for(m=11; m1000; m+) if (symm(m)&symm(m*m)&symm(m*m*m) coutm=m m*m=m*m m*m*m=m*m*mendl;bool symm(long n) long i, m; i=n ; m=0 ; while(i) m=m*10+i%10; i=i/10 ; return ( m=n );運行結果:運行結果:m=11 m*m=121 m*m*m=1331m=101 m*m=10201 m*m*m=1030301m=111 m*m=12321 m*m*m=1367631 前一頁 休息19函數調用的執行過程函數調用的執

9、行過程函數的聲明與使用main()調fun()結束fun()返回保存:返回地址當前現場恢復:主調程序現場返回地址 前一頁 休息20嵌套調用嵌套調用函數的聲明與使用main調fun1()結束fun1()調fun2()返回fun2()返回 前一頁 休息21例例3-6 輸入兩個整數,求平方和。輸入兩個整數,求平方和。#include iostream#include .hvoid main(void)void main(void) int a,b; int a,b; int fun1(int x,int y); int fun1(int x,int y); cinab; cinab; c o u t

10、 c o u t a a 、 b b 的 平 方 和 :的 平 方 和 : fun1fun1(a,b)endl(a,b)endl; ; 函數的聲明與使用intint fun1fun1(int x,int(int x,int y) y) int int fun2fun2(int(int m); m); return (fun2(x)+fun2(y); return (fun2(x)+fun2(y); intint fun2fun2(int(int m) m) return (m return (m* *m);m); 運行結果:運行結果:3 43 4a a、b b的平方和:的平方和:2525 前一

11、頁 休息23遞歸調用遞歸調用l函數直接或間接地調用自身,稱為遞歸調用。l遞歸過程的兩個階段:遞推: 4!=43! 3!=32! 2!=21! 1!=10! 0!=1未知 已知回歸:4!=43!=243!=32!=62!=21!=21!=10!=10!=1未知未知 已知已知函數的聲明與使用 前一頁 休息24例例3-8 求求n!分析:計算n!的公式如下:這是一個遞歸形式的公式,應該用遞歸函數實現。函數的聲明與使用)0()!1()0(1!nnnnn源程序:源程序:# #include iostreaminclude .hlong long facfac(int(int n) n) long f; l

12、ong f; if (n0) if (n0) coutn0,data error!endl coutn0,data error!endl; ; else if (n=0) f=1;else if (n=0) f=1; else f= else f=facfac(n-1)(n-1)* *n;n; return(f); return(f); void main()void main() long fac(int n); long fac(int n); int int n; n; long y; long y; coutEnter a positive integer:; coutn;n; y=

13、y=facfac(n);(n); coutn!=yendl coutn!=yendl; ; 運行結果:運行結果:Enter a positive integer:8Enter a positive integer:88!=403208!=40320 前一頁 休息27函數的參數傳遞機制函數的參數傳遞機制 傳遞參數值傳遞參數值l在函數被調用時才分配形參的存儲在函數被調用時才分配形參的存儲單元。單元。l實參可以是常量、變量或表達式。實參可以是常量、變量或表達式。l實參類型必須與形參相符。實參類型必須與形參相符。l傳遞時是傳遞參數值,即單向傳遞。傳遞時是傳遞參數值,即單向傳遞。函數的聲明與使用 前一頁

14、 休息28函數的參數傳遞機制函數的參數傳遞機制 參數值傳遞舉例參數值傳遞舉例XN被調函數:被調函數:主調函數:主調函數:3 2.5AD = power(A,3) 2.53double power(double X, int N)函數的聲明與使用 前一頁 休息29例例3-11 輸入兩輸入兩 整數交換后輸出整數交換后輸出#includevoid Swap(int a, int b);int main()int x(5), y(10);coutx=x y=yendl;Swap(x,y);coutx=x y=yendl;return 0;函數的聲明與使用void Swap(int a, int b)i

15、nt t;t=a;a=b;b=t;運行結果運行結果:x=5 y=10 x=5 y=10 前一頁 休息31函數的參數傳遞函數的參數傳遞 用引用做形參用引用做形參l引用引用(&)是標識符的別名是標識符的別名,例如例如:int i,j;int &ri=i; /建立一個int型的引用ri,并將其 /初始化為變量i的一個別名j=10;ri=j;/相當于 i=j;l聲明一個引用時,必須同時對它進行初始化,聲明一個引用時,必須同時對它進行初始化,使它指向一個已存在的對象。使它指向一個已存在的對象。l一旦一個引用被初始化后,就不能改為指向一旦一個引用被初始化后,就不能改為指向其它對象。其它對象

16、。l引用可以作為形參引用可以作為形參 void swap(int& a, int& b) .函數的聲明與使用 前一頁 休息32例例3-12 輸入兩個整數交換后輸出輸入兩個整數交換后輸出#includevoid Swap(int& a, int& b);int main()int x(5), y(10);coutx=x y=yendl;Swap(x,y);coutx=x y=yendl;return 0;函數的聲明與使用void Swap(int& a, int& b)int t;t=a;a=b;b=t;運行結果運行結果:x=5 y=10 x=10

17、 y=5t=a;x5t5x 的地址axy510y 的地址x 的地址aby 的地址x 的地址abx10y10a=bb=t;y5t5y 的地址bxy105Swap(x,y); 前一頁 休息35例例3-13 引用調用舉例引用調用舉例#include #include void fiddle(int in1, int &in2);int main() int count = 7, index = 12; cout The values are ; coutsetw(5)count; coutsetw(5)indexendl; fiddle(count, index); cout The val

18、ues are ; coutsetw(5)count; coutsetw(5)indexendl; return 0;函數的聲明與使用void fiddle(int in1, int &in2) in1 = in1 + 100; in2 = in2 + 100; cout The values are ; coutsetw(5)in1; coutsetw(5)in2endl;運行結果:運行結果: The values are 7 12 The values are 107 112 The values are 7 112 前一頁 休息37內聯函數聲明與使用內聯函數聲明與使用l聲明時使用

19、關鍵字聲明時使用關鍵字 inline。l編譯時在調用處用函數體進行替換編譯時在調用處用函數體進行替換,節節省了參數傳遞、控制轉移等開銷。省了參數傳遞、控制轉移等開銷。l注意:注意: 內聯函數體內不能有循環語句和switch語句。 內聯函數的聲明必須出現在內聯函數第一次被調用之前。 對內聯函數不能進行異常接口聲明。內聯函數 前一頁 休息38例例3-14 內聯函數應用舉例內聯函數應用舉例#includeinline double CalArea(double radius)return 3.14*radius*radius;int main()double r(3.0);double area;a

20、rea=CalArea(r);coutareaendl;return 0;內聯函數 前一頁 休息39缺省形參值的作用缺省形參值的作用l函數在聲明時可以預先給出默認的形參值,函數在聲明時可以預先給出默認的形參值,調用時如給出實參,則采用實參值,否則采調用時如給出實參,則采用實參值,否則采用預先給出的默認形參值。用預先給出的默認形參值。l例如:例如:int add(int x=5,int y=6) return x+y;void main(void) add(10,20); /10+20 add(10); /10+6 add(); /5+6帶缺省形參值的函數 前一頁 休息40缺省形參值的說明次序缺

21、省形參值的說明次序l缺省形參值必須缺省形參值必須從右向左從右向左順序聲明,順序聲明,并且在缺省形參值的右面不能有非缺并且在缺省形參值的右面不能有非缺省形參值的參數。因為調用時實參取省形參值的參數。因為調用時實參取代形參是從左向右的順序。代形參是從左向右的順序。l例:例:int add(int x,int y=5,int z=6); /正確int add(int x=1,int y=5,int z); /錯誤int add(int x=1,int y,int z=6); /錯誤帶缺省形參值的函數 前一頁 休息41缺省形參值與函數的調用位置缺省形參值與函數的調用位置l調用出現在函數體實現之前時,缺

22、省形參值必調用出現在函數體實現之前時,缺省形參值必須在函數原形中給出;而當調用出現在函數體須在函數原形中給出;而當調用出現在函數體實現之后時,缺省形參值需在函數實現時給出。實現之后時,缺省形參值需在函數實現時給出。l例:例:int add(int x=5,int y=6);void main(void) add(); /調用在實現前int add(int x,int y) return x+y; int add(int x=5,int y=6) return x+y; void main(void) add(); /調用在實現后帶缺省形參值的函數 前一頁 休息42缺省形參值的作用域缺省形參值的

23、作用域l在相同的作用域內,缺省形參值的說明應在相同的作用域內,缺省形參值的說明應保持唯一,但如果在不同的作用域內,允保持唯一,但如果在不同的作用域內,允許說明不同的缺省形參。許說明不同的缺省形參。l例:例:int add(int x=1,int y=2);void main(void) int add(int x=3,int y=4); add(); /使用局部缺省形參值(實現3+4)void fun(void) . add(); /使用全局缺省形參值(實現1+2)帶缺省形參值的函數 前一頁 休息43例例3-15帶缺省形參值的函數舉例帶缺省形參值的函數舉例#include #include i

24、nt get_volume(int length, int width = 2, int height = 3);int main()int x = 10, y = 12, z = 15; cout Some box data is ; cout get_volume(x, y, z) endl; cout Some box data is ; cout get_volume(x, y) endl; cout Some box data is ; cout get_volume(x) endl; cout Some box data is ; cout get_volume(x, 7) end

25、l; cout Some box data is ; cout get_volume(5, 5, 5) endl; return 0;帶缺省形參值的函數int get_volume(int length, int width, int height) coutsetw(5)length setw(5)widthsetw(5)height ; return length * width * height;運行結果運行結果:Some box data is 10 12 15 1800Some box data is 10 12 3 360Some box data is 10 2 3 60Some

26、 box data is 10 7 3 210Some box data is 5 5 5 125 前一頁 休息45重載函數的聲明重載函數的聲明lC+允許功能相近的函數在相同的作用允許功能相近的函數在相同的作用域內以相同函數名聲明,從而形成重載。域內以相同函數名聲明,從而形成重載。方便使用,便于記憶。方便使用,便于記憶。l例:例:形參類型不同int add(int x, int y);float add(float x, float y);形參個數不同int add(int x, int y);int add(int x, int y, int z); 函 數 重 載 前一頁 休息46注意事項

27、注意事項 不要將不同功能的函數聲明為重載函數,以免出現調用結果的誤解、混淆。這樣不好:int add(int x,int y);int add(int a,int b);編譯器不以形參名來區分int add(int x,int y);void add(int x,int y);編譯器不以返回值來區分int add(int x,int y) return x+y; float add(float x,float y) return x-y; 函 數 重 載 重載函數的形參必須不同: 個數不同或類型不同。 編譯程序將根據實參和形參的類型及個數的最佳匹配來選擇調用哪一個函數。 前一頁 休息47例例3

28、-16重載函數應用舉例重載函數應用舉例編寫三個名為編寫三個名為add的重載函數,分別實現兩整數的重載函數,分別實現兩整數相加、兩實數相加和兩個復數相加的功能。相加、兩實數相加和兩個復數相加的功能。#includestruct complexdouble real;double imaginary;void main(void)int m, n;double x, y;complex c1, c2, c3;int add(int m, int n);double add(double x, double y);complex add(complex c1, complex c2);coutmn;

29、coutinteger m+n=add(m,n)endl;coutxy;coutreal number x+y= add(x,y) endl;coutc1.realc1.imaginary;coutc2.realc2.imaginary;c3=add(c1,c2);coutcomplex number ( c1.real , c1.imaginary )+(c2.real, c2.imaginary)=(c3.real, c3.imaginary)n;int add(int m, int n) return m+n; double add(double x, double y) return

30、x+y; complex add(complex c1, complex c2) complex c;c.real=c1.real+c2.real;c.imaginary=c1.imaginary+c2.imaginary;return c;運行結果:運行結果:Enter two integer: 3 5integer 3+5=8Enter two real number: 2.3 5.8real number 2.3+5.8= 8.1Enter the first complex number: 12.3 45.6Enter the second complex number: 56.7 6

31、7.8complex number (12.3,45.6)+(56.7,67.8)= (69,113.4) 前一頁 休息52函數模板的聲明函數模板的聲明l函數模板可以用來創建一個通用功能函數模板可以用來創建一個通用功能的函數,以支持多種不同形參,進一的函數,以支持多種不同形參,進一步簡化重載函數的函數體設計。步簡化重載函數的函數體設計。l聲明方法:聲明方法:template 函數聲明 函 數 模 板 前一頁 休息53例例3-17 求絕對值函數的模板求絕對值函數的模板#includetemplateT abs(T x) return x0?-x:x; void main() int n=-5;

32、double d=-5.5; coutabs(n)endl; coutabs(d)endl; 函 數 模 板l運行結果:運行結果:55.5l分析分析 編譯器從調用abs()時實參的類型,推導出函數模板的類型參數。例如,對于調用表達式abs(n),由于實參n為int型,所以推導出模板中類型參數T為int。 當類型參數的含義確定后,編譯器將以函數模板為樣板,生成一個函數:int abs(int x) return x0?-x:x; 前一頁 休息55C+系統函數系統函數lC+的系統庫中提供了幾百個函數可的系統庫中提供了幾百個函數可供程序員使用。供程序員使用。例如:求平方根函數(sprt)、求絕對值函

33、數(abs)等。l使用系統函數時要包含相應的頭文件。使用系統函數時要包含相應的頭文件。例如:math.h使用C+系統函數 前一頁 休息56例例3-18系統函數應用舉例系統函數應用舉例l題目:題目:從鍵盤輸入一個角度值,求出該角度的正弦值、余弦值和正切值。l分析:分析:系統函數中提供了求正弦值、余弦值和正切值的函數:sin()、cos()、tan(),函數的說明在頭文件math.h中。使用C+系統函數#include#includeconst double pi(3.14159265);void main() double a,b; cina; b=a*pi/180; coutsin(a)=si

34、n(b)endl; coutcos(a)=cos(b)endl; couttan(a)=tan(b)(“活動子集”欄)Visual C+ Documentation - Visual C+ Documentation -Using Visual C+ - Visual C+ Programmers Guide - Run-Time Library Reference -Run Time Routines by Category - Run Time Routines by Category 使用C+系統函數 前一頁 休息60作作 業業l復習第三章,預習第四章復習第三章,預習第四章l3-2, 3-8, 3-11, 3-13, 3-15l學習使用聯機幫助系統查找系統函數學習使用聯機幫助系統查找系統函數l實驗三實驗三 前一頁 休息62例例3-9l用遞歸法計算從用遞歸法計算從n個人中選擇個人中選擇k個人組個人組成一個委員會的不同組合數。成一個委員會的不

溫馨提示

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

最新文檔

評論

0/150

提交評論