2014c課件第5章函數(shù)_第1頁(yè)
2014c課件第5章函數(shù)_第2頁(yè)
2014c課件第5章函數(shù)_第3頁(yè)
2014c課件第5章函數(shù)_第4頁(yè)
2014c課件第5章函數(shù)_第5頁(yè)
已閱讀5頁(yè),還剩115頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

練習(xí)編程求xn在任一給定點(diǎn)x處的值第五章模塊化程序設(shè)計(jì)

——函數(shù)

5.1函數(shù)的定義與調(diào)用

5.5作用域與存儲(chǔ)類型

5.4函數(shù)調(diào)用機(jī)制

5.3全局變量和局部變量

5.2函數(shù)的參數(shù)傳遞,返回值及函數(shù)原型說明

5.10

編譯預(yù)處理

5.9頭文件與多文件結(jié)構(gòu)

5.8C++的系統(tǒng)庫(kù)函數(shù)

5.7函數(shù)的一些高級(jí)議題

5.6函數(shù)的遞歸調(diào)用

5.1

函數(shù)的定義與調(diào)用main()fun2()fun1()fun3()Fun1_1()Fun2_1()Fun2_2()圖5.1函數(shù)調(diào)用層次關(guān)系5.1.1

函數(shù)與模塊化程序設(shè)計(jì)5.1.2函數(shù)的定義1.函數(shù)定義格式為:

●無(wú)參函數(shù)<數(shù)據(jù)類型><函數(shù)名>(void){<函數(shù)體>}●有參函數(shù)<數(shù)據(jù)類型><函數(shù)名>(<形式參數(shù)表>){<函數(shù)體>}

說明:1)數(shù)據(jù)類型——函數(shù)返回值的類型??梢允侨我獾念愋?,無(wú)返回則為void型。

2)函數(shù)名——是一自定義標(biāo)識(shí)符。

3)函數(shù)體——由聲明部分和語(yǔ)句部分構(gòu)成。例:下面無(wú)參函數(shù)的功能是打印一個(gè)表頭voidTableHead(){cout<<″****************″<<endl;

cout<<″*example*″<<endl;cout<<″****************″<<endl;}4)形式參數(shù)——由形式參數(shù)及其所屬類型構(gòu)成,其格式與變量定義相同。形式參數(shù)表——多個(gè)形式參數(shù)說明之間用逗號(hào)分隔。5)函數(shù)定義具有“外部性”2.舉例:無(wú)返回值例:下面函數(shù)的功能是返回兩個(gè)整數(shù)中較大一個(gè)的值

intmaximun(inta,intb){intmax; if(a>=b)max=a; elsemax=b;returnmax;}3.函數(shù)返回與return語(yǔ)句

return<表達(dá)式>;表達(dá)式可以缺省5.1.3

函數(shù)的調(diào)用●無(wú)參函數(shù)的調(diào)用格式為:

<函數(shù)名>()●有參函數(shù)的調(diào)用格式為:

<函數(shù)名>(實(shí)際參數(shù)表)說明:(1)實(shí)際參數(shù)——簡(jiǎn)稱實(shí)參??梢允浅?shù)、變量或表達(dá)式;其類型必須與對(duì)應(yīng)形參匹配。(2)實(shí)際參數(shù)表——用逗號(hào)分隔,通常其實(shí)參個(gè)數(shù)要與對(duì)應(yīng)形參個(gè)數(shù)相等。(3)函數(shù)名——已定義的函數(shù)的名?!纠?.1】

輸入兩個(gè)實(shí)數(shù),輸出其中較大的數(shù)。其中求兩個(gè)實(shí)數(shù)中的較大數(shù)用函數(shù)完成。程序如下://文件名:Ex4_1.cpp#include<iostream.h>float

Max(floata,floatb){ return(a>=b?a:b);}voidmain(){ floatx,y,max; cout<<"輸入兩個(gè)實(shí)數(shù):"<<endl; cin>>x>>y; max=Max(x,y); cout<<x<<"和"<<y<<"中較大數(shù)為"<<max<<endl;}main()函數(shù)調(diào)用max(2.5,4.7)函數(shù)max(2.5,4.7)return4.7主程序后續(xù)語(yǔ)句(4)任何C++程序都是從main函數(shù)開始執(zhí)行的,其它函數(shù)只有在被調(diào)用時(shí)才執(zhí)行。DryRunTableStopDisplaynNum1,nNum2numericnNum1,nNum2nNum1=1,nNum2=100IsnNum1<nNum2?

NoYes

nNum1=3*nNum1nNum2=nNum2-nNum1-208161278899731001nNum2nNum1Exercise:What’stheoutputoftheFlowchart?回顧1.函數(shù)定義格式

<數(shù)據(jù)類型><函數(shù)名>(<形式參數(shù)表>){<函數(shù)體>}

2.函數(shù)的調(diào)用格式

<函數(shù)名>(實(shí)際參數(shù)表)5.1.4

函數(shù)模塊設(shè)計(jì)的三步曲方法第1步:確定函數(shù)模塊的功能。(并給出函數(shù)名)第2步:確定函數(shù)模塊的界面(接口)。(1)傳入信息:待處理的原始數(shù)據(jù)。(2)返回信息:數(shù)據(jù)處理的結(jié)果(現(xiàn)只考慮至多一個(gè)返回信息)函數(shù)模塊傳入信息返回信息第3步:確定函數(shù)模塊的形參及函數(shù)功能實(shí)現(xiàn)。注:目前理解,無(wú)傳入信息為無(wú)參函數(shù),否則為有參函數(shù)。若無(wú)返回信息,則函數(shù)為void型例:

用函數(shù)實(shí)現(xiàn)求兩個(gè)整數(shù)的最大值

分析:(1)功能:求兩個(gè)數(shù)的最大值(函數(shù)名max)

(2)模塊界面:

●傳入信息:兩個(gè)數(shù)

●返回信息:兩個(gè)數(shù)的較大者

