《C++語言程序設(shè)計(jì)》課件第5章_第1頁
《C++語言程序設(shè)計(jì)》課件第5章_第2頁
《C++語言程序設(shè)計(jì)》課件第5章_第3頁
《C++語言程序設(shè)計(jì)》課件第5章_第4頁
《C++語言程序設(shè)計(jì)》課件第5章_第5頁
已閱讀5頁,還剩76頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

C++語言程序設(shè)計(jì)第十一組C++語言程序設(shè)計(jì)第五章函數(shù)C++語言程序設(shè)計(jì)1目錄C++語言程序設(shè)計(jì)2“函數(shù)概述函數(shù)定義函數(shù)調(diào)用全局變量與局部變量結(jié)構(gòu)化程序設(shè)計(jì)基本知識(shí)遞歸函數(shù)內(nèi)聯(lián)函數(shù)重載函數(shù)帶默認(rèn)參數(shù)值的函數(shù)編程技能變量的存儲(chǔ)類型和生存期函數(shù)調(diào)用的執(zhí)行機(jī)制參數(shù)的傳遞機(jī)制刨根問底C++語言程序設(shè)計(jì)3基本知識(shí)a5.1函數(shù)概述結(jié)構(gòu)化程序設(shè)計(jì),將整個(gè)程序自頂向下分為若干個(gè)程序模塊,每個(gè)模塊用來實(shí)現(xiàn)一個(gè)特定的功能。C++中的模塊以函數(shù)和類的形式實(shí)現(xiàn)。函數(shù)是具有一定功能又經(jīng)常使用的相對獨(dú)立的一段代碼。無論是面向過程的程序設(shè)計(jì)還是面向?qū)ο蟮某绦蛟O(shè)計(jì),函數(shù)都是一種實(shí)現(xiàn)算法的重要形式。C++語言程序設(shè)計(jì)45.1函數(shù)概述函數(shù)接口(規(guī)定接口形式)函數(shù)名(命名規(guī)則與變量相同,見名知意)函數(shù)類型(返回值類型)形式參數(shù)表函數(shù)體(實(shí)現(xiàn)算法:三種基本結(jié)構(gòu)組合而成的代碼)常用的函數(shù)C++的庫函數(shù)自定義的函數(shù)C++語言程序設(shè)計(jì)55.1函數(shù)概述自定義函數(shù)編程者在處理具體問題時(shí),將程序中多處使用的、實(shí)現(xiàn)一定功能的特定代碼段定義成函數(shù)。這樣的函數(shù)稱為自定義函數(shù)。在同一個(gè)程序中,一個(gè)函數(shù)只能定義一次。一般是通過函數(shù)調(diào)用來使用函數(shù)。函數(shù)調(diào)用需要指定函數(shù)名并且提供被調(diào)用函數(shù)所需的信息(即函數(shù)參數(shù))。C++語言程序設(shè)計(jì)65.1函數(shù)概述例如要打印某一年某一月的月歷C++語言程序設(shè)計(jì)75.1函數(shù)概述C++的庫函數(shù)C++

標(biāo)準(zhǔn)庫提供了豐富的函數(shù)集合,可以進(jìn)行常用的數(shù)學(xué)計(jì)算、字符串操作、字符操作、輸入/輸出、錯(cuò)誤檢查和許多其他操作。數(shù)學(xué)庫函數(shù)實(shí)現(xiàn)常見的數(shù)學(xué)計(jì)算使用時(shí),在程序中嵌入cmath頭文件,按對應(yīng)庫函數(shù)的接口形式寫調(diào)用語句。調(diào)用數(shù)學(xué)函數(shù):函數(shù)名(參數(shù)1,…,參數(shù)n)數(shù)學(xué)函數(shù)庫中的多數(shù)函數(shù)都返回double類型結(jié)果。C++語言程序設(shè)計(jì)8例如:doublex;x=sqrt(900.0);cout<<x;C++語言程序設(shè)計(jì)9常用數(shù)學(xué)庫函數(shù)函

數(shù)說

明舉

例ceil(x)將x取整為不小于x的最小整數(shù)ceil(9.2)

=

10ceil(?9.8)

=

?9cos(x)x(弧度)的余弦cos(0.0)

=

1.0exp(x)指數(shù)函數(shù)exexp(1.0)=

2.71828exp(2.0)

=

7.38906fabs(x)x的絕對值fabs(?5)

=

5floor(x)將x取整為不大于x的最大整數(shù)floor(9.2)

=

9floor(?9.8)

=

?10fmod(x,y)x/y的浮點(diǎn)數(shù)余數(shù)fmod(13.657,2.333)

=

1.992log(x)x的自然對數(shù)(底數(shù)為e)log(2.718282)

=

1.0

log(7.389056)

=

2.0log10(x)x的對數(shù)(底數(shù)為10)log(10.0)

=

1.0 log(100.0)

=

2.0pow(x,y)x的y次方(xy)pow(2,7)

=

128pow(9,0.5)

=

3sin(x)x(弧度)的正弦sin(0.0)

=

0sqrt(x)x的平方根sqrt(900.0)

=

30.0tan(x)x(弧度)的正切tan(0.0)

=

0C++語言程序設(shè)計(jì)10#include<iostream>#include<cmath>usingnamespacestd;intmain(){ cout<<"EnterQuadraticcoefficients:"; doublea,b,c; cin>>a>>b>>c; if((a!=0)&&(b*b-4*a*c>0)){ doubleradical=

sqrt(b*b-4*a*c);

doubleroot1=(-b+radical)/(2*a); doubleroot2=(-b-radical)/(2*a); cout<<"Roots:"<<root1<<""<<root2; } else{ cout<<"Doesnothavetworealroots"; } return0;}調(diào)用函數(shù)或主調(diào)函數(shù)被調(diào)函數(shù)庫函數(shù)C++語言程序設(shè)計(jì)11#include<iostream>usingnamespacestd;floatCircleArea(floatr);intmain()//managecirclecomputation{cout<<"Enterradius:";floatMyRadius;cin>>MyRadius;floatArea=

