c++語言程序設(shè)計(鄭莉第四版)課件3_第1頁
c++語言程序設(shè)計(鄭莉第四版)課件3_第2頁
c++語言程序設(shè)計(鄭莉第四版)課件3_第3頁
c++語言程序設(shè)計(鄭莉第四版)課件3_第4頁
c++語言程序設(shè)計(鄭莉第四版)課件3_第5頁
已閱讀5頁,還剩67頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、1C+語言程序設(shè)計C+語言程序設(shè)計清華大學(xué) 鄭莉2本章主要內(nèi)容本章主要內(nèi)容l函數(shù)的定義和調(diào)用函數(shù)的定義和調(diào)用l函數(shù)間的參數(shù)傳遞函數(shù)間的參數(shù)傳遞l內(nèi)聯(lián)函數(shù)內(nèi)聯(lián)函數(shù)l帶默認(rèn)形參值的函數(shù)帶默認(rèn)形參值的函數(shù)l函數(shù)重載函數(shù)重載lC+系統(tǒng)函數(shù)系統(tǒng)函數(shù)l深度探索深度探索C+語言程序設(shè)計清華大學(xué) 鄭莉3函數(shù)的定義函數(shù)的定義l函數(shù)是面向?qū)ο蟪绦蛟O(shè)計中,對功能的函數(shù)是面向?qū)ο蟪绦蛟O(shè)計中,對功能的抽象抽象l函數(shù)定義的語法形式函數(shù)定義的語法形式類型標(biāo)識符 函數(shù)名(形式參數(shù)表) 語句序列函數(shù)的聲明與使用是被初始化的內(nèi)部變量,壽命和可見性僅限于函數(shù)內(nèi)部若無返回值,寫voidC+語言程序設(shè)計清華大學(xué) 鄭莉4函數(shù)的定義函數(shù)的

2、定義l形式參數(shù)表形式參數(shù)表 name1, name2, ., namenl函數(shù)的返回值函數(shù)的返回值由 return 語句給出,例如:return 0無返回值的函數(shù)(void類型),不必寫return語句。函數(shù)的聲明與使用C+語言程序設(shè)計清華大學(xué) 鄭莉5函數(shù)的調(diào)用函數(shù)的調(diào)用l調(diào)用前先聲明函數(shù):調(diào)用前先聲明函數(shù):若函數(shù)定義在調(diào)用點(diǎn)之前,則無需另外聲明;若函數(shù)定義在調(diào)用點(diǎn)之后,則需要在調(diào)用函數(shù)前按如下形式聲明函數(shù)原型: 類型標(biāo)識符 被調(diào)用函數(shù)名(含類型說明的形參表);l調(diào)用形式調(diào)用形式 函數(shù)名(實參列表) l嵌套調(diào)用嵌套調(diào)用函數(shù)可以嵌套調(diào)用,但不允許嵌套定義。l遞歸調(diào)用遞歸調(diào)用函數(shù)直接或間接調(diào)用自身

3、。函數(shù)的聲明與使用C+語言程序設(shè)計清華大學(xué) 鄭莉6例例3-1編寫一個求編寫一個求x的的n次方的函數(shù)次方的函數(shù)# #include include using namespace std;using namespace std;/計算計算x的的n次方次方double power(double x, int n)double power(double x, int n) double val = 1.0;double val = 1.0;while (n-) val while (n-) val * *= x;= x;return val;return val; int main()int mai

4、n() cout 5 to the power 2 is cout 5 to the power 2 is powerpower(5, 2) endl;(5, 2) endl;return 0;return 0; 函數(shù)的聲明與使用C+語言程序設(shè)計清華大學(xué) 鄭莉7運(yùn)行結(jié)果:運(yùn)行結(jié)果:5 to the power 2 is 255 to the power 2 is 25例例3-1編寫一個求編寫一個求x的的n次方的函數(shù)次方的函數(shù)函數(shù)的聲明與使用C+語言程序設(shè)計清華大學(xué) 鄭莉8例例3-2 數(shù)制轉(zhuǎn)換數(shù)制轉(zhuǎn)換題目:題目: 輸入一個輸入一個8 8位二進(jìn)制數(shù),將其轉(zhuǎn)換位二進(jìn)制數(shù),將其轉(zhuǎn)換為十進(jìn)制數(shù)輸出。為十

5、進(jìn)制數(shù)輸出。例如:例如:110111012 2=1(2=1(23 3)+1(2)+1(22 2)+0(2)+0(21 1)+1(2)+1(20 0)=13)=131010 所以,如果輸入所以,如果輸入11011101,則應(yīng)輸出,則應(yīng)輸出1313函數(shù)的聲明與使用# #include include using namespace std;using namespace std;/計算計算x的的n次方次方double double powerpower (double x, int n); (double x, int n);int main() int main() int value = 0;

