函數(shù)及變量的作用域課件_第1頁
函數(shù)及變量的作用域課件_第2頁
函數(shù)及變量的作用域課件_第3頁
函數(shù)及變量的作用域課件_第4頁
函數(shù)及變量的作用域課件_第5頁
已閱讀5頁,還剩59頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、第四講函數(shù)及變量的作用域第1頁,共64頁。函數(shù)的定義和說明函數(shù)的調(diào)用函數(shù)的參數(shù)內(nèi)聯(lián)函數(shù)函數(shù)重載函數(shù)的嵌套調(diào)用和遞歸調(diào)用作用域C+的系統(tǒng)函數(shù)主要內(nèi)容第2頁,共64頁。4.1 函數(shù)的定義和說明函數(shù)的定義格式函數(shù)的說明方法第3頁,共64頁。一個(gè)C+函數(shù)由函數(shù)頭與函數(shù)體兩部分組成。形式如下:函數(shù)類型 函數(shù)名(形式參數(shù)類型 形式參數(shù)名,) 函數(shù)體 如: int fun1(char c,float f) int m=1; m+=c+f; return m; 函數(shù)的定義格式即函數(shù)返回值的類型。無返回值為void類型語句序列。描述了實(shí)現(xiàn)功能的過程,并一般要最后執(zhí)行一條return語句??砂鄠€(gè)形式參數(shù)。定義

2、了函數(shù)將從調(diào)用函數(shù)中接收多少個(gè)數(shù)據(jù)及其類型第4頁,共64頁。返回語句的形式為: return 表達(dá)式;這時(shí)表達(dá)式的結(jié)果就是函數(shù)的返回值,也稱函數(shù)值。即返回的不是函數(shù)本身,而是一個(gè)值。若函數(shù)所執(zhí)行的功能不需要返回?cái)?shù)據(jù),則可缺省 return語句。如: void spc (int n) for (int I=0; In; I+) cout*; 注意:函數(shù)類型為void,若無默認(rèn)為int。 C+不允許函數(shù)定義嵌套。 第5頁,共64頁。函數(shù)的說明方法其形式為:函數(shù)類型函數(shù)名(參數(shù)類型表);如: int absolute_value ( int ,double);要求在調(diào)用函數(shù)前讓編譯器知道其函數(shù)原型,

3、以便編譯器利用函數(shù)原型提供的信息來檢查調(diào)用的合法性,強(qiáng)制參數(shù)為適當(dāng)類型,保證參數(shù)的正確傳遞。而編譯器獲得函數(shù)原型有兩種情況:()當(dāng)函數(shù)定義在調(diào)用之前時(shí),則從定義中抽取函數(shù)原型。()當(dāng)函數(shù)定義在調(diào)用之后時(shí),則程序員須在調(diào)用之前用函數(shù)原型對(duì)函數(shù)進(jìn)行聲明,讓編譯器獲得函數(shù)原型。即所有參數(shù)的數(shù)據(jù)類型第6頁,共64頁。對(duì)于標(biāo)準(zhǔn)庫函數(shù)的函數(shù)原型都在頭文件中提供了,程序可用#include命令包含進(jìn)來即可;注意:函數(shù)原型和函數(shù)定義在返回類型、函數(shù)名和參數(shù)表上必須完全一致,否則編譯錯(cuò)誤。注 意第7頁,共64頁。#include void f1 ( ) ; /函數(shù)說明void f2 ( ) ;void main

4、( ) f1( ); /函數(shù)調(diào)用 f2( ); void f1( ) /函數(shù)定義 cout Function f1.n;f2( );void f2( ) cout Function f2 .n;main()f1()f2()第8頁,共64頁。第9頁,共64頁。4.2 函數(shù)的調(diào)用函數(shù)的值和類型函數(shù)的傳值調(diào)用函數(shù)的引用調(diào)用第10頁,共64頁。函數(shù)的值和類型函數(shù)調(diào)用通過調(diào)用表達(dá)式進(jìn)行。表達(dá)式形式為:函數(shù)名(實(shí)參表列)函數(shù)調(diào)用過程是:為形參及函數(shù)體中的變量分配存儲(chǔ)空間;用實(shí)參向形參傳遞數(shù)據(jù);中斷現(xiàn)行(調(diào)用)函數(shù),將控制轉(zhuǎn)交給被調(diào)用函數(shù)執(zhí)行。函數(shù)調(diào)用后的返回過程是:先計(jì)算出返回語句中的值若表達(dá)式值的類型與

