第7章 函數(shù)及預(yù)處理_第1頁
第7章 函數(shù)及預(yù)處理_第2頁
第7章 函數(shù)及預(yù)處理_第3頁
第7章 函數(shù)及預(yù)處理_第4頁
第7章 函數(shù)及預(yù)處理_第5頁
已閱讀5頁,還剩60頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、 第7章 函數(shù)與預(yù)處理主要內(nèi)容主要內(nèi)容 7.1 概述概述 7.2 定義函數(shù)的一般形式定義函數(shù)的一般形式 7.3 函數(shù)參數(shù)和函數(shù)的值函數(shù)參數(shù)和函數(shù)的值 7.4 函數(shù)的調(diào)用函數(shù)的調(diào)用 *7.5 內(nèi)置函數(shù)內(nèi)置函數(shù) *7.6 函數(shù)的重載函數(shù)的重載 *7.7 函數(shù)模板函數(shù)模板 *7.8 有默認參數(shù)的函數(shù)有默認參數(shù)的函數(shù) 7.11 局部變量和全局變量局部變量和全局變量 7.14 關(guān)于變量的聲明和定義關(guān)于變量的聲明和定義 7.16 預(yù)處理命令預(yù)處理命令7.1 概述概述 程序結(jié)構(gòu)清晰,可讀性好。 減少重復(fù)編碼的工作量。 可多人共同編制一個大程序,縮短程序設(shè)計周期,提高程序設(shè)計和調(diào)試的效率。C+程序程序源程序文

2、件源程序文件n函數(shù)函數(shù)1函數(shù)函數(shù)m 源程序文件源程序文件1函數(shù)函數(shù)1函數(shù)函數(shù)n圖7.是一個程序中函數(shù)調(diào)用的示意圖。圖7.#include using namespace std;void printstar(void) /定義printstar函數(shù) cout* endl; /輸出30個“*”void print_message(void) /定義print_message函數(shù) cout Welcome to C+!endl; /輸出一行文字int main(void)printstar( ); /調(diào)用printstar 函數(shù) print_message( ); /調(diào)用print_message

3、函數(shù)printstar( ); /調(diào)用printstar 函數(shù)return 0;例7.1 在主函數(shù)中調(diào)用其他函數(shù) 從用戶使用的角度看,函數(shù)有兩種: 系統(tǒng)函數(shù),即庫函數(shù)。這是由編譯系統(tǒng)提供的,用戶不必自己定義這些函數(shù),可以直接使用它們。用戶自己定義的函數(shù)。用以解決用戶的專門需要。 從函數(shù)的形式看,函數(shù)分兩類:無參函數(shù)。調(diào)用函數(shù)時不必給出參數(shù)。有參函數(shù)。在調(diào)用函數(shù)時,要給出參數(shù)。在主調(diào)函數(shù)和被調(diào)用函數(shù)之間有數(shù)據(jù)傳遞。函數(shù)的分類函數(shù)的分類即函數(shù)返回值的類型。無返回值為void類型語句序列。描述了實現(xiàn)功能的過程,并一般要最后執(zhí)行一條return語句??砂鄠€形式參數(shù)。定義了函數(shù)將從調(diào)用函數(shù)中接收多少

4、個數(shù)據(jù)及其類型7.3.1 形式參數(shù)和實際參數(shù)在調(diào)用函數(shù)時,大多數(shù)情況下,函數(shù)是帶參數(shù)的。主調(diào)函數(shù)和被調(diào)用函數(shù)之間有數(shù)據(jù)傳遞關(guān)系,數(shù)據(jù)傳遞的方向是從實參傳向形參。形參:在定義函數(shù)時函數(shù)名后面括號中的變量名稱為形式參數(shù)(formal parameter,簡稱形參)實參:在主調(diào)函數(shù)中調(diào)用一個函數(shù)時,函數(shù)名后面括號中的參數(shù)(可以是一個表達式)稱為實際參數(shù)(actual parameter,簡稱實參)。7.3 函數(shù)參數(shù)和函數(shù)的值函數(shù)參數(shù)和函數(shù)的值例例7.2 調(diào)用函數(shù)時的數(shù)據(jù)傳遞調(diào)用函數(shù)時的數(shù)據(jù)傳遞#include using namespace std;int max(int x,int y) /定義有