6、int value = 0;cout Enter an 8 bit binary number ;cout = 0; i-) for (int i = 7; i = 0; i-) char ch; char ch; cin ch; cin ch; if (ch = 1) if (ch = 1) value += int( value += int(powerpower(2, i);(2, i); cout Decimal value is value endl;cout Decimal value is value endl;return 0;return 0; double double p

7、owerpower (double x, int n) (double x, int n) double val = 1.0;double val = 1.0;while (n-) while (n-) val val * *= x;= x;return val;return val; 運(yùn)行結(jié)果:運(yùn)行結(jié)果:Enter an 8 bit binary number Enter an 8 bit binary number 0110100101101001Decimal value is 105Decimal value is 1059C+語言程序設(shè)計清華大學(xué) 鄭莉10例例3-3編寫程序求編寫程序

8、求的值的值其中其中arctanarctan用如下形式的級數(shù)計算:用如下形式的級數(shù)計算:直到級數(shù)某項絕對值不大于直到級數(shù)某項絕對值不大于1010-15-15為止;為止;和和x x均為均為doubledouble型。型。函數(shù)的聲明與使用2391arctan451arctan16357arctan357xxxxx#include #include using namespace std;using namespace std;double arctan(double x) double arctan(double x) double sqr = x double sqr = x * * x; x;d

9、ouble e = x;double e = x;double r = 0;double r = 0;int i = 1;int i = 1;while (e / i 1e-15) while (e / i 1e-15) double f = e / i;double f = e / i;r = (i % 4 = 1) ? r + f : r - f;r = (i % 4 = 1) ? r + f : r - f;e = e e = e * * sqr; sqr;i += 2;i += 2; return r;return r; 11int main() int main() double a

10、 = 16.0 double a = 16.0 * * arctan(1 / 5.0)arctan(1 / 5.0); ; double b = 4.0 double b = 4.0 * * arctan(1 / 239.0)arctan(1 / 239.0); ; /注意:因為整數(shù)相除結(jié)果取整,如果參數(shù)寫注意:因為整數(shù)相除結(jié)果取整,如果參數(shù)寫1/51/5,1/2391/239,結(jié)果就都是,結(jié)果就都是0 0cout PI = a - b endl;cout PI = a - b endl;return 0;return 0; 運(yùn)行結(jié)果:運(yùn)行結(jié)果:PI=3.14159PI=3.1415912C+

11、語言程序設(shè)計清華大學(xué) 鄭莉13例例3-4l尋找并輸出尋找并輸出1111999999之間的數(shù)之間的數(shù)m m,它滿足,它滿足m m、m m2 2和和m m3 3均為回文數(shù)。均為回文數(shù)?;匚模焊魑粩?shù)字左右對稱的整數(shù)。例如:11滿足上述條件 112 2=121,113 3=1331。l分析:分析:10取余的方法,從最低位開始,依次取出該數(shù)的各位數(shù)字。按反序重新構(gòu)成新的數(shù),比較與原數(shù)是否相等,若相等,則原數(shù)為回文。函數(shù)的聲明與使用#include #include using namespace std;using namespace std;/判斷判斷n n是否為回文數(shù)是否為回文數(shù)bool symm(

12、unsigned n) bool symm(unsigned n) unsigned i = n; unsigned i = n;unsigned m = 0;unsigned m = 0;while (while (i 0i 0) ) m = m = m m * * 10 + i % 10 10 + i % 10; ; i /= 10; i /= 10; return m = n; return m = n; 14int main() int main() for(unsigned m = 11; m 1000; m+)for(unsigned m = 11; m 1000; m+) if

