青島理工大學(xué)課件_第1頁
青島理工大學(xué)課件_第2頁
青島理工大學(xué)課件_第3頁
青島理工大學(xué)課件_第4頁
青島理工大學(xué)課件_第5頁
已閱讀5頁,還剩115頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

青島理工大學(xué)第三章函數(shù)青島理工大學(xué)第三章函數(shù)本章主要內(nèi)容3.1函數(shù)的定義和聲明3.2函數(shù)的調(diào)用與參數(shù)傳遞3.3內(nèi)聯(lián)函數(shù)3.4函數(shù)重載3.5帶默認(rèn)形參值的函數(shù)3.6作用域與生存周期3.7多文件結(jié)構(gòu)本章主要內(nèi)容3.1函數(shù)的定義和聲明3.1函數(shù)的定義與申明1、函數(shù)的定義無參函數(shù)的一般形式類型說明符

函數(shù)名()

{

類型說明

語句

}類型說明符

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

形式參數(shù)類型說明

{

類型說明

語句

}有參函數(shù)的一般形式3.1函數(shù)的定義與申明1、函數(shù)的定義類型說明符

函數(shù)【例3-1】max函數(shù)的位置示例#include<iostream.h>int

max(int

a,int

b){if(a>b)return

a;else

return

b;}void

main(){int

max(int

a,int

b);int

x,y,z;cout<<"input

two

numbers:"<<endl);cin>>x>>y;z=max(x,y);cout<<"maxmum="<<z<<endl;}【例3-1】max函數(shù)的位置示例#include<io3.1函數(shù)的定義與申明2、函數(shù)的申明函數(shù)聲明的語法形式類型標(biāo)識符函數(shù)名(形式參數(shù)表){

語句序列}形式參數(shù)表<type1>name1,<type2>name2,...,<typen>namen函數(shù)的返回值由return語句給出;無返回值的函數(shù)(void類型),不必寫return語句是被初始化的內(nèi)部變量,壽命和可見性僅限于函數(shù)內(nèi)部若無返回值,寫void3.1函數(shù)的定義與申明2、函數(shù)的申明是被初始化的內(nèi)部變量,【例3-1】max函數(shù)的位置示例#include<iostream.h>int

max(int

a,int

b); //函數(shù)聲明void

main(){int

max(int

a,int

b);int

x,y,z;cout<<"input

two

numbers:"<<endl);cin>>x>>y;z=max(x,y);cout<<"maxmum="<<z<<endl;}int

max(int

a,int

b)//函數(shù)定義{if(a>b)return

a;else

return

b;}【例3-1】max函數(shù)的位置示例#include<io【例3-2】實現(xiàn)兩個數(shù)相加#include<iostream.h>intadd(int,int); //函數(shù)原型voidmain(){ intsum,x,y; cout<<"請輸入被加數(shù)和加數(shù):"<<endl; cin>>x>>y; sum=add(x,y);//函數(shù)調(diào)用 cout<<"Sum="<<sum<<endl;}intadd(inta,intb)//函數(shù)定義{ returna+b;}運行結(jié)果:請輸入被加數(shù)和加數(shù):213625Sum=838【例3-2】實現(xiàn)兩個數(shù)相加#include<iostr3.2函數(shù)的調(diào)用與參數(shù)傳遞1、函數(shù)的調(diào)用調(diào)用形式函數(shù)名(實參列表)函數(shù)調(diào)用格式函數(shù)表達(dá)式函數(shù)語句函數(shù)實參3.2函數(shù)的調(diào)用與參數(shù)傳遞1、函數(shù)的調(diào)用3.2函數(shù)的調(diào)用與參數(shù)傳遞2、函數(shù)調(diào)用時的參數(shù)傳遞按值傳遞形參在沒有被調(diào)用時,不占用存儲空間調(diào)用函數(shù)時,應(yīng)該注意函數(shù)的實參與形參類型一致,否則會出現(xiàn)錯誤C++函數(shù)中參數(shù)的求值順序為自右至左3.2函數(shù)的調(diào)用與參數(shù)傳遞2、函數(shù)調(diào)用時的參數(shù)傳遞【例3-3】按值傳遞#include<iostream.h>voidswap(int,int);voidmain(){inta=3,b=4;cout<<"a="<<a<<",b=“<<b<<endl;swap(a,b);cout<<"a="<<a<<",b="<<b<<endl;}voidswap(intx,inty){intt=x;x=y;y=t;}運行結(jié)果:a=3,b=4a=3,b=4【例3-3】按值傳遞#include<iostream【例3-4】函數(shù)參數(shù)的傳遞順序#include<iostream.h>intsome_fun(inta,intb){ returna+b;}voidmain()

{intx,y;x=2;y=3;cout<<some_fun(++x,x+y)<<endl;x=2;y=3;cout<<some_fun(x+y,++x)<<endl;}運行結(jié)果:89【例3-4】函數(shù)參數(shù)的傳遞順序#include<iost3.2函數(shù)的調(diào)用與參數(shù)傳遞2、函數(shù)調(diào)用時的參數(shù)傳遞地址傳遞【例3-5】地址傳遞#include"iostream.h"voidswap(int*,int*);voidmain(){inta=3,b=4;cout<<"a="<<a<<",b=“<<b<<endl;swap(&a,&b);cout<<"a="<<a<<",b=“<<b<<endl;}

voidswap(int*x,int*y){intt=*x;*x=*y;*y=t;}運行結(jié)果:a=3,b=4a=4,b=33.2函數(shù)的調(diào)用與參數(shù)傳遞2、函數(shù)調(diào)用時的參數(shù)傳遞【例3-3.2函數(shù)的調(diào)用與參數(shù)傳遞2、函數(shù)調(diào)用時的參數(shù)傳遞引用傳遞數(shù)據(jù)類型&引用名=數(shù)據(jù)類型變量名;引用(&)是標(biāo)識符的別名;【例3-6】引用的建立和使用。#include<iostream>usingnamespacestd;intmain(){inta=30,b=20;int&refa=a,&refb=b;refa=a+20;b=refb+10;cout<<refa<<“”<<a<<endl;cout<<refb<<""<<b<<endl;