CircleArea(MyRadius);

cout<<"Circlehasarea"<<Area;return0;}//CircleArea():computeareaofradiusrcirclefloatCircleArea(floatr){constfloatPi=3.1415;returnPi*r*r;}自定義函數(shù)調(diào)用函數(shù)或主調(diào)函數(shù)被調(diào)函數(shù)5.2函數(shù)的定義一個(gè)C++控制臺(tái)程序可以由一個(gè)主函數(shù)(main()函數(shù))和若干子函數(shù)構(gòu)成。主函數(shù)main()是程序執(zhí)行的開始點(diǎn),由主函數(shù)調(diào)用子函數(shù),子函數(shù)還可以再調(diào)用其他子函數(shù)。調(diào)用其他函數(shù)的函數(shù)被稱為主調(diào)函數(shù)。被其他函數(shù)調(diào)用的函數(shù)稱為被調(diào)函數(shù)。一個(gè)函數(shù)既可以是主調(diào)函數(shù),又可以是被調(diào)函數(shù)(main()除外)。C++語言程序設(shè)計(jì)125.2函數(shù)的定義C++語言程序設(shè)計(jì)13每一個(gè)函數(shù)都是一個(gè)具有一定功能的語句模塊,函數(shù)定義的語法形式:

返回值類型

函數(shù)名(形式參數(shù)表){

函數(shù)體(變量聲明和執(zhí)行語句)}約定接口形式函數(shù)體完成功能intmaximum(intx,inty){intmaxv;maxv=x>=y?x:y;returnmaxv;}5.2函數(shù)的定義C++語言程序設(shè)計(jì)14

floatCircleArea(floatr)

{

floatPi=3.1415; returnPi*r*r;

}函數(shù)體返回值語句局部變量定義形式參數(shù)函數(shù)類型函數(shù)名5.2函數(shù)的定義函數(shù)名是函數(shù)體代碼段的外部標(biāo)識(shí)符函數(shù)定義之后,即可通過函數(shù)名調(diào)用函數(shù)。函數(shù)的形式參數(shù)表,簡稱形參表形式:(類型1形式參數(shù)1,…,類型n形式參數(shù)n)C++語言程序設(shè)計(jì)15//Sum():computesumofintegersina...bintSum(inta,intb){ intTotal=0; for(inti=a;i<=b;++i){ Total+=i; } returnTotal;}5.2函數(shù)的定義形式參數(shù)表示主調(diào)函數(shù)和被調(diào)函數(shù)之間需要交換的信息(1)傳給被調(diào)函數(shù)的待處理的數(shù)據(jù);(2)控制被調(diào)函數(shù)執(zhí)行操作的信息;(3)被調(diào)函數(shù)執(zhí)行的結(jié)果。形式參數(shù)表從參數(shù)的類型、個(gè)數(shù)、排列順序上規(guī)定了主調(diào)函數(shù)和被調(diào)函數(shù)之間信息交換的形式。如果函數(shù)之間沒有需要交換的信息,也可以沒有形參,形參表內(nèi)寫void或空著。C++語言程序設(shè)計(jì)16floatfunc(intk,intb,floatx){ returnk*x+b;}5.2函數(shù)的定義函數(shù)體是實(shí)現(xiàn)函數(shù)功能的代碼部分變量聲明完成函數(shù)功能的語句兩部分從組成結(jié)構(gòu)看,函數(shù)體是由程序的三種基本控制結(jié)構(gòu)即順序、選擇、循環(huán)結(jié)構(gòu)組合而成的。C++語言程序設(shè)計(jì)-17-

intSum(inta,intb){ intTotal=0; for(inti=a;i<=b;++i)Total+=i; returnTotal;}C++語言程序設(shè)計(jì)-18-//計(jì)算整數(shù)的立方#include<iostream>using

namespace

std;int

cube(int);//函數(shù)原型聲明void

main(){

int

last,cb;

last=1;

cout<<"thedifferenceofcube:"<<endl;for(int

x=2;x<=10;x++){cb=cube(x);

cout<<cb-last<<"";

last=cb;}

cout<<endl;}

//函數(shù)定義int

cube(int

y){

return

y*y*y;}C++語言程序設(shè)計(jì)-19-#include<iostream>using

namespace

std;//函數(shù)原型聲明float

maximum(float

x,float

y,float

z);void