求兩數(shù)較大者a,b較大者(作為函數(shù)值返回)(3)實(shí)現(xiàn):intmax(inta,intb){return(a>=b?a:b);}要注意兩者類型的一致voidmain(){ intm,n; floatresult; cin>>m>>n; result=cmn(m,n); cout<<“result=”<<result<<endl;}練習(xí):(用函數(shù)實(shí)現(xiàn))1.素?cái)?shù)問題。2.百分制成績(jī)轉(zhuǎn)換成五分制成績(jī)。1.分析:(1)功能:判斷一自然數(shù)是否是素?cái)?shù)(函數(shù)名isPrime)

(2)界面:

●傳入信息:一個(gè)自然數(shù)n

●返回信息:是否是素?cái)?shù)的信息(3)實(shí)現(xiàn):boolisPrime(intn){<函數(shù)體>}練習(xí):P744.34.4用模塊化程序設(shè)計(jì)方法

4.3編程求所有的三位的“水仙花數(shù)”。

(用一個(gè)函數(shù)判斷一個(gè)三位數(shù)是否是水仙花數(shù))4.4編程求1000以內(nèi)所有的“完數(shù)”。完全數(shù)(Perfectnumber),又稱完美數(shù)或完備數(shù),是一些特殊的自然數(shù)。它所有的真因子(即除了自身以外的約數(shù))的和(即因子函數(shù)),恰好等于它本身。5.2函數(shù)的參數(shù)傳遞、返回值及函數(shù)原型說明

5.2.1函數(shù)的參數(shù)傳遞及傳值調(diào)用

5.2.3函數(shù)原型說明5.2.2

函數(shù)返回值

5.2.1

函數(shù)的參數(shù)傳遞及傳值調(diào)用(COPY方式)

在進(jìn)行函數(shù)調(diào)用時(shí),實(shí)參(調(diào)用者)與對(duì)應(yīng)形參(定義者)之間進(jìn)行了數(shù)據(jù)傳遞。數(shù)據(jù)傳遞的方式有三種:實(shí)參形參實(shí)參形參實(shí)參形參(1)(2)(3)傳值方式copy方式本章主要講解第一種方式,即傳值方式。形參與實(shí)參分別占用不同的存儲(chǔ)單元,實(shí)參將其值傳遞(copy方式)給對(duì)應(yīng)的形參,而形參的值在函數(shù)內(nèi)的改變不影響對(duì)應(yīng)的實(shí)參的值。floatmax(floata,floatb){ return(a>=b?a:b);}voidmain(){ floatx,y,maximun; cout<<"輸入兩個(gè)實(shí)數(shù):"<<endl; cin>>x>>y; maximun=max(x,y); cout<<x<<"和"<<y<<"中較大數(shù)為"<<maximun<<endl;}實(shí)參形參xy2.54.74.72.5ab程序?qū)嵗篶h5_ex4.cpp調(diào)用power(4.6,3)函數(shù)power(4.6,3)return97.336

主程序后續(xù)語(yǔ)句n=3x=4.6c=‘a(chǎn)’【例5.2】

說明實(shí)參和形參對(duì)應(yīng)關(guān)系的示例。//文件名:Ex4_2.cpp#include<iostream.h>#include<math.h>floatpower(floatx,intn){//求x的n次冪

floatpow=1; while(n--)pow*=x; returnpow;}voidmain(){intn=3; floatx=4.6; charc='a'; cout<<"power("<<x<<','<<n<<")="<<power(x,n)<<endl; cout<<"power("<<c<<','<<n<<")="<<power(c,n)<<endl; cout<<"power("<<n<<','<<x<<")="<<power(2,7)<<endl;}【例5.2】

說明實(shí)參和形參對(duì)應(yīng)關(guān)系的示例。//文件名:Ex4_2.cpp#include<iostream.h>#include<math.h>floatpower(floatx,intn){//求x的n次冪

floatpow=1; while(n--)pow*=x; returnpow;}voidmain(){intn=3; floatx=4.6; charc='a'; cout<<"power("<<x<<','<<n<<")="<<power(x,n)<<endl; cout<<"power("<<c<<','<<n<<")="<<power(c,n)<<endl; cout<<"power("<<n<<','<<x<<")="<<power(n,x)<<endl;}調(diào)用power(‘a(chǎn)’,3)函數(shù)power(‘a(chǎn)’,3)return912673

主程序后續(xù)語(yǔ)句n=3x=4.6c=‘a(chǎn)’【例5.2】

說明實(shí)參和形參對(duì)應(yīng)關(guān)系的示例。//文件名:Ex4_2.cpp#include<iostream.h>#include<math.h>floatpower(floatx,intn){//求x的n次冪

floatpow=1; while(n--)pow*=x; returnpow;}voidmain(){intn=3; floatx=4.6; charc='a'; cout<<"power("<<x<<','<<n<<")="<<power(x,n)<<endl; cout<<"power("<<c<<','<<n<<")="<<power(c,n)<<endl; cout<<"power("<<n<<','<<x<<")="<<power(n,x)<<endl;}調(diào)用power(3,4.6)函數(shù)power(3,4)return81

主程序后續(xù)語(yǔ)句n=3x=4.6c=‘a(chǎn)’5.2.2函數(shù)返回值return語(yǔ)句的一般格式為:

return<表達(dá)式>;或

return;(不帶返回值的返回方式)注:(1)在程序的任何地方執(zhí)行到return語(yǔ)句,則函數(shù)執(zhí)行完畢返回。

(2)允許在不同情況下返回不同的值。例:下面函數(shù)的功能是返回兩個(gè)整數(shù)中較大一個(gè)的值

版1:

intmax(inta,intb){return(a>=b?a:b);}版2:

intmax(inta,intb){if(a>=b)returna;

elsereturnb;}版3:intmax(inta,intb){intc;if(a>=b)c=a;elsec=b;returnc;}練習(xí)編寫程序,求兩個(gè)自然數(shù)m和n的最大公約數(shù)和最小公倍數(shù)。【例5.3】設(shè)計(jì)函數(shù),根據(jù)三角形的三邊長(zhǎng)求面積。分析:函數(shù)為計(jì)算三角形面積,一般三角形返回面積值,若不能構(gòu)成三角形則返回-1。設(shè)計(jì)一個(gè)主函數(shù)完成函數(shù)測(cè)試。根據(jù)返回值情況輸出相應(yīng)結(jié)果??偟牧鞒蹋海?)輸入3個(gè)實(shí)數(shù)a,b,c(2)判斷:若a,b,c不能構(gòu)成三角形三條邊,則輸出錯(cuò)誤信息;否則,根據(jù)公式計(jì)算三角形面積,并輸出;

輸入a,b,c構(gòu)成三角形?YN計(jì)算三角形面積輸出面積輸出數(shù)據(jù)錯(cuò)誤判斷構(gòu)成三角形?a,b,c是否構(gòu)成(bool)求三角形面積a,b,c面積(1)判斷是否構(gòu)成三角形?(isTriangle)boolisTriangle(floata,floatb,floatc){}(2)計(jì)算三角形面積(calculateTriangleArea)floatcalculateTriangleArea(floata,floatb,floatc){}#include<iostream.h>#include<math.h>

bool

isTriangle(floata,floatb,floatc)//判斷是否構(gòu)成三角形{if((a+b<=c)||(a+c<=b)||(b+c<=a))returnfalse; returntrue;}float

calculateArea(floata,floatb,floatc)//計(jì)算三角形面積{ floats=(a+b+c)/2; returnsqrt(s*(s-a)*(s-b)*(s-c));}voidmain(){floata,b,c; cin>>a>>b>>c; if(isTriangle(a,b,c)) cout<<"三角形面積="<<calculateArea(a,b,c); else cout<<"不能構(gòu)成三角形!"<<endl;}ch5_ex5.3.cpp5.2.3

函數(shù)原型說明

函數(shù)原型是一條以分號(hào)結(jié)束的語(yǔ)句,實(shí)際上就是所定義函數(shù)的函數(shù)頭,形如:<函數(shù)返回值類型><函數(shù)名>([<形參表>]);

【例5.1】

輸入兩個(gè)實(shí)數(shù),輸出其中較大的數(shù)。其中求兩個(gè)實(shí)數(shù)中的較大數(shù)用函數(shù)完成。程序如下://文件名:Ex5_1.cpp#include<iostream.h>floatmax(floatx,floaty){ return(x>=y?x:y);}voidmain(){ floatx,y; cout<<"輸入兩個(gè)實(shí)數(shù):"<<endl; cin>>x>>y; cout<<x<<"和"<<y<<"中較大數(shù)為"<<max(x,y)<<endl;}【例5.1】

程序修改如下://文件名:Ex5_1.cpp#include<iostream.h>voidmain(){ floatx,y; cout<<"輸入兩個(gè)實(shí)數(shù):"<<endl; cin>>x>>y; cout<<x<<"和"<<y<<"中較大數(shù)為"<<max(x,y)<<endl;}floatmax(floatx,floaty){ return(x>=y?x:y);}floatmax(float,float);函數(shù)聲明,函數(shù)原形#include<iostream.h>#include<math.h>

bool

isTriangle(float,float,float);//判斷是否構(gòu)成三角形float

calculateArea(float,float,float);//計(jì)算三角形面積voidmain(){floata,b,c; cin>>a>>b>>c; if(isTriangle(a,b,c)

==true) cout<<"三角形面積="<<calculateArea(a,b,c); else cout<<"不能構(gòu)成三角形!"<<endl;}bool

isTriangle(floata,floatb,floatc)//判斷是否構(gòu)成三角形{if((a+b<=c)||(a+c<=b)||(b+c<=a))returnfalse; returntrue;}float

calculateArea(floata,floatb,floatc)//計(jì)算三角形面積{ floats=(a+b+c)/2; returnsqrt(s*(s-a)*(s-b)*(s-c));}ch5_ex5.3.cpp

下面是一個(gè)使用結(jié)構(gòu)化程序設(shè)計(jì)思想開發(fā)的企業(yè)管理報(bào)表(財(cái)務(wù)報(bào)表、工程報(bào)表、市場(chǎng)報(bào)表)程序的框架。#include<iostream.h>voidmenu_print();voidaccount_report();//財(cái)務(wù)報(bào)表voidengineering_report();//工程報(bào)表voidmarketing_report();//市場(chǎng)報(bào)表

voidmain(){intchoice;while(1){menu_print();cin>>choice;switch(choice){case1:account_report();break;//財(cái)務(wù)報(bào)表

case2:engineering_report();break;//工程報(bào)表

case3:marketing_report();break;//市場(chǎng)報(bào)表

case0:return;}}}程序:ch5_ex2.cppvoidmenu_print(){cout<<”系統(tǒng)功能:”<<endl;cout<<”1 財(cái)務(wù)報(bào)表”<<endl;cout<<”2 工程報(bào)表”<<endl;cout<<”3 市場(chǎng)報(bào)表”<<endl;cout<<”0 退出”<<endl;cout<<”選擇業(yè)務(wù)序號(hào):”;}voidaccount_report(){//生成財(cái)務(wù)報(bào)表

}voidengineering_report(){//生成工程報(bào)表

}voidmarketing_report(){//生成市場(chǎng)報(bào)表;

}【例5.4】

輸出所有滿足下列條件的正整數(shù)m:10<m<1000且m、m2、m3均為回文數(shù)。分析:回文指左右對(duì)稱的序列。如121、353等就是回文數(shù)。判斷整數(shù)是否回文數(shù)用函數(shù)實(shí)現(xiàn),其思想是將該數(shù)各位拆開后反向組成新的整數(shù),如果該整數(shù)與原數(shù)相等則為回文數(shù)。程序框架如下://文件名:Ex4_4.cpp#include<iostream.h>#include<iomanip.h>boolpalindrome(int); //函數(shù)原型,判斷一個(gè)數(shù)是否是回文數(shù)voidmain()//采用結(jié)構(gòu)化程序設(shè)計(jì)方法:自頂向下、逐步求精、模塊化設(shè)計(jì){for(intm=11;m<1000;m++)if(palindrome(m)&&palindrome(m*m)&&palindrome(m*m*m)) cout<<m<<m*m<<m*m*m<<endl;}回文函數(shù)palindrome(int)的設(shè)計(jì):