13、( if (symmsymm(m) & (m) & symmsymm(m (m * * m) & m) & symm symm(m (m * * m m * * m) m) cout m = m; cout m = m; cout m cout m * * m = m m = m * * m; m; cout m cout m * * m m * * m = m = m m * * m m * * m endl; m endl; return 0;return 0; 15運(yùn)行結(jié)果:運(yùn)行結(jié)果:m=11 mm=11 m* *m=121 mm=121 m* *m m*

14、 *m=1331m=1331m=101 mm=101 m* *m=10201 mm=10201 m* *m m* *m=1030301m=1030301m=111 mm=111 m* *m=12321 mm=12321 m* *m m* *m=1367631m=136763116C+語言程序設(shè)計清華大學(xué) 鄭莉17例例3-5計算如下公式,并輸出結(jié)果:計算如下公式,并輸出結(jié)果:其中其中r r、s s的值由鍵盤輸入。的值由鍵盤輸入。sin xsin x的近似的近似值按如下公式計算,計算精度為值按如下公式計算,計算精度為1010-6-6:函數(shù)的聲明與使用1121753)!12() 1(! 7! 5!

15、3! 1sinnnnnxxxxxx222222sinsinr1sin()r2rsskrss當(dāng)當(dāng)#include #include #include /#include /對對C+C+標(biāo)準(zhǔn)庫中數(shù)學(xué)函數(shù)的說明標(biāo)準(zhǔn)庫中數(shù)學(xué)函數(shù)的說明using namespace std;using namespace std;const double TINY_VALUE = 1e-10;const double TINY_VALUE = 1e-10;double tsin(double x) double tsin(double x) double g = 0;double g = 0;double t = x;

16、double t = x;int n = 1;int n = 1;do do g += t;g += t;n+;n+;t = -t t = -t * * x x * * x / (2 x / (2 * * n - 1) / (2 n - 1) / (2 * * n - 2); n - 2); while (fabs(t) = TINY_VALUE); while (fabs(t) = TINY_VALUE); return g;return g;18int main() int main() double k, r, s;double k, r, s;cout r = ;cout r;cin

17、r;cout s = ;cout s;cin s;if (r if (r * * r = s r = s * * s) s)k = sqrt(k = sqrt(tsintsin(r) (r) * * tsintsin(r) + (r) + tsintsin(s) (s) * * tsin(s);tsin(s);elseelsek = k = tsintsin(r (r * * s) / 2; s) / 2;cout k endl;cout k endl;return 0;return 0; 運(yùn)行結(jié)果:r=5s=81.3778119C+語言程序設(shè)計清華大學(xué) 鄭莉20例例3-6投骰子的隨機(jī)游戲投骰

18、子的隨機(jī)游戲每個骰子有六面,點(diǎn)數(shù)分別為每個骰子有六面,點(diǎn)數(shù)分別為1 1、2 2、3 3、4 4、5 5、6 6。游戲者在程序開始時輸入一個無符號整數(shù),作為產(chǎn)生游戲者在程序開始時輸入一個無符號整數(shù),作為產(chǎn)生隨機(jī)數(shù)的種子。隨機(jī)數(shù)的種子。每輪投兩次骰子,第一輪如果和數(shù)為每輪投兩次骰子,第一輪如果和數(shù)為7 7或或1111則為勝,則為勝,游戲結(jié)束;和數(shù)為游戲結(jié)束;和數(shù)為2 2、3 3或或1212則為負(fù),游戲結(jié)束;和數(shù)則為負(fù),游戲結(jié)束;和數(shù)為其它值則將此值作為自己的點(diǎn)數(shù),繼續(xù)第二輪、第為其它值則將此值作為自己的點(diǎn)數(shù),繼續(xù)第二輪、第三輪三輪.直到某輪的和數(shù)等于點(diǎn)數(shù)則取勝,若在此前直到某輪的和數(shù)等于點(diǎn)數(shù)則取勝

19、,若在此前出現(xiàn)和數(shù)為出現(xiàn)和數(shù)為7 7則為負(fù)。則為負(fù)。由由rolldicerolldice函數(shù)負(fù)責(zé)模擬投骰子、計算和數(shù)并輸函數(shù)負(fù)責(zé)模擬投骰子、計算和數(shù)并輸出和數(shù)。出和數(shù)。函數(shù)的聲明與使用lrandrand函數(shù)原型:int rand(void);所需頭文件:功能和返回值:求出并返回一個偽隨機(jī)數(shù)lsrandsrand函數(shù)原型:void srand(unsigned int seed);參數(shù):seed產(chǎn)生隨機(jī)數(shù)的種子。所需頭文件:功能:為使rand()產(chǎn)生一序列偽隨機(jī)整數(shù)而設(shè)置起始點(diǎn)。使用1作為seed參數(shù),可以重新初化rand()。21#include #include #include #incl

20、ude using namespace std;using namespace std;/投骰子、計算和數(shù)、輸出和數(shù)投骰子、計算和數(shù)、輸出和數(shù)int rollDice() int rollDice() int die1 = 1 + rand() % 6;int die1 = 1 + rand() % 6;int die2 = 1 + rand() % 6;int die2 = 1 + rand() % 6;int sum = die1 + die2;int sum = die1 + die2;cout player rolled die1 + cout player rolled die1 +

21、 die2 = sum endl;die2 = sum endl;return sum;return sum; 22enum GameStatus WIN, LOSE, PLAYING ;enum GameStatus WIN, LOSE, PLAYING ;int main() int main() int sum, myPoint;int sum, myPoint;GameStatus status;GameStatus status;unsigned seed; unsigned seed; cout Please enter an unsigned integer: ;cout see

22、d;/cin seed;/輸入隨機(jī)數(shù)種子輸入隨機(jī)數(shù)種子srand(seed);/srand(seed);/將種子傳遞給將種子傳遞給rand()rand()sum = sum = rollDicerollDice(); /(); /第一輪投骰子、計算和數(shù)第一輪投骰子、計算和數(shù)23switch (sum) switch (sum) case 7: /case 7: /如果和數(shù)為如果和數(shù)為7 7或或1111則為勝則為勝, ,狀態(tài)為狀態(tài)為WINWINcase 11:case 11: status = WIN; status = WIN; break; break;case 2: /case 2: /和

23、數(shù)為和數(shù)為2 2、3 3或或1212則為負(fù)則為負(fù), ,狀態(tài)為狀態(tài)為LOSELOSEcase 3: case 3: case 12:case 12: status = LOSE; status = LOSE; break; break;default: /default: /其它情況其它情況, ,游戲尚無結(jié)果游戲尚無結(jié)果, ,狀態(tài)為狀態(tài)為PLAYING,PLAYING,記記下點(diǎn)數(shù)下點(diǎn)數(shù), ,為下一輪做準(zhǔn)備為下一輪做準(zhǔn)備 status = PLAYING;status = PLAYING; myPoint = sum; myPoint = sum; cout point is myPoint en

24、dl; cout point is myPoint endl; break; break; 24while (status = PLAYING) /while (status = PLAYING) /只要狀態(tài)仍為只要狀態(tài)仍為PLAYING,PLAYING,就繼續(xù)就繼續(xù)進(jìn)行下一輪進(jìn)行下一輪 sum = sum = rollDicerollDice();(); if (sum = myPoint) / if (sum = myPoint) /某輪的和數(shù)等于點(diǎn)數(shù)則取勝某輪的和數(shù)等于點(diǎn)數(shù)則取勝 status = WIN; status = WIN; else if (sum = 7) / else i

25、f (sum = 7) /出現(xiàn)和數(shù)為出現(xiàn)和數(shù)為7 7則為負(fù)則為負(fù) status = LOSE; status = LOSE; /當(dāng)狀態(tài)不為當(dāng)狀態(tài)不為PLAYINGPLAYING時上面的循環(huán)結(jié)束時上面的循環(huán)結(jié)束, ,以下程序段輸出游戲結(jié)以下程序段輸出游戲結(jié)果果if (status = WIN)if (status = WIN) cout player wins endl; cout player wins endl;elseelse cout player loses endl; cout player loses endl;return 0;return 0; 25運(yùn)行結(jié)果運(yùn)行結(jié)果2 2:Pl

26、ease enter an unsigned integer:23Please enter an unsigned integer:23player rolled 6 + 3 = 9player rolled 6 + 3 = 9point is 9point is 9player rolled 5 + 4 = 9player rolled 5 + 4 = 9player winsplayer wins26C+語言程序設(shè)計清華大學(xué) 鄭莉27嵌套調(diào)用嵌套調(diào)用函數(shù)的聲明與使用main調(diào)fun1()結(jié)束fun1()調(diào)fun2()返回fun2()返回C+語言程序設(shè)計清華大學(xué) 鄭莉28例例3-6 輸入兩個

27、整數(shù),求平方和。輸入兩個整數(shù),求平方和。#include #include using namespace std;using namespace std;int int fun2fun2(int m) (int m) return m return m * * m; m; int int fun1fun1(int x,int y) (int x,int y) return return fun2fun2(x) + (x) + fun2fun2(y);(y); 函數(shù)的聲明與使用int main() int main() int a, b;int a, b;cout Please enter t

28、wo integers (a cout a b;cin a b;cout The sum of square of a and cout The sum of square of a and b: b: fun1fun1(a, b) endl;(a, b) endl;return 0;return 0; 運(yùn)行結(jié)果:運(yùn)行結(jié)果:Please enter two integers(a and b): 3 4Please enter two integers(a and b): 3 4The sum of square of a and b: 25The sum of square of a and

29、b: 2529C+語言程序設(shè)計清華大學(xué) 鄭莉30遞歸調(diào)用遞歸調(diào)用l函數(shù)直接或間接地調(diào)用自身,稱為遞歸調(diào)用。l遞歸過程的兩個階段:遞推: 4!=43!3!=32!2!=21!1!=10!0!=1未知 已知回歸:4!=43!=243!=32!=62!=21!=21!=10!=10!=1未知未知 已知已知函數(shù)的聲明與使用C+語言程序設(shè)計清華大學(xué) 鄭莉31例例3-8 求求n!分析:計算n!的公式如下:這是一個遞歸形式的公式,應(yīng)該用遞歸函數(shù)實現(xiàn)。函數(shù)的聲明與使用)0()!1()0(1!nnnnn源程序:源程序:#include #include using namespace std;using nam

30、espace std;unsigned unsigned facfac(int n)(int n)unsigned f;unsigned f;if (n = 0)if (n = 0) f = 1; f = 1; else else f = f = facfac(n - 1) (n - 1) * * n; n; return f; return f; 32int main() int main() unsigned n;unsigned n;cout Enter a positive integer:;cout n;cin n;unsigned y = unsigned y = facfac(n

31、);(n);cout n ! = y endl;cout n ! = y endl;return 0;return 0; 運(yùn)行結(jié)果:運(yùn)行結(jié)果:Enter a positive integer:8Enter a positive integer:88! = 403208! = 4032033C+語言程序設(shè)計清華大學(xué) 鄭莉34例例3-9l用遞歸法計算從用遞歸法計算從n n個人中選擇個人中選擇k k個人組個人組成一個委員會的不同組合數(shù)。成一個委員會的不同組合數(shù)。l分析:分析: 由n個人里選k個人的組合數(shù) = 由n-1個人里選k個人的組合數(shù) +由n-1個人里選k-1個人的組合數(shù)當(dāng)n = k或k = 0

32、時,組合數(shù)為1函數(shù)的聲明與使用#include #include using namespace std;using namespace std;int comm(int n, int k) int comm(int n, int k) if (k n)if (k n) return 0; return 0;else if (n = k | k = 0)else if (n = k | k = 0) return 1; return 1;elseelse return comm(n - 1, k) + comm(n - 1, k - 1); return comm(n - 1, k) + co

33、mm(n - 1, k - 1); int main() int main() int n, k;int n, k;cout Please enter two integers n and k: ;cout n k;cin n k;cout C(n, k) = comm(n, k) endl;cout C(n, k) = comm(n, k) endl;return 0;return 0; 運(yùn)行結(jié)果:18 5856835C+語言程序設(shè)計清華大學(xué) 鄭莉36例例3-10漢諾塔問題漢諾塔問題有三根針有三根針A A、B B、C C。A A針上有針上有N N個盤子,大個盤子,大的在下,小的在上,要求把這

34、的在下,小的在上,要求把這N N個盤子從個盤子從A A針針移到移到C C針,在移動過程中可以借助針,在移動過程中可以借助B B針,每次針,每次只允許移動一個盤,且在移動過程中在三根只允許移動一個盤,且在移動過程中在三根針上都保持大盤在下,小盤在上。針上都保持大盤在下,小盤在上。函數(shù)的聲明與使用ABC分析:分析:將將n n 個盤子從個盤子從A A針移到針移到C C針可以分解為下面三個步驟:針可以分解為下面三個步驟:將將A A 上上n-1n-1個盤子移到個盤子移到 B B針上(借助針上(借助C C針)針); ;把把A A針上剩下的一個盤子移到針上剩下的一個盤子移到C C針上針上; ;將將n-1n-

35、1個盤子從個盤子從B B針移到針移到C C針上(借助針上(借助A A針)針); ;事實上,上面三個步驟包含兩種操作:事實上,上面三個步驟包含兩種操作:將多個盤子從一個針移到另一個針上,這是一個遞將多個盤子從一個針移到另一個針上,這是一個遞歸的過程。歸的過程。 hanoihanoi函數(shù)實現(xiàn)。函數(shù)實現(xiàn)。將將1 1個盤子從一個針上移到另一針上。個盤子從一個針上移到另一針上。用用movemove函數(shù)實現(xiàn)。函數(shù)實現(xiàn)。37#include #include using namespace std;using namespace std;/把把srcsrc針的最上面一個盤子移動到針的最上面一個盤子移動到de

36、stdest針上針上void move(char src, char dest) void move(char src, char dest) cout src dest endl;cout src dest endl; /把把n n個盤子從個盤子從srcsrc針移動到針移動到destdest針,以針,以mediummedium針作為中介針作為中介void hanoi(int n, char src, char medium, char dest) void hanoi(int n, char src, char medium, char dest) if (n = 1)if (n = 1)

37、move(src, dest); move(src, dest);else else hanoi(n - 1, src, dest, medium); hanoi(n - 1, src, dest, medium); move(src, dest); move(src, dest); hanoi(n - 1, medium, src, dest); hanoi(n - 1, medium, src, dest); 38int main() int main() int m;int m;cout Enter the number of diskes: ;cout m;cin m;cout the

38、 steps to moving m cout the steps to moving m diskes: endl;diskes: CA - CA - BA - BC - BC - BA - CA - CB - AB - AB - CB - CA - CA - C40C+語言程序設(shè)計清華大學(xué) 鄭莉41函數(shù)的參數(shù)傳遞機(jī)制函數(shù)的參數(shù)傳遞機(jī)制 傳遞參數(shù)值傳遞參數(shù)值/值調(diào)用值調(diào)用l在函數(shù)被調(diào)用時才分配形參的存儲在函數(shù)被調(diào)用時才分配形參的存儲單元。單元。l實參可以是常量、變量或表達(dá)式。實參可以是常量、變量或表達(dá)式。l實參類型必須與形參相符。實參類型必須與形參相符。l傳遞時是傳遞參數(shù)值,即單向傳遞。傳遞

39、時是傳遞參數(shù)值,即單向傳遞。函數(shù)的聲明與使用C+語言程序設(shè)計清華大學(xué) 鄭莉42函數(shù)的參數(shù)傳遞機(jī)制函數(shù)的參數(shù)傳遞機(jī)制 參數(shù)值傳遞舉例參數(shù)值傳遞舉例XN被調(diào)函數(shù):被調(diào)函數(shù):主調(diào)函數(shù):主調(diào)函數(shù):3 3 2.5 2.5AD = power(A,3) 2.5 2.53 3double power(double X,int N)函數(shù)的聲明與使用C+語言程序設(shè)計清華大學(xué) 鄭莉43例例3-11 輸入兩個整數(shù)交換后輸出輸入兩個整數(shù)交換后輸出#include#includeusing namespace std;using namespace std;void void swapswap(int a, int b

40、) (int a, int b) int t = a;int t = a;a = b;a = b;b = t;b = t; 函數(shù)的聲明與使用int main() int main() int x = 5, y = 10;int x = 5, y = 10;cout x = x y = y endl;cout x = x y = y endl;swapswap(x, y);(x, y);cout x = x y = y endl;cout x = x y = y endl;return 0;return 0; 運(yùn)行結(jié)果運(yùn)行結(jié)果: :x = 5 y = 10 x = 5 y = 10 x = 5

41、y = 10 x = 5 y = 1044a=b;5 x10 y5 a10 b執(zhí)行主函數(shù)中的函數(shù)調(diào)用s);s);t=a;5 x10 y5 a10 b5tb=t;5 x10 y10 a5 b5t5 x10 y10 a10 b5t在swap子函數(shù)中返回主函數(shù)以后5x x10y4545C+語言程序設(shè)計清華大學(xué) 鄭莉46函數(shù)的參數(shù)傳遞函數(shù)的參數(shù)傳遞 用引用做形參用引用做形參/引用調(diào)用引用調(diào)用l引用引用(&)(&)是標(biāo)識符的別名是標(biāo)識符的別名, ,例如例如: :int i, j;int &ri = i; /建立一個int型的引用ri,并將其 /初始化為變量i的一個別名j = 10

42、;ri = j;/相當(dāng)于 i = j;l聲明一個引用時,必須同時對它進(jìn)行初始化,聲明一個引用時,必須同時對它進(jìn)行初始化,使它指向一個已存在的對象。使它指向一個已存在的對象。l一旦一個引用被初始化后,就不能改為指向一旦一個引用被初始化后,就不能改為指向其它對象。其它對象。l引用可以作為形參引用可以作為形參void s &a, int &b) .void s &a, int &b) .函數(shù)的聲明與使用C+語言程序設(shè)計清華大學(xué) 鄭莉47例例3-12 輸入兩個整數(shù)交換后輸出輸入兩個整數(shù)交換后輸出#include#includeusing namespace std;us