main(){

float

a,b,c;

cout<<"Enterthreefloatingnumbers:";

cin>>a>>b>>c;

//調(diào)用maximum函數(shù),a,b,c為實(shí)際參數(shù)

cout<<"Maximumis:"<<maximum(a,b,c)<<endl;//函數(shù)調(diào)用}例:在三個(gè)浮點(diǎn)中確定最大值,使用自定義函數(shù)maximum完成。//maximum函數(shù)定義//函數(shù)的形式參數(shù)x,y,zfloat

maximum(float

x,float

y,float

z){

float

max;

max=x>=y?x:y;

max=max>=z?max:z;

return

max;}5.2函數(shù)的定義引用函數(shù)之前,要先指定函數(shù)的接口形式函數(shù)原型函數(shù)原型聲明格式:函數(shù)類型函數(shù)名(形式參數(shù)表);intMax(inta,intb);函數(shù)定義如果沒有函數(shù)原型聲明,要先寫函數(shù)定義,后調(diào)用函數(shù)。函數(shù)原型聲明使編譯器獲得關(guān)于函數(shù)名稱、函數(shù)類型、函數(shù)形參個(gè)數(shù)、形參類型和形參順序的信息。函數(shù)調(diào)用時(shí),編譯器根據(jù)函數(shù)原型聲明驗(yàn)證函數(shù)調(diào)用正確與否。C++語言程序設(shè)計(jì)-20-5.2函數(shù)的定義程序中,如果調(diào)用自定義的函數(shù),且函數(shù)定義在后,調(diào)用在先,則必須在調(diào)用函數(shù)之前有函數(shù)原型聲明。C++語言程序設(shè)計(jì)-21-//計(jì)算3個(gè)數(shù)絕對值的平均值#include<iostream>#include<cmath>usingnamespacestd;intCalAbsMean(inta,intb,intc);//函數(shù)原型聲明voidmain(){inta,b,c;cout<<"輸入a,b,c:";cin>>a>>b>>c;cout<<"絕對值的均值為:"<<CalAbsMean(a,b,c)<<endl;}intCalAbsMean(inta,intb,intc){intsum=abs(a)+abs(b)+abs(c);sum/=3;returnsum;}5.2函數(shù)的定義程序中,如果調(diào)用自定義的函數(shù),且函數(shù)定義在后,調(diào)用在先,則必須在調(diào)用函數(shù)之前有函數(shù)原型聲明。如果是函數(shù)定義在先,調(diào)用在后,則不必進(jìn)行函數(shù)原型聲明。因?yàn)榫幾g器已經(jīng)從函數(shù)定義得到關(guān)于函數(shù)的信息。C++語言程序設(shè)計(jì)-22-//計(jì)算3個(gè)數(shù)絕對值的平均值#include<iostream>#include<cmath>usingnamespacestd;intCalAbsMean(inta,intb,intc){intsum=abs(a)+abs(b)+abs(c);sum/=3;returnsum;}voidmain(){inta,b,c;cout<<"輸入a,b,c:";cin>>a>>b>>c;cout<<"絕對值的均值為:"<<CalAbsMean(a,b,c)<<endl;}5.2函數(shù)的定義庫函數(shù)的聲明在相應(yīng)庫的頭文件中,使用庫函數(shù)時(shí)要包含對應(yīng)的頭文件。C++語言程序設(shè)計(jì)-23-//計(jì)算3個(gè)數(shù)絕對值的平均值#include<iostream>#include<cmath>usingnamespacestd;intCalAbsMean(inta,intb,intc){intsum=abs(a)+abs(b)+abs(c);sum/=3;returnsum;}voidmain(){inta,b,c;cout<<"輸入a,b,c:";cin>>a>>b>>c;cout<<"絕對值的均值為:"<<CalAbsMean(a,b,c)<<endl;}5.2函數(shù)的定義return語句使程序執(zhí)行流程從被調(diào)函數(shù)返回主調(diào)函數(shù),有兩種形式:不返回值的形式return;返回值的形式return表達(dá)式;C++語言程序設(shè)計(jì)-24-intSum(inta,intb){ intTotal=0; for(inti=a;i<=b;++i) Total+=i;

returnTotal;}void

DisplayMessage(){

cout<<"只顯示確定信息的簡單函數(shù)不帶參數(shù)"<<endl;return;}5.2函數(shù)的定義函數(shù)返回值類型規(guī)定了函數(shù)返回給主調(diào)函數(shù)的值的類型,也稱為函數(shù)類型。當(dāng)被調(diào)函數(shù)只需要把一個(gè)數(shù)值結(jié)果返回給主調(diào)函數(shù)時(shí),使用return語句返回比較合適。由return語句返回的值的類型必須與函數(shù)返回值類型一致。如果不需要向主調(diào)函數(shù)返回值,函數(shù)可以定義成無類型的,函數(shù)類型寫成void,函數(shù)結(jié)束時(shí)的return語句可以省略不寫。C++語言程序設(shè)計(jì)-25-例如:void

display(){

cout<<“noreturn"<<endl;}C++語言程序設(shè)計(jì)-26-//例5-4.從輸入文件中讀入學(xué)生人數(shù)和每人考試成績,統(tǒng)計(jì)成績均值。#include<iostream>#include<fstream>usingnamespacestd;intCalMean(charchFileName[]);//函數(shù)原型聲明voidmain(){charchFileName[80]="";cout<<"輸入文件名:";cin>>chFileName;//輸入文件名

intmean=ChlMean(chFileName);//調(diào)用函數(shù)

cout<<"平均值="<<mean<<endl;}//計(jì)算均值,函數(shù)定義如下intCalMean(charchFileName[]) {intcount; //數(shù)據(jù)個(gè)數(shù)

intscore; //分?jǐn)?shù)

intsum(0),mean;ifstreaminfile(chFileName);if(!infile)cout<<"!infile"<<endl;infile<<count;cout<<"成績個(gè)數(shù):";

cout<<count<<endl;cout<<"成績:"<<endl;while(infile>>score)//從文件讀取成績

{ cout<<score<<""; sum+=score; //累積分?jǐn)?shù)

}cout<<endl;if(count>0) mean=sum/count; //計(jì)算平均值

else

mean=0;returnmean;//將平均值返回主調(diào)函數(shù)}5.3函數(shù)的調(diào)用函數(shù)調(diào)用的三種形式函數(shù)語句函數(shù)語句形式:函數(shù)名(實(shí)參數(shù)表);DispColor(color);函數(shù)表達(dá)式函數(shù)調(diào)用出現(xiàn)在表達(dá)式中,形式:函數(shù)名(實(shí)際參數(shù)表)x=max(a,b);y=sqrt(x);此時(shí)函數(shù)要使用return語句向主調(diào)函數(shù)返回一個(gè)確定的值,參與它所在的表達(dá)式的運(yùn)算。floatmax(floata,floatb){returna>=b?a:b;}函數(shù)參數(shù)函數(shù)參數(shù)調(diào)用方式是將函數(shù)調(diào)用寫在另一次函數(shù)調(diào)用的實(shí)際參數(shù)位置。例如:m=max(a,b,max(c,d,e));