5、函數(shù)類型不一致,則強(qiáng)制轉(zhuǎn)換。將計(jì)算出的表達(dá)式值返回給調(diào)用函數(shù)作為返回值。將控制由被調(diào)用函數(shù)轉(zhuǎn)向調(diào)用函數(shù),執(zhí)行后面的語句。第11頁,共64頁。如: #include int lmax(int,int); /函數(shù)聲明 void main( ) int limit=32; char ch=A; long mval; mval=lmax(limit,ch); /調(diào)用表達(dá)式 coutmvalb?a:b); 實(shí)參的個(gè)數(shù)、類型及順序要與形參保持一致形式參數(shù)實(shí)際參數(shù)第12頁,共64頁。說明:(1)實(shí)參在進(jìn)行函數(shù)調(diào)用時(shí),必須具有確定的值,以便把這些值傳送給形參。(2)形參變量只有在被調(diào)用時(shí),才分配內(nèi)存單元;調(diào)用

6、結(jié)束時(shí),即刻釋放所分配的內(nèi)存單元。因此,形參只有在該函數(shù)內(nèi)有效。調(diào)用結(jié)束,返回調(diào)用函數(shù)后,則不能再使用該形參變量。(3)實(shí)參對(duì)形參的數(shù)據(jù)傳送是單向的,即只能把實(shí)參的值傳送給形參,而不能把形參的值反向地傳送給實(shí)參。(4)實(shí)參和形參占用不同的內(nèi)存單元,即使同名也互不影響。第13頁,共64頁。函數(shù)的傳值調(diào)用C+中變量值有兩種:變量本身值和變量地址值。而形參的類型也就分為兩種:一般類型和指針類型。則傳值調(diào)用的方式也有兩種:傳值調(diào)用和傳址調(diào)用有時(shí)也稱:直接調(diào)用與間接調(diào)用1、傳值調(diào)用的實(shí)現(xiàn)機(jī)制和特點(diǎn)實(shí)現(xiàn)機(jī)制是:調(diào)用函數(shù)中的數(shù)據(jù)只是在調(diào)用之初通過實(shí)參向形參傳遞,之后各占有不同的空間,并且不再發(fā)生聯(lián)系,互不干

7、擾。特點(diǎn)是:形參值的改變不影響實(shí)參。實(shí)參本身的值在調(diào)用前后和調(diào)用過程中都不發(fā)生變化。第14頁,共64頁。函數(shù)swap本想實(shí)現(xiàn)交換a和b值的功能,但調(diào)用結(jié)果卻不如意。原因就在于這種調(diào)用是一種值調(diào)用。例:#include void swap(int,int); void main( ) int a=3,b=5; coutbefore swap :a=a,b=bendl; swap(a,b); coutafter swap :a=a,b=bendl; void swap(int a,int b) int temp; temp=a; a=b; b=temp; coutin swap :a=a,b=be

8、ndl; 第15頁,共64頁。調(diào)用swap時(shí),內(nèi)存單元分配情況:353ababtemp 實(shí)參 形參3535實(shí)參形參35過程調(diào)用中35過程調(diào)用后temp=a; a=b; b=temp;第16頁,共64頁。實(shí)現(xiàn)機(jī)制是:實(shí)參為某變量地址值,形參為指針類型。在調(diào)用時(shí),將地址值賦給形參,使形參指針指向該變量。則以后可直接通過形參指針來訪問該變量。特點(diǎn)是:可通過改變形參所指向的變量值來影響實(shí)參所對(duì)應(yīng)的變量值。 2、傳址調(diào)用的實(shí)現(xiàn)機(jī)制和特點(diǎn)第17頁,共64頁。函數(shù)swap實(shí)現(xiàn)了交換a和b值的功能。原因就在于這種調(diào)用是一種傳址調(diào)用。例:#include void swap(int *,int *); void