refa=b;//此時引用refa仍舊是a的別名,只是把b的值給到a。cout<<refa<<“”<<a<<endl;return0;}運行結(jié)果:5050303030303.2函數(shù)的調(diào)用與參數(shù)傳遞2、函數(shù)調(diào)用時的參數(shù)傳遞【例3-【例3-7】引用傳遞#include"iostream.h"voidswap(int&,int&);voidmain(){inta=3,b=4;cout<<“a=”<<a<<“,b=”<<b<<endl;swap(a,b);cout<<“a=”<<a<<“,b=”<<b<<endl;}voidswap(int&x,int&y){intt=x;x=y;y=t;}

運行結(jié)果:a=3,b=4a=4,b=3【例3-7】引用傳遞#include"iostream3.2函數(shù)的調(diào)用與參數(shù)傳遞3、函數(shù)的嵌套調(diào)用和遞歸調(diào)用函數(shù)的嵌套調(diào)用【例3-8】函數(shù)的嵌套調(diào)用,求三個數(shù)中最大數(shù)和最小數(shù)的差值。#include<iostream>usingnamespacestd;intmax(intx,inty,intz){intt;t=x>y?x:y;return(t>z?t:z);}intmin(intx,inty,intz){intt;t=x<y?x:y;return(t<z?t:z);}intdif(intx,inty,intz){returnmax(x,y,z)-min(x,y,z);}voidmain(){inta,b,c;cin>>a>>b>>c;cout<<"Max-Min="<<dif(a,b,c)<<endl;}運行結(jié)果:5-615↙213.2函數(shù)的調(diào)用與參數(shù)傳遞3、函數(shù)的嵌套調(diào)用和遞歸調(diào)用【例3.2函數(shù)的調(diào)用與參數(shù)傳遞3、函數(shù)的嵌套調(diào)用和遞歸調(diào)用函數(shù)的遞歸調(diào)用圖3-1直接調(diào)用過程示意圖圖3-2間接調(diào)用過程示意圖3.2函數(shù)的調(diào)用與參數(shù)傳遞3、函數(shù)的嵌套調(diào)用和遞歸調(diào)用圖33.2函數(shù)的調(diào)用與參數(shù)傳遞3、函數(shù)的嵌套調(diào)用和遞歸調(diào)用函數(shù)的遞歸調(diào)用遞歸函數(shù)的一般形式:函數(shù)類型遞歸函數(shù)名f(參數(shù)x)

{

if(滿足結(jié)束條件)

結(jié)果=初值;

else

結(jié)果=含f(x-1)的表達(dá)式;

返回結(jié)果;

}3.2函數(shù)的調(diào)用與參數(shù)傳遞3、函數(shù)的嵌套調(diào)用和遞歸調(diào)用函數(shù)【例3-9】

編程計算某個正整數(shù)的階乘#include<iostream.h>longintfac(intn){inttotal;if(n==1||n==0)total=1;

elsetotal=fac(n-1)*n;

returntotal;}voidmain(){intn;cout<<"pleaseinputainteger:";

cin>>n;cout<<n<<"!is"<<fac(n)<<endl; }運行結(jié)果:pleaseinputainteger:12↙12!is479001600【例3-9】編程計算某個正整數(shù)的階乘#include<【例3-10】用非遞歸方法求階乘longintfac(intn){inttotal=1;if(n>0){ while(n) {total*=n; n--;

} }returntotal; }【例3-10】用非遞歸方法求階乘longintfac3.3內(nèi)聯(lián)函數(shù)聲明時使用關(guān)鍵字inline。編譯時在調(diào)用處用函數(shù)體進(jìn)行替換,節(jié)省了參數(shù)傳遞、控制轉(zhuǎn)移等開銷。注意:內(nèi)聯(lián)函數(shù)體內(nèi)不能有循環(huán)語句和switch語句。內(nèi)聯(lián)函數(shù)的定義必須出現(xiàn)在內(nèi)聯(lián)函數(shù)第一次被調(diào)用之前。內(nèi)聯(lián)函數(shù)不能是遞歸函數(shù)語句數(shù)盡可能少,一般不超過5行3.3內(nèi)聯(lián)函數(shù)聲明時使用關(guān)鍵字inline?!纠?-12】將字符數(shù)組str1中所有小寫字母('a'~'z')轉(zhuǎn)換成大寫字母#include<iostream.h>#include<string.h>intup_letter(charch);voidmain(){charstr[80];inti;cout<<"pleaseinputastring:";cin>>str;for(i=0;i<strlen(str);i++){if(up_letter(str[i]))str[i]-=32;}cout<<"theresultis:"<<str<<endl;}intup_letter(charch){if(ch>='a'&&ch<='z')return1;elsereturn0;}運行結(jié)果:Pleaseinputastring:goodMORNING3456

Theresultis:GOODMORNING3456【例3-12】將字符數(shù)組str1中所有小寫字母('a'~'z【例3-12】將字符數(shù)組str1中所有小寫字母('a'~'z')轉(zhuǎn)換成大寫字母#include<iostream.h>#include<string.h>inlineintup_letter(charch);voidmain(){charstr[80];inti;cout<<"pleaseinputastring:";cin>>str;for(i=0;i<strlen(str);i++){if(up_letter(str[i]))str[i]-=32;}cout<<"theresultis:"<<str<<endl;}inlineintup_letter(charch){if(ch>='a'&&ch<='z')return1;elsereturn0;}【例3-12】將字符數(shù)組str1中所有小寫字母('a'~'z【例3-13】內(nèi)聯(lián)函數(shù)的應(yīng)用#include<iostream.h>inlineintabs(intx){returnx<0?-x:x;}voidmain(){inta,b=3,c,d=-4;a=abs(b);

c=abs(d);

cout<<"a="<<a<<",c="<<c<<endl;}運行結(jié)果:a=3,c=4【例3-13】內(nèi)聯(lián)函數(shù)的應(yīng)用#include<iost3.4函數(shù)重載1、函數(shù)重載的定義重載是指同一個函數(shù)名對應(yīng)多個函數(shù)的現(xiàn)象形參類型不同intadd(intx,inty);floatadd(floatx,floaty);形參個數(shù)不同intadd(intx,inty);intadd(intx,inty,int