43、ing namespace std;void void swapswap(int(int& & a, int a, int& & b) b) int t = a;int t = a;a = b;a = b;b = t;b = t; int main() int main() int x = 5, y = 10;int x = 5, y = 10;cout x = x y = y endl;cout x = x y = y endl;swapswap(x, y);(x, y);cout x = x y = y endl;cout x = x y = y endl;

44、return 0;return 0; 函數(shù)的聲明與使用運(yùn)行結(jié)果運(yùn)行結(jié)果: :x = x = 5 5 y = 10 y = 10 x = 10 y = x = 10 y = 5 5t=a;x x5t5x 的引用a ax xy y510y 的引用x 的引用a ab by 的引用x 的引用a ab bx x10y y10a=bb=t;y5t5y 的引用b bx xy y105s);48C+語言程序設(shè)計清華大學(xué) 鄭莉49內(nèi)聯(lián)函數(shù)聲明與使用內(nèi)聯(lián)函數(shù)聲明與使用l聲明時使用關(guān)鍵字聲明時使用關(guān)鍵字 inlineinline。l編譯時在調(diào)用處用函數(shù)體進(jìn)行替換編譯時在調(diào)用處用函數(shù)體進(jìn)行替換, ,節(jié)省了參數(shù)傳遞、控

45、制轉(zhuǎn)移等開銷。節(jié)省了參數(shù)傳遞、控制轉(zhuǎn)移等開銷。l注意:注意:內(nèi)聯(lián)函數(shù)體內(nèi)不能有循環(huán)語句和switch語句。內(nèi)聯(lián)函數(shù)的聲明必須出現(xiàn)在內(nèi)聯(lián)函數(shù)第一次被調(diào)用之前。對內(nèi)聯(lián)函數(shù)不能進(jìn)行異常接口聲明。內(nèi)聯(lián)函數(shù)C+語言程序設(shè)計清華大學(xué) 鄭莉50例例3-14 內(nèi)聯(lián)函數(shù)應(yīng)用舉例內(nèi)聯(lián)函數(shù)應(yīng)用舉例#include #include using namespace std;using namespace std;const double PI = 3.149;const double PI = 3.149;inline double calArea(double radius) inline double calAr

