




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
函數1.什么是函數?2.函數的定義和說明3.函數的參數和返回值主要內容4.函數的參數和返回值5.函數的調用方式6.函數的嵌套調用和遞歸調用22天津工程師范學院什么是函數編寫函數,計算并打印若干給定整數(1、3、4)的階乘,要求每次打印數據后打印一行星號(10個)。1**********************6**********************24**********************……33天津工程師范學院什么是函數voidmain(){inta=1,b=3,c=4;intv=1;while(a>0){v*=a;a--;}cout<<v;for(inti=0;i<10;i++){cout<<"*";}cout<<endl;
v=1;while(a>0){v*=a;a--;}cout<<v;for(inti=0;i<10;i++){cout<<"*";}
cout<<endl;44天津工程師范學院什么是函數 intgetfact(intm){intv=1;while(m>0){v*=m;m--;}returnv;}
voidcoutstar(){for(inti=0;i<10;i++)cout<<"*";cout<<endl;}voidmain(){ inta=19,b=123,c=67; cout<<getfact(a);
coutstar(); cout<<getfact(b);
coutstar(); cout<<getfact(c);
coutstar();}5參數類型參數名函數名返回類型函數體函數調用(參數傳遞)5天津工程師范學院什么是函數為什么需要函數提高效率,減少重復編寫程序的工作量。一個較大的程序不可能完全由一個人完成,更不可能把所有代碼放在一個主函數中。什么是函數函數(function)就是一段實現某個功能的代碼。66天津工程師范學院什么是函數一個程序包含若干個函數(但只有一個主函數),程序從主函數開始執行。執行過程中,主函數調用其它函數,其他函數相互調用。實際應用中,主函數一般比較簡單,作用就是調用其它函數,而程序的功能全部都是由函數實現的。mainABCED77天津工程師范學院函數的定義和說明1、函數的定義格式<返回類型><函數名>(<參數列表>){若干條語句(函數體)}返回類型包含存儲類型和數據類型,存儲類型省略為外部函數,數據類型不能省略。參數列表由若個參數組成,參數間用逗號分隔,給出參數名時還要給出參數的數據類型。88天津工程師范學院函數的定義和說明注意:1、函數的類型即函數返回值的類型,如果函數沒有返回值則返回類型為void。 voidcoutstar(){ … }2、參數定義方式intgetfact(intm){……}99天津工程師范學院什么是函數void
coutstar(){for(inti=0;i<10;i++){cout<<"*";}cout<<endl;}int
getfact(intm){ intv=1;while(m>0){v*=m;m--;}returnv;}1010天津工程師范學院什么是函數voidmain(){ inta=1,b=3,c=4;cout<<getfact(a);
coutstar();cout<<getfact(b);
coutstar(); ……}voidcoutstar(){……}intgetfact(intm){……}voidcoutstar(){……}intgetfact(intm){……}voidmain(){ inta=1,b=3,c=4; cout<<getfact(a);
coutstar();cout<<getfact(b);
coutstar(); ……}11函數說明int
getfact(int);voidcoutstar();11天津工程師范學院函數的定義和說明2、函數的說明如果函數定義在前,調用在后,調用前可以不說明。如果函數定義在調用之后,則必須在調用前說明函數的類型,名稱和參數。說明格式:<類型><函數名>(<參數列表>)例如,有函數定義如下:int
getfact(int
m){…}原型說明:int
getfact(int)要與定義時順序和類型相一致可省略參數名1212天津工程師范學院函數的定義和說明voidmain(){ inta=1,b=3,c=4;
voidcoutstar();
intgetfact(intm);cout<<getfact(a); coutstar(); ……}voidcoutstar(){……}intgetfact(intm){……}voidcoutstar();intgetfact(intm);voidmain(){ inta=1,b=3,c=4;
cout<<getfact(a); coutstar(); ……}voidcoutstar(){……}intgetfact(intm){……}1313天津工程師范學院函數的參數和返回值1、函數的參數在定義函數時,函數名后括號中的變量名為形式參數(形參)。定義函數時,必須寫出形參的個數、類型和名字。當調用一個有參數的函數時,直接寫函數名調用函數,函數名后括號中的參數為實際參數(實參)。實參不加數據類型,可以是常量、變量、表達式。1414天津工程師范學院函數的參數和返回值1、函數的參數在未被調用時,形參沒有確定值,只是形式上的參數,只有被調用時才從調用函數中獲得實際參數。void
fun(intm){ cout<<m;}voidmain(){ inta=100; fun(a); fun(10); fun(10+a);}…………ma100100intm=a;1515天津工程師范學院函數的參數和返回值函數參數的求值順序參數的求值順序因編譯系統不同而不同,一般來說不會引起參數值不同,但在具有副作用的表達式中可能會造成二義性。inta=5;fun(a++,a);編寫程序要避免實參表達式中出現具有副作用的表達式1616天津工程師范學院6.1#include<iostream.h>intfun(inta,intb){ returna+b;}voidmain(){ inta(13),b(25); intsum=fun(a-1,a-b); cout<<sum<<endl;}1717天津工程師范學院函數的參數和返回值函數參數的默認值在定義或說明函數時通過設置參數的默認值,可以方便函數在調用時只寫出部分參數。例如doublefun(doublea=1.5,doubleb=2.6)在函數被調用時,如果對應實參無值,則用形參的默認值,如對應實參有值,則用實參值,默認值無效。fun(); //a=1.5,b=2.6fun(1.0) //a=1.0,b=2.61818天津工程師范學院函數的參數和返回值如,doublefun(doublea,doubleb=2.6),則以下調用函數語句有無錯誤?fun();fun(1.2);fun(1,3);又如doublefun(doublea=1.5,doubleb),則以下調用語句有無錯誤?fun(1.2);1919天津工程師范學院函數的參數和返回值注意設置形參的默認值要求從參數的右端開始,在指定了默認值的參數右端不允許出現沒有指定默認值的參數。如果一個函數需要說明時,設置參數默認值應放在說明函數的語句中,不放在定義函數的語句中。參數默認值可以只用表達式2020天津工程師范學院6.2#include<iostream.h>voidmain(){ voidfun(inti=1,intj=2,intk=3); fun(); fun(4); fun(5,6); fun(7,8,9);}voidfun(inti,intj,intk){ cout<<i+j+k<<endl;}2121天津工程師范學院函數的參數和返回值函數返回值的實現函數可以有返回值也可以沒有返回值。沒有返回值的函數類型為void,return語句可以省略。在函數中實現返回值的方法是使用帶有表達式的return語句:return[表達式];一個函數可以有一個以上return語句,執行到哪一個return語句,哪一個return語句起作用。return后的表達式可以加括號,可以不加2222天津工程師范學院函數的參數和返回值return[表達式];的執行過程;先計算表達式值;當表達式值同函數返回類型不一致時,應將表達式值轉換為返回類型;將表達式值返回給調用函數,作為調用函數的值將程序的控制權返回到調用函數語句,執行調用函數下面的語句。2323天津工程師范學院6.4#include<iostream.h>intfun(doublea,intb){ returna-b;}voidmain(){ doublex(11.5); inty(10); doublez=fun(x,y); cout<<z<<endl;}2424天津工程師范學院函數的調用方式函數根據調用方式分為傳值調用和引用調用。傳值調用 函數調用時,將實參的值傳遞給形參的調用方式。傳值調用中有個分為傳值和傳地址兩種。傳值是指傳遞變量或表達式的值傳地址是指傳遞變量的地址值2525天津工程師范學院函數的調用方式1、傳值調用實參為表達式,形參為變量實參復制一個副本給形參,在被調用函數中形參的值被改變時,實參不會受到影響。2626天津工程師范學院傳值調用1234567891011voidswap(int,int);voidmain(){ intx=100,y=0; swap(x,y); cout<<x<<","<<y<<endl;}voidswap(inta,intb){ intt; t=a;a=b;b=t; cout<<a<<","<<b<<endl;}
2727天津工程師范學院回顧注意:當形參是普通變量時,實參可以是變量、常量、表達式,這時形參收到的是實參的值。傳參的過程就是初始化形參的過程(開辟空間+賦值)傳值方式不能通過改變形參來改變實參2828天津工程師范學院函數的嵌套調用和遞歸調用函數的嵌套調用嵌套調用是指在一個函數體中調用另一個函數。注意,函數可以嵌套調用,但是不能嵌套定義!mainABCED2929天津工程師范學院函數的嵌套調用和遞歸調用#include<iostream.h>voidfun1(),fun2(),fun3();voidmain(){ cout<<"Itisinmain()."<<endl;
fun2(); cout<<"Tiisbackmain()."<<endl;}voidfun1(){ cout<<"Itisinfun1()."<<endl;
fun3(); cout<<"Itisbackinfun1()."<<endl;}3030天津工程師范學院函數的嵌套調用和遞歸調用voidfun2(){ cout<<"Itisinfun2()."<<endl;
fun1(); cout<<"Itisbackinfun2()."<<endl;}voidfun3(){ cout<<"Itisinfun3()."<<endl;}3131天津工程師范學院函數的嵌套調用和遞歸調用函數的遞歸調用遞歸調用是指在一個函數體中直接或間接調用自己。mainDmainAD3232天津工程師范學院遞歸調用采用遞歸調用可以解決的問題是有限的,這些問題具有以下特點:能夠將原有問題分解為一個新問題,而這個新問題又要用原有問題的解決方法。按這一特點將問題分解下去,每次出現的新問題都是原有問題的簡化的子問題;(規模變小,形式不變)最終分解出來的新問題是具有已知解的問題。(有限)3333天津工程師范學院遞歸從鍵盤輸入一個正整數,編程求出該函數的階乘,要求使用遞歸調用的方法。0!=11!=12!=1*23!=1*2*3n!=1*2*3*……*n=1!*2=2!*3=(n-1)!*n 1n=0,1fact(n)= fact(n-1)*nn>13434天津工程師范學院遞歸longfact(intn){ intc; if(n<=1){ return1; else returnfact(n-1)*n;}voidmain(){intn;cin>>n;cout<<fact(n)<<endl;}35 1n=0,1fact(n)= fact(n-1)*nn>1主函數voidmain()intfact(intn)fact(n)
5
435天津工程師范學院主函數voidmain()intfact(inti)fact(n)遞歸
5
4longfact(intn){ intc; if(n<=1){ return1; else returnfact(n-1)*n;}voidmain(){intn;cin>>n;cout<<fact(n)<<endl;}mainfact(n)輸出fact(n)returnfact(n-1)*nfact(n-1)returnfact(n-2)*(n-1)fact(1)return1…36天津工程師范學院重載函數請編寫絕對值函數,函數返回參數的絕對值。1、參數為int類型2、參數為double類型3、參數為long類型intabs(inti){return(i>0?i,-i);}doubleabs1(doublei){return(i>0?i,-i);}longabs2(longi){return(i>0?i,-i);}voidmain(){ cout<<abs(-10); cout<<abs1(-2.5); ……}3737天津工程師范學院重載函數為什么要重載函數具有相同功能的函數如果不能用一個函數名,會給編寫和使用帶來不變。C++運行多個函數具有相同的函數名,但其中任意兩個函數的參數個數、參數類型、類型順序不能完全相同。3838天津工程師范學院重載函數intfun();intfun(int);intfun(double);intfun(int,double);intfun(double,int);floatfun(int);inta=1;doubled=2.5;cout<<fun(d);cout<<fun(d,a);cout<<fun(a,d);cout<<fun(a);3939天津工程師范學院重載函數重載和函數的默認參數可能會沖突,如果有沖突,不能同時使用。intfun(int);intfun(inta=10,doubled=100);intmain(){ cout<<fun(1);}4040天津工程師范學院重載函數intmax(int,int),max(int,int,int),max(int,int,int,int);voidmain(){ cout<<max(57,69)<<endl; cout<<max(60,59,61)<<endl; cout<<max(51,52,53,54)<<endl;}intmax(inta,intb){ returna>b?a:b;}intmax(inta,intb,intc){ intt=max(a,b); returnmax(t,c);}intmax(inta,intb,intc,intd){ intt1=max(a,b); intt2=max(c,d); returnmax(t1,t2);}4141天津工程師范學院例題:輸入兩個數,求最大數并輸出。1)如果是輸入的是整數intmax(intx,inty);
{return(x>y)?x:y;}2)如果是輸入的是單精度數
floatmax(floatx,floaty){
return(x>y)?x:y;}3)如果是輸入的是字符
charmax(charx,chary)
{return(x>y)?x:y;}Tmax(Tx,Ty)
{return(x>y)?x:y;}函數模版42天津工程師范學院函數模版函數模版的一般格式為:template<classortypename標識符><返回類型><函數名>(形式參數表){//函數體};模版關鍵字class和typename必選其中之一函數模版是用來定義個通用的函數,以支持不同類型參數使用。函數模版是一種不指定某些參數的數據類型的函數,在函數模版被調用時根據實際參數的類型決定這些函數模版的類型。43天津工程師范學院函數模版——實例1:求兩個數的最大值并輸出。#include<iostream.h>template<typenameT>TMAX(Tx,Ty){return(x>y)?x:y;}voidmain(){inta(4),b(6);charm('a'),n('b');cout<<MAX(a,b)<<endl;cout<<MAX(m,n)<<endl;}函數模版(僅僅是個說明,不能執行)模版參數實例化編譯器通過實參的類型推導出函數模版的類型參數。44天津工程師范學院函數模版——實例2題目:定義一個函數模版,實現對兩個數的求和功能。解:定義一個函數模版Add(),它的功能是對傳來的兩個參數進行求和運算。這兩個參數可以是任何類型的參數。45天津工程師范學院#include<iostream.h>voidmain(){intx=3,y=5;floatx1=12.3,y1=3.4;doublex2=0.8,y2=23.5;cout<<”整數型:x+y=”<<Add(x,y)<<endl;cout<<”浮點型:x+y=”<<Add(x1,y1)<<endl;cout<<”雙精度:x+y=”<<Add(x2,y2)<<endl;}函數模版template<classT>TAdd(Tx,Ty) {returnx+y;}46天津工程師范學院函數模版——練習使用函數模板實現任意兩個同類型的數的交換。#include<iostream.h>voidmain(){inta(10),b(20);swap(a,b);cout<<"swapa,b"<<a<<""<<b<<endl;}template<typenameT>voidswap(T&x,T&y){Ttemp;temp=x;x=y;y=temp;}47天津工程師范學院函數模版——含有兩個以上其不同參數。定義函數模版時可以使用多個類型參數,每個類型參數前面只需加上關鍵字class,用逗號分割:template<classT1,classT2,…,classTn>例如:template<classT1,classT2>T1Max(T1x,T2y){returnx>=y?x:(T1)y};48天津工程師范學院內聯函數調用函數需要一定的時間和空間開銷:voidmain(){a();}voida(){}
5
44949天津工程師范學院內聯函數C++提供了一種高效方式:在編譯時將所調用函數的代碼直接嵌入到調用函數中,而不是流程轉出去,這種被調用函數叫內聯函數。指定內聯函數只需在函數首行的左端加一個“inline”關鍵字。5050天津工程師范學院內聯函數……inlineintmax(int,int);intmain(){inti=1,j=20;cout<<max(i,j);}inlineintmax(inta,intb){if(a<b){a=b;}returna;}……intmain(){inti=1,j=20;intm;inta,b;a=i;b=jif(a<b){a=b;}m=a;cout<<m;}5151天津工程師范學院內聯函數對函數進行內聯聲明,可以看成是程序設計者對編譯系統提出一個建議,而不是強制命令。編譯系統會自己決定是否采用內聯形式編譯源文件。只有規模比較小(5個語句以下),調用比較頻繁的簡單函數適合作為內聯函數。內聯函數可以有選擇語句,不能包含復雜控制語句,如循環和開關語句。5252天津工程師范學院標識符的作用域和生命期標識符:變量名、常量名、函數名、……標識符的作用域作用域就是變量的有效范圍,在作用域以外是無法訪問這些變量的。變量只能在說明它和定義它的范圍是可見的。根據作用域不同,變量分為全局變量和局部變量兩種。5353天津工程師范學院變量的作用域和生命期局部變量:在一個函數(或復合語句)內部定義的變量是局部變量,它只在函數(或復合語句)內有效,函數(或復合語句)外是不能訪問這些變量的。全局變量:在函數外部定義的變量是全局變量,它的有效范圍從定義開始到文件結束。5454天津工程師范學院變量的作用域和生命期inta=0;//全局intmain(){ intb,c{ ……inti,j;…… }} for(inti=0;i<6;) { inti=7; floata=5f; cout<<i<<endl; i++; }cout<<i<<endl;//cout<<a<<endl;}5555天津工程師范學院變量的作用域和生命期注意:形式參數屬于局部變量,相當于定義在函數內。不同函數中可以使用相同的變量名,使用不同內存單元,互不干擾。作用域重疊的變量,取最近定義有效。全局變量不宜定義過多,為降低程序的清晰性和通用性。全局變量有默認值:char型變量為空,int型變量為0,浮點型變量為0.0。5656天津工程師范學院變量的作用域和生命期inti(0);voidmain(){ inti=10; for(intj(1);j<=2;j++){ { inti=100; j++; cout<<i<<','<<j<<endl; } cout<<i<<','<<j<<endl; i=fun();} cout<<i<<','<<j<<endl; }intfun(){ returni;}5757天津工程師范學院變量的作用域和生命期變量的生命期變量有誕生到消亡的過程。生命期就是變量從開始在內存中占用存儲單元到撤銷所占內存單元的一段時間。變量的生命期同它的存儲類型有關。根據存儲類型的不同,變量分為動態變量和靜態變量兩種。58程序區靜態存儲區動態存儲區58天津工程師范學院變量的作用域和生命期動態存儲方式是指在程序運行期間,系統對變量動態地分配存儲空間。動態存儲區存放以下變量:1、函數的形參,在函數調用時分配單元2、函數中的自動變量(未加static的局部變量)系統在函數調用開始時分配動態空間,函數結束時,釋放這些空間。由于是動態分配的,兩次調用同一個函數時,函數中的變量所占存儲單元可能不一樣。5959天津工程師范學院變量的作用域和生命期靜態存儲方式是指在程序運行期間,系統對變量分配固定的存儲空間。全局變量,在程序開始執行時,為他們分配固定的存儲單元,程序結束釋放這些空間。靜態局部變量(函數中加static的局部變量),第一次被調用時分配空間,此后一直存在靜態存儲區,直到程序運行結束。靜態存儲區動態存儲區6060天津工程師范學院voidfun();voidmain(){ for(inti(0);i<4;i++) fun();}voidfun(){ inta(0); a++;
staticintb; b++; cout<<"a="<<a<<','<<"b="<<b<<endl;}6161天津工程師范學院變量的作用域和生命期注意:靜態局部變量(函數中加static的局部變量),具有默認值,與全局變量一樣。char型變量為空,int型變量為0,浮點型變量為0.0。6262天津工程師范學院intfac(int);voidmain(){ ints(0); for(inti(1);i<=5;i++) s+=fac(i); cout<<“result="<<s<<endl;}intfac(intn){
staticintb=1; b*=n; cout<<"b="<<b<<endl; returnb;}6363天津工程師范學院函數的存儲類外部函數,可以在定義它的程序文件和外部程序文件調用。extern<返回類型><函數名>([參數列表]){……}其中,extern可以省略。P112例5.20,體會多源程序文件。6464天津工程師范學院函數的存儲類內部函數,只能在定義它的程序文件中使用。static<返回類型><函數名>([參數列表]){……}6565天津工程師范學院練習——觀察程序有無錯誤#include<iostream.h>voidmain(){ fun(); cout<<"notfuny!"<<endl;}voidfun(){cout<<"sofuny!"<<endl;}66voidfun();voidfun();66天津工程師范學院#include<iostream.h>voidfun();voidmain(){ fun(); cout<<"notfuny!"<<endl;}voidfun(inta){cout<<"sofuny!"<<a<<endl;}#include<iostream.h>voidfun();voidmain(){ fun(); cout<<"notfuny!"<<endl;}voidfun(inta){cout<<"sofuny!"<<a<<endl;}#include<iostream.h>voidfun();voidmain(){ fun(); cout<<"notfuny!"<<endl;}voidfun(inta){cout<<"sofuny!"<<a<<endl;}觀察程序有無錯誤#include<iostream.h>voidfun();voidmain(){ fun(); cout<<"notfuny!"<<endl;}void
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年基礎設施建設的借款合同示范文本
- 航空物流行業發展趨勢分析報告:2025年航空貨運樞紐建設與區域物流網絡升級策略
- 2025年制造業數字化轉型數據治理與智能生產設備選型指南報告
- 2025年簽訂藝術家節目表演合同
- 2025橄欖葉收購合同樣本
- 2025年中國智能化工廠行業市場占有率及投資前景預測分析報告
- 生物質能源在分布式能源系統中的分布式能源產業市場環境優化
- 綠色供應鏈在制造業中的綠色培訓與教育推廣報告
- 電廠個人年度工作總結模版
- 農業綠色轉型背景下2025年農業綠色生產模式政策實施策略報告
- 《供應商審核講義》課件
- 電化學儲能電站檢修規程知識培訓
- 猩紅熱課件完整版本
- 肌肉骨骼康復學學習通超星期末考試答案章節答案2024年
- 農業保險理賠服務操作流程手冊
- 《交換與路由技術》 課件全套 曹炯清 第1-9部分 學習環境的搭建- 綜合實訓與技能比賽
- 第30屆WMO初測2年級B試卷
- 2024《整治形式主義為基層減負若干規定》全文課件
- 反訴狀(業主反訴物業)(供參考)
- 10SMS202-2 埋地矩形雨水管道及其附屬構筑物(磚、石砌體)
- 《教育向美而生-》讀書分享課件
評論
0/150
提交評論