intreverse(int);//函數(shù)原型,將一個(gè)數(shù)進(jìn)行逆置操作boolpalindrome(intm){//判斷m是否是回文數(shù),若是則返回1,否則返回0if(m==reverse(m))returntrue;elsereturnfalse;}逆置操作函數(shù)intreverse(int))的設(shè)計(jì)原理:

m=5623轉(zhuǎn)換成n=3265(1)k=m%10(k=3)m=m/10(m=562)n=n*10+k(n=3)初始:m=5623n=0(2)k=m%10(k=2)m=m/10(m=56)n=n*10+k(n=32)(3)k=m%10(k=6)m=m/10(m=5)n=n*10+k(n=326)(4)k=m%10(k=5)m=m/10(m=0)n=n*10+k(n=3265)(5)轉(zhuǎn)換完畢returnn;逆置操作函數(shù)intreverse(int)的實(shí)現(xiàn)intreverse(intm)

{intk,n=0;while(m>0){k=m%10;n=n*10+k;m/=10;}returnn;}程序:ch5_ex1.cppintpalindrome(intm){if(m==reverse(m))return1;elsereturn0;}mm*mm*m*mm=11調(diào)用palindrom(11)函數(shù)palindrom(11)為真return1111211331調(diào)用palindrom(121)函數(shù)palindrom(121)為真return1調(diào)用palindrom(1331)函數(shù)palindrom(1331)為真return1打印,循環(huán)voidmain(){ cout<<setw(10)<<'m'<<setw(20)<<"m*m"<<setw(20)<<"m*m*m"<<endl; for(intm=11;m<1000;m++) if(palindrome(m)&&palindrome(m*m)&&palindrome(m*m*m)) cout<<setw(10)<<m<<setw(20)<<m*m<<setw(20)<<m*m*<<endl;}m=11mm*mm*m*m12調(diào)用palindrom(12)函數(shù)palindrom(12)為假return0繼續(xù)循環(huán)111211331intpalindrome(intm){if(m==reverse(m))return1;elsereturn0;}voidmain(){ cout<<setw(10)<<'m'<<setw(20)<<"m*m"<<setw(20)<<"m*m*m"<<endl; for(intm=11;m<1000;m++) if(palindrome(m)&&palindrome(m*m)&&palindrome(m*m*m)) cout<<setw(10)<<m<<setw(20)<<m*m<<setw(20)<<m*m*<<endl;}m=998mm*mm*m*m101102011030301111123211367631999調(diào)用palindrom(999)函數(shù)palindrom(999)為真return0結(jié)束111211331調(diào)用palindrom(998001)函數(shù)palindrom(998001)為假return1intpalindrome(intm){if(m==reverse(m))return1;elsereturn0;}voidmain(){ cout<<setw(10)<<'m'<<setw(20)<<"m*m"<<setw(20)<<"m*m*m"<<endl; for(intm=11;m<1000;m++) if(palindrome(m)&&palindrome(m*m)&&palindrome(m*m*m)) cout<<setw(10)<<m<<setw(20)<<m*m<<setw(20)<<m*m*<<endl;}【例5.6】

設(shè)計(jì)程序求組合數(shù):C(n,m)=n!/(m!*(n-m)!),其中m、r均為正整數(shù)且n>m。要求階乘和組和數(shù)均用函數(shù)實(shí)現(xiàn)。程序名:Ex4_6.cpp#include<iostream.h>intfac(int);//求一個(gè)數(shù)的階乘factorialcombination(int,int);//求組合數(shù)n=5m=2調(diào)用combination(5,2)函數(shù)combination(5,2)120/2*6=10return10打印結(jié)束調(diào)用fan(2)fan(5)fan(3)函數(shù)fan(2)fan(5)fan(3)returnfan(2)=2;fan(3)=6fan(5)=120voidmain(){intn,m;do{cout<<"輸入兩個(gè)整數(shù)n,m:"<<endl; cin>>n>>m;}while(n<=0||m<=0||n<=m); cout<<"C("<<n<<','<<m<<")="<<combination(n,m)<<endl;}intcombination(intn,intm){returnfac(n)/(fac(m)*fac(n-m));}intfac(intn){intfactorial=1; for(inti=1;i<=n;i++)factorial*=i; returnfactorial;}練習(xí):所謂“完數(shù)”(Perfectnumber

),是指一個(gè)數(shù)恰好等于它的真因子之和。例如6是完數(shù),因?yàn)?=1+2+3。請(qǐng)輸出100之內(nèi)的所有“完數(shù)”。用函數(shù)實(shí)現(xiàn)一個(gè)數(shù)是否是完數(shù)的判別。5.3全局變量和局部變量5.3.1變量的存儲(chǔ)機(jī)制與C++的內(nèi)存布局

5.3.2全局變量

5.3.3局部變量

5.3.1變量的存儲(chǔ)機(jī)制與C++的內(nèi)存布局堆區(qū)

(動(dòng)態(tài)數(shù)據(jù))棧區(qū)(函數(shù)局部數(shù)據(jù))靜態(tài)數(shù)據(jù)區(qū)

(全局、靜態(tài)變量)代碼區(qū)

(程序代碼)

操作系統(tǒng)為一個(gè)C++程序的運(yùn)行所分配的內(nèi)存分為四個(gè)區(qū)域,如圖下圖,程序在內(nèi)存中的區(qū)域所示:

5.3.2全局變量i=0調(diào)用sqrt(0)函數(shù)sqrt(0)return0打印n++(=1)i++(=1)繼續(xù)循環(huán)n=011全局變量是指在函數(shù)外部定義的變量?!纠?.7】使用全局變量的例子。//文件名:Ex4_7.cppintn=0;#include<iostream.h>#include<math.h>voidmain(){ for(inti=0;i<5;i++){ cout<<sqrt(n)<<endl; n++; }}