46、ea(double radius) return PI return PI * * radius radius * * radius; radius; int main() int main() double r = 3.0;double r = 3.0;double areadouble area= calArea(r);= calArea(r);cout area endl;cout area endl;return 0;return 0; 內(nèi)聯(lián)函數(shù)C+語言程序設(shè)計清華大學(xué) 鄭莉51缺省形參值的作用缺省形參值的作用l函數(shù)在聲明時可以預(yù)先給出缺省的形參值,函數(shù)在聲明時可以預(yù)先給出缺省的形參值

47、,調(diào)用時如給出實參,則采用實參值,否則采調(diào)用時如給出實參,則采用實參值,否則采用預(yù)先給出的缺省形參值。用預(yù)先給出的缺省形參值。l例如:例如:int add(int x = 5,int y = 6) return x + y;int main() add(10,20);/10+20add(10); /10+6add(); /5+6帶缺省形參值的函數(shù)C+語言程序設(shè)計清華大學(xué) 鄭莉52缺省形參值的說明次序缺省形參值的說明次序l有缺省參數(shù)的形參必須在形參列表的最后,有缺省參數(shù)的形參必須在形參列表的最后,也就是說缺省形參值的右面不能有無缺省也就是說缺省形參值的右面不能有無缺省值的參數(shù)。因為調(diào)用時實參與形

