![面向?qū)ο蟪绦蛟O(shè)計復習輔導(三)_第1頁](http://file3.renrendoc.com/fileroot_temp3/2021-12/8/4f08031f-0705-45b9-a5fa-a67c65b188a7/4f08031f-0705-45b9-a5fa-a67c65b188a71.gif)
![面向?qū)ο蟪绦蛟O(shè)計復習輔導(三)_第2頁](http://file3.renrendoc.com/fileroot_temp3/2021-12/8/4f08031f-0705-45b9-a5fa-a67c65b188a7/4f08031f-0705-45b9-a5fa-a67c65b188a72.gif)
![面向?qū)ο蟪绦蛟O(shè)計復習輔導(三)_第3頁](http://file3.renrendoc.com/fileroot_temp3/2021-12/8/4f08031f-0705-45b9-a5fa-a67c65b188a7/4f08031f-0705-45b9-a5fa-a67c65b188a73.gif)
![面向?qū)ο蟪绦蛟O(shè)計復習輔導(三)_第4頁](http://file3.renrendoc.com/fileroot_temp3/2021-12/8/4f08031f-0705-45b9-a5fa-a67c65b188a7/4f08031f-0705-45b9-a5fa-a67c65b188a74.gif)
下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、面向?qū)ο蟪绦蛟O(shè)計復習輔導(三)-函 數(shù)徐孝凱一個 C+語言程序由若干個程序文件和頭文件所組成,每個頭文件中通常帶有用戶類型的定義、符號常量的定義、函數(shù)的聲明等內(nèi)容,每個程序文件由若干個函數(shù)定義所組成,其中必有一個并且只有一個程序文件中包含有主函數(shù) main,稱此程序文件為主程序文件。函數(shù)是 C+程序中的基本功能模塊和執(zhí)行單元,這一章專門討論函數(shù)的定義和調(diào)用,變量的作用域和生存期等內(nèi)容。一、函數(shù)的定義(一)定義格式<類型名 > < 函數(shù)名 > (< 參數(shù)表 >) <函數(shù)體 ><類型名 >為系統(tǒng)或用戶已定義的一種數(shù)據(jù)類型,它是函數(shù)執(zhí)行過程
2、中通過return語句要求返回的值的類型,又稱為該函數(shù)的類型。當一個函數(shù)不需要通過return語句返回一個值時,稱為無返回值函數(shù)或無類型函數(shù),此時需要使用保留字void作為類型名。當類型名為int時,可以省略不寫,但為了清楚起見,還是寫明為好。<函數(shù)名 >是用戶為函數(shù)所起的名字,它是一個標識符,應符合C+標識符的一般命名規(guī)則,用戶通過使用這個函數(shù)名和實參表可以調(diào)用該函數(shù)。<參數(shù)表 >又稱形式參數(shù)表,它包含有任意多個(含0 個,即沒有)參數(shù)說明項,當多于一個時其前后兩個參數(shù)說明項之間必須用逗號分開。每個參數(shù)說明項由一種已定義的數(shù)據(jù)類型和一個變量標識符組成,該變量標識符成為
3、該函數(shù)的形式參數(shù),簡稱形參,形參前面給出的數(shù)據(jù)類型稱為該形參的類型。一個函數(shù)定義中的<參數(shù)表 >可以被省略,表明該函數(shù)為無參函數(shù),若 <參數(shù)表 >用 void取代,則也表明是無參函數(shù),若<參數(shù)表 >不為空,同時又不是保留字void ,則稱為帶參函數(shù)。<函數(shù)體 >是一條復合語句,它以左花括號開始,到右花括號結(jié)束,中間為一條或若干條C+語句。在一個函數(shù)的參數(shù)表中,每個參數(shù)可以為任一種數(shù)據(jù)類型,包括普通類型、指針類型、數(shù)組類型、引用類型等,一個函數(shù)的返回值可以是除數(shù)組類型之外的任何類型,包括普通類型、指針類型和引用類型等。另外,當不需要返回值時,應把函
4、數(shù)定義為void類型。(二)定義格式舉例(1) void f1() .(2) void f2(int x) .(3) int f3(int x,int* p) .(4) char* f4(char a).(5) int f5(int& x,double d) .(6) int& f6(int b10, int n) .(7) void f7(float cN, int m, float& max) .(8) bool f8(ElemType*& bt, ElemType& item) .在第一條函數(shù)定義中,函數(shù)名為f1 ,函數(shù)類型為void ,參數(shù)表為空
5、,此函數(shù)是一個無參無1/27類型函數(shù)。若在f1 后面的圓括號內(nèi)寫入保留字void ,也表示為無參函數(shù)。在第二條函數(shù)定義中,僅帶有一個類型為int的形參變量x,該函數(shù)沒有返回值。在第三條函數(shù)定義中,函數(shù)名為f3 ,函數(shù)類型為int ,函數(shù)參數(shù)為x 和 p,其中 x 為int型普通參數(shù),p 為 int*型指針參數(shù)。在第四條函數(shù)定義中,函數(shù)名為f4 ,函數(shù)類型為char* ,即字符指針類型,參數(shù)表中包含一個一維字符數(shù)組參數(shù)。注意:在定義任何類型的一維數(shù)組參數(shù)時,不需要給出維的尺寸,當然給出也是允許的,但沒有任何意義。在第五條函數(shù)定義中,函數(shù)名為f5 ,返回類型為int ,該函數(shù)帶有兩個形參,一個為整
6、型引用變量x,另一個為雙精度變量d。在第六條函數(shù)定義中,函數(shù)名為f6 ,函數(shù)類型為int& ,即整型引用,該函數(shù)帶有兩個形參,一個是整型數(shù)組 b,另一個是整型變量 n。在這里定義形參數(shù)組 b 所給出的維的尺寸 10 可以被省略。在第七條函數(shù)定義中,函數(shù)名為f7 ,無函數(shù)類型,參數(shù)表中包含三個參數(shù),一個為二維單精度型數(shù)組c,第二個為整型變量m,第三個為單精度引用變量max。注意:當定義一個二維數(shù)組參數(shù)時,第二維的尺寸必須給出,并且必須是一個常量表達式,第一維尺寸可給出也可不給出,其作用相同。在第八條函數(shù)定義中,函數(shù)名為f8 ,返回類型為bool ,即邏輯類型,該函數(shù)帶有兩個參數(shù),一個為形
7、參bt ,它為ElemType的指針引用類型,另一個為形參item ,它是ElemType 的引用類型,其中ElemType 為一種用戶定義的類型或是通過typedef語句定義的一個類型的別名。(三)有關(guān)函數(shù)定義的幾點說明1. 函數(shù)原型語句在一個函數(shù)定義中,函數(shù)體之前的所有部分稱為函數(shù)頭,它給出了該函數(shù)的返回類型、每個參數(shù)的次序和類型等函數(shù)原型信息,所以當沒有專門給出函數(shù)原型說明語句時,系統(tǒng)就從函數(shù)頭中獲取函數(shù)原型信息。一個函數(shù)必須先定義或聲明而后才能被調(diào)用,否則編譯程序無法判斷該調(diào)用的正確性。一個函數(shù)的聲明是通過使用一條函數(shù)原型語句實現(xiàn)的,當然使用多條相同的原型語句聲明同一個函數(shù)雖然多余但也
8、是允許的,編譯時不會出現(xiàn)錯誤。在一個完整的程序中,函數(shù)的定義和函數(shù)的調(diào)用可以在同一個程序文件中,也可以處在不同的程序文件中,但必須確保函數(shù)原型語句與函數(shù)調(diào)用表達式出現(xiàn)在同一個文件中,并且函數(shù)原型語句出現(xiàn)在前,函數(shù)的調(diào)用出現(xiàn)在后。通常把一個程序中用戶定義的所有函數(shù)的原型語句組織在一起,構(gòu)成一個頭文件,讓該程序中所含的每個程序文件的開始(即所有函數(shù)定義之前)包含這個頭文件(通過 #include 命令實現(xiàn)),這樣不管每個函數(shù)的定義在哪里出現(xiàn),都能夠確保函數(shù)先聲明后使用(即調(diào)用)這一原則的實現(xiàn)。一個函數(shù)的原型語句就是其函數(shù)頭的一個拷貝,當然要在最后加上語句接上結(jié)束符分號。函數(shù)原型語句與函數(shù)頭也有細微
9、的差別,在函數(shù)原型語句中,其參數(shù)表中的每個參數(shù)允許只保留參數(shù)類型,而省略參數(shù)名,并且若使用參數(shù)名也允許與函數(shù)頭中對應的參數(shù)名不同。2. 常量形參在定義一個函數(shù)時,若只允許函數(shù)體訪問一個形參的值,不允許修改它的值,則應把該形參說明為常量,這只要在形參說明的前面加上const 保留字進行修飾即可。如:void f9(const int& x, const char& y)。void f10(const char* p, char key)。2/27在函數(shù) f9 的函數(shù)體中只允許使用x 和 y 的值,不允許修改它們的值。在函數(shù)f10 的函數(shù)體中只允許使用p 所指向的字符對象或字符數(shù)組
10、對象的值,不允許修改它們的值,但在函數(shù)體中既允許使用也允許修改形參key 的值。3. 缺省參數(shù)在一個函數(shù)定義中,可根據(jù)需要對參數(shù)表末尾的一個或連續(xù)若干個參數(shù)給出缺省值,當調(diào)用這個函數(shù)時,若實參表中沒有給出對應的實參,則形參將采用這個缺省值。如:void f11(int x, int y=0) .int f12(int a, char op='+', int k=10) .函數(shù) f11 的定義帶有兩個參數(shù),分別為整型變量x 和 y,并且 y 帶有缺省值0,若調(diào)用該函數(shù)的表達式為f11(a,b),將把a 的值賦給x,把 b 的值賦給y,接著執(zhí)行函數(shù)體;若調(diào)用該函數(shù)的表達式為f11(
11、a+b) ,則也是正確的調(diào)用格式,它將把a+b 的值賦給x,因 y 沒有對應的實參,將采用缺省值0,參數(shù)傳送后接著執(zhí)行函數(shù)體。函數(shù)f12的定義帶有三個參數(shù),其中后兩個帶有缺省值,所以調(diào)用它的函數(shù)格式有三種,一種只帶一個實參,用于向形參a 傳送數(shù)據(jù),后兩個形參采用缺省值,第二種帶有兩個實參,用于分別向形參a 和 op 傳送數(shù)據(jù),第三個形參采用缺省值,第三種帶有三個實參,分別用于傳送給三個形參。若一個函數(shù)帶有專門的函數(shù)原型語句,則形參的缺省值只能在該函數(shù)原型語句中給出,不允許在函數(shù)頭中給出。如對于上述的f11 和 f12函數(shù),其對應的函數(shù)原型語句分別為:void f11(int x, int y=
12、0)。int f12(int a, char op='+', int k=10)。函數(shù)定義應分別改寫為:void f11(int x, int y) .int f12(int a, char op, int k) .4.數(shù)組參數(shù)在函數(shù)定義中的每個數(shù)組參數(shù)實際上是指向元素類型的指針參數(shù)。對于一維數(shù)組參數(shù)說明:<數(shù)據(jù)類型 > < 數(shù)組名 >它與下面的指針參數(shù)說明完全等價:<數(shù)據(jù)類型 >*< 指針變量名 >其中 <指針變量名 >就是數(shù)組參數(shù)說明中的<數(shù)組名 >。如對于f12函數(shù)定義中的數(shù)組參數(shù)說明int a,等價
13、于指針參數(shù)說明int* a。也就是說,數(shù)組參數(shù)說明中的數(shù)組名a 是一個類型為int*的形參。注意:在變量定義語句中定義的數(shù)組,其數(shù)組名代表的是一個數(shù)組,它的值是指向第一個元素的指針常量,這與數(shù)組形參的含義有區(qū)別。對于二維數(shù)組參數(shù)說明:<數(shù)據(jù)類型 > < 參數(shù)名 ><第二維尺寸 >它與下面的指針參數(shù)說明完全等價:<數(shù)據(jù)類型 > (*< 參數(shù)名 >)< 第二維尺寸 >如 對 于f7函 數(shù) 定 義 中 的 二 維 數(shù) 組 參 數(shù) 說 明floatcN, 等 價 于 指 針 參 數(shù) 說 明float(*c)N。5.函數(shù)類型當調(diào)用一
14、個函數(shù)時就執(zhí)行一遍循環(huán)體,對于類型為非void的函數(shù),函數(shù)體中至少必須帶有一條 return 語句,并且每條 return 語句必須帶有一個表達式,當執(zhí)行到任一條 return 語句時,將計算出它的表達式的值,結(jié)束整個函數(shù)的調(diào)用過程,把這個值作為所求3/27的函數(shù)值帶回到調(diào)用位置,參與相應的運算;對于類型為void的函數(shù),它不需要返回任何函數(shù)值,所以在函數(shù)體中既可以使用return語句,也可以不使用,對于使用的每條return語句不允許也不需要帶有表達式,當執(zhí)行到任一條return語句時,或執(zhí)行到函數(shù)體最后結(jié)束位置時,將結(jié)束函數(shù)的調(diào)用過程,返回到調(diào)用位置向下繼續(xù)執(zhí)行。6. 內(nèi)聯(lián)函數(shù)當在一個函數(shù)
15、的定義或聲明前加上關(guān)鍵字inline則就把該函數(shù)聲明為內(nèi)聯(lián)函數(shù)。計算機在執(zhí)行一般函數(shù)的調(diào)用時,無論該函數(shù)多么簡單或復雜,都要經(jīng)過參數(shù)傳遞、執(zhí)行函數(shù)體和返回等操作。若把一個函數(shù)聲明為內(nèi)聯(lián)函數(shù)后,在程序編譯階段系統(tǒng)就有可能把所有調(diào)用該函數(shù)的地方都直接替換為該函數(shù)的執(zhí)行代碼,由此省去函數(shù)調(diào)用時的參數(shù)傳遞和返回操作,從而加快整個程序的執(zhí)行速度。通常可把一些相對簡單的函數(shù)聲明為內(nèi)聯(lián)函數(shù),對于較復雜的函數(shù)則不應聲明為內(nèi)聯(lián)函數(shù)。從用戶的角度看,調(diào)用內(nèi)聯(lián)函數(shù)和一般函數(shù)沒有任何區(qū)別。下面就是一個內(nèi)聯(lián)函數(shù)定義的例子,它返回形參值的立方。inline int cube(int n)return n*n*n。二、函數(shù)
16、的調(diào)用(一)調(diào)用格式調(diào)用一個已定義或聲明的函數(shù)需要給出相應的函數(shù)調(diào)用表達式,其格式為:<函數(shù)名 >(< 實參表 >)若調(diào)用的是一個無參函數(shù),或全部形參為可選的函數(shù),則<實參表 >被省略,此時實參表為空。<實參表 >為一個或若干個用逗號分開的表達式,表達式的個數(shù)應至少等于不帶缺省值的形參的個數(shù),應不大于所有形參的個數(shù),<實參表 >中每個表達式稱為一個實參,每個實參的類型必須與相應的形參類型相同或兼容(即能夠被自動轉(zhuǎn)換為形參的類型,如整型與字符型就是兼容類型)。每個實參是一個表達式,包括是一個常量、一個變量、一個函數(shù)調(diào)用表達式,或一個帶運
17、算符的一般表達式。如:(1) g1(25) /實參是一個整數(shù)(2) g2(x)/實參是一個變量(3) g3(a,2*b+3)/第一個為變量,第二個運算表達式(4) g4(sin(x),)/第一個為函數(shù)調(diào)用表達式,第二個為字符常量(5) g5(&d,*p,x/y-1) /分別為取地址運算、間接訪問和一般運算表達式任一個函數(shù)調(diào)用表達式都可以單獨作為一條表達式語句使用,但當該函數(shù)調(diào)用帶有返回值時,這個值被自動丟失。對于具有返回值的函數(shù),調(diào)用它的函數(shù)表達式通常是作為一個數(shù)據(jù)項使用,用返回值參與相應的運算,如把它賦值給一個變量,把它輸出到屏幕上顯示出來等。如:(1) f1() 。 / 作為單獨的
18、語句,若有返回值則被丟失(2) y=f3(x,a)。/返回值被賦給y 保存(3) cout<<f6(c,10)<<endl。/返回值被輸出到屏幕上(4) f2(f5(x1,d1)+1)。 /f2調(diào)用作為單獨的語句,/f5調(diào)用是 f2 實參表達式中的一個數(shù)據(jù)項(5) f6(b,5)=3*w-2。/f6函數(shù)調(diào)用的返回值當作一個左值(6) if(f8(ct,x) cout<<”true ”<<endl 。 / f6函數(shù)調(diào)用作為一個判斷條件,4/27/若返回值不為0 則執(zhí)行后面的輸出語句,否則不執(zhí)行任何操作(二)調(diào)用過程當調(diào)用一個函數(shù)時,整個調(diào)用過程分為
19、三步進行,第一步是參數(shù)傳遞,第二步是函數(shù)體執(zhí)行,第三步是返回,即返回到函數(shù)調(diào)用表達式的位置。參數(shù)傳遞稱為實虛結(jié)合,即實參向形參傳遞信息,使形參具有確切地含義(即具有對應的存儲空間和初值)。這種傳遞又分為兩種不同情況,一種是向非引用參數(shù)傳遞,另一種是向引用參數(shù)傳遞。形參表中的非引用參數(shù)包括普通類型的參數(shù)、指針類型的參數(shù)和數(shù)組類型的參數(shù)三種。實際上可以把數(shù)組類型的參數(shù)歸為指針類型的參數(shù)。當形參為非引用參數(shù)時,實虛結(jié)合的過程為:首先計算出實參表達式的值,接著給對應的形參變量分配一個存儲空間,該空間的大小等于該形參類型的長度,然后把已求出的實參表達式的值存入到為形參變量分配的存儲空間中,成為形參變量的
20、初值。這種傳遞是把實參表達式的值傳送給對應的形參變量,稱這種傳遞方式為“按值傳遞”。假定有下面的函數(shù)原型:(1) void h1(int x, int y)。(2) bool h2(char*p)。(3) void h3(int a, int n)。(4) char* h4(char bN, int m)。若采用如下的函數(shù)調(diào)用:(1) h1(a,25)。 / 假定 a 為 int型(2) bool bb=h2(sp)。/假定 sp 為 char* 型(3) h3(b,10)。/假定 b 為 int*型(4) char* s=h4(c,n+1)。/假定 c 為 int(*)N型, n 為 int
21、型當執(zhí)行第一條語句中的h1(a,25)調(diào)用時,把第一個實參a 的值傳送給對應形參x 的存儲空間,成為x 的初值,把常數(shù)25 傳送給形參y 的存儲空間,成為y 的初值。當執(zhí)行第二條語句中的h2(sp) 調(diào)用時,將把sp 的值,即一個字符對象的存儲地址傳送給對應的指針形參p 的存儲空間中,使p 指向的對象就是實參sp 所指向的對象,即*p 和 *sp指的是同一個對象,若在函數(shù)體中對*p 進行了修改,則待調(diào)用結(jié)束返回后通過訪問*sp就得到了這個修改。當執(zhí)行第三條語句中的h3(b,10)調(diào)用時,將把b 的值(通常為元素類型為int的一維數(shù)組的首地址)傳送給對應數(shù)組變量(實際為指針變量)a 的存儲空間中
22、,使得形參a 指向?qū)崊 所指向的數(shù)組空間,因此,在函數(shù)體中對數(shù)組a 的存取元素的操作就是對實參數(shù)組 b 的操作。也就是說,采用數(shù)組傳送能夠在函數(shù)體中使用形參數(shù)組訪問對應的實參數(shù)組。當執(zhí)行第四條語句中的h4(c,n+1)調(diào)用時,將把c 的值(通常為與形參b 具有相同元素類型和列數(shù)的二維數(shù)組的首地址)傳送給對應二維數(shù)組參數(shù)(實際為指針變量)a 的存儲空間中,使得形參b 指向?qū)崊 所指向的二維數(shù)組空間,在函數(shù)體中對數(shù)組b 的存取元素的操作就是對實參數(shù)組c 的操作;該函數(shù)調(diào)用還要把第二個實參表達式n+1 的值傳送給形參 m中,在函數(shù)體中對m的操作與相應的實參無關(guān)。在函數(shù)定義的形參表中說明一個數(shù)組參
23、數(shù)時,通常還需要說明一個整型參數(shù),用它來接收由實參傳送來的數(shù)組的長度,這樣才能夠使函數(shù)知道待處理元素的個數(shù)。當形參為引用參數(shù)時,對應的實參通常是一個變量,實虛結(jié)合的過程為:把實參變量的地址傳送給引用形參,成為引用形參的地址,也就是說使得引用形參是實參變量的一個引用(別名),引用形參所占用的存儲空間就是實參變量所占用的存儲空間。因此,在函5/27數(shù)體中對引用形參的操作實際上就是對被引用的實參變量的操作。這種向引用參數(shù)傳遞信息的方式稱為引用傳送或按址傳送。引用傳送的好處是不需要為形參分配新的存儲空間,從而節(jié)省存儲,另外能夠使對形參的操作反映到實參上,函數(shù)被調(diào)用結(jié)束返回后,能夠從實參中得到函數(shù)對它的
24、處理結(jié)果。有時,既為了使形參共享實參的存儲空間,又不希望通過形參改變實參的值,則應當把該形參說明為常量引用,如:void f13(const int& A, const Node*& B, char C)。在該函數(shù)執(zhí)行時,只能讀取引用形參A 和 B 的值,不能夠修改它們的值。因為它們是對應實參的別名,所以,也可以說,只允許該函數(shù)使用A 和 B 對應實參的值,不允許進行修改,從而杜絕了對實參進行的有意或無意的破壞。進行函數(shù)調(diào)用除了要把實參傳遞給形參外,系統(tǒng)還將自動把函數(shù)調(diào)用表達式執(zhí)行后的位置(稱為返回地址)傳遞給被調(diào)用的函數(shù),使之保存起來,當函數(shù)執(zhí)行結(jié)束后,將按照所保存的返回地址
25、返回到原來位置,繼續(xù)向下執(zhí)行。函數(shù)調(diào)用的第二步是執(zhí)行函數(shù)體,實際上就是執(zhí)行函數(shù)頭后面的一條復合語句,它將按照從上向下、從左向右的次序執(zhí)行函數(shù)體中的每條語句,當碰到return語句時就結(jié)束返回。對于無類型函數(shù),當執(zhí)行到函數(shù)體最后的右花括號時,與執(zhí)行一條不帶表達式的 return 語句相同,也將結(jié)束返回。函數(shù)調(diào)用的第三步是返回,這實際上是執(zhí)行一條return語句的過程。當return語句不帶有表達式時,其執(zhí)行過程為:按函數(shù)中所保存的返回地址返回到調(diào)用函數(shù)表達式的位置接著向下執(zhí)行。當return語句帶有表達式時,又分為兩種情況,一種是函數(shù)類型為非引用類型,則計算出return表達式的值,并把它保存起
26、來,以便返回后訪問它參與相應的運算;另一種情況是函數(shù)的類型為引用類型,則return中的表達式必須是一個左值,并且不能是本函數(shù)中的局部變量(關(guān)于局部變量的概念留在下一節(jié)討論),執(zhí)行return語句時就返回這個左值,也可以說函數(shù)的返回值是該左值的一個引用。因此,返回為引用的函數(shù)調(diào)用表達式既可作為右值又可作為左值使用,但非引用類型的函數(shù)表達式只能作為右值使用。例如:int& f14(int a, int n)int k=0。for(int i=1。 i<n 。i+)if(ai>ak) k=i。return ak。該函數(shù)的功能是從一維整型數(shù)組an 中求出具有最大值的元素并引用返回
27、。當調(diào)用該函數(shù)時,其函數(shù)表達式既可以作為右值,從而取出 ak 的值,又可以作為左值,從而向 ak 賦予新值。如:#include<iostream.h>int& f14(int a, int n)int k=0。for(int i=1。 i<n 。i+)if(ai>ak) k=i。return ak。6/27void main()int b8=25,37,18,69,54,73,62,31。cout<<f14(b,8)<<endl。f14(b,5)=86。for(int i=0。 i<8 。i+) cout<<bi<
28、;<' '。cout<<endl。該程序的運行結(jié)果如下,請讀者自行分析。7325 37 18 86 54 73 62 31通常把函數(shù)定義為引用的情況較少出現(xiàn),而定義為非引用(即普通類型和指針類型)的情況則常見。(三)函數(shù)調(diào)用舉例程序 1:#include<iostream.h>int xk1(int n)。void main()cout<<"輸入一個正整數(shù):" 。int m。cin>> sum=xk1(m)+xk1(2*m+1)。cout<<sum<< x
29、k1(int n)int i,s=0。for(i=1。 i<=n 。 i+) s+=i。return s。該程序包含一個主函數(shù)和一個xk1函數(shù),在程序開始給出了一條xk1函數(shù)的原型語句,使得xk1 函數(shù)無論在什么地方定義,在此程序文件中的所有函數(shù)都能夠合法地調(diào)用它。注意:主函數(shù)不需要使用相應的函數(shù)原型語句加以聲明,因為C+規(guī)定不允許任何函數(shù)調(diào)用它,它只由操作系統(tǒng)調(diào)用并返回操作系統(tǒng)。函數(shù) xk1 的功能是求出自然數(shù)1 至 n 之和,這個和就是s 的最后值,由return語句把它返回。在主函數(shù)中首先為m輸入一個自然數(shù),接著用m去調(diào)用 xk1 函數(shù)返回1 至 m之間的所有自然數(shù)之和,再用2*m
30、+1 去調(diào)用xk1 函數(shù)返回1 至 2*m+1 之間的所有自然數(shù)之和,把這兩個和加起來賦給變量sum,最后輸出sum 的值。假定從鍵盤上為m輸入的正整數(shù)為5,則進行xk1(m) 調(diào)用時把m 的值 5 傳送給 n,接著執(zhí)行函數(shù)體后返回s 的值為15,進行xk1(2*m+1) 調(diào)用時把2*m+1 的值 11 傳送給 n,接著執(zhí)行函數(shù)體后返回 s 的值為 66,它們的和 81 被作為初值賦給 sum,最后輸出的 sum值為81。7/27程序 2:#include<iostream.h>void xk2(int& a, int b)。void main()int x=12,y=18
31、。cout<<"x="<<x<<' '<<"y="<<y<<endl。xk2(x,y)。cout<<"x="<<x<<' '<<"y="<<y<<endl。void xk2(int& a, int b)cout<<"a="<<a<<' '<<"
32、;b="<<b<<endl。a=a+b。b=a+b。cout<<"a="<<a<<' '<<"b="<<b<<endl。該程序包含一個主函數(shù)和一個xk2 函數(shù), xk2 函數(shù)使用了兩個形參,一個是整型引用變量a,另一個是整型變量 b。在主函數(shù)中使用 xk1(x,y) 調(diào)用時,將使形參 a 成為實參 x 的別名,在函數(shù)體中對 a 的訪問就是對主函數(shù)中 x 的訪問,此調(diào)用同時把 y 的值傳送給形參b,在函數(shù)體中對形參 b 的操作是與對應的
33、實參 y 無關(guān)的,因為它們使用各自的存儲空間。該程序的運行結(jié)果為:x=12 y=18a=12 b=18a=30 b=48x=30 y=18程序 3:#include<iostream.h>void xk3(int* a, int* b)。void xk4(int& a, int& b)。void main()int x=5,y=10。cout<<"x="<<x<<' '<<"y="<<y<<endl。xk3(&x, &y)。
34、cout<<"x="<<x<<' '<<"y="<<y<<endl。xk4(x, y)。cout<<"x="<<x<<' '<<"y="<<y<<endl。void xk3(int* a, int* b)int c=*a。*a=*b 。8/27*b=c 。void xk4(int& a, int& b)int c=a。a=b。
35、b=c。該程序中的xk3 函數(shù)用于交換a 和 b 分別指向的兩個對象的值,主函數(shù)使用xk3(&x, &y)調(diào)用時,分別把x 和 y 的地址賦給形參a 和 b,所以實際交換的是主函數(shù)中x 和 y 的值;xk4 函數(shù)用于直接交換a 和 b 的值,由于a 和 b 都是引用參數(shù),所以在主函數(shù)使用xk4(x,y)調(diào)用時,執(zhí)行xk4 函數(shù)實際交換的是相應實參變量x 和 y 的值。此程序的運行結(jié)果為:x=5 y=10x=10 y=5x=5 y=10上述的 xk3 和 xk4 具有完全相同的功能,但由于在xk3 中使用的是指針參數(shù),傳送給它的實參也必須是對象的地址,在函數(shù)體中訪問指針所指向的對
36、象必須進行間接訪問運算,所以,定義和調(diào)用xk3 不如定義和調(diào)用 xk4 直觀和簡便。程序 4:#include<iostream.h>const int N=8。int xk5(int a, int n)。void main()int bN=1,7,2,6,4,5,3,-2。int m1=xk5(b,8)。int m2=xk5(&b2,5)。int m3=xk5(b+3,3) 。cout<<m1<<' '<<m2<<' '<<m3<< xk5(int a,
37、 int n)int i,f=1。for(i=0。 i<n 。 i+) f*=ai。 /或?qū)懗?f*=*a+ 。return f。該函數(shù)包含一個主函數(shù)和一個xk5 函數(shù), xk5函數(shù)的功能是求出一維整型數(shù)組an中所有元素之積并返回。在主函數(shù)中第一次調(diào)用xk5函數(shù)時,把數(shù)組 b 的首地址傳送給a,把數(shù)組 b 的長度 8傳送給 n,執(zhí)行函數(shù)體對數(shù)組a 的操作實際上就是對主函數(shù)中數(shù)組b 的操作,因為它們同時指向數(shù)組b 的存儲空間;第二次調(diào)用xk5 函數(shù)是把數(shù)組 b 中 b2元素的地址傳送給 a,把整數(shù)5 傳送給 n,執(zhí)行函數(shù)體對數(shù)組an 的操作實際上是對數(shù)組b 中 b2至 b6之間元素的操作;
38、第三次調(diào)用xk5 函數(shù)是把數(shù)組b 中 b3 元素的地址傳送給a,把9/27整數(shù) 3 傳送給 n,執(zhí)行函數(shù)體對數(shù)組 an 的操作實際上是對數(shù)組 b 中 b3 至 b5 之間元素的操作。該程序的運行結(jié)果為:-10080 720 120程序 5:#include<iostream.H>char* xk6(char* sp, char* dp)。void main()char a15="abcadecaxybcw"。char b15。char* c1=xk6(a,b)。cout<<c1<<' '<<a<<&
39、#39; '<<b<<endl。char* c2=xk6(a+4,b)。cout<<c1<<' '<<a<<' '<<b<<endl。char* xk6(char* sp, char* dp)if(*sp='0') *dp='0'。 return dp。 int i=0,j。for(char* p=sp。 *p 。 p+) /掃描 sp 所指字符串中的每個字符位置for(j=0。 j<i 。 j+)if(*p=dpj) b
40、reak。 /當 *p 與 dp0 至 dpi-1之間的/ 任一元素相同則比較過程結(jié)束if(j>=i) dpi+=*p。/ 若 dp 數(shù)組的前 i個元素均不等于 *p ,則把 *p 寫入 dpi元素中dpi='0'。 / 寫入字符串結(jié)束符return dp。xk6函數(shù)的功能是把 sp所指向的字符串,去掉重復字符后拷貝到dp 所指向的字符數(shù)組中,并返回dp 指針。在主函數(shù)中第一次調(diào)用xk6 函數(shù)時,分別以a 和 b 作為實參,第二次調(diào)用時分別以a+4(即 a4的地址)和 b 作為實參。該程序運行后的輸出結(jié)果為:abcdexyw abcadecaxybcw abcdexywd
41、ecaxybw abcadecaxybcw decaxybw程序 6:#include<iostream.H>int* xk7(int*& a1, int* a2)。int* xk7(int*& a1, int* a2)cout<<"when enter xk7: *a1,*a2="<<*a1<<", "<<*a2<<endl。a1=new int(2*a1+4)。a2=new int(2*a2-1)。10/27cout<<"when leave
42、 xk7: *a1,*a2="<<*a1<<", "<<*a2<<endl。return a2。void main()int x=10, y=25。int *xp=&x, *yp=&y。cout<<"before call xk7: *xp,*yp="<<*xp<<", "<<*yp<<* ip=xk7(xp,yp)。cout<<"after call xk7: *
43、xp,*yp="<<*xp<<", "<<*yp<<endl。cout<<"*ip="<<*ip<<endl。delete xp。 /xp指向的是在執(zhí)行xk7 函數(shù)時動態(tài)分配的對象*a1delete ip。 /ip指向的是在執(zhí)行xk7 函數(shù)時動態(tài)分配的對象*a2在 xk7 函數(shù)的定義中,把形參a1 定義為整型指針的引用,把a2 定義為整型指針,當在主函數(shù)中利用xk7(xp,yp)表達式調(diào)用該函數(shù)時,a1 就成為 xp 的別名,訪問a1 就等于訪問主函數(shù)中的xp,
44、而 a2 同 yp 具有各自獨立的存儲空間,a2 的初值為yp 的值,在xk7 函數(shù)中對 a2 的訪問 ( 指直接訪問 ) 與 yp 無關(guān)。此程序運行結(jié)果為:before call xk7: *xp,*yp=10, 25when enter xk7: *a1,*a2=10, 25when leave xk7: *a1,*a2=24, 49after call xk7: *xp,*yp=24, 25*ip=49三、變量的作用域在一個 C+程序中,對于每個變量必須遵循先定義后使用的原則。根據(jù)變量定義的位置不同將使它具有不同的作用域。一個變量離開了它的作用域,在定義時為它分配的存儲空間就被系統(tǒng)自動回
45、收了,因此該變量也就不存在了。(一)作用域分類變量的作用域具有四種類別:全局作用域、文件作用域、函數(shù)作用域和塊作用域。具有全局作用域的變量稱為全局變量,具有塊作用域的變量稱為局部變量。1. 全局作用域當一個變量在一個程序文件的所有函數(shù)定義之外(并且通常在所有函數(shù)定義之前)定義時,則該變量具有全局作用域,即該變量在整個程序包括的所有文件中都有效,都是可見的,都是可以訪問的。當一個全局變量不是在本程序文件中定義時,若要在本程序文件中使用,則必須在本文件開始進行聲明,聲明格式為:extern <類型名 ><變量名 >, < 變量名 >,.。它與變量定義語句格式類似
46、,其區(qū)別是:不能對變量進行初始化,并且要在整個語句前加上 extern 保留字。當用戶定義一個全局變量時,若沒有對其初始化,則編譯時會自動把它初始化為0。2. 文件作用域當一個變量定義語句出現(xiàn)在一個程序文件中的所有函數(shù)定義之外,并且該語句前帶有static 保留字時,則該語句定義的所有變量都具有文件作用域,即在整個程序文件中有效,但在其他文件中是無效的,不可見的。11/27若在定義文件作用域變量時沒有初始化,則編譯時會自動把它初始化為0。3. 函數(shù)作用域在每個函數(shù)中使用的語句標號具有函數(shù)作用域,即它在本函數(shù)中有效,供本函數(shù)中的goto 語句跳轉(zhuǎn)使用。由于語句標號不是變量,應該說函數(shù)作用域不屬于
47、變量的一種作用域。4. 塊作用域當一個變量是在一個函數(shù)體內(nèi)定義時,則稱它具有塊作用域,其作用域范圍是從定義點開始,直到該塊結(jié)束(即所在復合語句的右花括號)為止。具有塊作用域的變量稱為局部變量,若局部變量沒有被初始化,則系統(tǒng)也不會對它初始化,它的初值是不確定的。對于在函數(shù)體中使用的變量定義語句,若在其前面加上static保留字,則稱所定義的變量為靜態(tài)局部變量,若靜態(tài)局部變量沒有被初始化,則編譯時會被自動初始化為0。對于非靜態(tài)局部變量,每次執(zhí)行到它的定義語句時,都會為它分配對應的存儲空間,并對帶初值表達式的變量進行初始化;而對于靜態(tài)局部變量,只是在整個程序執(zhí)行過程中第一次執(zhí)行到它的定義語句時為其分
48、配對應的存儲空間,并進行初始化,以后再執(zhí)行到它時什么都不會做,相當于第一次執(zhí)行后就刪除了該語句。任一函數(shù)定義中的每個形參也具有塊作用域,這個塊是作為函數(shù)體的復合語句,當離開函數(shù)體后它就不存在了,函數(shù)調(diào)用時為它分配的存儲空間也就被系統(tǒng)自動回收了,當然引用參數(shù)對應的存儲空間不會被回收。由于每個形參具有塊作用域,所以它也是局部變量。在 C+程序中定義的符號常量也同變量一樣具有全局、文件和局部這三種作用域。當符號常量定義語句出現(xiàn)在所有函數(shù)定義之外,并且在前面帶有extern保留字時,則所定義的常量具有全局作用域,若在前面帶有 static 關(guān)鍵字或什么都沒有,則所定義的常量具有文件作用域。若符號常量定
49、義語句出現(xiàn)在一個函數(shù)體內(nèi),則定義的符號常量具有局部作用域。一個 C+程序中的所有函數(shù)的函數(shù)名都具有全局作用域,所以在程序中所含的任何文件內(nèi)都可以使用任一函數(shù)名構(gòu)成函數(shù)調(diào)用表達式,執(zhí)行對應的函數(shù)。具有同一作用域的任何標識符,不管它表示什么對象(如常量、變量、函數(shù)、類型等)都不允許重名,若重名系統(tǒng)就無法唯一確定它的含義了。由于每一個復合語句就是一個塊,所以在不同復合語句中定義的對象具有不同的塊作用域,也稱為具有不同的作用域,其對象名允許重名,因為系統(tǒng)能夠區(qū)分它們。(二)程序舉例程序 7:程序主文件7.cpp#include<iostream.h>int xk8(int n)。/函數(shù) x
50、k8 的原型聲明int xk9(int n)。/函數(shù) xk9 的原型聲明int AA=5 。 /定義全局變量AAextern const int BB=8。 /定義全局常量BBstatic int CC=12。/ 定義文件域變量CCconst int DD=23。 / 定義文件域常量DDvoid main()12/27int x=15。/x的作用域為主函數(shù)體cout<<"x*x="<<xk8(x)<<endl。cout<<"mainFile: AA,BB="<<AA<<',&
51、#39;<<BB<<endl。cout<<"mainFile: CC,DD="<<CC<<','<<DD<<endl。cout<<xk9(16)<< xk9(int n)/n的作用域為xk9 函數(shù)體int x=10。 /x的作用域為xk9 函數(shù)體cout<<"xk9:x="<<x<<endl。return n*x。程序次文件7-1.cpp#include<iostream.h
52、>int xk8(int n)。/函數(shù) xk8 的原型聲明extern int AA。 /全局變量 AA 的聲明extern const int BB。 / 全局常量 BB的聲明static int CC=120。 /定義文件域變量CCconst int DD=230。/定義文件域常量DDint xk8(int n)/n的作用域為 xk8 函數(shù)體cout<<"attachFile: AA,BB="<<AA<<','<<BB<<endl。cout<<"attachFile:
53、 CC,DD="<<CC<<','<<DD<<endl。return n*n。此程序包含兩個程序文件,定義有各種類型的變量和常量,其中AA 為全局變量, BB 為全局常量, CC為各自的文件域變量, DD為各自的文件域常量,主函數(shù)中的x 為作用于主函數(shù)的局部變量, xk9 函數(shù)中的 x 為作用于該函數(shù)的局部變量,xk8 和 xk9函數(shù)的各自參數(shù)表中的形參 n 是作用于各自函數(shù)的局部變量。為了在程序次文件7-1.cpp中能夠使用程序主文件 7.cpp 中定義的全局變量AA和全局常量 BB,必須在該文件開始對他們進行聲明。當上機輸入和運行該程序時,可以先建立程序主文件d6-7.cpp 并編譯通過,再建立程序次文件 7-1.cpp 并編譯通過,然后把它們連接起來生成可執(zhí)行文件7.exe 。該程序的運行結(jié)果為:attachFile: AA,BB=5,8attachFile: CC,DD=120,230x*x=225mainFile: AA,BB=5,8mainFile: CC,DD=12,23xk9:x=10160請讀者結(jié)合上述程序分析結(jié)果的正確性。程序 8:13/27#include<iostream.h>const int N=10。void m
溫馨提示
- 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025-2030全球風電用工業(yè)碳刷行業(yè)調(diào)研及趨勢分析報告
- 2025-2030全球服裝金屬探測器行業(yè)調(diào)研及趨勢分析報告
- 2025年全球及中國高性能航空涂料行業(yè)頭部企業(yè)市場占有率及排名調(diào)研報告
- 2025年全球及中國眼科手術(shù)剪行業(yè)頭部企業(yè)市場占有率及排名調(diào)研報告
- 2025公路工程進度、計量、合同管理監(jiān)理內(nèi)容
- 餐桌茶幾家具買賣合同
- 年貨物運輸合同范本
- 2025合同模板合伙協(xié)議范本
- 大米購銷的合同
- 物聯(lián)網(wǎng)系統(tǒng)定制與開發(fā)合同
- 確定項目干系人(表格)
- 渠道管理就這樣做
- 大客戶銷售這樣說這樣做
- 精裝修樣板房房屋使用說明
- 喬遷新居結(jié)婚典禮主持詞
- 小學四年級數(shù)學競賽試題(附答案)
- 魯科版高中化學必修2全冊教案
- 《病理學基礎(chǔ)》知識考核試題題庫與答案
- 人口分布 高一地理下學期人教版 必修第二冊
- 四年級上冊英語試題-Module 9 Unit 1 What happened to your head--外研社(一起)(含答案)
- 子宮內(nèi)膜異位癥診療指南
評論
0/150
提交評論