C++語言程序設(shè)計(jì)-27-5.3函數(shù)的調(diào)用實(shí)際參數(shù)表可簡稱為實(shí)參表,是按與被調(diào)函數(shù)形式參數(shù)表一一對應(yīng)的格式組織的參數(shù)表,即參數(shù)的類型、個(gè)數(shù)和排列順序必須與被調(diào)函數(shù)聲明的形式參數(shù)表嚴(yán)格一致。實(shí)際參數(shù)表的各實(shí)際參數(shù)以逗號(hào)間隔,實(shí)際參數(shù)可以是常量、變量或表達(dá)式,變量和表達(dá)式必須具有確定值。如果被調(diào)函數(shù)無形式參數(shù),則實(shí)參表也是空的。C++語言程序設(shè)計(jì)-28-例:計(jì)算y=kx+b的函數(shù)floatfunc(intk,intb,floatx){returnk*x+b;}voidmain(){intk,b;floatx,y;cin>>k>>b>>x;y=func(k,b,x);}5.4全局變量與局部變量根據(jù)變量定義的位置局部變量(在函數(shù)內(nèi)部定義的變量、函數(shù)的形參)全局變量(在函數(shù)外部定義的變量為全局變量)作用域由于變量定義的位置不同,所以變量起作用的范圍也不同。把程序中一個(gè)標(biāo)識(shí)符起作用的范圍稱為其作用域。C++語言程序設(shè)計(jì)-29-5.4全局變量與局部變量局部變量包括在函數(shù)體內(nèi)定義的變量和函數(shù)的形式參數(shù),它們的作用域就在函數(shù)體內(nèi),只能在本函數(shù)內(nèi)使用,不能被其它函數(shù)直接訪問。C++語言程序設(shè)計(jì)-30-int

fun1(int

x,int

y){int

n;

n=x*x+y*y;

return

n;}int

fun2(int

x,int

y){int

m;

m=x*x-y*y;

return

m;}#include<iostream>using

namespace

std;int

fun1(int

x,int

y);int

fun2(int

x,int

y);void

main(){int

a,b;

cout<<"inputa,b:"

cin>>a>>b;

cout<<fun1(a,b)<<endl;

cout<<fun2(a,b)<<endl;}5.4全局變量與局部變量局部變量能夠隨其所在的函數(shù)被調(diào)用而被分配內(nèi)存空間,也隨其所在的函數(shù)調(diào)用結(jié)束而消失(釋放內(nèi)存空間),所以使用這種局部變量能夠提高內(nèi)存利用率。由于局部變量只能被其所在的函數(shù)訪問,所以這種變量的數(shù)據(jù)安全性好(不能被其它函數(shù)直接讀寫)。局部變量在我們實(shí)際編程中使用頻率最高。C++語言程序設(shè)計(jì)-31-5.4全局變量與局部變量一個(gè)C++的源文件(.cpp)可以由多個(gè)函數(shù)組成,可以在函數(shù)外部定義變量,即全局變量。全局變量能夠被位于其定義位置之后的所有函數(shù)(屬于本源文件的)共用。即全局變量起作用的范圍是從它定義的位置開始至源文件結(jié)束。全局變量的作用域是整個(gè)源文件。全局變量在程序執(zhí)行的整個(gè)過程中,始終位于全局?jǐn)?shù)據(jù)區(qū)內(nèi)固定的內(nèi)存單元;如果程序沒有初始化全局變量,系統(tǒng)會(huì)將其初始化為0。C++語言程序設(shè)計(jì)-32-5.4全局變量與局部變量C++語言程序設(shè)計(jì)-33-void

main(){int

a,b,c;

cout<<"inputdataa,b:";

cin>>a>>b>>c;

fun(a,b,c);

cout<<"maximum="<<maximum<<endl;

cout<<"minimum="<<minimum<<endl;}//全局變量使用示例#include<iostream>using

namespace

std;int

maximum;int

minimum;void

fun(int

x,int

y

int

z){int

t;

t=x>y?x:y;

maximum=t>z?t:z;

t=x<y?x:y;

minimum=t<z?t:z;}5.4全局變量與局部變量程序中標(biāo)識(shí)符的作用域也就是標(biāo)識(shí)符起作用的范圍,標(biāo)識(shí)符只能在其起作用的范圍內(nèi)被使用。從標(biāo)識(shí)符起作用的范圍上劃分,作用域主要分為全局作用域局部作用域從標(biāo)識(shí)符在程序中所處的位置,又可區(qū)分作用域?yàn)閴K作用域函數(shù)作用域類作用域文件作用域C++語言程序設(shè)計(jì)-34-5.4全局變量與局部變量塊作用域塊作用域是指標(biāo)識(shí)符起作用的范圍為塊內(nèi)范圍,在塊內(nèi)定義的標(biāo)識(shí)符具有塊作用域。這個(gè)塊,可以是復(fù)合語句的塊,也可以是函數(shù)定義的函數(shù)體塊。塊內(nèi)定義的局部變量的作用域是從變量定義起至本塊結(jié)束。C++語言程序設(shè)計(jì)-35-C++語言程序設(shè)計(jì)-36-#include<iostream>using

namespace

std;void

main(){inta,b;cout<<"inputa,b:"cin>>a>>b;

if(a<b){int

t;t=a;a=b;b=t;}

intc=a*a-b*b;cout<<a<<"*"<<a"-"<<b<<"*"<<b<<"="<<c<<endl;}a和b的作用域t的作用域c的作用域C++語言程序設(shè)計(jì)-37-#include”iostream”usingnamespacestd;voidfun();voidmain(){intnum=10;cout<<“thefirst:num=”<<num<<endl;fun();{

intnum=30;

cout<<“thethird:num=”<<num<<endl;}cout<<“theforth:num=”<<num<<endl;}voidfun(){intnum=20;cout<<“thesecond:num=”<<num<<endl;}塊作用域范圍作用域范圍在main函數(shù)中作用域范圍在fun函數(shù)中5.4全局變量與局部變量函數(shù)作用域函數(shù)作用域是指標(biāo)識(shí)符的作用域?yàn)楹瘮?shù),或者是從標(biāo)識(shí)符定義開始到函數(shù)結(jié)束。文件作用域文件作用域也即全局作用域,指標(biāo)識(shí)符的作用域?yàn)槲募秶?。在源文件所有函?shù)之外聲明或定義的標(biāo)識(shí)符具有文件作用域,全局變量和函數(shù)名(不包括在其它函數(shù)內(nèi)部聲明原型的函數(shù)名)具有全局作用域,起作用的范圍是從聲明或定義點(diǎn)開始,直至其所在文件結(jié)束。C++語言程序設(shè)計(jì)-38-5.4全局變量與局部變量標(biāo)識(shí)符的可見性是研究標(biāo)識(shí)符在其作用域內(nèi)能否被訪問到的問題。標(biāo)識(shí)符在其作用域內(nèi),能被訪問到的位置稱其為可見的。不能被訪問到的位置稱其為不可見的。內(nèi)層標(biāo)識(shí)符與外層標(biāo)識(shí)符同名時(shí),內(nèi)層標(biāo)識(shí)符可見,外層標(biāo)識(shí)符不可見。對于變量,也即內(nèi)層變量屏蔽外層同名變量。C++語言程序設(shè)計(jì)-39-C++語言程序設(shè)計(jì)-40-#include<iostream>using