48、參的結(jié)合值的參數(shù)。因為調(diào)用時實參與形參的結(jié)合是從左向右的順序。是從左向右的順序。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);/錯誤帶缺省形參值的函數(shù)C+語言程序設(shè)計清華大學(xué) 鄭莉53缺省形參值與函數(shù)的調(diào)用位置缺省形參值與函數(shù)的調(diào)用位置l如果一個函數(shù)有原型聲明,且原型聲明在定義之前,則缺如果一個函數(shù)有原型聲明,且原型聲明在定義之前,則缺省形參值必須在函數(shù)原型聲明中給出;而如果只有函數(shù)的省形參值必須在

49、函數(shù)原型聲明中給出;而如果只有函數(shù)的定義,或函數(shù)定義在前,則缺省形參值需在函數(shù)定義中給定義,或函數(shù)定義在前,則缺省形參值需在函數(shù)定義中給出。出。l例:例:int add(int x = 5,int y = 6);/原型聲明在前int main() add(); int add(int x,int y) /此處不能再指定缺省值 return x + y;int add(int x = 5,int y = 6) /只有定義,沒有原型聲明 return x + y;int main() add();帶缺省形參值的函數(shù)C+語言程序設(shè)計清華大學(xué) 鄭莉54重載函數(shù)的聲明重載函數(shù)的聲明lC+C+允許功能相近

