版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第四章 模塊化與函數(shù),2,實(shí)際問(wèn)題,求a!b!c!的值。,3,算法,分別求出a!,b!,c! a!=1*2*3*.*a; b!=1*2*3*.*b; c!=1*2*3*.*c;,4,#include using namespace std; int main() int a,b,c,sum=0; unsigned long la,lb,lc; la=lb=lc=1; int i; cinabc; for (i=1;i=a;i+) la*=i; for (i=1;i=b;i+) lb*=i; for (i=1;i=c;i+) lc*=i; sum = la+lb+lc; couta!+b!+c!
2、=sumendl; return 0; ,5,問(wèn)題抽化成一個(gè)模塊,重復(fù)了求階乘的代碼 可以設(shè)計(jì)一個(gè)求階乘的函數(shù),這里的函數(shù)具備 求 階乘的 功能。,6,模塊化程序設(shè)計(jì)的優(yōu)點(diǎn),分而治之 代碼可重用 便于實(shí)現(xiàn) 易于維護(hù) 抽象技術(shù),7,模塊化程序設(shè)計(jì)圖示,模塊化程序設(shè)計(jì),第4章 函數(shù),9,本章學(xué)習(xí)目標(biāo),通過(guò)本章學(xué)習(xí),你能夠 了解模塊化程序設(shè)計(jì) 能夠分解復(fù)雜問(wèn)題 能夠創(chuàng)建模塊(函數(shù)) 能夠使用模塊(函數(shù)),10,本章主要內(nèi)容,函數(shù)的定義 函數(shù)的調(diào)用 遞歸函數(shù) C+標(biāo)準(zhǔn)庫(kù)函數(shù),內(nèi)聯(lián)函數(shù) 函數(shù)重載 函數(shù)模板 默認(rèn)參數(shù)(略),11,實(shí)例1模塊化,定義求階乘函數(shù),定義函數(shù)(創(chuàng)建模塊),模塊: unsigned
3、 long fac(int x) int i; unsigned long ul=1; for (i=1;i=x;i+) ul*=i; return ul; ,調(diào)用函數(shù)(使用模塊),int main() int a,b,c,sum=0; unsigned long la,lb,lc; cinabc; la = fac(a); lb = fac(b); lc = fac(c); sum = la+lb+lc; couta!+b!+c!=sumendl; return 0; ,總結(jié)規(guī)律:設(shè)計(jì)一個(gè)有子函數(shù)的程序,定義一個(gè)子函數(shù) 考慮該函數(shù)的形式參數(shù),參數(shù)類型,個(gè)數(shù) 考慮該函數(shù)是否有返回值,即考慮該函
4、數(shù)設(shè)計(jì)后是否需要得到一個(gè)值,如果 需要,則得有return 返回值。 主函數(shù)中調(diào)用子函數(shù) 如:la = fac(a);,unsigned long fac(int x) int i; unsigned long ul=1; for (i=1;i=x;i+) ul*=i; return ul; ,15,函數(shù)定義的格式,返回值類型 函數(shù)名(形式參數(shù)表) 函數(shù)體 ,模塊接口,實(shí)現(xiàn) 模塊功能,數(shù)據(jù)傳遞,16,關(guān)于函數(shù)定義的說(shuō)明,函數(shù)名:fac 標(biāo)識(shí)函數(shù),表明函數(shù)功能,與變量名命名規(guī)則相同 函數(shù)形參(int x) 傳遞數(shù)據(jù),必須是變量,不能是表達(dá)式 返回值類型(函數(shù)類型):unsigned long 返
5、回給上一層模塊的數(shù)據(jù)的類型 通過(guò)return實(shí)現(xiàn) 如果無(wú)返回值,則函數(shù)類型為void 函數(shù)體:實(shí)現(xiàn)函數(shù)的功能 ,unsigned long fac(int x) int i; unsigned long ul=1; for (i=1;i=x;i+) ul*=i; return ul; ,17,函數(shù)設(shè)計(jì)要求,執(zhí)行單一的、明確的任務(wù) 函數(shù)名表達(dá)其任務(wù) 如:factorial 內(nèi)聚性強(qiáng)、耦合性弱!,18,函數(shù)調(diào)用,unsigned long fac(int x);/ 函數(shù)原型 int main() int a,b,c,sum=0; unsigned long fac(int x);/ 函數(shù)原型 un
6、signed long la,lb,lc; cinabc; la = fac(a);/函數(shù)調(diào)用 lb = fac(b); lc = fac(c); sum = la+lb+lc; couta!+b!+c!=sumendl; return 0; ,unsigned long fac(int x) int i; unsigned long ul=1; for (i=1;i=x;i+) ul*=i; return ul; ,19,關(guān)于函數(shù)調(diào)用的說(shuō)明,調(diào)用前要給出函數(shù)原型: 類型 函數(shù)名(形參表); /注意; 例:unsigned long fac(int x); 函數(shù)調(diào)用的形式: 函數(shù)名(實(shí)參表);
7、 例:fac(a);fac(3);fac(a+4); 實(shí)參:可以是常量、變量或表達(dá)式,20,函數(shù)調(diào)用中的類型問(wèn)題,按函數(shù)原型的參數(shù)類型強(qiáng)制轉(zhuǎn)換 例: double maximum( int, int, int ); double x; x = maximum(1.1, 2.1, 3.1); x ?,21,函數(shù)原型的作用,編譯程序用以檢驗(yàn)函數(shù)的調(diào)用,以避免因錯(cuò)誤調(diào)用而導(dǎo)致運(yùn)行時(shí)錯(cuò)誤: 返回值的類型 參數(shù)的個(gè)數(shù) 參數(shù)的類型 參數(shù)的順序,設(shè)計(jì)一個(gè)函數(shù),求兩個(gè)整數(shù)的最大值的函數(shù) 在主函數(shù)中,輸入兩個(gè)整數(shù),調(diào)用這個(gè)函數(shù),得到這個(gè)兩個(gè)整數(shù)的最大值。,23,函數(shù)調(diào)用的執(zhí)行過(guò)程,使用函數(shù)是有代價(jià)的!,24,函
8、數(shù)調(diào)用中的程序控制,主調(diào)函數(shù)(caller)怎么使程序流程進(jìn)入到被調(diào)用函數(shù)呢? 通過(guò)函數(shù)名進(jìn)入被調(diào)函數(shù) 被調(diào)函數(shù)(callee)被調(diào)用以后怎么回到主調(diào)函數(shù)呢? 通過(guò)以下途徑返回主調(diào)函數(shù): return 函數(shù)結(jié)束部分的右大括號(hào),返回值類型 函數(shù)名(形式參數(shù)表),形式參數(shù)表:數(shù)據(jù)傳遞的作用,實(shí)參和形參的關(guān)系:y=f(x); 2=f(1);,26,函數(shù)的參數(shù)傳遞,兩種途徑: 按值傳遞 被調(diào)函數(shù)生成形參 實(shí)參值被復(fù)制到形參 形參的改變不會(huì)改變實(shí)參 按引用傳遞 形參使用實(shí)參的存儲(chǔ)空間 形參的改變會(huì)改變實(shí)參,27,函數(shù)參數(shù)的按值傳遞,只有在函數(shù)被調(diào)用時(shí),形參才被分配存儲(chǔ)單元。 實(shí)參可以是常量、變量或表達(dá)式
9、。 數(shù)據(jù)只能從實(shí)參傳遞給形參,即單向傳遞。 當(dāng)實(shí)參類型與形參不同時(shí),按形參類型轉(zhuǎn)換。 虛實(shí)結(jié)合:一一對(duì)應(yīng)(類型、個(gè)數(shù)、順序) 函數(shù)返回時(shí),釋放形參和局部變量所占內(nèi)存,28,例:輸入兩整數(shù)交換后輸出,void swap(int a, int b); int main() int x=5, y=10; coutx=xy=yendl; swap(x,y); coutx=xy=yendl; return 0; ,void swap(int a, int b) int t; t=a; a=b; b=t; couta=ab=bendl; 運(yùn)行結(jié)果: x=5 y=10 a=10 b=5 x=5 y=10,原
10、因何在?,30,按值傳遞,void swap( int, int ); void main(void) int x=5, y=10; swap(x, y); void swap( int a, int b) ,x, y 為實(shí)參,a, b 為形參,31,函數(shù)參數(shù)的按引用傳遞,在函數(shù)被調(diào)用時(shí)不為形參分配存儲(chǔ)單元,形參使用實(shí)參空間。 實(shí)參不能是常量或表達(dá)式,只能是變量,而且類型必需與形參類型一致。 實(shí)參和形參共享數(shù)據(jù),即雙向傳遞。,32,何謂引用?,引用是標(biāo)識(shí)符的別名 例如: int i=10;int / i? 聲明一個(gè)引用時(shí),必須同時(shí)對(duì)它進(jìn)行初始化。 一個(gè)引用一旦被初始化后,就不能改為其它對(duì)象的引
11、用。,33,例:輸入兩整數(shù)交換后輸出,void swap(int ,void swap(int 運(yùn)行結(jié)果: x=5 y=10 a=10 b=5 x=10 y=5,原因何在?,35,函數(shù)參數(shù)按引用傳遞,void swap( int void swap( int void print_message(void) cout Welcome to C+!endl;,38,2、函數(shù)形參和實(shí)參,說(shuō)明: 實(shí)參必須有確定的值 形參必須指定類型 形參與實(shí)參類型一致,個(gè)數(shù)相同 若形參與實(shí)參類型不一致,自動(dòng)按形參類型轉(zhuǎn)換函數(shù)調(diào)用轉(zhuǎn)換 形參在函數(shù)被調(diào)用前不占內(nèi)存;函數(shù)調(diào)用時(shí)為形參分配內(nèi)存;調(diào)用結(jié)束,內(nèi)存釋放,39,例
12、: 計(jì)算x的立方注意內(nèi)存,#include using namespace std; float cube(float x) return(x*x*x); int main() float a, product; couta; product=cube(a); cout Cube of a is productendl; return 0; ,x,1.2,1.2,1.728,40,3、函數(shù)的返回值 返回語(yǔ)句 形式: return(表達(dá)式); 或 return 表達(dá)式; 或 return; 功能:使程序控制從被調(diào)用函數(shù)返回到調(diào)用函數(shù)中,同時(shí)把返回值帶給調(diào)用函數(shù) 說(shuō)明: 函數(shù)中可有多個(gè)return
13、語(yǔ)句,但函數(shù)被調(diào)用后只能有一個(gè)值。 若無(wú)return語(yǔ)句,遇時(shí),自動(dòng)返回主調(diào)用函數(shù) 若函數(shù)類型與return語(yǔ)句中表達(dá)式值的類型不一致,按前者為準(zhǔn),自動(dòng)轉(zhuǎn)換-函數(shù)調(diào)用轉(zhuǎn)換 void型函數(shù),例 無(wú)返回值函數(shù) void swap(int x,int y ) int temp; temp=x; x=y; y=temp; ,例 int max(int x,int y) return (xy?x:y); ,41,例: 函數(shù)返回值類型轉(zhuǎn)換,#include using namespace std; int max(float x, float y) float z; z=xy?x:y; return(z)
14、; int main() float a,b; int c; cinab; c=max(a,b); coutMax is cendl; return 0; ,運(yùn)行結(jié)果:2.6 , 8.9 Max is 8,42,4、函數(shù)調(diào)用方式 函數(shù)語(yǔ)句: 例 printstar( ); 函數(shù)表達(dá)式: 例 m=max(a,b)*2; 函數(shù)參數(shù): 例 m=max(a,max(b,c);,可以被多次調(diào)用,相互調(diào)用 例 int f1(int x);/函數(shù)原型 int f2(int x); int f3(int x); int main() int a; f1(a); f2(a); f3(a); int f1(int
15、 x) int b; return f2(b); int f2(int x) int c; return f3(c); int f3(int x) ,43,5、函數(shù)聲明,一般形式: 函數(shù)類型 函數(shù)名(形參類型 形參名,. ); 或 函數(shù)類型 函數(shù)名(); 作用:告訴編譯系統(tǒng)函數(shù)類型、參數(shù)個(gè)數(shù)及類型,以便檢驗(yàn) 函數(shù)定義與函數(shù)聲明不同 函數(shù)聲明位置:程序的數(shù)據(jù)說(shuō)明部分(函數(shù)內(nèi)或外) 下列情況下,可不作函數(shù)聲明 若函數(shù)返回值是char或int型,系統(tǒng)自動(dòng)按int型處理 被調(diào)用函數(shù)定義出現(xiàn)在主調(diào)函數(shù)之前,44,例 函數(shù)說(shuō)明舉例,函數(shù)的嵌套調(diào)用 嵌套調(diào)用 C規(guī)定:函數(shù)定義不可嵌套,但可以嵌套調(diào)用函數(shù),例
16、如: 求三個(gè)數(shù)中最大數(shù)和最小數(shù)的差值,#include using namespace std; int dif(int x,int y,int z); int max(int x,int y,int z); int min(int x,int y,int z); int main() int a,b,c,d; cinabc; d=dif(a,b,c); coutMax-Min“dendl; return 0; ,int dif(int x,int y,int z) return max(x,y,z)-min(x,y,z); int max(int x,int y,int z) int r;
17、r=xy?x:y; return(rz?r:z); int min(int x,int y,int z) int r; r=xy?x:y; return(rz?r:z); ,例 求三個(gè)數(shù)中最大數(shù)和最小數(shù)的差值,遞歸調(diào)用 定義:函數(shù)直接或間接的調(diào)用自身叫函數(shù)的遞歸調(diào)用,說(shuō)明 C+編譯系統(tǒng)對(duì)遞歸函數(shù)的自調(diào)用次數(shù)沒(méi)有限制 每調(diào)用函數(shù)一次,在內(nèi)存堆棧區(qū)分配空間,用于存放函數(shù)變量、返回值等信息,所以遞歸次數(shù)過(guò)多,可能引起堆棧溢出,int f(int x) int y,z; z=f(y); . return(2*z); ,例4.10 有5個(gè)人坐在一起,問(wèn)第5個(gè)人多少歲?他說(shuō)比第4個(gè)人大兩歲。問(wèn)第4個(gè)人歲數(shù)
18、,他說(shuō)比第3個(gè)人大兩歲。問(wèn)第3個(gè)人,又說(shuō)比第2個(gè)人大兩歲。問(wèn)第2個(gè)人,說(shuō)比第1個(gè)人大兩歲。最后問(wèn)第1個(gè)人,他說(shuō)是10歲。請(qǐng)問(wèn)第5個(gè)人多大?,可以用式子表述如下: age(n)=10 (n=1) age(n)=age(n-1)+2 (n1),運(yùn)行結(jié)果如下:18 函數(shù)調(diào)用過(guò)程如圖所示,#include using namespace std; int age(int n) int c; if(n= =1) c=10; else c=age(n-1)+2; return(c); int main( ) cout1),遞歸總結(jié),一個(gè)問(wèn)題若要采用遞歸來(lái)解決時(shí),要滿足: 可以把要解決的問(wèn)題轉(zhuǎn)化為一個(gè)新的問(wèn)
19、題,而這個(gè)新的問(wèn)題的解法與原來(lái)的解法相同,只是所處理的對(duì)象有規(guī)律的遞增或遞減。 可以應(yīng)用這個(gè)轉(zhuǎn)化過(guò)程使問(wèn)題得到解決。 必定要有一個(gè)明確的結(jié)束遞歸的條件,一個(gè)可以得到解的基本情況。,52,遞歸算法,計(jì)算n!的遞歸算法如下: 注:其累計(jì)求積算法為: n!=1*2*3*.*(n-1)*n,53,遞歸算法,由兩部分組成: 已知部分 解基本情形:n!=1(n=0) 未知部分 與原始問(wèn)題類似,但更簡(jiǎn)單或更?。?n!=n*(n-1)!,n0,54,遞歸算法,遞歸算法的兩個(gè)過(guò)程: 遞推: 4!=43! 3!=32! 2!=21! 1!=1 未知 已知 回歸: 4!=43!=243!=32!=62!=21!=2
20、1!=1 未知 已知,55,用遞歸函數(shù)實(shí)現(xiàn)遞歸算法,int fac( int n ) if ( n = 1 ) return 1; else return ( n * fac( n - 1 ) ); ,基本情形,更簡(jiǎn)單的原始問(wèn)題,56,遞歸過(guò)程演示,5!,5*4!,4*3!,3*2!,2*1!,1,返回5*24=120,返回4*6=24,返回3*2=6,返回2*1=2,返回1,57,遞歸函數(shù)的常見(jiàn)錯(cuò)誤,忽略了基本情形,或錯(cuò)誤地編寫了遞歸步,以致程序無(wú)法運(yùn)行到基本情形,而導(dǎo)致無(wú)限遞歸,最終內(nèi)存耗盡。 忘記從遞歸函數(shù)中返回,例 有以下程序 #include using namespace std;
21、 int f(int n) if (n=1)return 1; else return f(n-1)+1; int main() int i,j=0; for(i=1;i3;i+) j+=f(i); coutjendl; return 0; 程序運(yùn)行后的輸出結(jié)果是: a)4 b)3 c)2 d)1,i f(i) j 1 1 1 2 f(2-1)+1 1+2,例:#include using namespace std; long fun(int n) long s; if( n=1| n=2 ) s=2; else s=n-fun(n-1); return s; int main() cout
22、fun(3)endl; return 0; ,運(yùn)行結(jié)果: ns 33-fun(3-1) 3-2=1,內(nèi)置函數(shù)(內(nèi)聯(lián)函數(shù)) 在編譯時(shí)將所調(diào)用函數(shù)的代碼直接嵌入到主調(diào)函數(shù)中,而不是將流程轉(zhuǎn)出去。 指定內(nèi)置函數(shù),只需在函數(shù)首行的左端加一個(gè)關(guān)鍵字inline。 例4.4 函數(shù)指定為內(nèi)置函數(shù)。 #include using namespace std;,inline int max(int,int, int); /函數(shù)聲明,注意左端有inline int main( ) int i=10,j=20,k=30,m; m=max(i,j,k); couta) a=b; /求a,b,c中的最大者 if(ca)
23、 a=c; return a; ,實(shí)參代替形參,被置換成 if (ji) i=j; if(ki) i=k; m=i;,注意:inline可以寫在聲明函數(shù)或定義函數(shù)時(shí) 優(yōu)點(diǎn):內(nèi)置函數(shù)節(jié)省運(yùn)行時(shí)間 缺點(diǎn):增加了目標(biāo)程序的長(zhǎng)度。 對(duì)內(nèi)置函數(shù)的要求: 規(guī)模很小,一般為5個(gè)語(yǔ)句以下 使用頻繁的函數(shù) 不包括復(fù)雜的控制語(yǔ)句,如循環(huán)語(yǔ)句和switch語(yǔ)句,函數(shù)重載,函數(shù)起名字注意什么? 見(jiàn)名之意 max1,max2,max3 函數(shù)調(diào)用的時(shí)候注意什么? 參數(shù)類型一致,從左到右 int max(int ,int,int) long max(long, long, long) double max(double ,
24、 double , double ),int max1(int ,int,int) long max2(long, long, long) double max3(double , double , double ),函數(shù)的重載:一組概念相同,處理對(duì)象(參數(shù))不同的過(guò)程,出于方便編程的目的,用同一個(gè)函數(shù)名字來(lái)命名的技術(shù)稱為函數(shù)重載 重載是不同的函數(shù),以參數(shù)的類型,個(gè)數(shù)和順序來(lái)分辨 函數(shù)體可以相同也可以不同,函數(shù)的重載“一名多用”,例:void print(double); void print(int); void func() print(1); / void print(int); pri
25、nt(1.0); / void print(double); print(a); / void print(int); print(3.1415f); / void pirnt(double); ,66,函數(shù)重載,特點(diǎn): 函數(shù)名相同 參數(shù)不同:類型、個(gè)數(shù)、順序不同,例4.5 求3個(gè)數(shù)中最大的數(shù)(分別考慮整數(shù)、雙精度數(shù)、長(zhǎng)整數(shù)的情況)。 #include using namespace std; int main( ) int max(int a,int b,int c); /函數(shù)聲明 double max(double a,double b,double c); /函數(shù)聲明 long max(
26、long a,long b,long c); /函數(shù)聲明 int i1,i2,i3,i; cini1i2i3; /輸入3個(gè)整數(shù) i=max(i1,i2,i3); /求3個(gè)整數(shù)中的最大者 couti_max=iendl;,double d1,d2,d3,d; cind1d2d3; d=max(d1,d2,d3); coutg1g2g3; g=max(g1,g2,g3); couta) a=b; if(ca) a=c; return a; ,double max(double a,double b,double c) if(ba) a=b; if(ca) a=c; return a; long m
27、ax(long a,long b,long c) if(ba) a=b; if(ca) a=c; return a; ,運(yùn)行情況如下: 185 -76 567 i_max=567 56.87 90.23 -3214.78 d_max=90.23 67854 -912456 673456 g_max=673456,特點(diǎn):參數(shù)類型不同,函數(shù)體一樣,例4.6參數(shù)個(gè)數(shù)不同的重載。 #include using namespace std; int main( ) int max(int a,int b,int c); /函數(shù)聲明 int max(int a,int b); /函數(shù)聲明 int a=8,
28、b=-12,c=27; cout“max(a,b,c)=“max(a,b,c)endl; cout“max(a,b)=“max(a,b)endl; return 0; ,int max(int a,int b,int c) if(ba) a=b; if(ca) a=c; return a; int max(int a,int b) if(ab) return a; else return b; 運(yùn)行情況如下: max(a,b,c)=27 max(a,b)=8 兩次調(diào)用max函數(shù)的參數(shù)個(gè)數(shù)不同,系統(tǒng)就根據(jù)參數(shù)的個(gè)數(shù)找到與之匹配的函數(shù)并調(diào)用它。,重載注意事項(xiàng),int f(int); long f(
29、int); void f(int); 調(diào)用時(shí),注意參數(shù)的不同而調(diào)用不同的函數(shù),參數(shù)個(gè)數(shù),參數(shù)類型或者參數(shù)順序3者中必須至少有一種不同,返回值類型可以相同可以不同。,72,函數(shù)模板,一種有效的編程工具: 生成若干重載函數(shù) 使用關(guān)鍵字 template,定義函數(shù)模板的形式: template 通用函數(shù)定義 在調(diào)用函數(shù)時(shí)系統(tǒng)會(huì)根據(jù)實(shí)參的類型來(lái)取代模板中的虛擬類型,從而實(shí)現(xiàn)了不同函數(shù)的功能。 類型參數(shù)可以不只一個(gè),可以根據(jù)需要確定個(gè)數(shù)。 如:template 注意: 它只適用于函數(shù)的參數(shù)個(gè)數(shù)相同而類型不同,且函數(shù)體相同的情況,如果參數(shù)的個(gè)數(shù)不同,則不能用函數(shù)模板。,函數(shù)模板,例4.7 將例4.6程序改
30、為通過(guò)函數(shù)模板來(lái)實(shí)現(xiàn)。 #include using namespace std; template /模板定義,其中T為類型參數(shù) T max(T a,T b,T c) if(ba) a=b; if(ca) a=c; return a;,int main( ) int i1=185,i2=-76,i3=567,i; double d1=56.87,d2=90.23,d3=-3214.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=ie
31、ndl; coutf_max=fendl; coutg_max=gendl; return 0; ,int max(int a,int b,int c) if(ba) a=b; if(ca) a=c; return a; ,函數(shù)在聲明時(shí)可以預(yù)先給出默認(rèn)的形參值,調(diào)用時(shí)如給出實(shí)參,則采用實(shí)參值,否則采用預(yù)先給出的默認(rèn)形參值。 例如:,有默認(rèn)參數(shù)的函數(shù),int add(int x=5,int y=6) return x+y; ,void main() add(10,20); /10+20 add(10); /10+6 add(); /5+6 ,默認(rèn)形參值必須從右向左順序聲明,并且在默認(rèn)形參值的右面
32、不能有非默認(rèn)形參值的參數(shù)。因?yàn)檎{(diào)用時(shí)實(shí)參取代形參是從左向右的順序。 例:,int add(int x,int y=5,int z=6); /正確 int add(int x=1,int y=5,int z); /錯(cuò)誤 int add(int x=1,int y,int z=6); /錯(cuò)誤,例4.8 求2個(gè)或3個(gè)正整數(shù)中的最大數(shù),用帶有默認(rèn)參數(shù)的函數(shù)實(shí)現(xiàn)。 #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)end
33、l; coutmax(a,b)=max(a,b)endl; /c取默認(rèn)值 return 0; ,int max(int a,int b,int c) if(ba) a=b; if(ca) a=c; return a; ,運(yùn)行情況如下: 14 -56 135 max(a,b,c)=135 max(a,b)=14,在一個(gè)函數(shù)內(nèi)部定義的變量是內(nèi)部變量,它只在本函數(shù)范圍內(nèi)有效,也就是說(shuō)只有在本函數(shù)內(nèi)才能使用它們,在此函數(shù)以外是不能使用這些變量的。同樣,在復(fù)合語(yǔ)句中定義的變量只在本復(fù)合語(yǔ)句范圍內(nèi)有效。這稱為局部變量(local variable)。如,局部變量和全局變量變量作用域區(qū)分,局部變量,floa
34、t f1(int a) /函數(shù)f1 int b,c; b、c有效a有效 char f2(int x, int y) /函數(shù)f2 int i,j; i、j有效x、y有效 int main( ) /主函數(shù) int m,n; int p,q; p、q在復(fù)合語(yǔ)句中有效 m、n有效 ,說(shuō)明: (1) 主函數(shù)main中定義的變量也只在主函數(shù)中有效 (2) 不同函數(shù)中可以使用同名的變量,它們代表不同的對(duì)象,互不干擾。 (3) 可以在復(fù)合語(yǔ)句中定義變量,這些變量?jī)H在本復(fù)合語(yǔ)句中有效。 (4) 形式參數(shù)也是局部變量。其他函數(shù)不能調(diào)用。 (5) 在函數(shù)聲明中出現(xiàn)的參數(shù)名,其作用范圍只在本行的括號(hào)內(nèi)。,例如 int
35、 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ù)體中無(wú)效 編譯時(shí)認(rèn)為max函數(shù)體中的a和b未經(jīng)定義。,在函數(shù)內(nèi)定義的變量是局部變量,而在函數(shù)之外定義的變量是外部變量,稱為全局變量(全程變量)。全局變量的有效范圍為從定義變量的位置開(kāi)始到本源文件結(jié)束。如,4.11.2 全局變量,int p=1,q=5;/全局變量全局變量p、q的作用范圍 float f1(int a)/定義函數(shù)f1 int b,c; char c1,c2
36、; /全局變量 全局變量c1、c2 的作用范圍 char f2 (int x, int y) /定義函數(shù)f2 int i,j; main ( )/主函數(shù) int m,n; ,4.12 變量的存儲(chǔ)類別 概述 變量是對(duì)程序中數(shù)據(jù)的存儲(chǔ)空間的抽象,編譯或函數(shù)調(diào)用時(shí)為其分配內(nèi)存單元,10,程序中使用變量名對(duì)內(nèi)存操作,變量的屬性 數(shù)據(jù)類型:變量所持有的數(shù)據(jù)的性質(zhì)(操作屬性) 存儲(chǔ)屬性 生存期:變量在內(nèi)存中的存在期間。變量在某一時(shí)刻存在-靜態(tài)變量與動(dòng)態(tài)變量(時(shí)間角度) 作用域:變量在某區(qū)域內(nèi)有效-局部變量與全局變量(空間角度) 變量的存儲(chǔ)類型 auto -自動(dòng)型 register-寄存器型 static
37、-靜態(tài)型 extern -外部型 變量定義格式: 存儲(chǔ)類型 數(shù)據(jù)類型 變量表;,4.12 變量的存儲(chǔ)類別 概述 變量是對(duì)程序中數(shù)據(jù)的存儲(chǔ)空間的抽象,如: int sum; auto int a,b,c; register int i; static float x,y;,動(dòng)態(tài)變量與靜態(tài)變量 存儲(chǔ)方式 靜態(tài)存儲(chǔ):程序運(yùn)行期間分配固定存儲(chǔ)空間 動(dòng)態(tài)存儲(chǔ):程序運(yùn)行期間根據(jù)需要?jiǎng)討B(tài)分配存儲(chǔ)空間 內(nèi)存用戶區(qū),生存期 靜態(tài)變量:從程序開(kāi)始執(zhí)行到程序結(jié)束 動(dòng)態(tài)變量:從包含該變量定義的函數(shù)開(kāi)始執(zhí)行至函數(shù)執(zhí)行結(jié)束,局部變量與全局變量 局部變量-內(nèi)部變量 定義:在函數(shù)內(nèi)定義,只在本函數(shù)內(nèi)有效 說(shuō)明: main中定
38、義的變量只在main中有效 不同函數(shù)中同名變量,占不同內(nèi)存單元 形參屬于局部變量 可定義在復(fù)合語(yǔ)句中有效的變量 局部變量可用存儲(chǔ)類型:auto register static (默認(rèn)為auto),例 不同函數(shù)中同名變量,#include using namespace std; int main() int a,b; int sub( ); a=3; b=4; coutmain: a“,”bendl; sub( ); coutmain: a“,”bendl; return 0; int sub( ) int a,b; a=6; b=7; cout sub: a“,”bendl; ,運(yùn)行結(jié)果:
39、main:a=3,b=4 sub:a=6,b=7 main:a=3,b=4,全局變量-外部變量 定義:在函數(shù)外定義,可為本文件所有函數(shù)共用 有效范圍:從定義變量的位置開(kāi)始到本源文件結(jié)束,及有extern說(shuō)明的其它源文件,應(yīng)盡量少使用全局變量,因?yàn)椋?全局變量在程序全部執(zhí)行過(guò)程中占用存儲(chǔ)單元 降低了函數(shù)的通用性、可靠性,可移植性 降低程序清晰性,容易出錯(cuò),定義 說(shuō)明 次數(shù): 只能1次 可說(shuō)明多次 位置: 所有函數(shù)之外 函數(shù)內(nèi)或函數(shù)外 分配內(nèi)存: 分配內(nèi)存,可初始化 不分配內(nèi)存,不可初始化,外部變量說(shuō)明: extern 數(shù)據(jù)類型 變量表;,外部變量定義與外部變量說(shuō)明不同,若全局變量與局部變量同名,
40、則全局變量被屏蔽,外部變量可用存儲(chǔ)類型:缺省 或 static,float max,min; float average(float array, int n) int i; float sum=array0; max=min=array0; for(i=1;imax) max=arrayi; else if(arrayimin) min=arrayi; sum+=arrayi; return(sum/n); main() int i; float ave,score10; /*Input */ ave=average(score,10); coutmax= maxmin=“ minavera
41、ge=“aveendl; ,extern char c1,c2;,extern char c1,c2;,運(yùn)行結(jié)果:max=13,#include using namespace std; extern int a,b; int max() int z; z=ab?a:b; return(z); int main() coutmax=“max()endl; return 0; int a=13,b=-8;,運(yùn)行結(jié)果:max=8,int i; #include using namespace std; int main() void prt(); for(i=0;i5;i+) prt( ); vo
42、id prt( ) for(i=0;i5;i+) cout“*”; coutendl; ,例 外部變量副作用,運(yùn)行結(jié)果:*,作用域分類,全局 局部”可見(jiàn)” “不可見(jiàn)” int a=5; int main() void f(); int b=5; a=1; f(); void f() int c=1; a=5; 若全局變量和局部變量同名,全局變量被屏蔽。 若多個(gè)函數(shù)中出現(xiàn)局部變量同名的情況,同名的局部變量之間沒(méi)有任何關(guān)系,相互獨(dú)立。,存儲(chǔ)方式分類按在內(nèi)存中存在的時(shí)間,靜態(tài)存儲(chǔ)占有固定的存儲(chǔ)單元 動(dòng)態(tài)存儲(chǔ)動(dòng)態(tài)隨機(jī)的存儲(chǔ)單元 4種存儲(chǔ)類型 auto -自動(dòng)型 register-寄存器型 static
43、 -靜態(tài)型 extern -外部型,如: int sum; auto int a,b,c; register int i; static float x,y;,局部變量默認(rèn)為auto型,如int a=3; 局部static變量具有全局壽命和局部可見(jiàn)性 局部static變量具有可繼承性即占有的存儲(chǔ)單元不釋放,在下一次調(diào)用函數(shù)時(shí),該變量保留上一次函數(shù)調(diào)用結(jié)束時(shí)的值。 extern不是變量定義,可擴(kuò)展外部變量作用域,例 auto 變量的作用域同名局部變量,#include using namespace std; int main() int x=1; void prt(void); int x=3
44、; prt( ); cout“2nd x=”xendl; cout“1st x=”xendl; return 0; void prt( ) int x=5; cout“3th x=”xendl; ,運(yùn)行結(jié)果: 3th x=5 2nd x=3 1st x=1,#include using namespace std; int main() void increment(void); increment(); increment(); increment(); return 0; void increment(void) int x=0; x+; coutxendl; ,例 局部靜態(tài)變量值具有可繼
45、承性,運(yùn)行結(jié)果:1 1 1,#include using namespace std; int main() void increment(void); increment(); increment(); increment(); return 0; void increment(void) static int x=0; x+; coutxendl; ,運(yùn)行結(jié)果:1 2 3,例 變量的壽命與可見(jiàn)性,#include int i=1; main() static int a; register int b=-10; int c=0; cout-MAIN-n“endl; couti: i a:
46、a “b:” b“ c:” c; c=c+8; other(); cout-MAIN-n“endl; couti: i a: a “b:” b“ c:” c; i=i+10; other(); ,other() static int a=2; static int b; int c=10; a=a+2; i=i+32; c=c+5; cout-OTHER-“endl; couti: i a: a “b:” b“ c:” c; b=a; ,-Main- i:1 a:0 b:-10 c:0,-Other- i:33 a:4 b:0 c:15,-Main- i:33 a:0 b:-10 c:8,-O
47、ther- i:75 a:6 b:4 c:15,8,4,33,15,4,43,6,75,15,6,#include using namespace std; int main() void gx(),gy(); extern int x,y; cout“1: x=”x“ty=“yendl; y=246; gx(); gy(); void gx() extern int x,y; x=135; cout“2: x=”x“ty=“yendl; int x,y; void gy() cout“3: x=”x“ty=“yendl; ,例 用extern擴(kuò)展外部變量作用域,運(yùn)行結(jié)果: 1: x=0 y=
48、0 2: x=135 y=246 3: x=135 y=246,例 引用其它文件中的外部變量,例 引用其它文件中的變量,輸出ab和a的m次方,Ch7.cpp,Ch8.cpp,運(yùn)行結(jié)果: Enter the number a and its power: 2,3 2*3=6 2*3=8,一個(gè)變量除了數(shù)據(jù)類型以外,還有3種屬性: 存儲(chǔ)類別 C+允許使用auto,static,register和extern 4種存儲(chǔ)類別。 作用域 指程序中可以引用該變量的區(qū)域。 存儲(chǔ)期 指變量在內(nèi)存的存儲(chǔ)期限。 以上3種屬性是有聯(lián)系的,程序設(shè)計(jì)者只能聲明變量的存儲(chǔ)類別,通過(guò)存儲(chǔ)類別可以確定變量的作用域和存儲(chǔ)期。,4
49、.13 變量屬性小結(jié),變量存儲(chǔ)類型,4.14 關(guān)于變量的聲明和定義,把建立存儲(chǔ)空間的聲明稱為定義 而把不需要建立存儲(chǔ)空間的聲明稱為聲明 例如 函數(shù)的聲明是函數(shù)的原型, 函數(shù)的定義是函數(shù)功能的確立。,int main( ) extern int a; /聲明a是一個(gè)已定義的外部變量 int a; /是定義,定義a為整型外部變量,用static來(lái)聲明一個(gè)變量 對(duì)局部變量用static聲明,使該變量在本函數(shù)調(diào)用結(jié)束后不釋放,整個(gè)程序執(zhí)行期間始終存在,使其存儲(chǔ)期為程序的全過(guò)程。 全局變量用static聲明,則該變量的作用域只限于本文件模塊(即被聲明的文件中)。 用auto,register,stati
50、c聲明變量時(shí),是在定義變量的基礎(chǔ)上加上這些關(guān)鍵字,而不能單獨(dú)使用。 例如: static a; 是不合法的,應(yīng)寫成static int a;,static靜態(tài)局部變量的例子,輸出15的階乘值(即1!,2!,3!,4!,5!) #include using namespace std; int main( ) unsigned long fac(int n); for (int i =1;i=5;i+) coutfac(i); return 0; unsigned long fac(int n) unsigned long f=1; for(int i=1;i=n;i+) f*=i; retur
51、n f; ,例 文件file1.c int a; main( ) . . f2; . f1; . f1( ) auto int b; f2; . f2( ) static int c; ,內(nèi)部函數(shù) 函數(shù)只能被本文件中其他函數(shù)所調(diào)用 內(nèi)部函數(shù)定義:,static 類型標(biāo)識(shí)符 函數(shù)名(形參表),外部函數(shù) 函數(shù)能被其他文件調(diào)用 外部函數(shù)定義: 在函數(shù)首部的最左端冠以關(guān)鍵字extern 如果在定義函數(shù)時(shí)省略extern,則默認(rèn)為外部函數(shù),如: extern int fun (int a, int b),extern 類型標(biāo)識(shí)符 函數(shù)名(形參表),4.15 內(nèi)部函數(shù)和外部函數(shù),例4.15 輸入兩個(gè)整數(shù),
52、要求輸出其中的大者。file1.cpp(文件) #include using namespace std; int main( ) extern int max(int,int); int a,b; cinab; coutmax(a,b)endl; return 0; ,file2.cpp(文件2) int max(int x,int y) int z; z=xy?x:y; return z; ,運(yùn)行情況如下: 7 -34 7,在計(jì)算機(jī)上運(yùn)行一個(gè)含多文件的程序時(shí),需要建立一個(gè)項(xiàng)目文件(project file),在該項(xiàng)目文件中包含程序的各個(gè)文件。,作用:對(duì)源程序編譯之前對(duì)程序中特殊的命令進(jìn)行處
53、理,生成擴(kuò)展C+源程序 種類 宏定義 #define 文件包含 #include 條件編譯 #if-#else-#endif等 格式: “#”開(kāi)頭 占單獨(dú)書(shū)寫行 語(yǔ)句尾不加分號(hào),4.16 預(yù)處理命令,#include 包含指令 將一個(gè)源文件嵌入到當(dāng)前源文件中該點(diǎn)處。 #include 按標(biāo)準(zhǔn)方式搜索,文件位于C+系統(tǒng)目錄的include子目錄下 #include文件名 首先在當(dāng)前目錄中搜索,若沒(méi)有,再按標(biāo)準(zhǔn)方式搜索。 #define 宏定義指令 定義符號(hào)常量,很多情況下已被const定義語(yǔ)句取代。 定義帶參數(shù)宏,已被內(nèi)聯(lián)函數(shù)取代。 #undef 刪除由#define定義的宏,使之不再起作用。,#include 包含指令作用相當(dāng)于寫幾十行、幾百行甚至更多行的內(nèi)容。 在文件頭部的被包含的文件成為“頭文件” 對(duì)類型的聲明(類,自定義的類型) 函數(shù)聲明 內(nèi)置函數(shù)的定義 宏定義 全局變量定義 根據(jù)需要包
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年蛋炒午餐肉食品加工機(jī)維修(加工機(jī)故障排除)試題及答案
- 2025年高職第一學(xué)年(家政服務(wù))高端護(hù)理階段測(cè)試題及答案
- 2025年高職(應(yīng)用化工技術(shù))化工儀表試題及答案
- 2025年大學(xué)社會(huì)研究方法(調(diào)研數(shù)據(jù)處理)試題及答案
- 2025年中職機(jī)械類(機(jī)械制圖基礎(chǔ))試題及答案
- 2025年中職非金屬材料(材料加工技術(shù))試題及答案
- 2025年高職第二學(xué)年(康復(fù)治療技術(shù))言語(yǔ)治療技術(shù)試題及答案
- 2025年高職電子信息工程技術(shù)(電子信息工程應(yīng)用)試題及答案
- 2025年中職職業(yè)衛(wèi)生技術(shù)與管理(職業(yè)衛(wèi)生管理)期末試題
- 2025年高職(藥事管理與法規(guī))法規(guī)應(yīng)用單元測(cè)試試題及答案
- 廣東省花都亞熱帶型巖溶地區(qū)地基處理與樁基礎(chǔ)施工技術(shù):難題破解與方案優(yōu)化
- 生鮮乳安全生產(chǎn)培訓(xùn)資料課件
- 基于知識(shí)圖譜的高校學(xué)生崗位智能匹配平臺(tái)設(shè)計(jì)研究
- GB 4053.3-2025固定式金屬梯及平臺(tái)安全要求第3部分:工業(yè)防護(hù)欄桿及平臺(tái)
- 2026年《必背60題》高校專職輔導(dǎo)員高頻面試題包含詳細(xì)解答
- 2026年八年級(jí)生物上冊(cè)期末考試試卷及答案
- 工程顧問(wèn)協(xié)議書(shū)
- 2026年沃爾瑪財(cái)務(wù)分析師崗位面試題庫(kù)含答案
- GA 1016-2012槍支(彈藥)庫(kù)室風(fēng)險(xiǎn)等級(jí)劃分與安全防范要求
- 220kv輸電線路工程施工組織設(shè)計(jì)
- (完整)中考英語(yǔ)??嫉?00個(gè)高頻詞匯
評(píng)論
0/150
提交評(píng)論