z);3.4函數(shù)重載1、函數(shù)重載的定義形參類型不同intadd3.4函數(shù)重載2、函數(shù)重載的綁定函數(shù)重載要求編譯器能夠唯一地確定調(diào)用一個函數(shù)時應(yīng)執(zhí)行哪個函數(shù)代碼重載函數(shù)add()的綁定:

cout<<add(1,2)<<endl;//匹配intadd(int,int);

cout<<add(1.2,3.4)<<endl;//匹配doubleadd(double,double);

cout<<add('a','b')<<endl;//匹配intadd(int,int);3.4函數(shù)重載2、函數(shù)重載的綁定【例3-14】求三個操作數(shù)之和#include<iostream.h>intsum(int,int,int);doublesum(double,double,double);voidmain(){ cout<<"Int:"<<sum(2,3,4)<<endl; cout<<"Double:"<<sum(1.4,2.7,3.8)<<endl;}intsum(inta,intb,intc){ returna+b+c;}doublesum(doublea,doubleb,doublec){ returna+b+c;}運行結(jié)果:Int:9

Double:7.9【例3-14】求三個操作數(shù)之和#include<ios3.5帶默認(rèn)形參值的函數(shù)C++語言允許在函數(shù)說明或函數(shù)定義中為形參預(yù)賦一個默認(rèn)的值,這樣的函數(shù)就叫做帶有默認(rèn)形參值的函數(shù)intfun(intx=15,inty=8){returnx-y;}voidmain(void){fun(34,22);//傳遞給形參x,y的值分別為34和22fun(10);//傳遞給形參x,y的值分別為10和8fun();//傳遞給形參x,y的值分別為15和8}3.5帶默認(rèn)形參值的函數(shù)C++語言允許在函數(shù)說明或函數(shù)定義3.5帶默認(rèn)形參值的函數(shù)特點若函數(shù)具有多個形參,則缺省形參值必須自右向左連續(xù)定義,并且在一個缺省形參值的右邊不能有未指定缺省值的參數(shù)在調(diào)用一個函數(shù)時,如果省去了某個實參,則直到最右端的實參都要省去voidadd_int(inta=1,intb=5,intc=10);//正確的函數(shù)聲明

voidadd_int(inta,intb=5,intc=10);//正確的函數(shù)聲明

voidadd_int(inta=1,intb,intc=10);//錯誤的函數(shù)聲明

voidadd_int(inta=1,intb,intc)//錯誤的函數(shù)聲明假如聲明:intfun(inta,floatb=5.0,charc='.',intd=10);

采用如下調(diào)用形式是錯誤的:

fun(8,,,4);//語法錯誤3.5帶默認(rèn)形參值的函數(shù)特點voidadd_int(i3.5帶默認(rèn)形參值的函數(shù)特點缺省形參值的說明必須出現(xiàn)在函數(shù)調(diào)用之前例如:

intsub(intx=8,inty=3); //缺省形參值在函數(shù)原型中給出

voidmain(void)

