3變量的作用域和存儲方式_第1頁
3變量的作用域和存儲方式_第2頁
3變量的作用域和存儲方式_第3頁
3變量的作用域和存儲方式_第4頁
3變量的作用域和存儲方式_第5頁
免費預覽已結(jié)束,剩余51頁可下載查看

下載本文檔

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

文檔簡介

1、第三章 函數(shù)函數(shù)函數(shù)定義函數(shù)調(diào)用函數(shù)模板變量的作用域和存儲方式隨機函數(shù)函數(shù)重載函數(shù)的分類函數(shù)的定義返回類型 函數(shù)名(數(shù)據(jù)類型1 參數(shù)1,數(shù)據(jù)類型2 參數(shù)2,) (函數(shù)變量定義);(函數(shù)功能實現(xiàn));(函數(shù)返回值);函數(shù)不允許嵌套定義,即不允許一個函數(shù)的定義放在另一個函數(shù)的定義中。函數(shù)體函數(shù)頭例3-1 無參函數(shù)實例#include using namespace std;void hello()cout ”Hello,Lets study the C+ language. n”;這不是完整的代碼無返回值函數(shù)不需要在函數(shù)體中寫return語句函數(shù)體定義函數(shù)頭,函數(shù)名為hello,無參數(shù),無返回值。例

2、3-2 有參函數(shù)實例求1 + 2 + 3 + + n的和int mysum(int n)int i, s = 0;for(i = 1; i y) return x;else return y;在一個函數(shù)中允許有多個return語句,但每次調(diào)用只能有一個return 語句被執(zhí)行,即只能返回一個函數(shù)值。定義函數(shù)max()若x大于y,返回值為x,否則返回值為y錯誤的函數(shù)定義int f(int a, int b=0, int c)修改:int f(int a, int b=0, int c=0)函數(shù)原型的聲明函數(shù)使用前需要先聲明。聲明函數(shù)原型的形式與定義函數(shù)頭基本相同,但函數(shù)原型聲明是一條語句,要以分

3、號結(jié)尾,而函數(shù)定義中的函數(shù)頭末尾是沒有分號的。返回類型 函數(shù)名(數(shù)據(jù)類型1 參數(shù)1, 數(shù)據(jù)類型2 參數(shù)2, );void hello( );int mysum(int n);在實際使用函數(shù)時,如果函數(shù)定義在先,函數(shù)調(diào)用在后,調(diào)用前可以不必聲明。函數(shù)函數(shù)定義函數(shù)調(diào)用函數(shù)模板變量的作用域和存儲方式隨機函數(shù)函數(shù)重載函數(shù)調(diào)用的語法形式函數(shù)調(diào)用中的實參不需要加數(shù)據(jù)類型實參的個數(shù)、類型、順序要和函數(shù)定義時的形參一一對應。函數(shù)名(實際參數(shù)1, 實際參數(shù)2, , 實際參數(shù)n);main()函數(shù)C+程序的運行總是從main()開始,main()函數(shù)又稱之為主函數(shù),它可以調(diào)用任何其他的函數(shù),但不允許被其他函數(shù)調(diào)用

4、。除了main()函數(shù)以外,其它任何函數(shù)的關(guān)系都是平等的,可以相互調(diào)用。例3-4#include using namespace std;int max(int x, int y);void main() int a, b, m; cout a b; m = max(a, b); cout “a,b 二個數(shù)中的較大數(shù)為:” m y) s = x; else s = y; return s; 調(diào)用max( )函數(shù)語句main( )函數(shù)定義max( )函數(shù)聲明函數(shù)max( ),函數(shù)必須“先聲明,后調(diào)用”例3-4#includeusing namespace std;int max(int x, i

5、nt y);void main() int a,b; coutab; m=max(a, b); cout“a,b二個數(shù)中的較大者為:”my) s=x; else s=y; return s;程序總是從主函數(shù)開始執(zhí)行4 64 6 程序的入口點調(diào)用之前a4b6cinaba4b6調(diào)用開始實參形參xy46開辟a4b6調(diào)用期間實參形參xy46s=xy?x:y;a4b6調(diào)用完畢實參形參xy46釋放m=max(a, b);函數(shù)調(diào)用的過程以例3-4為例:函數(shù)調(diào)用,并把實參的值傳遞給形參執(zhí)行被調(diào)用函數(shù)max()的函數(shù)體,形參用所獲得的數(shù)值進行運算通過return語句將被調(diào)用函數(shù)的運算結(jié)果輸出給主調(diào)函數(shù)返回到主調(diào)

6、函數(shù)的函數(shù)調(diào)用表達式位置,繼續(xù)后續(xù)語句的執(zhí)行函數(shù)的調(diào)用過程函數(shù)參數(shù)的傳值調(diào)用在C+語言中,調(diào)用有參函數(shù)時,是通過實參向形參傳值的,按調(diào)用方式可分為傳值調(diào)用和引用調(diào)用。函數(shù)參數(shù)按值依次傳遞實參到形參的傳遞過程#include using namespace std;void swap(int a, int b) int temp; temp=a; a=b; b=temp;void main() int x=5,y=6; couta與b交換之前; coutx=xy=yendl; swap(x,y); couta與b交換之后; coutx=xy=yendl;調(diào)用:56a:b:56x:y:swap:5