9、 main( ) int a=3,b=5; coutbefore swap :a=a,b=bendl; swap(&a,&b); /實(shí)參為變量地址 coutafter swap :a=a,b=bendl; void swap(int * a,int *b) /形參為指針類型 int temp; temp=*a; *a=*b; *b=temp; /注意引用方式 coutin swap :a=a,b=bendl; 第18頁,共64頁。調(diào)用swap時(shí),內(nèi)存單元分配情況:35353過程調(diào)用后 形參ababtemp 實(shí)參3510012008實(shí)參形參2008100120081001過程調(diào)用中35temp=

10、*a; *a=*b; *b=temp;第19頁,共64頁。函數(shù)的引用調(diào)用使用引用作為函數(shù)形參時(shí),調(diào)用函數(shù)的實(shí)參要用變量名。將實(shí)參變量名賦給形參的引用,則在被調(diào)函數(shù)中,對(duì)引用的操作,實(shí)質(zhì)就是直接通過引用來操作實(shí)參的變量值。顯然,引用傳遞方式具有傳址調(diào)用的效果,又有傳值調(diào)用的語法簡單性和可讀性。注意:若只從調(diào)用語句觀察,是無法區(qū)別采用的是傳值調(diào)用還是引用調(diào)用。第20頁,共64頁。函數(shù)swap實(shí)現(xiàn)了交換a和b值的功能。這里調(diào)用是采用了引用調(diào)用。例:#include void swap(int &,int &); void main( ) int a=3,b=5; coutbefore swap :a

11、=a,b=bendl; swap(a,b); /實(shí)參為變量名 coutafter swap :a=a,b=bendl; void swap(int & a,int &b) /形參為引用類型 int temp; temp=a; a=b; b=temp; /注意區(qū)別 coutin swap :a=a,b=bendl; 第21頁,共64頁。調(diào)用swap時(shí),內(nèi)存單元分配情況:35353過程調(diào)用后 形參ababtemp 實(shí)參35實(shí)參形參20081001過程調(diào)用中35temp=a; a=b; b=temp;第22頁,共64頁。4.3 函數(shù)的參數(shù)函數(shù)參數(shù)的求值順序設(shè)置函數(shù)參數(shù)的默認(rèn)值使用數(shù)組作函數(shù)參數(shù)第23

12、頁,共64頁。函數(shù)參數(shù)的求值順序由于使用不同求值順序的編譯器而造成二義性。 #include int add(int x,int y); /函數(shù)聲明 void main( ) int a=4,b=6; int z=add(+a,a+b); /從左至右為5 11 coutzendl; /從右至左為5 10 int add(int x,int y) /函數(shù)定義(實(shí)現(xiàn)) return x+y; 第24頁,共64頁。設(shè)置函數(shù)參數(shù)的默認(rèn)值在函數(shù)說明語句中預(yù)先初始化一些參數(shù)的值,從而使調(diào)用語句中相應(yīng)的參數(shù)可以缺省。如: int max(int, int, int=-32768);則在函數(shù)調(diào)用時(shí)可以不給最后

13、一個(gè)參數(shù)傳遞值,而采用缺省值。如: max(i1,i2); / 參數(shù)缺省調(diào)用 max(i1,i2,i3); /正常調(diào)用允許函數(shù)默認(rèn)參數(shù)值,是為了讓編程簡單。設(shè)置函數(shù)參數(shù)的默認(rèn)值是按從右至左的方式當(dāng)又有聲明又有定義時(shí),定義中不允許默認(rèn)參數(shù)。若只有定義,則默認(rèn)參數(shù)才可出現(xiàn)在函數(shù)定義中。第25頁,共64頁。注意:若一個(gè)函數(shù)中有多個(gè)默認(rèn)參數(shù),則參數(shù)缺省按從后向前的順序進(jìn)行,如:void fun(int a=3,int,char c=a); /error 當(dāng)調(diào)用函數(shù)時(shí),也只能從右向左匹配參數(shù)。如:聲明函數(shù)為:void func(int a,int b=2,int c=3,int d=5);則調(diào)用方法:f