{

sub(20,15); //20-15

sub(10); //10-3

sub(); //8-3}

intsub(intx,inty) //缺省形參值沒有在函數(shù)定義時給出

{

returnx-y;

}3.5帶默認(rèn)形參值的函數(shù)特點例如:

intsub(int3.5帶默認(rèn)形參值的函數(shù)特點在同一個作用域,一旦定義了缺省形參值,就不能再定義它如果幾個函數(shù)說明出現(xiàn)在不同的作用域內(nèi),則允許分別為它們提供不同的缺省形參值intfun(inta,floatb,char,intd=10);

intfun(inta,floatb,charc=‘.’,intd=10);//錯誤:企圖再次定義缺省參數(shù)c和dintfun(inta=6,floatb=5.0,charc='.',intd=10);

voidmain(void)

{

intfun(inta=3,floatb=2.0,charc='n',intd=20);

cout<<fun()<<endl;//fun函數(shù)使用局部缺省參數(shù)值

}3.5帶默認(rèn)形參值的函數(shù)特點intfun(inta,f3.5帶默認(rèn)形參值的函數(shù)特點對形參缺省值的指定可以是初始化表達(dá)式,甚至可以包含函數(shù)調(diào)用在函數(shù)原型中給出了形參的缺省值時,形參名可以省略形參的默認(rèn)值可以是全局常量、全局變量、表達(dá)式、函數(shù)調(diào)用,但不能為局部變量//d參數(shù)的缺省值是函數(shù)調(diào)用

intfun(inta,floatb=5.0,charc=‘.’,intd=sub(20,15));intfun(int,float=5.0,char=‘.’,int=sub(20,15));//下例不合法:

voidfun()

{intk;

voidg(intx=k); //k為局部變量

}3.5帶默認(rèn)形參值的函數(shù)特點//d參數(shù)的缺省值是函數(shù)調(diào)用

3.6作用域與生存周期1、標(biāo)識符的作用域局部作用域(塊作用域)函數(shù)作用域函數(shù)原型作用域文件作用域名字空間作用域表3-1四種作用域的作用范圍3.6作用域與生存周期1、標(biāo)識符的作用域表3-1四種作【例3-15】塊作用域示例#include<iostream>usingnamespacestd;intmain(){ //1inti,j; //2i=1;j=2; //3{inta,b; //4

a=5; //5b=j; //6cout<<a<<"\t"<<b<<endl;//7} //8cout<<i<<“\t”<<j<<endl; //9return0; //10} //11【例3-15】塊作用域示例#include<iostr【例3-16】塊作用域示例#include<iostream>usingnamespacestd;intmain() //1{ //2intx(3),y(5); //3for(;x>0;x--) //4{ //5intx(4); //6cout<<x<<"\t"<<y<<endl; //7} //8cout<<endl<<x<<"\t"<<y<<endl;//9

return0

; //10} //11運行結(jié)果:4

54

54

50

5【例3-16】塊作用域示例#include<iostr【例3-17】文件作用域示例#include<iostream>usingnamespacestd;inti;

//全局變量,文件作用域intmain(){i=5;{inti;

//局部變量,塊作用域i=7;cout<<"i="<<i<<endl;

//輸出7}cout<<“i=”<<i<<endl;

//輸出5return0;}【例3-17】文件作用域示例#include<iost3.6作用域與生存周期2、局部變量和全局變量局部變量在一個函數(shù)內(nèi)部說明的變量是內(nèi)部變量,局部變量是在函數(shù)內(nèi)作定義說明的,它只在該函數(shù)范圍內(nèi)有效全局變量全局變量也稱為外部變量,它是在函數(shù)外部定義的變量3.6作用域與生存周期2、局部變量和全局變量【例3-19】使用局部變量示例#include<iostream.h>int

f1(int

a)

/*函數(shù)f1*/{int

b,c;

……}//a,b,c作用域int

f2(int

x)

/*函數(shù)f2*/{int

y,z;

}//x,y,z作用域voidmain(){int

m,n;

}主函數(shù)中定義的變量也只能在主函數(shù)中使用,不能在其他函數(shù)中使用。形參變量是屬于被調(diào)函數(shù)的局部變量,實參變量是屬于主調(diào)函數(shù)的局部變量。允許在不同的函數(shù)中使用相同的變量名,它們代表不同的對象,分配不同的單元,互不干擾,也不會發(fā)生混淆。在復(fù)合語句中也可定義變量,其作用域只在復(fù)合語句范圍內(nèi)?!纠?-19】使用局部變量示例#include<ios【例3-22】全局變量與局部變量使用示例#include<iostream>usingnamespacestd;int

vs(int

l,int

w){extern

int

h;int

v;//定義局部變量vv=l*w*h;//引用全局變量w、h和局部變量v、lextern

v;}voidmain(){extern

int

w,h;int

l=5;//定義局部變量lcout<<vs(l,w);}int

l=3,w=4,h=5;//定義全局變量l、w、h【例3-22】全局變量與局部變量使用示例#include3.6作用域與生存周期3、動態(tài)變量和靜態(tài)變量變量在內(nèi)存中的存儲一個程序?qū)⒉僮飨到y(tǒng)分配給其運行的內(nèi)存塊分為4個區(qū)域:代碼區(qū)、全局?jǐn)?shù)據(jù)區(qū)、棧區(qū)、堆區(qū)動態(tài)變量用來在程序執(zhí)行過程中,定義變量或調(diào)用函數(shù)時分配存儲空間靜態(tài)變量在程序開始執(zhí)行時就分配存儲空間,在程序運行期間一直占用,運行結(jié)束時釋放3.6作用域與生存周期3、動態(tài)變量和靜態(tài)變量3.6作用域與生存周期4、變量的存儲類型所謂存儲類型,是指變量占用內(nèi)存空間的方式,

也稱為存儲方式變量的存儲方式可分為靜態(tài)存儲和動態(tài)存儲兩種對變量的存儲類型說明格式auto:自動變量。

register:寄存器變量。

extern:外部變量。

static:靜態(tài)變量存儲類型說明符

數(shù)據(jù)類型說明符

變量名,變量名,…;3.6作用域與生存周期4、變量的存儲類型auto:自動變量3.6作用域與生存周期5、變量的存儲類型外部類型用關(guān)鍵字extern聲明的變量稱為外部變量外部變量是全局變量,具有文件作用域用extern聲明外部變量的目的有兩個擴(kuò)展當(dāng)前文件中全局變量的作用域;其他文件中全局變量的作用域擴(kuò)展到當(dāng)前文件中3.6作用域與生存周期5、變量的存儲類型【例3-25】求兩個整數(shù)的最大值#include<iostream>usingnamespacestd;externinta,b; //第3行聲明a、b為外部變量intmain(){intc;intmax(intx,inty);c=max(a,b); //第7行使用全局變量a、bcout<<"max="<<c<<endl;return0;}inta=3,b=5; //第11行定義全局變量a、bintmax(intx,inty){intz;z=x>y?x:y;returnz;}【例3-25】求兩個整數(shù)的最大值#include<io3.6作用域與生存周期6、變量的存儲類型靜態(tài)類型靜態(tài)變量的類型說明符是static靜態(tài)變量屬于靜態(tài)存儲方式,但是屬于靜態(tài)存儲方式的量不一定就是靜態(tài)變量靜態(tài)變量根據(jù)定義在函數(shù)內(nèi)還是函數(shù)外,分為靜態(tài)局部變量與靜態(tài)全局變量。3.6作用域與生存周期6、變量的存儲類型【例3-26】靜態(tài)局部變量使用示例#include<iostream>usingnamespacestd;voidmain(){int

i;void

f();

/*函數(shù)說明*/for(i=1;i<=5;i++)f();

/*函數(shù)調(diào)用*/}void

f()

/*函數(shù)定義*/{auto

int

j=0;++j;cout<<j;}【例3-26】靜態(tài)局部變量使用示例#include<i【例3-27】靜態(tài)全局變量使用示例#include<iostream>usingnamespacestd;voidfn();staticintn;//定義靜態(tài)全局變量intmain(){ n=20; cout<<n<<endl; fn(); return0;}voidfn(){n++;cout<<n<<endl;}【例3-27】靜態(tài)全局變量使用示例#include<i3.6作用域與生存周期7、生存期靜態(tài)生存期這種生命期與程序的運行期相同,只要程序一開始運行,這種生命期的變量就存在,當(dāng)程序結(jié)束時,其生命期就結(jié)束局部生存期在函數(shù)內(nèi)部聲明的變量或者塊中聲明的變量具有局部生命期動態(tài)生存期用new聲明獲得動態(tài)存儲空間,在堆中分配某一類型變量所占的存儲空間,并將首地址賦給指針3.6作用域與生存周期7、生存期課堂測試1、#include<iostream>usingnamespacestd;voidfun();voidmain(){fun();fun();}voidfun(){staticinta=1;inti=5;

a++;

i++;cout<<"i="<<i<<",a="<<a<<endl;}課堂測試1、#include<iostream>#include<iostream>usingnamespacestd;inti=1;//voidmain(void){staticinta;//

intb=-10;//

intc=0;voidother(void);cout<<"---MAIN---\n";cout<<"i:"<<i<<"a:"<<a<<"b:"<<b<<"c:"<<c<<endl;c=c+8;other();cout<<"---MAIN---\n";cout<<"i:"<<i<<"a:"<<a<<"b:"<<b<<"c:"<<c<<endl;i=i+10;other();}i為全局變量,具有靜態(tài)生存期。靜態(tài)局部變量,有全局壽命,局部可見。b,c為局部變量,具有動態(tài)生存期。2.課堂測試#include<iostream>i為全局變量,具有靜態(tài)voidother(void){staticinta=2;staticintb;