5、參函數(shù)maxint z; z=xy?x:y;return(z);int main( )int a,b,c; coutab; c=max(a,b); /調(diào)用max函數(shù),給定實參為a,b。函數(shù)值賦給c coutmax=cendl;return 0;運行情況如下:please enter two integer numbers:2 3max=3圖7.2有關(guān)形參與實參的說明:(1) 在定義函數(shù)時指定的形參,在未出現(xiàn)函數(shù)調(diào)用時,它們并不占內(nèi)存中的存儲單元,只有在發(fā)生函數(shù)調(diào)用時,函數(shù)max中的形參才被分配內(nèi)存單元,以便接收從實參傳來的數(shù)據(jù)。在調(diào)用結(jié)束后,形參所占的內(nèi)存單元也被釋放。(2) 實參可以是常量、

6、變量或表達式,如max(3, a+b);但要求a和b有確定的值。 (3) 在定義函數(shù)時,必須在函數(shù)首部指定形參的類型;(4) 實參與形參的類型應(yīng)相同或賦值兼容。如果實參與形參類型不同,則按不同類型數(shù)值的賦值規(guī)則進行轉(zhuǎn)換。(5) 實參變量對形參變量的數(shù)據(jù)傳遞是“值傳遞”,即單向傳遞,只由實參傳給形參,而不能由形參傳回來給實參。在調(diào)用函數(shù)時,編譯系統(tǒng)臨時給形參分配存儲單元。請注意: 實參單元與形參單元是不同的單元。圖7.3表示將實參和的值2和3傳遞給對應(yīng)的形參和。圖7.3 圖7.47.3.2函數(shù)的返回值函數(shù)的返回值說明:(1) 函數(shù)的返回值是通過函數(shù)中的return語句獲得的。return語句將被

7、調(diào)用函數(shù)中的一個確定值帶回主調(diào)函數(shù)中去。return語句后面的括號可以要,也可以不要。(2) 函數(shù)值的類型。既然函數(shù)有返回值,這個值當(dāng)然應(yīng)屬于某一個確定的類型,應(yīng)當(dāng)在定義函數(shù)時指定函數(shù)值的類型。(3) 如果函數(shù)值的類型和return語句中表達式的值不一致,則以函數(shù)類型為準,即函數(shù)類型決定返回值的類型。對數(shù)值型數(shù)據(jù),可以自動進行類型轉(zhuǎn)換。7.4.1 函數(shù)調(diào)用的一般形式 函數(shù)名(實參表列)7.4.2 函數(shù)調(diào)用的方式按函數(shù)在語句中的作用來分,可以有以下3種函數(shù)調(diào)用方式:. 函數(shù)語句把函數(shù)調(diào)用單獨作為一個語句,并不要求函數(shù)帶回一個值,只是要求函數(shù)完成一定的操作。如例7.1中的printstar( );

8、2. 函數(shù)表達式函數(shù)出現(xiàn)在一個表達式中,這時要求函數(shù)帶回一個確定的值以參加表達式的運算。如c=2*max(a,b);3. 函數(shù)參數(shù)函數(shù)調(diào)用作為一個函數(shù)的實參。如m=max(a,max(b,c); /max(b,c)是函數(shù)調(diào)用,其值作為外層max函數(shù)調(diào)用的一個實參7.4 函數(shù)的調(diào)用函數(shù)的調(diào)用函數(shù)聲明函數(shù)聲明調(diào)用表達式調(diào)用表達式函數(shù)定義函數(shù)定義實參的個數(shù)、類型及順序要與形參保持一致形式參數(shù)實際參數(shù)即所有參數(shù)的數(shù)據(jù)類型注注 意意#include /函數(shù)說明void f1 ( ) ;void f2 ( ) ;void main( ) f1( ); /函數(shù)調(diào)用void f1( ) /函數(shù)定義 cout

9、Function f1.n;f2( );void f2( ) cout y) ? 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ù)及類型和所被調(diào)用的f()函數(shù)的形參的個數(shù)及類型一一比較來判斷。()作為重載函數(shù)至少在參數(shù)個數(shù)、參數(shù)類型上有所不同。若僅在返回類型上不同,編譯器是無法區(qū)別的。如:void func(int); int func(int);void func(int);