7、6x:y:65a:b:temp例3-5 交換兩個數(shù)程序入口點56x:y:調(diào)用前:調(diào)用結(jié)束:56x:y:不能實現(xiàn)交換函數(shù)參數(shù)的引用調(diào)用1、引用的概念引用是已存在的變量的一個別名,對引用型變量的操作實際上就是對被引用變量的操作。定義一個引用型變量的語法形式如下:數(shù)據(jù)類型&引用變量名 = 被引用變量名;例如: int a; int &ra = a; 定義引用變量ra,它是變量a的引用,a是被引用變量說明:&是引用運算符,注意與后面章節(jié)中的指針取址運算符區(qū)別。引用變量的數(shù)據(jù)類型應與被引用變量的類型相同。聲明引用時,必須同時對其進行初始化。引用聲明完畢后,相當于被引用變量名有兩個名稱,ra相當于a的別名

8、。對ra的任何操作就是對a的操作。不能再把該引用名作為其他變量名的別名。 聲明一個引用,不是新定義了一個變量,它不占存儲單元,系統(tǒng)也不給引用分配存儲單元。引用運算符&僅在說明一個引用型變量時使用,引用型變量被說明之后,就不能再帶&,只需直接使用其變量名。#include using namespace std;void swap(int &a, int &b) int temp;temp=a; a=b; b=temp;void main() int x=5,y=6; couta與b交換之前; coutx=xy=yendl; swap(x,y); couta與b交換之后; coutx=xy=ye

9、ndl;例3-7 如何實現(xiàn)實參x, y的交換?xint &a=x;a說明:&-引用運算符聲明引用時必須同時對其進行初始化;聲明一個引用不占內(nèi)存單元;引用型變量在使用時直接使用其變量名。#include using namespace std;void swap(int &a, int &b) int temp; temp=a; a=b; b=temp;void main() int x=5,y=6; couta與b交換之前; countx=xy=yendl; swap(x,y); couta與b交換之后; countx=xy=yendl;程序入口點x56y調(diào)前:x65y返回:x56y調(diào)用:ab

10、x711y調(diào)用中:abtemp65int &a=x;int &b=y;函數(shù)調(diào)用中參數(shù)傳遞以簡單變量作為形參以引用變量作為形參通過引用形參的方式可以返回多于一個的計算結(jié)果單向的“數(shù)值傳遞”形參的變化影響實參的變化函數(shù)的嵌套調(diào)用 嵌套調(diào)用C+規(guī)定:函數(shù)定義不可嵌套,但可以嵌套調(diào)用函數(shù)求1 ! +2 ! +3 ! +n!的值#include using namespace std;long add(int n); long f(int i);void main() int n; long sum;coutn;sum=add(n);cout1!+2!+3!+n!=sum;long add(int n)

11、 int i; long s=0;for(i=1;i=n;i+)s=s+f(i);return s;long f(int i) int j; long fac=1;for(j=1;j=i;j+)fac=fac*j;return fac;函數(shù)的遞歸調(diào)用C+ 語言允許被調(diào)函數(shù)調(diào)用該函數(shù)自身,這樣的嵌套調(diào)用稱為函數(shù)的遞歸調(diào)用。f( )調(diào)f調(diào)f2調(diào)f1f1( )f2( )int f(int x) int y,z; z=f(y); . return(2*z);int f1(int x) int y,z; z=f2(y); . return(2*z);int f2(int t) int a,c; c=f1

12、(a); . return(3+c);【例3-11】用遞歸的方法求斐波那契數(shù)列的第n項。斐波那契數(shù)列第1項和第2項都是1,后面每一項都是前兩項之和,即 1,1, 2,3,5,8, 13,。 求斐波那契數(shù)列第n項的公式為:例如,n = 6 時計算斐波那契數(shù)列的遞歸過程如下:f(6) = f(5) + f(4)f(5) = f(4) + f(3)f(4) = f(3) + f(2)f(3) = f(2) + f(1)f(2) = 1f(1) = 1按上述相應的過程回溯計算,就得到n = 6 時的斐波那契數(shù)列:f(1) = 1f(2) = 1f(3) = f(2) + f(1) = 1 + 1 =

13、2f(4) = f(3) + f(2) = 2 + 1 = 3f(5) = f(4) + f(3) = 3 + 2 = 5f(6) = f(5) + f(4) = 5 + 3 = 8 #include using namespace std; long f(int n); void main( ) int n = 0; long x = 0; cout 請輸入正整數(shù) n : n; x = f(n); cout n = n , f(n) = x endl; long f(int n) long x = 0; if(n = 1 | n = 2) x = 1; else x = f(n - 1) +

