第5章函數(shù)與預(yù)處理省名師優(yōu)質(zhì)課賽課獲獎(jiǎng)?wù)n件市賽課一等獎(jiǎng)?wù)n件_第1頁
第5章函數(shù)與預(yù)處理省名師優(yōu)質(zhì)課賽課獲獎(jiǎng)?wù)n件市賽課一等獎(jiǎng)?wù)n件_第2頁
第5章函數(shù)與預(yù)處理省名師優(yōu)質(zhì)課賽課獲獎(jiǎng)?wù)n件市賽課一等獎(jiǎng)?wù)n件_第3頁
第5章函數(shù)與預(yù)處理省名師優(yōu)質(zhì)課賽課獲獎(jiǎng)?wù)n件市賽課一等獎(jiǎng)?wù)n件_第4頁
第5章函數(shù)與預(yù)處理省名師優(yōu)質(zhì)課賽課獲獎(jiǎng)?wù)n件市賽課一等獎(jiǎng)?wù)n件_第5頁
已閱讀5頁,還剩38頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第五章函數(shù)與預(yù)處理5.1概述模塊化程序設(shè)計(jì)基本思想:將一個(gè)大程序按功效分割成一些小模塊,特點(diǎn):各模塊相對獨(dú)立、功效單一、結(jié)構(gòu)清楚、接口簡單控制了程序設(shè)計(jì)復(fù)雜性提升元件可靠性縮短開發(fā)周期防止程序開發(fā)重復(fù)勞動(dòng)易于維護(hù)和功效擴(kuò)充開發(fā)方法:自上向下,逐步分解,分而治之第1頁C是模塊化程序設(shè)計(jì)語言C程序結(jié)構(gòu)C是函數(shù)式語言必須有且只能有一個(gè)名為main主函數(shù)C程序執(zhí)行總是從main函數(shù)開始,在main中結(jié)束函數(shù)不能嵌套定義,能夠嵌套調(diào)用第2頁函數(shù)分類從用戶角度標(biāo)準(zhǔn)函數(shù)(庫函數(shù)):由系統(tǒng)提供用戶自定義函數(shù)從函數(shù)形式無參函數(shù)有參函數(shù)使用庫函數(shù)應(yīng)注意:1、函數(shù)功效2、函數(shù)參數(shù)數(shù)目和次序,及各參數(shù)意義和類型3、函數(shù)返回值意義和類型4、需要使用包含文件第3頁函數(shù)定義普通格式正當(dāng)標(biāo)識(shí)符函數(shù)返回值類型缺省int型無返回值void函數(shù)體函數(shù)類型函數(shù)名(數(shù)據(jù)類型變量名1,…,數(shù)據(jù)類型變量名n){ 說明部分 語句部分}例空函數(shù)dummy(){}函數(shù)體為空例無參函數(shù)printstar(){cout<<“**********\n”;}或printstar(void){cout<<“**********\n”;}例有參函數(shù)intmax(intx,y){intz;z=x>y?x:y;return(z);}例有參函數(shù)intmax(intx,inty){intz;z=x>y?x:y;return(z);}第4頁函數(shù)原型(函數(shù)申明)