intc=10;

a=a+2;i=i+32;c=c+5;cout<<"---OTHER---\n";cout<<"i:"<<i<<"a:"<<a<<"b:"<<b<<"c:"<<c<<endl;b=a;}//a,b為靜態(tài)局部變量,具有全局壽命,局部可見。//只第一次進(jìn)入函數(shù)時被初始化。//C為局部變量,具有動態(tài)生存期,每次進(jìn)入函數(shù)時都初始化。---MAIN---

i:1

a:0b:-10c:0---OTHER---

i:33a:4b:0c:15---MAIN---

i:33

a:0b:-10c:8---OTHER---

i:75a:6b:4c:15運行結(jié)果:voidother(void)//a,b為靜態(tài)局部變量,3.6作用域與生存周期8、名字空間一個命名空間將不同的標(biāo)識符集合在一個命名作用域(namedscope)內(nèi)為了解決命名沖突例如,聲明一個命名空間NS:namspaceNS{classFile;voidFun();}則引用標(biāo)識符的方式如下,NS::Fileobj;NS::Fun();沒有聲明命名空間的標(biāo)識符都處于無名的命名空間中3.6作用域與生存周期8、名字空間【例3-28】使用std名字空間#include<iostream>intmain(){

std::cout<<"Comingtoyoufromcout."<<endl;return0;}#include<iostream>usingnamespacestd;intmain(){cout<<"Comingtoyoufromcout."<<endl;return0;

}【3-29】usingnamespace語句【例3-28】使用std名字空間#include<io【3-30】usingnamespace的問題#include<iostream>namespaceMyNames{intval1=10;intval2=20;}namespaceMyOtherNames{intval1=30;intval2=50;}usingnamespacestd;usingnamespaceMyNames;usingnamespaceMyOtherNames;intmain(){cout<<“Comingtoyoufromcout.”;

val1=100;return0;}【3-30】usingnamespace的問題#inc【3-31】程序改寫#include<iostream>namespaceMyNames{intval1=10;intval2=20;}namespaceMyOtherNames{intval1=30;intval2=50;}usingnamespaceMyNames;usingnamespaceMyOtherNames;intmain(){

std::cout<<"Comingtoyoufrom

cout.“<<endl;MyNames::val1=100;return0;}【3-31】程序改寫#include<iostream【3-32】命名空間定義#include<iostream.h>namespaceMyNames{constintOFFSET=15;intval1=10;intval2=20;charch='A';intReturnSum(){inttotal=val1+val2+OFFSET;returntotal;}

charReturnCharSum(){charresult=ch+OFFSET;returnresult;}}【3-32】命名空間定義#include<iostre【3-32】命名空間定義intmain(){cout<<"namespacemembervalues:"<<endl;cout<<MyNames::val1<<endl;cout<<MyNames::val2<<endl;cout<<MyNames::ch<<endl;cout<<"resultofnamespacefunctions:"<<endl;cout<<MyNames::ReturnSum()<<endl;cout<<MyNames::ReturnCharSum()<<endl;}運行結(jié)果:

namespacemembervalues:

10

20

A

resultofnamespacefunctions:

45

P【3-32】命名空間定義intmain()運行結(jié)果:

【3-33】嵌套名字空間#include<iostream.h>namespaceMyNames{intval1=10;intval2=20;namespaceMyInnerNames{intval3=30;

intval4=40;}}intmain(){cout<<”namespacevalues:”<<endl;cout<<MyNames::val1<<endl;cout<<MyNames::val2<<endl;cout<<MyNames::MyInnerNames::val3<<endl;cout<<MyNames::MyInnerNames::val4<<endl;

return0;}運行結(jié)果:

namespacevalues:

10

20

30

40【3-33】嵌套名字空間#include<iostre3.6作用域與生存周期8、名字空間無名名字空間namespace

{

intval1=10;

intval2=20;

}名字空間別名namespaceMyNames

{

intval1=10;

intval2=20;

}

namespaceMyAlias=MyNames;3.6作用域與生存周期8、名字空間namespaceMy【3-34】名字空間別名的使用#include<iostream.h>namespaceMyNames{intval1=10;intval2=20;}NamespaceMyAlias=MyNames;intmain(){cout<<”namespacevalues:”<<endl;cout<<MyNames::val1<<endl;

cout<<MyNames::val2<<endl;cout<<”Aliasnamespacevalues:”<<endl;

cout<<MyAlias::val1<<endl;cout<<MyAlias::val2<<endl;return0;}運行結(jié)果:

namespacevalues:1020Aliasnamespacevalues:1020【3-34】名字空間別名的使用#include<ios3.7多文件結(jié)構(gòu)1、頭文件每個標(biāo)準(zhǔn)庫都有相應(yīng)的“頭文件”,頭文件中包含對應(yīng)庫中所有函數(shù)的函數(shù)原型與這些函數(shù)所需的各種數(shù)據(jù)類型和常量的定義2、多個文件組成的程序結(jié)構(gòu)大程序傾向于分成多個源文件,其理由如下:避免重復(fù)編譯函數(shù)使程序更加容易管理把相關(guān)函數(shù)放到一特定源文件中。3.7多文件結(jié)構(gòu)1、頭文件第三章函數(shù)作業(yè)復(fù)習(xí)本章結(jié)束,謝謝第三章函數(shù)作業(yè)青島理工大學(xué)第三章函數(shù)青島理工大學(xué)第三章函數(shù)本章主要內(nèi)容3.1函數(shù)的定義和聲明3.2函數(shù)的調(diào)用與參數(shù)傳遞3.3內(nèi)聯(lián)函數(shù)3.4函數(shù)重載3.5帶默認(rèn)形參值的函數(shù)3.6作用域與生存周期3.7多文件結(jié)構(gòu)本章主要內(nèi)容3.1函數(shù)的定義和聲明3.1函數(shù)的定義與申明1、函數(shù)的定義無參函數(shù)的一般形式類型說明符

函數(shù)名()

{

類型說明

語句

}類型說明符

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

形式參數(shù)類型說明

{

類型說明

語句

}有參函數(shù)的一般形式3.1函數(shù)的定義與申明1、函數(shù)的定義類型說明符

函數(shù)【例3-1】max函數(shù)的位置示例#include<iostream.h>int

max(int

a,int

b){if(a>b)return

a;else

return

b;}void

main(){int

max(int

a,int

b);int

x,y,z;cout<<"input

two

numbers:"<<endl);cin>>x>>y;z=max(x,y);cout<<"maxmum="<<z<<endl;}【例3-1】max函數(shù)的位置示例#include<io3.1函數(shù)的定義與申明2、函數(shù)的申明函數(shù)聲明的語法形式類型標(biāo)識符函數(shù)名(形式參數(shù)表){

語句序列}形式參數(shù)表<type1>name1,<type2>name2,...,<typen>namen函數(shù)的返回值由return語句給出;無返回值的函數(shù)(void類型),不必寫return語句是被初始化的內(nèi)部變量,壽命和可見性僅限于函數(shù)內(nèi)部若無返回值,寫void3.1函數(shù)的定義與申明2、函數(shù)的申明是被初始化的內(nèi)部變量,【例3-1】max函數(shù)的位置示例#include<iostream.h>int

max(int

a,int

b); //函數(shù)聲明void

main(){int

max(int

a,int

b);int

x,y,z;cout<<"input

two

numbers:"<<endl);cin>>x>>y;z=max(x,y);cout<<"maxmum="<<z<<endl;}int

max(int

a,int

b)//函數(shù)定義{if(a>b)return

a;else

return

b;}【例3-1】max函數(shù)的位置示例#include<io【例3-2】實現(xiàn)兩個數(shù)相加#include<iostream.h>intadd(int,int); //函數(shù)原型voidmain(){ intsum,x,y; cout<<"請輸入被加數(shù)和加數(shù):"<<endl; cin>>x>>y; sum=add(x,y);//函數(shù)調(diào)用 cout<<"Sum="<<sum<<endl;}intadd(inta,intb)//函數(shù)定義{ returna+b;}運行結(jié)果:請輸入被加數(shù)和加數(shù):213625Sum=838【例3-2】實現(xiàn)兩個數(shù)相加#include<iostr3.2函數(shù)的調(diào)用與參數(shù)傳遞1、函數(shù)的調(diào)用調(diào)用形式函數(shù)名(實參列表)函數(shù)調(diào)用格式函數(shù)表達(dá)式函數(shù)語句函數(shù)實參3.2函數(shù)的調(diào)用與參數(shù)傳遞1、函數(shù)的調(diào)用3.2函數(shù)的調(diào)用與參數(shù)傳遞2、函數(shù)調(diào)用時的參數(shù)傳遞按值傳遞形參在沒有被調(diào)用時,不占用存儲空間調(diào)用函數(shù)時,應(yīng)該注意函數(shù)的實參與形參類型一致,否則會出現(xiàn)錯誤C++函數(shù)中參數(shù)的求值順序為自右至左3.2函數(shù)的調(diào)用與參數(shù)傳遞2、函數(shù)調(diào)用時的參數(shù)傳遞【例3-3】按值傳遞#include<iostream.h>voidswap(int,int);voidmain(){inta=3,b=4;cout<<"a="<<a<<",b=“<<b<<endl;swap(a,b);cout<<"a="<<a<<",b="<<b<<endl;}voidswap(intx,inty){intt=x;x=y;y=t;}運行結(jié)果:a=3,b=4a=3,b=4【例3-3】按值傳遞#include<iostream【例3-4】函數(shù)參數(shù)的傳遞順序#include<iostream.h>intsome_fun(inta,intb){ returna+b;}voidmain()

{intx,y;x=2;y=3;cout<<some_fun(++x,x+y)<<endl;x=2;y=3;cout<<some_fun(x+y,++x)<<endl;}運行結(jié)果:89【例3-4】函數(shù)參數(shù)的傳遞順序#include<iost3.2函數(shù)的調(diào)用與參數(shù)傳遞2、函數(shù)調(diào)用時的參數(shù)傳遞地址傳遞【例3-5】地址傳遞#include"iostream.h"voidswap(int*,int*);voidmain(){inta=3,b=4;cout<<"a="<<a<<",b=“<<b<<endl;swap(&a,&b);cout<<"a="<<a<<",b=“<<b<<endl;}