10、 int func(int); /錯誤 int min(int ,int); int min(int ,int); int min(int,int,int);int min(int,int,int); /正確 int add(int,int); int add(int,int); double add(double,double);double add(double,double);/正確()typedef定義的類型只是給已有類型取另外一個名字,編譯器不能將其同原類型區(qū)分。如: typedef INT int;typedef INT int; void func(int x) . void f

11、unc(int x) . void func (INT x) void func (INT x) (3)重載函數(shù)一般應(yīng)具有相同的功能,否則會破壞程序的可讀性。7.7函數(shù)模板函數(shù)模板 所謂函數(shù)模板,實際上是建立一個通用函數(shù),其函數(shù)類型和形參類型不具體指定,用一個虛擬的類型來代表。這個通用函數(shù)就稱為函數(shù)模板。 在調(diào)用函數(shù)時系統(tǒng)會根據(jù)實參的類型來取代模板中的虛擬類型,從而實現(xiàn)了不同函數(shù)的功能。#include using namespace std;template T max(T a,T b,T c) if(ba) a=b; if(ca) a=c; return a;int main( )int

12、i1=185,i2=-76,i3=567,i; double d1=56.87,d2=90.23,d3=-3217.78,d; long g1=67854,g2=-912456, g3=673456,g;i=max(i1,i2,i3); d=max(d1,d2,d3); g=max(g1,g2,g3); couti_max=iendl; coutf_max=fendl; coutg_max=gendl; return 0;template 由于使用不同求值順序的編譯器而造成二義性。 #include #include int add(int x, int y); int add(int x,

13、int y); /函數(shù)聲明函數(shù)聲明 void main( )void main( ) int a=4,b=6; int a=4,b=6; int z=add( int z=add(+a,a+b+a,a+b); /); /從左至右為從左至右為5 115 11 coutzendl; / coutzendl; /從右至左為從右至左為5 105 10 int add(int x,int y) int add(int x,int y) /函數(shù)定義(實現(xiàn))函數(shù)定義(實現(xiàn)) return x+y; return x+y; 如果函數(shù)的定義在函數(shù)調(diào)用之前,則應(yīng)在函數(shù)定義中給出默認值。如果函數(shù)的定義在函數(shù)調(diào)用之后

14、,則在函數(shù)調(diào)用之前需要有函數(shù)聲明,此時必須在函數(shù)聲明中給出默認值,在函數(shù)定義時可以不給出默認值.#include using namespace std;int main( )int max(int a, int b, int c=0);int a,b,c; cinabc; coutmax(a,b,c)=max(a,b,c)endl; coutmax(a,b)=max(a,b)a) a=b; if(ca) a=c; return a;一個函數(shù)不能既作為重載函數(shù),又作為一個函數(shù)不能既作為重載函數(shù),又作為有默認參數(shù)的函數(shù)。有默認參數(shù)的函數(shù)。#include using namespace std;

15、int main( )int max(int a,int b,int c=100); int max(int a,int b); int a=8,b=-12,c=27; coutmax(a,b,c)=max(a,b,c)endl; coutmax(a,b)=max(a,b)a) a=b;if(ca) a=c; return a;int max(int a,int b) if(ab) return a;else return b; 在一個函數(shù)內(nèi)部定義的變量,只在本函數(shù)范圍內(nèi)有效,也就是說只有在本函數(shù)內(nèi)才能使用它們,在此函數(shù)以外是不能使用這些變量的。 同樣,在復(fù)合語句中定義的變量只在本復(fù)合語句范圍

16、內(nèi)有效。 這類變量稱為局部變量局部變量(local variable)。7.11 局部變量和全局變量局部變量和全局變量 1 、局部變量、局部變量2、全局變量、全局變量 在函數(shù)之外定義的變量是外部變量,稱為全局變?nèi)肿兞苛?global variable,也稱全程變量)。 全局變量的有效范圍為從定義變量的位置開始到本源文件結(jié)束。例例#include using namespace std; double Pi=3.14; int main( ) float s=0,r=7.5; s=Pi*fun(r); int l=0;l=2*Pi*r;coutl; couts; return 0; doubl