★函數(shù)原型普通形式:數(shù)據(jù)類型函數(shù)名(參數(shù)類型說明列表);功效:當(dāng)對一個(gè)函數(shù)調(diào)用出現(xiàn)在該函數(shù)定義之前時(shí),必須對函數(shù)進(jìn)行原型申明。#include<iostream.h>intand(inta,intb);voidmain(){intx,y,s;cin>>x>>y;"s=and(x,y);cout<<s<<endl;}intand(inta,intb){intc;c=a+b;return(c);}第5頁#include<iostream.h>voidmain(){floatadd(float,float);/*functiondeclaration*/floata,b,c;cin>>a>>b;c=add(a,b);cout<<"sumis“<<c;}floatadd(floatx,floaty){floatz;z=x+y;return(z);}例函數(shù)申明舉例#include<iostream.h>floatadd(floatx,floaty){floatz;z=x+y;return(z);}main(){floata,b,c;cout<<a<<b;c=add(a,b);cout<<"sumis“<<c;}被調(diào)函數(shù)出現(xiàn)在主調(diào)函數(shù)之前,無須進(jìn)行函數(shù)申明第6頁函數(shù)調(diào)用調(diào)用形式函數(shù)名(實(shí)參表);說明:實(shí)參加形參個(gè)數(shù)相等,類型一致,按次序一一對應(yīng)實(shí)參表求值次序,因系統(tǒng)而定()第7頁調(diào)用方式函數(shù)語句:例printstar();函數(shù)表示式:例m=max(a,b)*2;函數(shù)參數(shù):例cout<<max(a,b);m=max(a,max(b,c));第8頁函數(shù)參數(shù)形參加實(shí)參形式參數(shù):定義函數(shù)時(shí)函數(shù)名后面括號中變量名實(shí)際參數(shù):調(diào)用函數(shù)時(shí)函數(shù)名后面括號中表示式c=max(a,b);(main函數(shù))(max函數(shù))max(intx,inty){intz;z=x>y?x:y;return(z);}例比較兩個(gè)數(shù)并輸出大者voidmain(){inta,b,c;cin>>a>>b;c=max(a,b);cout<<"Maxis“<<c;}max(intx,inty){intz;z=x>y?x:y;return(z);}形參實(shí)參第9頁說明:實(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)存釋放函數(shù)參數(shù)及其傳遞方式形參加實(shí)參形式參數(shù):定義函數(shù)時(shí)函數(shù)名后面括號中變量名實(shí)際參數(shù):調(diào)用函數(shù)時(shí)函數(shù)名后面括號中表示式第10頁參數(shù)傳遞方式值傳遞方式(值調(diào)用)方式:函數(shù)調(diào)用時(shí),為形參分配單元,并將實(shí)參值復(fù)制到形參中;調(diào)用結(jié)束,形參單元被釋放,實(shí)參單元仍保留并維持原值特點(diǎn):形參加實(shí)參占用不一樣內(nèi)存單元單向傳遞第11頁調(diào)用結(jié)束:711x:y:例交換兩個(gè)數(shù)#include<iostream..h>voidmain(){intx=7,y=11;cout<<x<<“\t”<<y<<endl;cout<<"swapped:\n";

swap(x,y);cout<<x<<“\t”<<y<<endl;}swap(inta,intb){inttemp;temp=a;a=b;b=temp;//cout<<“a=“<<a<<"b=“<<b);}>第12頁引用調(diào)用方式:使用“引用”作為函數(shù)參數(shù)特點(diǎn):形參加實(shí)參占用一樣存放單元“雙向”傳遞方法:把形殘申明為引用類型,即在形參名前加上&標(biāo)示符。調(diào)用函數(shù)時(shí)實(shí)參要用變量名,將實(shí)參變量賦給形參引用。第13頁#incude<iostream.h>voidswap(int&u,int&v){inttemp=v;v=u;u=tem;}voidmain(){inta,b;cin>>a>>b;cout<<a<<”\t”<<b;;cout<<“swapped:\n”;swap(a,b);cout<<a<<”\t”<<b;}例交換兩個(gè)數(shù)第14頁函數(shù)返回值返回語句形式:return(表示式);

或return表示式;

或return;功效:使程序控制從被調(diào)用函數(shù)返回到調(diào)用函數(shù)中,同時(shí)把返值帶給調(diào)用函數(shù)說明:函數(shù)中可有多個(gè)return語句若無return語句,遇}時(shí),自動(dòng)返回調(diào)用函數(shù)若函數(shù)類型與return語句中表示式值類型不一致,按前者為準(zhǔn),自動(dòng)轉(zhuǎn)換------函數(shù)調(diào)用轉(zhuǎn)換void型函數(shù)函數(shù)定義時(shí),沒有定義數(shù)據(jù)類型,默認(rèn)函數(shù)返回一個(gè)整型值(int)。例無返回值函數(shù)