14、unc(2,15, ,3); / error第26頁,共64頁。使用數(shù)組作函數(shù)參數(shù)1、形參和實(shí)參都用數(shù)組 這種調(diào)用的機(jī)制是:形參和實(shí)參共用內(nèi)存中的同一個(gè)數(shù)組空間。因此,在被調(diào)用函數(shù)中改變了數(shù)組中某個(gè)元素的值,對(duì)調(diào)用函數(shù)該數(shù)組的該元素值也被改變,因?yàn)槭枪灿猛粋€(gè)數(shù)組。#include int a8=1,3,5,7,9,11,13;void fun(int b ,int n) for (int I=0;In-1;I+) b7+=bI;void main( ) int m=8; fun(a,m); couta7endl; 第27頁,共64頁。#include void invert(char b,i

15、nt n);void main() char s60; int n; couts; cout字符串原始順序:sendl; n=strlen(s); invert(s,n); cout字符串反轉(zhuǎn)后的順序:sendl;void invert(char b,int n) for(int i=0;in/2;i+) char c=bi; bi=bn-1-i; bn-1-i=c; S0S1S2S3S4輸入一字符串個(gè)數(shù),反序存放并輸出不能寫成invert(sn,n)有問題嗎?第28頁,共64頁。2、形參和實(shí)參都用對(duì)應(yīng)數(shù)組的指針實(shí)際,也可一個(gè)使用指針,另一個(gè)使用數(shù)組。在使用指針時(shí),可以直接用數(shù)組名,也可用另外

16、定義的指向數(shù)組的指針。#include int a8=1,3,5,7,9,11,13;void fun(int *pa,int n) /函數(shù)聲明與定義 for (int I=0;In-1;I+) *(pa+7)+=*(pa+I); void main( ) int m=8; fun(a,m); couta7endl; 第29頁,共64頁。#include void invert(char *b,int n);void main() char s60; int n;/char *p=s; couts; cout字符串原始順序:sendl; n=strlen(s); invert(s,n);/ i

17、nvert(p,n); cout字符串反轉(zhuǎn)后的順序:sendl;void invert(char *b,int n) for(int i=0;in/2;i+) char c=*(b+i); *(b+i)=*(b+n-1-i); *(b+n-1-i)=c; 輸入一字符串個(gè)數(shù),反序存放并輸出第30頁,共64頁。3、形參用引用實(shí)參用數(shù)組名其中要先用類型定義語句定義一個(gè)int型的數(shù)組類型。typedef int aref8;/類型定義int a8=1,3,5,7,9,11,13;void fun(aref &b,int n) for (int I=0;In-1;I+) b7+=bI; void mai

18、n( ) int m=8; fun(a,m); couta7endl; 第31頁,共64頁。#include typedef char arr60; /先用類型定義一個(gè)char型的數(shù)組類型void invert(arr &b,int n);void main() char s60; int n,*p=s; coutp; cout字符串原始順序:sendl; n=strlen(s); invert(s,n); cout字符串反轉(zhuǎn)后的順序:sendl;void invert(arr &b,int n) for(int i=0;in/2;i+) char c=bi; bi=bn-1-i; bn-1-