14、 f( n - 2); return x; 遞歸函數(shù)終止條件調(diào)用函數(shù)自身函數(shù)函數(shù)定義函數(shù)調(diào)用函數(shù)模板變量的作用域和存儲方式隨機函數(shù)函數(shù)重載函數(shù)模板c+語言的一個特性實現(xiàn)代碼的重用,減少程序設(shè)計人員的重復勞動int sum(int a, int b) return a+b;double sum(double a, double b) return a+b;T sum(T a, T b) return a+b;函數(shù)模板的定義template 返回類型 函數(shù)名(形參表) 函數(shù)體語句;template void swap(T a, T b) T temp; temp=a;a=b;b=temp;temp

15、late T1 swap(T1 a, T2 b, T3 c) /函數(shù)體模板函數(shù)函數(shù)模板是對于一組函數(shù)的描述不產(chǎn)生可執(zhí)行代碼模板函數(shù)是某個函數(shù)模板的一個具體實例#include using namespace std;templateT1 add(T1 a, T2 b) return a+b;void main() int x=5;float y=-3.1f;double z=8.5;char ch=a; coutadd(x,x)=add(x,x)endl; coutadd(y,x)=add(y,x)endl; coutadd(z,x)=add(z,x)endl; coutadd(y,y)=ad

16、d(y,y)endl; coutadd(ch,x)=add(ch,x)endl;定義一個函數(shù)模板定義了兩個類型參數(shù)T1,T2add(x,x)=10add(y,x)=1.9add(z,x)=13.5add(y,y)=-6.2add(ch,x)=f函數(shù)函數(shù)定義函數(shù)調(diào)用函數(shù)模板變量的作用域和存儲方式隨機函數(shù)函數(shù)重載變量的作用域變量按在程序中所處不同位置分為兩類:局部變量和全局變量。如果一個變量定義在函數(shù)內(nèi)部或者復合語句內(nèi)部,該變量稱之為局部變量。如果一個變量定義在所有函數(shù)外面,則該變量稱之為全局變量。局部變量和全局變量的作用范圍如圖所示。例3-13#include using namespace s

17、td;int Max=0; Min=0;int fnc1(int x, int y) Max=x; if(yx) Max=y; return Max;int fnc2(int i, int j) Min=i; if(jab; Max=fnc1(a,b); Min=fnc2(a,b); cout“max”=Maxendl; cout“min”=Minendl;Max, Min全局變量,作用域整個源程序文件x, y局部變量,作用域:fnc1函數(shù)i, j局部變量,作用域:fnc2函數(shù)a, b局部變量,作用域:main函數(shù)變量的存儲方式靜態(tài)存儲方式:變量存儲空間保持到程序結(jié)束全局變量(定義在所有函數(shù)之

18、外)靜態(tài)局部變量(如static int i;)動態(tài)存儲方式:變量存儲空間保持到使用完畢動態(tài)局部變量(如auto int i; 或int i;)【例3-14】動態(tài)局部變量和 靜態(tài)局部變量舉例 #include using namespace std; int myfun(); main() int i=0,a=0; for(i=1;i=2;i+) a=myfun(); coutaendl; int myfun() auto int x=1; static int y=1; x=x+2; y=y+2; return x+y; 程序運行結(jié)果為:68外部變量定義一個外部變量的一般格式為: exter

19、n 變量類型 外部變量名;聲明一個變量為外部變量,其實質(zhì)是引用其他程序中的同名全局變量,故其他程序中的同名全局變量的值將成為外部變量的初值,外部變量的運算結(jié)果將被其他程序作為同名全局變量的新值。圖3.9 調(diào)用外部變量(1)file2.cppextern int s;void f2() s=0; for(int i=1;i=100;i+) s=s+i;(2)file1.cpp#includeusing namespace std;void f2();int s=10;void main() f2(); couts=sendl;外部變量的聲明:聲明該變量是在外部定義過的一個全局變量外部變量的定義【

20、例3-15】外部變量的應用示例。設(shè)在程序文件file2.cpp中將其全局變量s設(shè)置為外部變量,s = 1 + 2 + + 100,由文件file1.cpp調(diào)用該變量的運算結(jié)果。調(diào)用外部函數(shù)f2( ),其外部變量s的運算結(jié)果改變了本程序全局變量s的值輸出:s=5050函數(shù)函數(shù)定義函數(shù)調(diào)用函數(shù)模板變量的作用域和存儲方式隨機函數(shù)函數(shù)重載隨機函數(shù)rand(): 產(chǎn)生032767之間的一個偽隨機整數(shù);根據(jù)一個數(shù)(我們可以稱它為種子)為基準以某個遞推公式推算出來的一系數(shù) srand(): 初始化rand()函數(shù)的初始值,即指定不同的種子time(): 時間來作為隨機數(shù)生成器rand()的種子, time的

21、值每時每刻都不同,所以種子不同,所以產(chǎn)生的隨機數(shù)也不同。#include#include#includeusing namespace std;void main() int a,b,c; srand(time(0); a=rand(); b=rand(); c=rand(); couta=a; couttb=b; couttc=cendl;#include#include#includeusing namespace std;void main() int a,b,c; int N=100; srand(time(0); a=rand()%100+1; b=rand()%100+1; c=rand()%100+1; couta=a; couttb=b; couttc=cendl;產(chǎn)生隨機數(shù)的范圍11

溫馨提示

  • 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

提交評論