namespace

std;double

pi=3.1415926;

double

BallVolume(double

radius){double

volume=pi*radius*radius*radius*4/3;

//全局變量pi

return

volume;}

double

CircleArea(double

radius){double

area=pi*radius*radius;//全局變量pi

return

area;}

float

CircleArea(float

radius){float

pi=3.14f;

float

area=pi*radius*radius;//局部變量pireturn

area;}

void

main(){float

r;

cout<<"inputradius:";

cin>>r;

double

dr=(double)r;

cout<<"Ballvolume:"<<BallVolume(dr)<<endl;

cout<<"Circlearea:"<<CircleArea(dr)<<"(double)"<<endl;

cout<<"Circlearea:"<<CircleArea(r)<<"(float)"<<endl;}5.4.4可見性標(biāo)識(shí)符的可見性是研究標(biāo)識(shí)符在其作用域內(nèi)能否被訪問到的問題。標(biāo)識(shí)符在其作用域內(nèi),能被訪問到的位置稱其為可見的。不能被訪問到的位置稱其為不可見的。內(nèi)層標(biāo)識(shí)符與外層標(biāo)識(shí)符同名時(shí),內(nèi)層標(biāo)識(shí)符可見,外層標(biāo)識(shí)符不可見。對于變量,也即內(nèi)層變量屏蔽外層同名變量。如果函數(shù)內(nèi)的局部變量與全局變量同名,且在函數(shù)內(nèi)一定要使用這個(gè)同名全局變量,可以用作用域符號(hào)(::)指定要訪問的全局變量。C++語言程序設(shè)計(jì)-41-C++語言程序設(shè)計(jì)-42-#include<iostream>using

namespace

std;double

pi=3.1415926;

void

BallVolume(double

radius){double

volume=pi*radius*radius*radius*4/3; //全局變量picout<<"Ballvolume:"<<volume<<endl;}void

CircleArea(float

radius){float

pi=3.14f;

float

area=pi*radius*radius;//局部變量picout<<"Circlearea:"<<area<<"(float)"<<endl;

area=::pi*radius*radius;//全局變量pi

cout<<"Circlearea:"<<area<<"(double)"<<endl;}

void

main(){float

r;

cout<<"inputradius:";

cin>>r;

BallVolume(r);

CircleArea(r);}5.4全局變量與局部變量標(biāo)識(shí)符的可見性是研究標(biāo)識(shí)符在其作用域內(nèi)能否被訪問到的問題。標(biāo)識(shí)符在其作用域內(nèi),能被訪問到的位置稱其為可見的。不能被訪問到的位置稱其為不可見的。內(nèi)層標(biāo)識(shí)符與外層標(biāo)識(shí)符同名時(shí),內(nèi)層標(biāo)識(shí)符可見,外層標(biāo)識(shí)符不可見。對于變量,也即內(nèi)層變量屏蔽外層同名變量。如果函數(shù)內(nèi)的局部變量與全局變量同名,且在函數(shù)內(nèi)一定要使用這個(gè)同名全局變量,可以用作用域符號(hào)(::)指定要訪問的全局變量。在同一作用域中,不能聲明同名的標(biāo)識(shí)符。C++語言程序設(shè)計(jì)-43-5.5多文件結(jié)構(gòu)用C++編寫程序處理比較復(fù)雜的問題時(shí),一般采用多文件結(jié)構(gòu)程序,即由多個(gè)源程序分別完成不同的子功能,這樣的程序組織便于管理和維護(hù)。C++既支持面向過程的程序設(shè)計(jì),也支持面向?qū)ο蟮某绦蛟O(shè)計(jì)。在面向過程的程序設(shè)計(jì)中,為方便開發(fā)和維護(hù)程序,將程序的功能分成相對獨(dú)立的子功能,然后用不同的源程序分別實(shí)現(xiàn)各個(gè)子功能。在實(shí)現(xiàn)每個(gè)子功能時(shí),一般可使用兩種文件:一種是包含程序自定義類型、符號(hào)常量定義和函數(shù)的聲明等的頭文件(*.h文件);一種是由實(shí)現(xiàn)算法的函數(shù)構(gòu)成的.cpp文件(即由函數(shù)定義構(gòu)成的文件)。C++語言程序設(shè)計(jì)-44-C++語言程序設(shè)計(jì)-45-使用時(shí)要在cpp文件的最開始使用include將要用的頭文件包含進(jìn)來。

//month.h頭文件voidprintMonth(intyear,intmonth);voidprintMonthTitle(intyear,intmonth);voidprintMonthBody(intyear,intmonth);intgetStartDay(intyear,intmonth);intgetTotalNumberOfDays(intyear,intmonth);intgetNumberOfDaysInMonth(intyear,intmonth);boolisLeapYear(intyear);//month.cpp#include<iostream>#include<iomanip>

#include“month.h”usingnamespacestd;

……//mainprog.cpp主函數(shù)的實(shí)現(xiàn)代碼#include<iostream>#include<iomanip>

#include“month.h”usingnamespacestd;