19、i=c; 輸入一字符串個(gè)數(shù),反序存放并輸出第32頁,共64頁。4.4 內(nèi)聯(lián)函數(shù)引入的原因定義方法注意事項(xiàng)第33頁,共64頁。引入原因目的是為了解決程序中函數(shù)調(diào)用的效率問題。函數(shù)調(diào)用時(shí)需要建立棧內(nèi)存環(huán)境,進(jìn)行參數(shù)傳遞,并產(chǎn)生程序執(zhí)行轉(zhuǎn)移,則都要有時(shí)間和空間的代價(jià)。而有時(shí)一些函數(shù)代碼很短(行),卻有高使用頻率,造成處理現(xiàn)場的開銷巨增。這時(shí)若將函數(shù)體嵌入函數(shù)調(diào)用處,則可避免每次調(diào)用函數(shù)的開銷。大大提高效率。第34頁,共64頁。通過將該函數(shù)聲明為inline來實(shí)現(xiàn)。即在函數(shù)聲明和定義中用inline來修飾。如:inline int isnumber(char); void main( ) char c

20、h; for (int I=1; Ich; int p=isnumber(ch); coutp=0&chy) ? x: y); double max (double x , double y) return ( (xy) ?x: y); #include void main( ) coutmax(10,20)endl; coutmax(1.23,2.34)endl; 重載方式靠將實(shí)參的個(gè)數(shù)及類型和所被調(diào)用的f()函數(shù)的形參的個(gè)數(shù)及類型一一比較來判斷。第39頁,共64頁。()作為重載函數(shù)至少在參數(shù)個(gè)數(shù)、參數(shù)類型上有所不同。若僅在返回類型上不同,編譯器是無法區(qū)別的。如:void func(int)

21、; int func(int); /錯(cuò)誤 int min(int ,int); int min(int,int,int); /正確 int add(int,int); double add(double,double);/正確()typedef定義的類型只是給已有類型取另外一個(gè)名字,編譯器不能將其同原類型區(qū)分。如: typedef INT int; void func(int x) . void func (INT x) (3)重載函數(shù)一般應(yīng)具有相同的功能,否則會(huì)破壞程序的可讀性。注意事項(xiàng)第40頁,共64頁。4.6 函數(shù)的嵌套調(diào)用和遞歸調(diào)用嵌套調(diào)用遞歸調(diào)用第41頁,共64頁。嵌套調(diào)用函數(shù)的嵌套

22、調(diào)用是指在執(zhí)行被調(diào)用函數(shù)時(shí),被調(diào)用函數(shù)又調(diào)用了其它函數(shù)。其關(guān)系可表示如圖所示:第42頁,共64頁。例4.15 計(jì)算s=1k+2k+3k+N k #include const int k=4;const int n=6; /符號(hào)常量定義int power(int,int); /求冪的函數(shù)說明int sum(int,int); /求和的函數(shù)說明void main( ) coutSum of 1k+2k+3k+N k = ; coutsum(k,n)endl; /調(diào)用sum函數(shù) 第43頁,共64頁。int sum(int k,int n)/*計(jì)算1到n的k次方之累加和*/ int s=0; for(