voidswap(intx,inty){inttemp;temp=x;x=y;y=temp;}第15頁例函數(shù)返回值類型轉(zhuǎn)換#include<iostream.h>voidmain(){floata,b;intc;cin>>a>>b;c=max(a,b);cout<<"Maxis"<<c<<"\n";}max(floatx,floaty){floatz;z=x>y?x:y;

return(z);}第16頁指針與函數(shù)指針作為函數(shù)參數(shù)

以數(shù)據(jù)地址作為實(shí)參調(diào)用一個(gè)函數(shù),參數(shù)傳遞不是數(shù)據(jù)本身,而是數(shù)據(jù)地址。注意:(1)在主調(diào)函數(shù)中,要以指向變量指針,即變量存放地址作為實(shí)參來調(diào)用另一個(gè)函數(shù)。(2)被調(diào)用函數(shù)形參必須是能夠接收地址值指針變量,而它數(shù)據(jù)類型應(yīng)與被傳送數(shù)據(jù)類型保持一致。第17頁例:#include<iostream.h>swap(int*p1,int*p2){intp;p=*p1;*p1=*p2;*p2=p;}voidmain(){inta,b;cin>>a>>b;cout<<“a=”<<a<<“b=”<<b<<endl;cout<<“swap:\n”;swap(&a,&b);cout<<“a=”<<a<<“b=”<<b<<endl;}int*p;p=p1;p1=p2;p2=p;第18頁函數(shù)調(diào)用中數(shù)組傳遞

使用數(shù)組名作為實(shí)參調(diào)用函數(shù),在被調(diào)用函數(shù)中,以指針變量作為形參接收數(shù)組地址,該指針被賦予數(shù)組地址之后,就指向了數(shù)組存放空間。#include<iostream.h>voidmain(){inta[10],small;voidinput(int*s,intn);intmin(int*s,intn);input(a,10);small=min(a,10);cout<<“minimumis”<<small<<endl;}voidinput(int*s,intn){cout<<“pleaseenter”<<n<<“integers:”<<endl;for(inti=0;i<n;i++)cin>>s[i];}intmin(int*s,intn){intmin,i;min=*s;for(i=1;i<n;i++)if(s[i]<min)min=s[i];return(min);}ints[],intn第19頁函數(shù)指針

函數(shù)在編譯時(shí)被分配一個(gè)入口地址。若將一個(gè)函數(shù)入口地址賦給一個(gè)指針變量,使其指向函數(shù),則稱這類指針為指向函數(shù)指針,即函數(shù)指針。函數(shù)指針定義形式:數(shù)據(jù)類型(*指針變量名)(形參表列);如:int(*fun)(inta,intb);(1)*標(biāo)識(shí)fun為指針變量,兩邊括號是必需。(2)單獨(dú)函數(shù)名表示該函數(shù)入口地址,即函數(shù)第一條指令地址。程序中能夠經(jīng)過將一個(gè)函數(shù)名賦給某一函數(shù)指針,從而使函數(shù)指針指向此函數(shù)。(3)一個(gè)函數(shù)指針能夠指向多個(gè)函數(shù),但必須同類型。(4)函數(shù)指針變量只能指向函數(shù)入口地址,不能指向函數(shù)中某一條指令。第20頁例:#include<iostream.h>voidmain(){ intfunc(inta,intb); int(*pf)(inta,intb); pf=func; intm,n,result; cin>>m>>n; result=(*pf)(m,n); cout<<“result=”<<result<<endl;}intfunc(inta,intb){ returna+b; }指針函數(shù)