5.3.2全局變量i=1調(diào)用sqrt(1)函數(shù)sqrt(1)return1打印n++(=2)i++(=2)繼續(xù)循環(huán)n=122【例5.7】使用全局變量的例子。//文件名:Ex4_7.cppintn=0;#include<iostream.h>#include<math.h>voidmain(){ for(inti=0;i<5;i++){ cout<<sqrt(n)<<endl; n++; }}

5.3.2全局變量i=2調(diào)用sqrt(2)函數(shù)sqrt(2)return1.41421打印n++(=3)i++(=3)繼續(xù)循環(huán)n=233【例5.7】使用全局變量的例子。//文件名:Ex4_7.cppintn=0;#include<iostream.h>#include<math.h>voidmain(){ for(inti=0;i<5;i++){ cout<<sqrt(n)<<endl; n++; }}

5.3.2全局變量i=3調(diào)用sqrt(3)函數(shù)sqrt(3)return1.73205打印n++(=4)i++(=4)繼續(xù)循環(huán)n=344【例5.7】使用全局變量的例子。//文件名:Ex4_7.cppintn=0;#include<iostream.h>#include<math.h>voidmain(){ for(inti=0;i<5;i++){ cout<<sqrt(n)<<endl; n++; }}

5.3.2全局變量i=4調(diào)用sqrt(4)函數(shù)sqrt(4)return2打印n++(=5)i++(=5)結(jié)束n=455【例5.7】使用全局變量的例子。//文件名:Ex4_7.cppintn=0;#include<iostream.h>#include<math.h>voidmain(){ for(inti=0;i<5;i++){ cout<<sqrt(n)<<endl; n++; }}5.3.2全局變量打印200調(diào)用func(200)函數(shù)func(200)200*2=400return400打印400n=100n=100*2=200【例5.8】

多個(gè)函數(shù)使用全局變量的例子。//文件名:Ex4_8.cppintn=100;#include<iostream.h>voidfunc(){ n*=2;}voidmain(){ n*=2; cout<<n<<endl; func(); cout<<n<<endl;}5.3.3局部變量打印t=3.5調(diào)用fun()函數(shù)fun()打印t=5

打印t=3.5t=3.5t=5【例5.9】

使用局部變量的例子。//文件名:Ex4_6.cpp#include<iostream.h>voidfun(){intt=5;//fun()中的局部變量

cout<<"fun()中的t="<<t<<endl;}voidmain(){ floatt=3.5;//main()函數(shù)中的局部變量

cout<<"main()中的t="<<t<<endl; fun(); cout<<"main()中的t="<<t<<endl;}局部變量是指在函數(shù)內(nèi)部定義的變量。5.4函數(shù)調(diào)用機(jī)制圖4.4

函數(shù)調(diào)用過程中的棧結(jié)構(gòu)棧頂棧yx

3fun2()fun1()運(yùn)行狀態(tài)及返回地址1ax3b2fun1()main()運(yùn)行狀態(tài)及返回地址y2x1main()操作系統(tǒng)運(yùn)行狀態(tài)及返回地址棧底棧頂棧頂棧頂voidfun1(int,int);voidfun2(float);voidmain(){intx=1;y=2;fun1(x,y);}voidfun1(inta,intb){floatx=3;fun2(x);}voidfun2(floaty){intx;…}5.4函數(shù)調(diào)用機(jī)制voidfun1(int,int);voidfun2(float);voidmain(){intx=1;y=2;fun1(x,y);}voidfun1(inta,intb){floatx=3;fun2(x);}voidfun2(floaty){intx;…}圖4.4

函數(shù)調(diào)用過程中的棧結(jié)構(gòu)棧1ax3b2fun1()main()運(yùn)行狀態(tài)及返回地址y2x1main()操作系統(tǒng)運(yùn)行狀態(tài)及返回地址棧底棧頂5.4函數(shù)調(diào)用機(jī)制voidfun1(int,int);voidfun2(float);voidmain(){intx=1;y=2;fun1(x,y);}voidfun1(inta,intb){floatx=3;fun2(x);}voidfun2(floaty){intx;…}圖4.4

函數(shù)調(diào)用過程中的棧結(jié)構(gòu)棧y2x1main()操作系統(tǒng)運(yùn)行狀態(tài)及返回地址棧底棧頂5.4函數(shù)調(diào)用機(jī)制voidfun1(int,int);voidfun2(float);voidmain(){intx=1;y=2;fun1(x,y);}voidfun1(inta,intb){floatx=3;fun2(x);}voidfun2(floaty){intx;…}圖4.4

函數(shù)調(diào)用過程中的棧結(jié)構(gòu)棧棧底棧頂

5.5作用域與存儲(chǔ)類型5.5.1

作用域5.5.2變量的存儲(chǔ)類型5.5.3外部存儲(chǔ)類型與靜態(tài)存儲(chǔ)類型

5.5.4

生命期與可見性

5.5.1作用域

1塊作用域

3文件作用域2函數(shù)原型作用域

作用域是指標(biāo)識(shí)符在程序中有效的范圍,作用域開始于標(biāo)識(shí)符的聲明處?!纠?.11】設(shè)計(jì)函數(shù)完成兩數(shù)交換,用主函數(shù)進(jìn)行測(cè)試。//文件名:Ex4_8.cpp#include<iostream.h>voidswap(int,int); voidswap(int,int); voidmain(){ inta,b; //a,b作用域?yàn)閙ain() cin>>a>>b; cout<<"調(diào)用前:實(shí)參a="<<a<<','<<"b="<<b<<endl; swap(a,b); cout<<"調(diào)用后:實(shí)參a="<<a<<','<<"b="<<b<<endl;//發(fā)現(xiàn)交換失敗} voidswap(inta,intb){ //a,b作用域?yàn)閟wap() cout<<"調(diào)用中…"<<endl; cout<<"交換前:形參a="<<a<<','<<"b="<<b<<endl; intt;{intnum;} t=a;a=b;b=t; //交換a,b的值