17、e fun(float x)int y=0;y=x*x;return y;局部變量說明(1) 主函數(shù)main中定義的變量也只在主函數(shù)中有效,不會因為在主函數(shù)中定義而在整個文件或程序中有效。主函數(shù)也不能使用其他函數(shù)中定義的變量。(2) 不同函數(shù)中可以使用同名的變量,它們代表不同的對象,互不干擾。它們在內(nèi)存中占不同的單元,不會混淆。(3) 可以在一個函數(shù)內(nèi)的復(fù)合語句中定義變量,這些變量只在本復(fù)合語句中有效,這種復(fù)合語句也稱為分程序或程序塊。(4) 形式參數(shù)也是局部變量,其他函數(shù)不能調(diào)用。(5) 在函數(shù)聲明中出現(xiàn)的參數(shù)名,其作用范圍只在本行的括號內(nèi)。實際上,編譯系統(tǒng)對函數(shù)聲明中的變量名是忽略的,即使

18、在調(diào)用函數(shù)時也沒有為它們分配存儲單元。例如int max(int a,int b); /函數(shù)聲明中出現(xiàn)a、b int max(int x,int y) /函數(shù)定義,形參是x、y coutxyendl; /合法,x、y在函數(shù)體中有效 coutabendl; /非法,a、b在函數(shù)體中無效編譯時認為max函數(shù)體中的a和b未經(jīng)定義。全局變量說明 (1) 設(shè)全局變量的作用是增加函數(shù)間數(shù)據(jù)聯(lián)系的渠道。(2) 建議不在必要時不要使用全局變量,因為: 全局變量在程序的全部執(zhí)行過程中都占用存儲單元,而不是僅在需要時才開辟單元。 它使函數(shù)的通用性降低了,因為在執(zhí)行函數(shù)時要受到外部變量的影響。 使用全局變量過多,會

19、降低程序的清晰性。在各個函數(shù)執(zhí)行時都可能改變?nèi)肿兞康闹担绦蛉菀壮鲥e。 因此,要限制使用全局變量。(3) 如果在同一個源文件中,全局變量與局部變量同名,則在局部變量的作用范圍內(nèi),全局變量被屏蔽,即它不起作用。變量的有效范圍稱為變量的作用域(scope)。歸納起來,變量有4種不同的作用域、文件作用域(file scope)、函數(shù)作用域(function scope)、塊作用域(block scope)和函數(shù)原型作用域(function prototype scope)。文件作用域是全局的,其他三者是局部的。除了變量之外,任何以標識符代表的實體都有作用域,概念與變量的作用域相似。#include

20、using namespace std;int main()static int m;extern int n;cout m (Y)?(X):(Y)7.16 編譯預(yù)處理(續(xù))編譯預(yù)處理(續(xù))7.16 編譯預(yù)處理(續(xù))編譯預(yù)處理(續(xù))【例】帶參數(shù)的宏定義。#define MAX(x,y) (x)(y)?(x):(y)main( ) coutMAX(a,b); cout MAX(a+m,b+n);分兩次替換:分兩次替換:將宏名將宏名 替換成字符串替換成字符串 。用實參用實參a替換形參替換形參x,實參,實參b替換形參替換形參y。程序中的兩個程序中的兩個printf語句被展開為:語句被展開為:cout

21、(b)?(a):(b); cout(b+n)?( a+m):( b+n);7.16 編譯預(yù)處理(續(xù))編譯預(yù)處理(續(xù))【例】分析下面程序運行后的輸出結(jié)果。#define MA(x) x*(x-1)main( ) int a=1,b=2; cout MA(1+a+b);分兩次替換:分兩次替換: 用用 替換。替換。用用1+a+b替換替換x。cout語句被展開為:語句被展開為:cout (1+a+b*(1+a+b-1);特別注意:特別注意:由于替換文由于替換文本中的本中的x沒沒有用括號括有用括號括起,因此,起,因此,1+a+b也不也不能用括號括能用括號括起。起。程序輸出結(jié)果:87.16 編譯預(yù)處理(續(xù))編譯預(yù)處理(續(xù))命令的一般形式格式1: #include 格式2: #include 文件名7.16編譯預(yù)處理(續(xù))編譯預(yù)處理(續(xù))例如:調(diào)用sin(x) 函數(shù)時,要在程序的開頭使用如下命令: #include 在預(yù)處理時,用cmath文件內(nèi)容替換 #include 命令行。7.

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論