指針函數(shù)是指返回值為指針函數(shù)。如:int*pf(intx,inty);第21頁main()函數(shù)f1()函數(shù)f2()函數(shù)voidmain(){…………調(diào)用f1()函數(shù)…………}f1(……){…………調(diào)用f2()函數(shù)…………}f2(……){……………………return(……);}函數(shù)嵌套調(diào)用函數(shù)嵌套調(diào)用和遞歸調(diào)用第22頁假如在一個(gè)函數(shù)調(diào)用過程中直接或間接地對自己進(jìn)行了調(diào)用,這么調(diào)用形式就是函數(shù)遞歸調(diào)用,這個(gè)函數(shù)就稱為遞歸函數(shù)。遞歸函數(shù)分為直接遞歸和間接遞歸。遞歸調(diào)用定義第23頁main()函數(shù)f1()函數(shù)f2()函數(shù)voidmain(){…………調(diào)用f1()函數(shù)…………}f1(……){…………調(diào)用f2()函數(shù)…………}f2(……){……………………return(……);}函數(shù)直接遞歸調(diào)用調(diào)用f2函數(shù)第24頁main()函數(shù)f1()函數(shù)f2()函數(shù)voidmain(){…………調(diào)用f1()函數(shù)…………}f1(……){…………調(diào)用f2()函數(shù)…………}f2(……){……………………return(……);}函數(shù)間接遞歸調(diào)用調(diào)用f1函數(shù)第25頁遞歸函數(shù)編寫方法分治法:分析問題,給出問題求解遞歸定義。遞歸定義基本項(xiàng)歸納項(xiàng)——描述了一個(gè)或幾個(gè)遞歸過程終止?fàn)顟B(tài)——描述了怎樣從當(dāng)前狀態(tài)到終止?fàn)顟B(tài)轉(zhuǎn)化實(shí)質(zhì):當(dāng)一個(gè)復(fù)雜問題能夠分解成若干個(gè)子問題來處理時(shí),其中一些問題與原問題有相同特征屬性,則可利用和原問題相同分析處理方法(函數(shù)開啟自己最新副原來處理這個(gè)較小問題);反之,這些問題處理了,原問題也就迎刃而解了。歸納項(xiàng)就是描述這種原問題和子問題之間轉(zhuǎn)化關(guān)系。第26頁[舉例]編寫函數(shù)計(jì)算n階乘。方法一:迭代法。n!=1*2*3*……*n#include<iostream.h>longfact(longn){return(f);}longf=1;for(inti=1;i<=n;i++)f=f*i;voidmain(){longa,t;cin>>t;a=fact(t);cout<<t<<“!=”<<a<<endl;}第27頁n!=1 n=0,1(n-1)!*n n>1方法二:遞歸法。遞歸定義:longfact(longn){

}if(n==0||n==1)return(1);elsereturn(fact(n-1)*n);5!5*4!4*3!3*2!2*1!12*13*24*65*24120回推遞推未知已知未知第28頁5.6作用域5.6.1.作用域1.函數(shù)原型作用域函數(shù)原型中所作函數(shù)參數(shù)申明作用域:起始于函數(shù)原型說明左括號處,結(jié)束于函數(shù)原型說明右括號處。2.塊作用域塊:用括號括起來一段代碼區(qū)域。作用區(qū)域:起始于標(biāo)識(shí)符被定義地方,結(jié)束于塊右括號。3.函數(shù)作用域作用區(qū)域:起始于函數(shù)中標(biāo)識(shí)符定義地方,結(jié)束于函數(shù)體右括號。4.類作用域5.文件作用域在函數(shù)或類之外說明標(biāo)識(shí)符含有文件作用域。作用區(qū)域:從說明點(diǎn)開始到文件末尾處。第29頁#include<iostream.h>inti;voidmain(){ i=5; { inti; i=7; cout<<“i=”<<i<<endl; } cout<<“i=”<<i<<endl;}例:作用域舉例第30頁5.6.2全局變量和局部變量1.局部變量定義:在函數(shù)內(nèi)部定義變量。有效范圍:從定義變量位置開始到所在函數(shù)結(jié)束。注意:局部變量只能在定義它函數(shù)體內(nèi)部使用,不能在其它函數(shù)中使用。主函數(shù)中定義變量也是局部變量。在不一樣函數(shù)中能夠申明相同名字變量,它們被認(rèn)為是兩個(gè)不一樣變量,由系統(tǒng)自動(dòng)識(shí)別。形參變量也是局部變量。形參加該函數(shù)體內(nèi)定義變量不能重名。第31頁定義:在文件域中申明變量,即在函數(shù)外定義。有效范圍:從定義變量位置開始到文件結(jié)束。2.全局變量intx,y; //全局變量voidf1(){ …}floata,b; //全局變量intf2(intc){ intz; }voidmain(){ intm,n; …}全局變量x,y作用域全局變量a,b作用域局部變量m,n作用域第32頁說明:若全局變量與局部變量同名,則在局部變量作用域內(nèi),全局變量不起作用。#include<iostream.h>inta=3,b=5;voidmain(){ inta=8,c; c=a>b?a:b; cout<<“c=”<<c<<endl;}只能在其作用域范圍內(nèi)使用全局變量,若想在申明位置前使用全局變量,則需使用extern關(guān)鍵字加以說明。第33頁#include<iostream.h>intmax(intx,inty){ intz; z=x>y?x:y; returnz;}voidmain(){ cout<<max(a,b)<<endl;}inta=13,b=-8;例:externinta,b;定義