cout<<"交換后:形參a="<<a<<','<<"b="<<b<<endl;}程序:ch5_ex6.cpp塊作用域全局j=300全局i=200全局n=100200300內(nèi)i=500內(nèi)j=600內(nèi)n=500+600=11001100500600100200+300=500500500200300【例5.12】

顯示同名變量可見性的例子。//文件名:Ex4_9.cppintn=100;#include<iostream.h>voidmain(){inti=200,j=300; cout<<n<<'\t'<<i<<'\t'<<j<<endl; { //內(nèi)部塊

inti=500,j=600,n; n=i+j; cout<<n<<'\t'<<i<<'\t'<<j<<endl;//輸出局部變量n cout<<::n<<endl;}//輸出全局變量n n=i+j; //修改全局變量

cout<<n<<'\t'<<i<<'\t'<<j<<endl;}函數(shù)原型作用域

函數(shù)原型不是定義函數(shù),在作函數(shù)原型聲明時(shí),其中的形參作用域只在原型聲明中,即作用域結(jié)束于右括號(hào)。正是由于形參不能被程序的其他地方引用,所以通常只要聲明形參個(gè)數(shù)和類型,形參名可省略。3文件作用域

文件作用域也稱全局作用域。定義在所有函數(shù)之外的標(biāo)識(shí)符,具有文件作用域,作用域?yàn)閺亩x處到整個(gè)源文件結(jié)束。文件中定義的全局變量和函數(shù)都具有文件作用域。如果某個(gè)文件中說明了具有文件作用域的標(biāo)識(shí)符,該文件又被另一個(gè)文件包含,則該標(biāo)識(shí)符的作用域延伸到新的文件中。如cin和cout是在頭文件iostream.h中說明的具有文件作用域的標(biāo)識(shí)符,它們的作用域也延伸到嵌入iostream.h的文件中。5.5.2變量的存儲(chǔ)類型

變量的存儲(chǔ)類型自動(dòng)型(auto型,棧區(qū),內(nèi)部缺?。┘拇嫫餍停╮egister型)內(nèi)部靜態(tài)型(內(nèi)部static型)外部型(外部非static型)外部靜態(tài)型(外部static型)

變量的存儲(chǔ)類型是指變量的存儲(chǔ)空間是在靜態(tài)數(shù)據(jù)區(qū)還是在棧區(qū)進(jìn)行分配。

存儲(chǔ)類型數(shù)據(jù)類型變量名;或

存儲(chǔ)類型數(shù)據(jù)類型變量名=常量表達(dá)式;

變量定義的一般格式:#include<iostream.h>intn=100;voidst(){staticintt=100;//局部靜態(tài)變量

autoints=100;t++;s++;n++;cout<<“t=“<<t<<“s=“<<s<<“n=“<<n<<endl;}voidmain(){autointi;for(i=0;i<5;i++)st();}n為外部型非靜態(tài)型t為內(nèi)部static型,s為auto型程序:Ch5_ex3.cpp#include<iostream.h>staticintn=100;voidst(){

static

int

t=100;//局部靜態(tài)變量

ints=100; t++;s++;n++;cout<<"t="<<t<<"s="<<s<<"n="<<n<<endl;}voidmain(){inti;for(i=0;i<5;i++)

st();}n為外部靜態(tài)型5.5.3

外部存儲(chǔ)類型與靜態(tài)存儲(chǔ)類型1.

外部非靜態(tài)存儲(chǔ)類型2.外部靜態(tài)存儲(chǔ)類型1外部存儲(chǔ)類型

【例5.11】

外部存儲(chǔ)類型的例子。假定程序包含兩個(gè)源程序文件Ex4_11_1.cpp和Ex4_11_2.cpp,程序結(jié)構(gòu)如下:/*Ex4_11_1.cpp,由main()和fun1()組成*/#include<iostream.h>voidfun1(); //外部函數(shù)聲明,等價(jià)于externvoidfun1();voidfun2(); //外部函數(shù)聲明,等價(jià)于externvoidfun2();intn; //全局變量定義1

外部存儲(chǔ)類型

n=1調(diào)用fun1()函數(shù)fun1()returnn=3打印n=3調(diào)用fun2()函數(shù)fun2()returnn=33voidmain(){n=1;fun1();//fun1()定義在本文件中cout<<″n=″<<n<<endl;}voidfun1(){fun2();//fun2()定義在文件Ex4_14_2.cpp中}/*Ex4_11_2.cpp,由fun2()組成*/externintn;//外部變量聲明,n定義在文件Ex4_13_1.cpp中voidfun2(){//fun2()被文件Ex4_14_1.cpp中的函數(shù)調(diào)用n=3;}2

靜態(tài)存儲(chǔ)類型

【例5.11】

靜態(tài)存儲(chǔ)類型的例子。假定一個(gè)程序由兩個(gè)源程序文件Ex4_11_1.cpp和Ex4_11_2.cpp組成。程序結(jié)構(gòu)如下:/*文件名:Ex4_11_1.cpp,由main()組成*/#include<iostream.h>intn=10; //定義全局變量//voidfun1(); //錯(cuò)誤的外部函數(shù)聲明voidfun2(); //外部函數(shù)聲明voidmain(){cout<<"n="<<n<<endl;//fun1();//錯(cuò)誤

fun2();//使用外部函數(shù)} 靜態(tài)存儲(chǔ)類型/*文件名:Ex4_11_2.cpp,由fun2()和靜態(tài)函數(shù)fun1()組成*/#include<iostream.h>staticintn=5; //定義靜態(tài)變量staticvoidfun1(){//定義靜態(tài)函數(shù)

cout<<"fun1()是靜態(tài)函數(shù)"<<endl;}voidfun2(){ cout<<"n="<<n<<endl; fun1(); cout<<"fun2()是外部函數(shù)"<<endl;}5.5.4

生命期與可見性1.

生命期2.

可見性

1.

生命期

(1)靜態(tài)生命期:其它三種

(2)局部生命期

:auto型