50、的函數(shù)在相同的作用域內(nèi)以允許功能相近的函數(shù)在相同的作用域內(nèi)以相同函數(shù)名聲明,從而形成重載。方便使用,相同函數(shù)名聲明,從而形成重載。方便使用,便于記憶。便于記憶。l例:例:形參類型不同int add(int x, int y);float add(float x, float y);形參個數(shù)不同int add(int x, int y);int add(int x, int y, int z); 函 數(shù) 重 載C+語言程序設(shè)計清華大學(xué) 鄭莉55注意事項注意事項 不要將不同功能的函數(shù)聲明為重載函數(shù),以免出現(xiàn)調(diào)用結(jié)果的誤解、混淆。這樣不好:int add(int x,int y);int add(i

51、nt a,int b);編譯器不以形參名來區(qū)分int add(int x,int y);void add(int x,int y);編譯器不以返回值來區(qū)分int add(int x, int y) return x + + y; float add(float x,float y) return x - - y; 函 數(shù) 重 載重載函數(shù)的形參必須不同:個數(shù)不同或類型不同。編譯程序?qū)⒏鶕?jù)實參和形參的類型及個數(shù)的最佳匹配來選擇調(diào)用哪一個函數(shù)。C+語言程序設(shè)計清華大學(xué) 鄭莉56例例3-16重載函數(shù)應(yīng)用舉例重載函數(shù)應(yīng)用舉例編寫兩個名為編寫兩個名為sumOfSquaresumOfSquare的重載函數(shù),