voidmain(){cout<<"請輸入年份(如2010):";intyear;cin>>year;cout<<"請輸入月份(1-12)";intmonth;cin>>month;printMonth(year,month); //打印月歷}

voidprintMonth(intyear,intmonth) //打印一年中某月的月歷{printMonthTitle(year,month); //打印月歷頭部printMonthBody(year,month); //打印月歷主體}……函數(shù)原型聲明在頭文件中主程序中調(diào)用其它函數(shù)函數(shù)的實(shí)現(xiàn)代碼C++語言程序設(shè)計(jì)-46-多文件結(jié)構(gòu)5.5多文件結(jié)構(gòu)編譯器在編譯源程序之前,先由預(yù)處理器處理預(yù)處理指令。C++語言程序設(shè)計(jì)-47-預(yù)處理指令格

式功能說明#include#include<頭文件>#include”頭文件”將頭文件嵌入(包含)到當(dāng)前文件#define#define標(biāo)識(shí)符串把字符串命名為標(biāo)識(shí)符(用標(biāo)識(shí)符代表字符串),標(biāo)識(shí)符可以表示符號(hào)常量或宏名,編寫源程序時(shí)代替“字符串”出現(xiàn)在程序中,編譯時(shí)又被替換為“字符串”內(nèi)#undef#undef標(biāo)識(shí)符撤銷前面用#define定義的標(biāo)識(shí)符#ifdef#ifdef標(biāo)識(shí)符語句#endif條件編譯。如果已定義了“標(biāo)識(shí)符”,則編譯“語句”

#ifndef#ifndef標(biāo)識(shí)符語句#endif如果未定義了“標(biāo)識(shí)符”,則編譯“語句”5.5多文件結(jié)構(gòu)預(yù)處理指令#include格式#include<頭文件名>優(yōu)先考慮在系統(tǒng)路徑下搜索該頭文件#include“頭文件名”優(yōu)先考慮在當(dāng)前路徑下搜索該頭文件功能將一個(gè)頭文件嵌入(包含)到當(dāng)前文件C++語言程序設(shè)計(jì)-48-5.5多文件結(jié)構(gòu)預(yù)處理指令#define格式#define標(biāo)識(shí)符字符串功能把字符串命名為標(biāo)識(shí)符(用標(biāo)識(shí)符代表字符串)標(biāo)識(shí)符可以表示符號(hào)常量或宏名,編寫源程序時(shí)代替”字符串”出現(xiàn)在程序中,編譯時(shí)又被替換為”字符串”內(nèi)容。例:#definePI3.1415constdoublePI=3.1415;#definemax(x,y)(x>=y?x:y)inlineintmax(intx,inty){returnx>=y?x:y;}C++語言程序設(shè)計(jì)-49-預(yù)處理指令#undef格式#undef

標(biāo)識(shí)符功能撤銷前面用#define定義的標(biāo)識(shí)符例:#undefPI5.5多文件結(jié)構(gòu)預(yù)處理指令#ifdef格式#ifdef標(biāo)識(shí)符語句#endif功能如果已定義了“標(biāo)識(shí)符”,則編譯“語句”C++語言程序設(shè)計(jì)-50-#ifdefPIfloatw=2*PI*f;cout<<f<<“,”<<w<<endl;#endif預(yù)處理指令#ifndef格式#ifndef

標(biāo)識(shí)符語句#endif

功能如果未定義“標(biāo)識(shí)符”,則編譯“語句”#ifndefPIfloatw=2*3.14*f;cout<<f<<“,”<<w<<endl;#endif5.5多文件結(jié)構(gòu)預(yù)處理指令#if#elif#else#endif功能條件編譯指令,如果某個(gè)表達(dá)式成立,則編譯相應(yīng)的語句。C++語言程序設(shè)計(jì)-51-格式#if常量表達(dá)式語句#endif格式#if常量表達(dá)式1語句1#else

語句2#endif格式#if常量表達(dá)式1語句1#elif常量表達(dá)式2語句2┇#else語句n#endifC++語言程序設(shè)計(jì)編程技能b52(一)

遞歸函數(shù)遞歸函數(shù)是函數(shù)的一種特殊形式,適合實(shí)現(xiàn)數(shù)學(xué)上的一些遞歸問題。遞歸函數(shù)是函數(shù)體內(nèi)有調(diào)用函數(shù)自己的語句或通過其它函數(shù)間接調(diào)用函數(shù)自己的函數(shù)。遞歸調(diào)用是調(diào)用遞歸函數(shù)而形成的一種函數(shù)調(diào)用方式。經(jīng)典遞歸問題C++語言程序設(shè)計(jì)-53-C++語言程序設(shè)計(jì)-54-#include<iostream>using

namespace

std;int

factorial(int

n);void

main(){

cout<<"enterapositioninteger:";

int

n,n_fact;

cin>>n;

n_fact=factorial(n);

cout<<"thefactorialof"<<n<<"is:"<<n_fact<<endl;}返回地址1int

factorial(int

n){

intfn;

if(n==0)fn=1;

elsefn=n*factorial(n-1);

returnfn;}返回地址2斷點(diǎn)地址參數(shù)局部變量toptoptoptopn=3地址1棧狀態(tài)fn=?n=2地址2fn=?n=1地址2fn=?n=0地址2(一)

遞歸函數(shù)遞歸問題的求解實(shí)際分成兩個(gè)階段:化簡問題的遞推階段;達(dá)到遞歸終止條件得到基本情況的結(jié)果,并逐步回推結(jié)果階段。遞歸函數(shù)的主要兩部分具有更簡單參數(shù)的遞歸調(diào)用停止遞歸的終止條件(遞歸終止條件)C++語言程序設(shè)計(jì)-55-fn=n*factorial(n-1);

if(n==0)fn=1;(一)

遞歸函數(shù)漢諾塔問題:大梵天創(chuàng)造世界的時(shí)候做了三根金剛石柱子,在一根柱子上從下往上按照大小順序摞著64片黃金圓盤。大梵天命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱子上。并且規(guī)定,在小圓盤上不能放大圓盤,在三根柱子之間一次只能移動(dòng)一個(gè)圓盤。C++語言程序設(shè)計(jì)-56-(二)內(nèi)聯(lián)函數(shù)函數(shù)調(diào)用時(shí),系統(tǒng)首先要保存主調(diào)函數(shù)的相關(guān)信息,再將控制轉(zhuǎn)入被調(diào)函數(shù),這些操作增加了程序執(zhí)行的時(shí)間開銷。C++提供的內(nèi)聯(lián)函數(shù)形式可以減少函數(shù)調(diào)用的額外開銷(時(shí)間空間開銷),特別是一些常用的短小的函數(shù)適合采用內(nèi)聯(lián)函數(shù)形式。內(nèi)聯(lián)函數(shù)的定義形式:inline函數(shù)類型函數(shù)名(形式參數(shù)表){函數(shù)體}C++語言程序設(shè)計(jì)-57-C++語言程序設(shè)計(jì)-58-//使用內(nèi)聯(lián)函數(shù)求三個(gè)整數(shù)中的最大值#include<iostream>using

namespace

std;inline

int

max(int

x,int

y,int

z){return((x>=y)?(x>=z?x:z):(y>=z?y:z));}

void

main(){int

a,b,c;

cout<<"enterthreeintegers:"

cin>>a>>b>>c;

cout<<"Maximumis"<<max(a,b,c)<<endl;}(a>=b)?(a>=c?a:c):(b>=c?b:c)(二)內(nèi)聯(lián)函數(shù)內(nèi)聯(lián)函數(shù)之所以能夠減少函數(shù)調(diào)用時(shí)的系統(tǒng)空間和時(shí)間開銷,是因?yàn)橄到y(tǒng)在編譯程序時(shí)就已經(jīng)把內(nèi)聯(lián)函數(shù)的函數(shù)體代碼插入到相應(yīng)的函數(shù)調(diào)用位置,成為主調(diào)函數(shù)內(nèi)的一段代碼,可以直接執(zhí)行,不必再轉(zhuǎn)換流程控制權(quán)。這樣的結(jié)構(gòu),自然節(jié)省了時(shí)間和空間開銷,但使得主調(diào)函數(shù)代碼變長。所以,一般是只把短小的函數(shù)寫成內(nèi)聯(lián)函數(shù)。注意:內(nèi)聯(lián)函數(shù)體不能包含循環(huán)語句、switch語句和異常接口聲明。內(nèi)聯(lián)函數(shù)要先定義,后調(diào)用。因?yàn)榫幾g器需要用內(nèi)聯(lián)函數(shù)的函數(shù)體代碼替換對應(yīng)的函數(shù)調(diào)用。如果內(nèi)聯(lián)函數(shù)不符合要求,編譯器就將內(nèi)聯(lián)函數(shù)當(dāng)一般函數(shù)處理。C++語言程序設(shè)計(jì)-59-(三)重載函數(shù)C++允許幾個(gè)功能類似的函數(shù)同名,但這些同名函數(shù)的形式參數(shù)必須不同,稱這些同名函數(shù)為重載函數(shù)。例:intmax(intx,inty){returnx>y?x:y;}floatmax(floatx,floaty){returnx>y?x:y;}各重載函數(shù)形式參數(shù)的不同是指參數(shù)的個(gè)數(shù)、類型或順序彼此不同,不包括參數(shù)標(biāo)識(shí)符的不同。如:①intmax(inta,intb){returna>b?a:b;}②intmax(intx,inty){returnx>y?x:y;}③intmax(intx,inty,intz){return(x>y?x:y)>z?(x>y?x:y):z;}①②實(shí)際是一個(gè)函數(shù),如果寫在同一個(gè)文件中,編譯時(shí)會(huì)出現(xiàn)編譯錯(cuò)誤。若①③或②③在同一個(gè)文件中可形成重載函數(shù)。編譯器將以形式參數(shù)個(gè)數(shù)的不同來認(rèn)定和區(qū)分重載函數(shù)。C++語言程序設(shè)計(jì)-60-C++語言程序設(shè)計(jì)-61-#include<iostream>using