(3)動(dòng)態(tài)生命期

變量的生命期是指從系統(tǒng)為之分配空間起到其空間釋放為止的這段時(shí)期。(1)靜態(tài)生命期

1)靜態(tài)生命期:指的是標(biāo)識(shí)符從程序開始運(yùn)行時(shí)存在(即具有存儲(chǔ)空間),到程序運(yùn)行結(jié)束時(shí)消亡(即釋放存儲(chǔ)空間)。2)靜態(tài)存儲(chǔ)類型:具有靜態(tài)生命期的標(biāo)識(shí)符存放在靜態(tài)數(shù)據(jù)區(qū),如全局變量、靜態(tài)全局變量、局部靜態(tài)變量。3)初始化:具有靜態(tài)生命期的標(biāo)識(shí)符在生命期只初始化一次,未被用戶初始化的情況下,系統(tǒng)會(huì)自動(dòng)將其初始化為0。4)函數(shù)駐留在代碼區(qū),也具有靜態(tài)生命期。所有具有文件作用域的標(biāo)識(shí)符都具有靜態(tài)生命期。(2)局部生命期

1)局部生命期:在函數(shù)內(nèi)部或塊中定義的標(biāo)識(shí)符具有局部生命期,其生命期開始于執(zhí)行到該函數(shù)或塊的標(biāo)識(shí)符聲明處,結(jié)束于該函數(shù)或塊的結(jié)束處。2)自動(dòng)型:具有靜態(tài)生命期的標(biāo)識(shí)符存放在棧區(qū)。如:自動(dòng)型。3)初始化:具有局部生命期的標(biāo)識(shí)符如果未被初始化,其內(nèi)容是隨機(jī)的,不可用。具有局部生命期的標(biāo)識(shí)符必定具有局部作用域;但反之不然,靜態(tài)局部變量具有局部作用域,但卻具有靜態(tài)生命期。(3)動(dòng)態(tài)生命期

1)動(dòng)態(tài)生命期:具有動(dòng)態(tài)生命期的標(biāo)識(shí)符由特定的函數(shù)調(diào)用或運(yùn)算來創(chuàng)建和釋放,如調(diào)用malloc()或用new運(yùn)算符為變量分配存儲(chǔ)空間時(shí),變量的生命期開始,而調(diào)用free()或用delete運(yùn)算符釋放空間或程序結(jié)束時(shí),變量生命期結(jié)束。2)具有動(dòng)態(tài)生命期的變量存放在堆區(qū)。關(guān)于new運(yùn)算和delete運(yùn)算將在職真一章介紹。2.可見性

下面的程序段和圖示顯示作用域與可見性。

intm,floatx作用域intm可見floatm不可見x可見

{intm=1;floatx=5.5;{ floatm=3.5;intnum; floatm作用域floatm可見intm不可見x可見x=5.5;}m++;}intm,floatx作用域intm可見floatm不可見x可見floatm作用域floatm可見intm不可見x可見標(biāo)識(shí)符可訪問(或可引用)的范圍。存儲(chǔ)類型定義作用域可見性生命期初始化備注auto型在塊或函數(shù)內(nèi)所在定義塊或函數(shù)內(nèi)函數(shù)被調(diào)用起至返回止每次調(diào)用都執(zhí)行內(nèi)部靜態(tài)型在塊或函數(shù)內(nèi)所在定義塊或函數(shù)內(nèi)整個(gè)程序運(yùn)行期間只第一次調(diào)用執(zhí)行外部型在函數(shù)外部被原形說明起至文件尾整個(gè)程序運(yùn)行期間只執(zhí)行一次作用域可為多文件外部靜態(tài)型在函數(shù)外部被原形說明起至文件尾整個(gè)程序運(yùn)行期間只執(zhí)行一次作用域限于本文件voidf1();voidf2();voidmain(){ cout<<“main”<<endl; f1();}voidf1(){ cout<<“f1”<<endl; f2();}voidf2(){ cout<<“f2”<<endl;}練習(xí)P744.7(用函數(shù)實(shí)現(xiàn)平方根的計(jì)算)5.6

函數(shù)的遞歸調(diào)用

遞歸是一種描述問題的方法,或稱算法。遞歸的思想可以簡(jiǎn)單地描述為“自己調(diào)用自己”。例如用如下方法定義階乘:n!=1當(dāng)n=0或1時(shí)n!=n*(n-1)!當(dāng)n>1時(shí)遞歸算法設(shè)計(jì)的原理:1.遞歸的結(jié)束條件:

2.遞推關(guān)系設(shè)計(jì):intfac(intn)//求n階乘{(lán)inty; if(n==0||n==1)y=1;elsey=n*fac(n-1); returny;}例:

5.6

函數(shù)的遞歸調(diào)用n=4cout<<4;y=4*fac(3);4!=【例5.16】

求4!//文件名:Ex4_16.cpp#include<iostream.h>intfac(intn){inty;; if(n==0||n==1)y=1;elsey=n*fac(n-1);returny;}voidmain(){cout<<"\n4!="<<fac(4)<<endl;}

5.6

函數(shù)的遞歸調(diào)用n=4cout<<4;y=4*fac(3);4!=n=3cout<<3;y=3*fac(2);【例5.16】

求4!//文件名:Ex4_16.cpp#include<iostream.h>intfac(intn){inty;cout<<n<<'\t'; if(n==0||n==1)y=1;elsey=n*fac(n-1); cout<<y<<'\t'; returny;}voidmain(){cout<<"\n4!="<<fac(4)<<endl;}

5.6

函數(shù)的遞歸調(diào)用n=4cout<<4;y=4*fac(3);4!=cout<<2;y=2*fac(1);n=2n=3cout<<3;y=3*fac(2);【例5.16】

求4!//文件名:Ex4_16.cpp#include<iostream.h>intfac(intn){inty;cout<<n<<'\t'; if(n==0||n==1)y=1;elsey=n*fac(n-1); cout<<y<<'\t'; returny;}voidmain(){cout<<"\n4!="<<fac(4)<<endl;}

5.6