voidswap(int*x,int*y){intt=*x;*x=*y;*y=t;}運行結(jié)果:a=3,b=4a=4,b=33.2函數(shù)的調(diào)用與參數(shù)傳遞2、函數(shù)調(diào)用時的參數(shù)傳遞【例3-3.2函數(shù)的調(diào)用與參數(shù)傳遞2、函數(shù)調(diào)用時的參數(shù)傳遞引用傳遞數(shù)據(jù)類型&引用名=數(shù)據(jù)類型變量名;引用(&)是標(biāo)識符的別名;【例3-6】引用的建立和使用。#include<iostream>usingnamespacestd;intmain(){inta=30,b=20;int&refa=a,&refb=b;refa=a+20;b=refb+10;cout<<refa<<“”<<a<<endl;cout<<refb<<""<<b<<endl;

refa=b;//此時引用refa仍舊是a的別名,只是把b的值給到a。cout<<refa<<“”<<a<<endl;return0;}運行結(jié)果:5050303030303.2函數(shù)的調(diào)用與參數(shù)傳遞2、函數(shù)調(diào)用時的參數(shù)傳遞【例3-【例3-7】引用傳遞#include"iostream.h"voidswap(int&,int&);voidmain(){inta=3,b=4;cout<<“a=”<<a<<“,b=”<<b<<endl;swap(a,b);cout<<“a=”<<a<<“,b=”<<b<<endl;}voidswap(int&x,int&y){intt=x;x=y;y=t;}

運行結(jié)果:a=3,b=4a=4,b=3【例3-7】引用傳遞#include"iostream3.2函數(shù)的調(diào)用與參數(shù)傳遞3、函數(shù)的嵌套調(diào)用和遞歸調(diào)用函數(shù)的嵌套調(diào)用【例3-8】函數(shù)的嵌套調(diào)用,求三個數(shù)中最大數(shù)和最小數(shù)的差值。#include<iostream>usingnamespacestd;intmax(intx,inty,intz){intt;t=x>y?x:y;return(t>z?t:z);}intmin(intx,inty,intz){intt;t=x<y?x:y;return(t<z?t:z);}intdif(intx,inty,intz){returnmax(x,y,z)-min(x,y,z);}voidmain(){inta,b,c;cin>>a>>b>>c;cout<<"Max-Min="<<dif(a,b,c)<<endl;}運行結(jié)果:5-615↙213.2函數(shù)的調(diào)用與參數(shù)傳遞3、函數(shù)的嵌套調(diào)用和遞歸調(diào)用【例3.2函數(shù)的調(diào)用與參數(shù)傳遞3、函數(shù)的嵌套調(diào)用和遞歸調(diào)用函數(shù)的遞歸調(diào)用圖3-1直接調(diào)用過程示意圖圖3-2間接調(diào)用過程示意圖3.2函數(shù)的調(diào)用與參數(shù)傳遞3、函數(shù)的嵌套調(diào)用和遞歸調(diào)用圖33.2函數(shù)的調(diào)用與參數(shù)傳遞3、函數(shù)的嵌套調(diào)用和遞歸調(diào)用函數(shù)的遞歸調(diào)用遞歸函數(shù)的一般形式:函數(shù)類型遞歸函數(shù)名f(參數(shù)x)

{

if(滿足結(jié)束條件)

結(jié)果=初值;

else

結(jié)果=含f(x-1)的表達(dá)式;

返回結(jié)果;

}3.2函數(shù)的調(diào)用與參數(shù)傳遞3、函數(shù)的嵌套調(diào)用和遞歸調(diào)用函數(shù)【例3-9】

編程計算某個正整數(shù)的階乘#include<iostream.h>longintfac(intn){inttotal;if(n==1||n==0)total=1;

elsetotal=fac(n-1)*n;

returntotal;}voidmain(){intn;cout<<"pleaseinputainteger:";

cin>>n;cout<<n<<"!is"<<fac(n)<<endl; }運行結(jié)果:pleaseinputainteger:12↙12!is479001600【例3-9】編程計算某個正整數(shù)的階乘#include<【例3-10】用非遞歸方法求階乘longintfac(intn){inttotal=1;if(n>0){ while(n) {total*=n; n--;

} }returntotal; }【例3-10】用非遞歸方法求階乘longintfac3.3內(nèi)聯(lián)函數(shù)聲明時使用關(guān)鍵字inline。編譯時在調(diào)用處用函數(shù)體進(jìn)行替換,節(jié)省了參數(shù)傳遞、控制轉(zhuǎn)移等開銷。注意:內(nèi)聯(lián)函數(shù)體內(nèi)不能有循環(huán)語句和switch語句。內(nèi)聯(lián)函數(shù)的定義必須出現(xiàn)在內(nèi)聯(lián)函數(shù)第一次被調(diào)用之前。內(nèi)聯(lián)函數(shù)不能是遞歸函數(shù)語句數(shù)盡可能少,一般不超過5行3.3內(nèi)聯(lián)函數(shù)聲明時使用關(guān)鍵字inline。【例3-12】將字符數(shù)組str1中所有小寫字母('a'~'z')轉(zhuǎn)換成大寫字母#include<iostream.h>#include<string.h>intup_letter(charch);voidmain(){charstr[80];inti;cout<<"pleaseinputastring:";cin>>str;for(i=0;i<strlen(str);i++){if(up_letter(str[i]))str[i]-=32;}cout<<"theresultis:"<<str<<endl;}intup_letter(charch){if(ch>='a'&&ch<='z')return1;elsereturn0;}運行結(jié)果:Pleaseinputastring:goodMORNING3456

Theresultis:GOODMORNING3456【例3-12】將字符數(shù)組str1中所有小寫字母('a'~'z【例3-12】將字符數(shù)組str1中所有小寫字母('a'~'z')轉(zhuǎn)換成大寫字母#include<iostream.h>#include<string.h>inlineintup_letter(charch);voidmain(){charstr[80];inti;cout<<"pleaseinputastring:";cin>>str;for(i=0;i<strlen(str);i++){if(up_letter(str[i]))str[i]-=32;}cout<<"theresultis:"<<str<<endl;}inlineintup_letter(charch){if(ch>='a'&&ch<='z')return1;elsereturn0;}【例3-12】將字符數(shù)組str1中所有小寫字母('a'~'z【例3-13】內(nèi)聯(lián)函數(shù)的應(yīng)用#include<iostream.h>inlineintabs(intx){returnx<0?-x:x;}voidmain(){inta,b=3,c,d=-4;a=abs(b);

c=abs(d);

cout<<"a="<<a<<",c="<<c<<endl;}運行結(jié)果:a=3,c=4【例3-13】內(nèi)聯(lián)函數(shù)的應(yīng)用#include<iost3.4函數(shù)重載1、函數(shù)重載的定義重載是指同一個函數(shù)名對應(yīng)多個函數(shù)的現(xiàn)象形參類型不同intadd(intx,inty);floatadd(floatx,floaty);形參個數(shù)不同intadd(intx,inty);intadd(intx,inty,int