namespace

std;

int

min(int

x,int

y){return

x<y?x:y;}double

min(double

x,double

y){return

x<y?x:y;}void

main(){int

ia(10),ib(20);

double

da(0.1),db(0.5);

cout<<"minimumofinteger.is"<<min(ia,ib)<<endl;

cout<<"minimumofdoubleis"<<min(da,db)<<endl;}函數(shù)重載(四)默認(rèn)參數(shù)值的函數(shù)C++允許函數(shù)的形式參數(shù)有默認(rèn)值。doubleCircleArea(doubleradius=1.0){constdoublePI=3.14;returnPI*radius*radius;}

調(diào)用具有默認(rèn)參數(shù)值的函數(shù)時(shí),如果提供實(shí)際參數(shù)值,則函數(shù)的形參值取自實(shí)際參數(shù);如果不提供實(shí)際參數(shù)值,函數(shù)的形參采用默認(rèn)參數(shù)值。C++語言程序設(shè)計(jì)-62-#include<iostream>using

namespace

std;void

main(){

cout<<CircleArea(10.0)<<endl;//提供實(shí)參

cout<<CircleArea()<<endl;//不提供實(shí)參}(四)默認(rèn)參數(shù)值的函數(shù)默認(rèn)參數(shù)值函數(shù)如果有多個(gè)參數(shù),而其中只有部分參數(shù)具有默認(rèn)值,則這些具有默認(rèn)值的參數(shù)值應(yīng)該位于形參表的最右端。或者說,形參表中具有默認(rèn)參數(shù)值的參數(shù)的右邊,不能出現(xiàn)沒有默認(rèn)值的參數(shù)。例如:intCuboidVolume(intlength=1,intwidth=1,intheight=1);//正確intCuboidVolume(intlength,intwidth=1,intheight=1);//正確intCuboidVolume(intlength,intwidth,intheight=1);//正確intCuboidVolume(intlength=1,intwidth,intheight=1);//錯(cuò)誤intCuboidVolume(intlength,intwidth=1,intheight);//錯(cuò)誤intCuboidVolume(intlength=1,intwidth=1,intheight);//錯(cuò)誤C++語言程序設(shè)計(jì)-63-(四)默認(rèn)參數(shù)值的函數(shù)如果默認(rèn)參數(shù)值函數(shù)是先聲明,后定義的,則在聲明函數(shù)原型時(shí)就指定默認(rèn)參數(shù)值。C++語言程序設(shè)計(jì)-64-//使用默認(rèn)形式參數(shù)值的函數(shù)編寫計(jì)算直角三角形面積的程序#include<iostream>using

namespace

std;float

areaRATriangle(int

side1=3,int

side2=4);void

main(){ cout<<"Theareaofdefaultright-angledtriangle(3,4)is:“<<areaRATriangle()<<endl;

cout<<"Theareaofright-angledtriangle(6,4)is:“<<areaRATriangle(6)<<endl;

cout<<"Theareaofright-angledtriangle(6,8)is:"

<<areaRATriangle(6,8)<<endl;}//計(jì)算直角三角形面積

float

areaRATriangle(int

side1,int

side2){ return

side1*side2/2.0;}(四)默認(rèn)參數(shù)值的函數(shù)如果函數(shù)定義在先(無需原型聲明),則在函數(shù)定義的形參表中指定默認(rèn)值。

C++語言程序設(shè)計(jì)-65-//使用默認(rèn)形式參數(shù)值的函數(shù)編寫計(jì)算直角三角形面積的程序#include<iostream>using

namespace

std;//計(jì)算直角三角形面積float

areaRATriangle(int

side1=3,int

side2=4){ return

side1*side2/2.0;}void

main(){ cout<<"Theareaofdefaultright-angledtriangle(3,4)is:“<<areaRATriangle()<<endl;

cout<<"Theareaofright-angledtriangle(6,4)is:“<<areaRATriangle(6)<<endl;

cout<<"Theareaofright-angledtriangle(6,8)is:"

<<areaRATriangle(6,8)<<endl;}刨根問底cC++語言程序設(shè)計(jì)66(I)變量的存儲(chǔ)類型和生存期內(nèi)存空間的使用一個(gè)變量在內(nèi)存中存在的時(shí)間取決于變量的存儲(chǔ)類型C++程序中使用的變量可分為四種存儲(chǔ)類型:autoregisterexternstaticC++語言程序設(shè)計(jì)-67-代碼區(qū)(存放程序的代碼)全局區(qū)(存放程序中的全局?jǐn)?shù)據(jù)和靜態(tài)數(shù)據(jù))堆區(qū)(存放程序的動(dòng)態(tài)數(shù)據(jù))棧區(qū)(存放程序的局部數(shù)據(jù))(I)變量的存儲(chǔ)類型和生存期auto型變量函數(shù)體內(nèi)部定義的局部變量、函數(shù)的形式參數(shù),稱為自動(dòng)變量。存儲(chǔ)于棧區(qū)C++語言程序設(shè)計(jì)-68-#include<iostream>using