函數(shù)的遞歸調(diào)用n=4cout<<4;y=4*fac(3);4!=cout<<2;y=2*fac(1);n=2cout<<1;y=1;cout<<1;return1;n=1n=3cout<<3;y=3*fac(2);【例5.16】

求4!//文件名:Ex4_16.cpp#include<iostream.h>intfac(intn){inty;cout<<n<<'\t'; if(n==0||n==1)y=1;elsey=n*fac(n-1); cout<<y<<'\t'; returny;}voidmain(){cout<<"\n4!="<<fac(4)<<endl;}

5.6

函數(shù)的遞歸調(diào)用n=4cout<<4;y=4*fac(3);4!=cout<<2;y=2*fac(1);

n=2cout<<1;y=1;cout<<1;return1;

n=1

n=3cout<<3;y=3*fac(2);cout<<2;return2;【例5.16】

求4!//文件名:Ex4_16.cpp#include<iostream.h>intfac(intn){inty;cout<<n<<'\t'; if(n==0||n==1)y=1;elsey=n*fac(n-1); cout<<y<<'\t'; returny;}voidmain(){cout<<"\n4!="<<fac(4)<<endl;}

5.6

函數(shù)的遞歸調(diào)用n=4cout<<4;y=4*fac(3);4!=cout<<2;y=2*fac(1);n=2cout<<1;y=1;cout<<1;return1;n=1n=3cout<<3;y=3*fac(2);cout<<6;return6;cout<<2;return2;【例5.16】

求4!//文件名:Ex4_16.cpp#include<iostream.h>intfac(intn){inty;cout<<n<<'\t'; if(n==0||n==1)y=1;elsey=n*fac(n-1); cout<<y<<'\t'; returny;}voidmain(){cout<<"\n4!="<<fac(4)<<endl;}

5.6

函數(shù)的遞歸調(diào)用n=4cout<<4;y=4*fac(3);4!=cout<<2;y=2*fac(1);n=2cout<<1;y=1;cout<<1;return1;n=1n=3cout<<3;y=3*fac(2);cout<<24;return24;cout<<6;return6;cout<<2;return2;24【例5.16】

求4!//文件名:Ex4_16.cpp#include<iostream.h>intfac(intn){inty;cout<<n<<'\t'; if(n==0||n==1)y=1;elsey=n*fac(n-1); cout<<y<<'\t'; returny;}voidmain(){cout<<"\n4!="<<fac(4)<<endl;}5.6

函數(shù)的遞歸調(diào)用【例】將輸入的一行字符(以#號(hào)結(jié)束)逆序輸出。如:輸入:ABCD#則輸出:#DCBA程序:ch5_ex5.cpp1)輸入一字符ch;2)若ch不是‘#’,則遞歸調(diào)用自身;3)輸出ch;

5.6

函數(shù)的遞歸調(diào)用【例】將輸入的一行字符(以#號(hào)結(jié)束)逆序輸出。如:輸入:ABCD#則輸出:#DCBA程序:ch5_ex5.cppvoidreverse(){charch;cin>>ch;if(ch!=‘#’)reverse();cout<<ch;}5.6

函數(shù)的遞歸調(diào)用【例】用遞歸的算法實(shí)現(xiàn)求兩個(gè)整數(shù)的最大公約數(shù)。分析:設(shè)a,b的最大公約數(shù)為gys(a,b)

,則有g(shù)ys(a,b)=a當(dāng)b=0時(shí)gys(b,a%b)當(dāng)b!=0時(shí)如:gys(75,35)=gys(35,5)=gys(5,0)=5//文件名:ch5_Ex7.cpp#include<iostream.h>intgys(int,int);//求兩個(gè)數(shù)的最大公約數(shù)voidmain(){ inta,b,m; cout<<"輸入整數(shù):"<<endl;cin>>a>>b;m=gys(a,b); cout<<a<<"和"<<b<<"的最大公約數(shù)為:"<<m<<endl;}intgys(inta,intb){if(b==0)returna; returngys(b,a%b);}思考:最小公倍數(shù)gbs問題如何解決?5.7函數(shù)的一些高級(jí)議題5.7.1函數(shù)重載

5.7.2缺省變?cè)?/p>

5.7.3內(nèi)聯(lián)函數(shù)

5.7.1函數(shù)重載【例5.19】

重載函數(shù)的應(yīng)用。//文件名:Ex4_19.cpp#include<iostream.h>intsum(inta,intb){returna+b;}doublesum(doublea,doubleb){returna+b;}floatsum(floata,floatb,floatc){ returna+b+c;}voidmain(){cout<<"3+5="<<sum(3,5)<<endl;cout<<"2.2+5.6="<<sum(2.2,5.6)<<endl;cout<<"3.5+4+8="<<sum(3.5,4,8)<<endl;}3+5=調(diào)用sum(3,5)函數(shù)sum(3,5)return82.2+5.6=調(diào)用sum(2.2,5.6)函數(shù)doublesum(2.2,5.6)return7.83.5+4+8=調(diào)用sum(3.5,4,8)函數(shù)floatsum(3.5,4,8)return15.5結(jié)束87.815.55.7.1函數(shù)重載所謂函數(shù)重載是指同名函數(shù)的多個(gè)不同版本。如:

intabs(int);longabs(long);doubleabs(double);對(duì)于:abs(25)//調(diào)用intabs(int)abs(25L)//調(diào)用longabs(long)abs(25.0)//調(diào)用doubleabs(double)5.7.1函數(shù)重載3+5=調(diào)用sum(3,5)函數(shù)sum(3,5)return82.2+5.6=調(diào)用sum(2.2,5.6)函數(shù)doublesum(2.2,5.6)return7.83.5+4+8=調(diào)用sum(3.5,4,8)函數(shù)floatsum(3.5,4,8)return15.5結(jié)束87.815.5【例5.19】

重載函數(shù)的應(yīng)用。//文件名:Ex4_19.cpp#include<iostream.h>intsum(inta,intb){returna+b;}doublesum(doublea,doubleb){returna+b;}

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論