23、int i=1;i=n;i+) s+= power(i, k); /累加 return s; /調(diào)用f1函數(shù) int power(int m,int n)/*計(jì)算m的n次方*/ int p=1, i; for(i=1;i1時(shí) ,n!= n * ( n-1 ) ! n ! = n=1n * ( n-1 ) ! n1三、調(diào)用函數(shù)本身,但參數(shù)值趨于結(jié)束條件一、有一個(gè)使遞歸結(jié)束的條件二、當(dāng)條件成立時(shí),不再調(diào)用自己,而有確定值第45頁,共64頁。s:=fac(3)主程序fac(3):=fac(2)*3n=3fac(2):=fac(1)*2n=2fac(1):=1n=1fac:=6fac:=2fac:=1

24、第46頁,共64頁。4.7 作用域標(biāo)識(shí)符的作用域規(guī)則作用域的種類局部變量和全局變量第47頁,共64頁。標(biāo)識(shí)符的作用域規(guī)則規(guī)則為:標(biāo)識(shí)符只能在說明它或定義它的范圍內(nèi)是可見的,而在該范圍之外是不可見的。說明有: 1、大多數(shù)標(biāo)識(shí)符的說明與定義是一致的,只有少數(shù)例外。如:函數(shù)等。2、范圍有大有小。最大為整個(gè)程序,最小為塊,中間有文件和函數(shù)。 第48頁,共64頁。作用域的種類不同的標(biāo)識(shí)符定義在不同的范圍內(nèi)有不同的作用域。按作用域的大小可分為: 程序級(jí):包含著組成該程序的所有文件。 文件級(jí):僅在定義它的文件內(nèi)。 函數(shù)級(jí):在它所定義的函數(shù)體內(nèi)。 塊級(jí): 定義在分程序中、語句塊內(nèi)。注意:作用范圍一般是從定義時(shí)

25、開始,到相應(yīng)范圍結(jié)束為止。第49頁,共64頁。如:#include void main() int x(3),y(5); /double x(3.5); error for (;x0;x-) int x(4); coutxtyt; coutendlxtyendl; 在不同作用域中允許同名。在同一作用域中不允許同名。藍(lán)色為函數(shù)作用域綠色為塊作用域不為x的原因是局部優(yōu)先4 5 4 5 4 505第50頁,共64頁。局部變量和全局變量1、局部變量是指作用域在函數(shù)級(jí)和塊級(jí)的變量。2、全局變量是指作用域在程序級(jí)和文件級(jí)的變量。第51頁,共64頁。#includeint i(5); /外部變量extern

26、static int j(6); /外部靜態(tài)變量void min(int x,int y ) /形參 int i(3); /自動(dòng)變量 auto register int j(2); /寄存器變量 static int k(1); /內(nèi)部靜態(tài)變量 void main( ) 局部變量全局變量藍(lán)色為文件作用域綠色為函數(shù)作用域注意:同名時(shí)是局部優(yōu)先第52頁,共64頁。分析程序結(jié)果int a(5),b(7),c(10); coutatbtcendl; coutatbtcendl; int b(8);double c(8.8); coutatbtcendl; a=b; int c;c=b; coutatb

27、tcendl; coutatbtcendl; coutatbtcendl;5 7 105 8 8.88 8 88 7 108 8 8.8第53頁,共64頁。4.8 C+的系統(tǒng)函數(shù)概述C+系統(tǒng)將所提供的系統(tǒng)函數(shù)的說明分類放在不同的.h文件(頭文件)中。如:數(shù)學(xué)處理函數(shù)(math.h)、字符串處理函數(shù)(string.h)、屏幕處理函數(shù)(conio.h)、圖形處理函數(shù)(graph.h)。 conconsole,控制臺(tái)、安慰 具體使用需要看所用的C+版本的幫助。注意:1、了解系統(tǒng)中有哪些系統(tǒng)函數(shù)。2、了解函數(shù)位于哪個(gè)頭文件中。3、調(diào)用一個(gè)函數(shù),須了解函數(shù)功能、參數(shù)和返回值。第54頁,共64頁。如:#i

28、nclude #includevoid main( ) double I(30*3.1415/180); double x=sin(I); double y=cos(I); coutxyendl; 第55頁,共64頁。輸入15個(gè)數(shù),用函數(shù)求和與平均值void main() double a15,s(0),ave(0); for(int i=0;i15;i+) cout輸入第(i+1)ai; for(i=0;i15;i+) s+=ai; ave=s/15; cout和:sendl; cout平均值:aveendl;sum(15)ave(15)第56頁,共64頁。double sum(int x);/函數(shù)聲明double ave(int x);/函數(shù)聲明double a15,s(0); /全局變量void main() for(int i=0;i15;i+) cout輸入第(i+1)ai; cout和:sum(15)endl; /函數(shù)調(diào)用 cout平均值:ave(15)endl;第57頁,共64頁。double sum(int x)/求和函數(shù)的定義 for(i=0;ix;i+) s+=ai; return s; double ave(int x) /求平均值函數(shù)

溫馨提示

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

評(píng)論

0/150

提交評(píng)論