namespace

std;int

max(int

x,int

y){return

x>y?x:y;}void

main(){

int

a,b;

cout<<"inputa,b:";

cin>>a>>b;

cout<<max(a,b)<<endl;}autointa,b;autointx,autointy;(I)變量的存儲(chǔ)類型和生存期寄存器型變量定義格式:register類型標(biāo)識(shí)符變量標(biāo)識(shí)符;例:registerintcounter;存儲(chǔ)于CPU的寄存器訪問寄存器中的變量要比訪問內(nèi)存中的變量速度快,但由于CPU寄存器數(shù)量有限,如果設(shè)置過多的register型變量,編譯器將把這些變量按普通局部變量處理,依然放在內(nèi)存棧區(qū)。C++語言程序設(shè)計(jì)-69-(I)變量的存儲(chǔ)類型和生存期extern變量在多文件程序結(jié)構(gòu)中,如果一個(gè)文件中的函數(shù)需要使用其它文件里定義的全局變量,可以用extern關(guān)鍵字聲明所要用的全局變量。使用原來定義時(shí)分配的存儲(chǔ)空間(全局區(qū)),并沒有新的存儲(chǔ)空間C++語言程序設(shè)計(jì)-70-//file1.cppintx,y;voidmain(){…}//file2.cppexternintx,y;voidfun(){…}(I)變量的存儲(chǔ)類型和生存期靜態(tài)變量定義格式:static類型標(biāo)識(shí)符變量標(biāo)識(shí)符;靜態(tài)變量在程序運(yùn)行期間一直在全局區(qū)占有固定的存儲(chǔ)空間。靜態(tài)局部變量static加在局部變量的定義前,則生成靜態(tài)局部變量靜態(tài)局部變量在其所在的函數(shù)第一次被調(diào)用時(shí),被初始化為一定的值,系統(tǒng)僅對它們作一次初始化。靜態(tài)全局變量static加在全局變量定義前,則形成靜態(tài)全局變量。靜態(tài)全局變量只能在其定義文件中使用,不能被多文件程序結(jié)構(gòu)的其它文件訪問。C++語言程序設(shè)計(jì)-71-(I)變量的存儲(chǔ)類型和生存期靜態(tài)局部變量如果程序中指定初始化值,則初始化為程序指定值;如果在定義它們時(shí)未指定初始值,則系統(tǒng)將靜態(tài)局部變量初始化為0。此后靜態(tài)局部變量能夠保持其在前一次函數(shù)調(diào)用結(jié)束時(shí)所獲得的值,直到下次函數(shù)調(diào)用時(shí)被修改。C++語言程序設(shè)計(jì)-72-//靜態(tài)局部變量的使用#include<iostream>using

namespace

std;int

squareMean(int

data){static

int

sum(0);

static

int

counter(0);

sum+=data*data;

counter++;

return

sum/counter;}

void

main(){int

number(1);

while(number!=-1){cout<<"inputnumber:";

cin>>number;

if(number!=-1)

cout<<"themeanofsquareis:“<<squareMean(number)<<endl;}}

(I)變量的存儲(chǔ)類型和生存期一個(gè)變量在內(nèi)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(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ǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論