說明次數(shù):只能1次可說明屢次位置:全部函數(shù)之外函數(shù)內(nèi)或函數(shù)外分配內(nèi)存:分配內(nèi)存,可初始化不分配內(nèi)存,不可初始化第34頁全局變量為函數(shù)間傳遞數(shù)據(jù)提供了一個(gè)新方法。#include<iostream.h>intmax,min;voidfind(int*s,intn){ max=min=*s; for(inti=0;i<n;i++) { if(min>s[i]) min=s[i]; if(max<s[i]) max=s[i]; }}voidmain(){ inta[5]={34,2,56,4,27}; find(a,5); cout<<“min=”<<min<<“,max=”<<max;}應(yīng)盡可能少使用全局變量,因?yàn)椋喝肿兞吭诔绦蛉繄?zhí)行過程中占用存放單元降低了函數(shù)通用性、可靠性,可移植性降低程序清楚性,輕易犯錯(cuò)第35頁5.7變量存放類型5.7.1變量存放類型程序區(qū)靜態(tài)存放區(qū)動(dòng)態(tài)存放區(qū)全局變量、局部靜態(tài)變量形參變量局部動(dòng)態(tài)變量(autoregister)函數(shù)調(diào)用現(xiàn)場保護(hù)和返回地址等存放方式靜態(tài)存放:程序運(yùn)行期間分配固定存放空間動(dòng)態(tài)存放:程序運(yùn)行期間依據(jù)需要?jiǎng)討B(tài)分配存放空間內(nèi)存用戶區(qū)第36頁對一個(gè)變量定義,需要指出兩種屬性:存放類型和數(shù)據(jù)類型。所以,變量普通定義形式是:存放類型數(shù)據(jù)類型變量名;變量存放類型要求了變量存在時(shí)間,即生存期。詳細(xì)有四種存放類型:自動(dòng)類(auto)存放器類(register)靜態(tài)類(static)外部類(extern)生存期靜態(tài)變量:從程序開始執(zhí)行到程序結(jié)束動(dòng)態(tài)變量:從包含該變量定義函數(shù)開始執(zhí)行至函數(shù)執(zhí)行結(jié)束第37頁5.7.2局部變量存放方式1.自動(dòng)(auto)存放方式

autointa; 說明:自動(dòng)變量作用范圍局限于定義它函數(shù)。關(guān)鍵字auto通常被缺省,不做專門說明局部變量均為自動(dòng)變量。在不一樣函數(shù)中自動(dòng)變量能夠使用相同名稱,它們類型能夠相同或相異,彼此互不干擾。自動(dòng)變量是隨函數(shù)調(diào)用而存在和消失,存放在動(dòng)態(tài)存放區(qū)第38頁2.

溫馨提示

  • 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

提交評論