z);3.4函數(shù)重載1、函數(shù)重載的定義形參類型不同intadd3.4函數(shù)重載2、函數(shù)重載的綁定函數(shù)重載要求編譯器能夠唯一地確定調(diào)用一個函數(shù)時應(yīng)執(zhí)行哪個函數(shù)代碼重載函數(shù)add()的綁定:

cout<<add(1,2)<<endl;//匹配intadd(int,int);

cout<<add(1.2,3.4)<<endl;//匹配doubleadd(double,double);

cout<<add('a','b')<<endl;//匹配intadd(int,int);3.4函數(shù)重載2、函數(shù)重載的綁定【例3-14】求三個操作數(shù)之和#include<iostream.h>intsum(int,int,int);doublesum(double,double,double);voidmain(){ cout<<"Int:"<<sum(2,3,4)<<endl; cout<<"Double:"<<sum(1.4,2.7,3.8)<<endl;}intsum(inta,intb,intc){ returna+b+c;}doublesum(doublea,doubleb,doublec){ returna+b+c;}運行結(jié)果:Int:9

Double:7.9【例3-14】求三個操作數(shù)之和#include<ios3.5帶默認(rèn)形參值的函數(shù)C++語言允許在函數(shù)說明或函數(shù)定義中為形參預(yù)賦一個默認(rèn)的值,這樣的函數(shù)就叫做帶有默認(rèn)形參值的函數(shù)intfun(intx=15,inty=8){returnx-y;}voidmain(void){fun(34,22);//傳遞給形參x,y的值分別為34和22fun(10);//傳遞給形參x,y的值分別為10和8fun();//傳遞給形參x,y的值分別為15和8}3.5帶默認(rèn)形參值的函數(shù)C++語言允許在函數(shù)說明或函數(shù)定義3.5帶默認(rèn)形參值的函數(shù)特點若函數(shù)具有多個形參,則缺省形參值必須自右向左連續(xù)定義,并且在一個缺省形參值的右邊不能有未指定缺省值的參數(shù)在調(diào)用一個函數(shù)時,如果省去了某個實參,則直到最右端的實參都要省去voidadd_int(inta=1,intb=5,intc=10);//正確的函數(shù)聲明

voidadd_int(inta,intb=5,intc=10);//正確的函數(shù)聲明

voidadd_int(inta=1,intb,intc=10);//錯誤的函數(shù)聲明

voidadd_int(inta=1,intb,intc)//錯誤的函數(shù)聲明假如聲明:intfun(inta,floatb=5.0,charc='.',intd=10);

采用如下調(diào)用形式是錯誤的:

fun(8,,,4);//語法錯誤3.5帶默認(rèn)形參值的函數(shù)特點voidadd_int(i3.5帶默認(rèn)形參值的函數(shù)特點缺省形參值的說明必須出現(xiàn)在函數(shù)調(diào)用之前例如:

intsub(intx=8,inty=3); //缺省形參值在函數(shù)原型中給出

voidmain(void)

{

sub(20,15); //20-15

sub(10); //10-3

sub(); //8-3}

intsub(intx,inty) //缺省形參值沒有在函數(shù)定義時給出

{

returnx-y;

}3.5帶默認(rèn)形參值的函數(shù)特點例如:

intsub(int3.5帶默認(rèn)形參值的函數(shù)特點在同一個作用域,一旦定義了缺省形參值,就不能再定義它如果幾個函數(shù)說明出現(xiàn)在不同的作用域內(nèi),則允許分別為它們提供不同的缺省形參值intfun(inta,floatb,char,intd=10);

intfun(inta,floatb,charc=‘.’,intd=10);//錯誤:企圖再次定義缺省參數(shù)c和dintfun(inta=6,floatb=5.0,charc='.',intd=10);

voidmain(void)

{

intfun(inta=3,floatb=2.0,charc='n',intd=20);

cout<<fun()<<endl;//fun函數(shù)使用局部缺省參數(shù)值

}3.5帶默認(rèn)形參值的函數(shù)特點intfun(inta,f3.5帶默認(rèn)形參值的函數(shù)特點對形參缺省值的指定可以是初始化表達(dá)式,甚至可以包含函數(shù)調(diào)用在函數(shù)原型中給出了形參的缺省值時,形參名可以省略形參的默認(rèn)值可以是全局常量、全局變量、表達(dá)式、函數(shù)調(diào)用,但不能為局部變量//d參數(shù)的缺省值是函數(shù)調(diào)用

intfun(inta,floatb=5.0,charc=‘.’,intd=sub(20,15));intfun(int,float=5.0,char=‘.’,int=sub(20,15));//下例不合法:

voidfun()

{intk;

voidg(intx=k); //k為局部變量

}3.5帶默認(rèn)形參值的函數(shù)特點//d參數(shù)的缺省值是函數(shù)調(diào)用

3.6作用域與生存周期1、標(biāo)識符的作用域局部作用域(塊作用域)函數(shù)作用域函數(shù)原型作用域文件作用域名字空間作用域表3-1四種作用域的作用范圍3.6作用域與生存周期1、標(biāo)識符的作用域表3-1四種作【例3-15】塊作用域示例#include<iostream>usingnamespacestd;intmain(){ //1inti,j; //2i=1;j=2; //3{inta,b; //4

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

最新文檔

評論

0/150

提交評論