52、分別求的重載函數(shù),分別求兩整數(shù)的平方和及兩實數(shù)的平方和。兩整數(shù)的平方和及兩實數(shù)的平方和。#include #include using namespace std;using namespace std;int sumOfSquare(int a, int b)int sumOfSquare(int a, int b) return a return a * * a + b a + b * * b; b; double sumOfSquare(double a, double b)double sumOfSquare(double a, double b) return a return a

53、* * a + b a + b * * b; b; 函 數(shù) 重 載int main() int main() int m, n;int m, n;cout Enter two integer: ;cout m n;cin m n;cout Their sum of square: sumOfSquare(m, n) cout Their sum of square: sumOfSquare(m, n) endl; endl;double x, y;double x, y;cout Enter two real number: ;cout x y;cin x y;cout Their sum o

54、f square: sumOfSquare(x, y) cout Their sum of square: sumOfSquare(x, y) endl; endl;return 0;return 0; 57運(yùn)行結(jié)果:運(yùn)行結(jié)果:Enter two integer: 3 5Enter two integer: 3 5Their sum of square: 34Their sum of square: 34Enter two real number: 2.3 5.8Enter two real number: 2.3 5.8Their sum of square: 38.93Their sum

55、of square: 38.9358C+語言程序設(shè)計清華大學(xué) 鄭莉59C+系統(tǒng)函數(shù)系統(tǒng)函數(shù)lC+的系統(tǒng)庫中提供了幾百個函數(shù)可的系統(tǒng)庫中提供了幾百個函數(shù)可供程序員使用。供程序員使用。例如:求平方根函數(shù)(sprt)、求絕對值函數(shù)(abs)等。l使用系統(tǒng)函數(shù)時要包含相應(yīng)的頭文件。使用系統(tǒng)函數(shù)時要包含相應(yīng)的頭文件。例如:cmath 或 math.h使用C+系統(tǒng)函數(shù)C+語言程序設(shè)計清華大學(xué) 鄭莉60例例3-17系統(tǒng)函數(shù)應(yīng)用舉例系統(tǒng)函數(shù)應(yīng)用舉例l題目:題目:從鍵盤輸入一個角度值,求出該角度的正弦值、余弦值和正切值。l分析:分析:系統(tǒng)函數(shù)中提供了求正弦值、余弦值和正切值的函數(shù):sin()、cos()、tan

56、(),函數(shù)的說明在頭文件cmath中。使用C+系統(tǒng)函數(shù)#include #include #include #include using namespace std;using namespace std;const double PI = 3.149;const double PI = 3.149;int main() int main() double angle;double angle;cout Please enter an angle: ;cout angle;cin angle;/輸入角度值輸入角度值double radian = angle double radian = an

57、gle * * PI / 180; PI / 180;/轉(zhuǎn)化為弧度值轉(zhuǎn)化為弧度值cout sin( angle ) = sin(radian) cout sin( angle ) = sin(radian) endl;endl;cout cos( angle ) = cos(radian) cout cos( angle ) = cos(radian) endl;endl;cout tan( angle ) = tan(radian) cout tan( angle ) = tan(radian) endl; Visual Studio - Visual C+ - Reference - Libraries Reference -Run-Time Library - Run-Time Routines by Category 使用C+系統(tǒng)

溫馨提示

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

最新文檔

評論

0/150

提交評論