版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第10章函數(shù)C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程第1頁本章關(guān)鍵點(diǎn)函數(shù)定義和分類
函數(shù)調(diào)用和申明
函數(shù)參數(shù)和函數(shù)值函數(shù)遞歸調(diào)用變量作用域與生存期內(nèi)部函數(shù)和外部函數(shù)8/18/20242C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程第2頁10.1了解函數(shù)人類處理復(fù)雜問題方式:分解和抽象分而治之8/18/20243C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程第3頁10.1了解函數(shù)
分解抽象8/18/20244C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程第4頁函數(shù)(function)定義:把相關(guān)語句組織起來,并給它們注明對(duì)應(yīng)名稱,利用這種方法把程序分塊,這種形式組合就稱為函數(shù)。函數(shù)也稱為例程或過程。函數(shù)作用:任務(wù)劃分代碼重用信息隱藏
10.1了解函數(shù)分而治之Divide&conquer8/18/20245C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程第5頁函數(shù)使用意義:程序模塊化,使程序開發(fā)更輕易管理;
函數(shù)把較大任務(wù)分解成若干個(gè)較小任務(wù),提煉出公用任務(wù)防止重復(fù)代碼(redundance)軟件復(fù)用性(softwarereusability)信息隱藏(hiddeninformation)10.1了解函數(shù)8/18/20246C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程第6頁例10.2采取函數(shù)分解,求任意兩個(gè)正整數(shù)最大條約數(shù)(GCD)和最小公倍數(shù)(LCM).
/*輾轉(zhuǎn)相除法求最大條約數(shù)*/intgcd(intiN1,intiN2){intiTemp=iN2;while(iTemp!=0){iTemp=iN1%iN2;iN1=iN2;iN2=iTemp;}returniN1;}/*求最小公倍數(shù)*/intlcm(intiN1,intiN2){intiGCDInside=gcd(iN1,iN2);
/*調(diào)用函數(shù)求最大條約數(shù)*/returniN1*iN2/iGCDInside;}7C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程第7頁例10.2采取函數(shù)分解,求任意兩個(gè)正整數(shù)最大條約數(shù)(GCD)和最小公倍數(shù)(LCM)intmain(){intiNum1,iNum2;/*兩個(gè)正整數(shù)*/intiGCD,iLCM;/*最大條約數(shù)與最小公倍數(shù)*/printf("Inputnum1&num2:");scanf("%d%d",&iNum1,&iNum2);
iGCD=gcd(iNum1,iNum2);/*調(diào)用函數(shù)求最大條約數(shù)*/iLCM=lcm(iNum1,iNum2);/*調(diào)用函數(shù)求最小公倍數(shù)*/printf("TheGCDof%dand%dis:%d\n",iNum1,iNum2,iGCD);/*輸出最大條約數(shù)*/printf("TheLCMof%dand%dis:%d\n",iNum1,iNum2,iLCM);/*輸出最小公倍數(shù)*/return0;}
8C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程第8頁10.1了解函數(shù)1.C程序是由多個(gè)函數(shù)組成。C程序能夠由多個(gè)文件組成,文件負(fù)責(zé)組織存放若干個(gè)函數(shù)。2.源程序文件為C程序編譯單位,每個(gè)文件單獨(dú)編譯,便于調(diào)試。
8/18/20249C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程第9頁10.1了解函數(shù)3.main函數(shù)是程序執(zhí)行入口,main函數(shù)能夠調(diào)用其它函數(shù),其它函數(shù)調(diào)用結(jié)束后,還要返回main函數(shù),main函數(shù)執(zhí)行完成,整個(gè)程序就結(jié)束了。4.main函數(shù)能夠出現(xiàn)在任何位置,但每個(gè)程序有且僅有一個(gè)main()函數(shù)。5.C程序全部函數(shù)都是平行定義,在一個(gè)函數(shù)內(nèi)部不允許定義另外函數(shù)。函數(shù)能夠相互調(diào)用,不過不能調(diào)用main函數(shù)。8/18/202410C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程第10頁類型
函數(shù)名(形式參數(shù)表)//functionheader{語句序列//functionbody}函數(shù)頭(函數(shù)首部)——函數(shù)接口,包含:
返回值類型
函數(shù)體中由return語句返回值類型。沒有返回值其類型為void
函數(shù)名
識(shí)別函數(shù)唯一標(biāo)識(shí)符,不能與變量或數(shù)組重名
形參表
逗號(hào)分隔形式參數(shù)說明表列,缺省形式參數(shù)時(shí)不能省略圓括號(hào)。普通形式為:(類型參數(shù)1,類型參數(shù)2,…,類型參數(shù)n
)10.2函數(shù)定義和分類8/18/202411C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程第11頁類型
函數(shù)名(形式參數(shù)表)//functionheader{語句序列//functionbody}函數(shù)頭(函數(shù)首部)——函數(shù)接口,包含:10.2函數(shù)定義和分類將控制返回函數(shù)調(diào)用點(diǎn)方法有三種。執(zhí)行到“}”時(shí)返回;return;假如函數(shù)返回結(jié)果,則
returnexpression;函數(shù)返回—— Type
FunctionName() {//statements
return
expression; }
void
FunctionName() {//statements
return; //可省略 }8/18/202412C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程第12頁
無參函數(shù)普通形式
類型說明符函數(shù)名(){ 申明部分 執(zhí)行語句部分}10.2.1函數(shù)定義longshowTime(){longlct;lct=time(0);returnlct;}longlCurTime=showTime();8/18/202413C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程第13頁2.有參函數(shù)普通形式類型說明符函數(shù)名(形式參數(shù)表){申明部分執(zhí)行語句部分}形式參數(shù)表:類型1形參變量1,…類型n形參變量n10.2.1函數(shù)定義intmax(inta,intb,intc){intresult=(a>b)?a:b;if(result
<c)result=c;returnresult;}8/18/202414C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程第14頁10.2.1函數(shù)定義/*函數(shù)功效:實(shí)現(xiàn)××××功效函數(shù)參數(shù):參數(shù)1,表示×××××
參數(shù)2,表示×××××
函數(shù)返回值:×××××*/返回值類型函數(shù)名(參數(shù)表){
函數(shù)體
return表示式;}3.編程規(guī)范:對(duì)函數(shù)接口加以注釋說明
funcioninputoutput函數(shù)是一個(gè)“黑盒子”功效過程性與信息隱藏8/18/202415C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程第15頁1.函數(shù)分類-
主調(diào)函數(shù)和被調(diào)函數(shù)間數(shù)據(jù)傳送
無參函數(shù)
函數(shù)定義、函數(shù)說明及函數(shù)調(diào)用中均不帶參數(shù)
有參函數(shù)形參:在函數(shù)定義及函數(shù)說明時(shí)都有參數(shù),稱形式參數(shù)。實(shí)參:在函數(shù)調(diào)用時(shí)也必須給出參數(shù),稱為實(shí)際參數(shù)。進(jìn)行函數(shù)調(diào)用時(shí),主調(diào)函數(shù)將把實(shí)參值傳送給形參.
10.2.2函數(shù)分類intgcd(intiN1,intiN2);iGCD=gcd(iNum1,iNum2);
8/18/202416C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程第16頁2.函數(shù)分類-從函數(shù)功效角度
有返回值函數(shù)
被調(diào)用執(zhí)行完后將向調(diào)用者返回一個(gè)執(zhí)行結(jié)果,稱為函數(shù)返回值。
無返回值函數(shù)
用于完成某項(xiàng)特定處理任務(wù),執(zhí)行完成后不向調(diào)用者返回函數(shù)值。
10.2.2函數(shù)分類voidshowTime(){longlct;lct=time(0);printf("%ld",lct);}longshowTime(){longlct;lct=time(0);returnlct;}8/18/202417C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程第17頁3.函數(shù)分類-從函數(shù)定義角度
用戶定義函數(shù)用以處理用戶專門需要標(biāo)準(zhǔn)庫函數(shù)
由系統(tǒng)提供庫函數(shù)。標(biāo)準(zhǔn)庫(standardlibrary)函數(shù)是在C/C++編程環(huán)境中提供。包含豐富函數(shù)集合,能夠進(jìn)行慣用數(shù)學(xué)計(jì)算、字符串操作、字符操作、輸人/輸出、錯(cuò)誤檢驗(yàn)和許多其它有用操作。10.2.2函數(shù)分類8/18/202418C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程第18頁庫函數(shù)又可從功效角度作以下分類字符類型分類函數(shù),轉(zhuǎn)換函數(shù)字符串函數(shù)圖形函數(shù)
輸入輸出函數(shù)數(shù)學(xué)函數(shù)日期和時(shí)間函數(shù)進(jìn)程控制函數(shù)接口函數(shù)診療函數(shù)其它函數(shù)10.2.2函數(shù)分類8/18/202419C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程第19頁doubleAverage(intx,inty);//declarefunctionintmain(){inta=5,b=2;
doubleave=Average(a,b);//callfunction}/*函數(shù)名:Average.c
函數(shù)功效:計(jì)算兩個(gè)數(shù)平均值函數(shù)入口參數(shù):整型x,存放第一個(gè)運(yùn)算數(shù)整型y,存放第二個(gè)運(yùn)算數(shù)函數(shù)返回值:x與y平均數(shù)*/doubleAverage(intx,inty){ doubleresult; result=(x+y)/2.0; returnresult;}20C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程第20頁調(diào)用形式函數(shù)名(實(shí)際參數(shù)表)函數(shù)名
函數(shù)入口地址實(shí)際參數(shù)表
與形式參數(shù)在個(gè)數(shù)、類型、位置對(duì)應(yīng)函數(shù)調(diào)用經(jīng)過表示式或語句激活并執(zhí)行函數(shù)代碼過程函數(shù)返回值:return后面值作為函數(shù)帶回值(稱函數(shù)值)經(jīng)過函數(shù)調(diào)用使主調(diào)函數(shù)得到確實(shí)定值。10.3.1函數(shù)調(diào)用參數(shù)可取常量、變量或表示式。8/18/202421C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程第21頁10.3.1函數(shù)調(diào)用函數(shù)調(diào)用過程執(zhí)行次序運(yùn)行主調(diào)函數(shù)當(dāng)運(yùn)行當(dāng)函數(shù)調(diào)用語句時(shí),開始執(zhí)行被調(diào)函數(shù);被調(diào)函數(shù)執(zhí)行結(jié)束后,回到主調(diào)函數(shù);繼續(xù)執(zhí)行主調(diào)函數(shù)。
8/18/202422C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程第22頁10.3.1函數(shù)調(diào)用在C語言中,能夠用以下幾個(gè)方式調(diào)用函數(shù):函數(shù)表示式:函數(shù)作為表示式中一項(xiàng)出現(xiàn)在表示式中,以函數(shù)返回值參加表示式運(yùn)算。2.函數(shù)語句:函數(shù)調(diào)用普通形式加上分號(hào)。
doubleave=Average(a,b);printf(“%f”,ave);8/18/202423C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程第23頁10.3.1函數(shù)調(diào)用在C語言中,能夠用以下幾個(gè)方式調(diào)用函數(shù):3.函數(shù)實(shí)參:函數(shù)作為另一個(gè)函數(shù)調(diào)用實(shí)際參數(shù)出現(xiàn)。把該函數(shù)返回值作為實(shí)參進(jìn)行傳送,要求該函數(shù)必須是有返回值。函數(shù)能夠嵌套調(diào)用
,不允許嵌套定義!
voidmain(){voidfunc(){ ……}}printf(“%f”,Average(a,b));Max=max(a,max(b,c));8/18/202424C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程第24頁函數(shù)調(diào)用中求值次序問題對(duì)實(shí)參表中各量是自左至右還是自右至左使用未作要求。
例10.5輸出i1增減后值#include<stdio.h>intmain(){inti1=3;printf("%d%d\n",++i1,--i1);return0;}2?2325C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程第25頁#include<stdio.h>doublemax(doublex,doubley)
{if(x>y)returnx;elsereturny;}
voidmain(){doublea,b,c;
scanf("%lf,%lf",&a,&b);c=max(a,b);printf(“Maxis%f\n",c);
printf("Maxis
%f\n",
max(c,3.5));
}函數(shù)定義出現(xiàn)在調(diào)用之前無必要作函數(shù)原型申明函數(shù)定義即為函數(shù)原型26C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程第26頁
#include<stdio.h>doublemax(doublex,doubley); //函數(shù)原型voidmain(){doublea,b,c;
scanf("%lf,%lf",&a,&b);c=max(a,b);//函數(shù)調(diào)用printf("Maxis%f\n",c);
printf("Maxis%f\n",
max(c,3.5));}doublemax(doublex,doubley) //函數(shù)定義{
return(x>y?x:y);
}27C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程第27頁10.3.2函數(shù)申明函數(shù)遵照先定義后使用標(biāo)準(zhǔn)。若被調(diào)用函數(shù)在主調(diào)函數(shù)之前定義,需在被調(diào)函數(shù)調(diào)用之前進(jìn)行申明.函數(shù)申明作用:編譯器依據(jù)函數(shù)原型檢驗(yàn)函數(shù)調(diào)用正確性:函數(shù)名字;函數(shù)返回?cái)?shù)據(jù)類型;函數(shù)要接收參數(shù)個(gè)數(shù)、類型和參數(shù)次序。8/18/202428C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程第28頁
函數(shù)原型functionprototype
10.3.2函數(shù)申明申明語句普通形式:類型說明符被調(diào)函數(shù)名(類型形參,類型形參…);或類型說明符被調(diào)函數(shù)名(類型,類型…);doublemax(doublex,doubley);doublemax(double,double);8/18/202429C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程第29頁
例10.6經(jīng)過函數(shù)計(jì)算兩個(gè)浮點(diǎn)數(shù)和#include<stdio.h>intmain(){floatfA=3.5,fB=4.6,fC;floatadd(floatfA1,floatfB1);/*函數(shù)申明*/fC=add(fA,fB);/*函數(shù)調(diào)用*/printf("%f\n",fC);return0;}floatadd(floatfA1,floatfB1)/*函數(shù)定義*/{returnfA1+fB1;}對(duì)庫函數(shù)調(diào)用不需作說明?30C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程第30頁10.4函數(shù)參數(shù)和函數(shù)值主調(diào)函數(shù)和被調(diào)用函數(shù)之間有數(shù)據(jù)傳遞關(guān)系。在不一樣函數(shù)之間傳遞數(shù)據(jù),能夠使用方法有:參數(shù):
經(jīng)過形式參數(shù)和實(shí)際參數(shù)函數(shù)傳遞參數(shù)機(jī)制--按值傳遞(callbyvalue)返回值:用return語句返回計(jì)算結(jié)果
8/18/202431C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程第31頁#include<iostream.h>doublemax(double,double);
//函數(shù)原型voidmain(){doublea,b,c;
scanf("%d,%d",&a,&b);c=max(a,b);//函數(shù)調(diào)用printf("Maxis%d\n",c);
printf("Maxis%d\n",
max(c,3.5));}doublemax(doublex,doubley) //函數(shù)定義{intz;z=x>y?x∶y;return(z);}32C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程第32頁關(guān)于形參加實(shí)參說明:1.實(shí)參能夠是常量、變量或表示式,在調(diào)用時(shí)將實(shí)參值賦給形參。max(3,a+b);2.實(shí)參加形參類型應(yīng)相同或賦值兼容。max(’3’,’2’+b);max(3.5,dNum);doublemax(doublex,doubley);10.4.1形式參數(shù)與實(shí)際參數(shù)20.0320.03xyab8/18/202433C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程第33頁例10.7經(jīng)過函數(shù)調(diào)用試圖交換兩個(gè)整數(shù)#include<stdio.h>intmain(){intiA=3,iB=4;voidswap(intiA1,intiB1);/*函數(shù)申明*/swap(iA,iB);/*函數(shù)調(diào)用*/printf("iA=%d,iB=%d\n",iA,iB);return0;}voidswap(intiA1,intiB1)/*函數(shù)定義*/{intiC1;iC1=iA1;iA1=iB1;iB1=iC1;}34C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程第34頁例10.7經(jīng)過函數(shù)調(diào)用試圖交換兩個(gè)兩個(gè)整數(shù)#include<stdio.h>intmain(){intiA=3,iB=4;voidswap(intiA1,intiB1);/*函數(shù)申明*/swap(iA,iB);/*函數(shù)調(diào)用*/printf("iA=%d,iB=%d\n",iA,iB);return0;}voidswap(intiA1,intiB1)/*函數(shù)定義*/{intiC1;iC1=iA1;iA1=iB1;iB1=iC1;}35C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程第35頁4.實(shí)參向形參數(shù)據(jù)傳遞是單向“值傳遞”只能把實(shí)參值傳送給形參,不能把形參值反向地傳送給實(shí)參。在函數(shù)調(diào)用過程中形參值發(fā)生改變,實(shí)參值不會(huì)改變。關(guān)于形參加實(shí)參說明:3.形參變量只有在被調(diào)用時(shí)才分配內(nèi)存單元,在調(diào)用結(jié)束時(shí),即刻釋放所分配內(nèi)存單元。形參只有在函數(shù)內(nèi)部有效。函數(shù)調(diào)用結(jié)束返回主調(diào)函數(shù)后則不能再使用該形參變量。10.4.1形式參數(shù)與實(shí)際參數(shù)8/18/202436C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程第36頁10.4.2函數(shù)返回值1.函數(shù)值只能經(jīng)過return語句返回主調(diào)函數(shù)。return語句普通形式
return表示式;或return(表示式);功效是計(jì)算表示式值,并返回給主調(diào)函數(shù)。在函數(shù)中允許有多個(gè)return語句(通常在條件語句中),但每次調(diào)用只能有一個(gè)return語句被執(zhí)行;當(dāng)return語句執(zhí)行時(shí),函數(shù)也就結(jié)束了,返回到主調(diào)函數(shù),其它return語句就不會(huì)被執(zhí)行。8/18/202437C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程第37頁例10.8對(duì)一個(gè)1到100之間隨機(jī)數(shù),計(jì)算其與7取余值#include<stdio.h>#include<time.h>intmain(){intiResult;intgetRand();iResult=getRand()%7;printf("%d",iResult);return0;}/*獲取1到100之間隨機(jī)數(shù)*/intgetRand(){intiRand1;srand(time(0));
/*生成1到100之間隨機(jī)數(shù)*/iRand=rand()%100+1;returniRand;}38C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程第38頁10.4.2函數(shù)返回值2.函數(shù)返回值應(yīng)該屬于某一個(gè)確定類型,在定義函數(shù)時(shí)指定函數(shù)返回值類型。
3.函數(shù)值類型和函數(shù)定義中函數(shù)類型應(yīng)保持一致。假如二者不一致以函數(shù)類型為準(zhǔn),將返回值自動(dòng)進(jìn)行類型轉(zhuǎn)換。
4.不返回函數(shù)值函數(shù),能夠明確定義為空類型,類型說明符為“void”。凡不加類型說明函數(shù),自動(dòng)按整型處理。8/18/202439C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程第39頁//強(qiáng)制類型轉(zhuǎn)換
intmain(){floatadd1(float,float);
floatadd2(int,int);
doublea=3,b=3.2,sum;sum=add1(a,b);sum=add2(1/a,1/b);return0;}floatadd1(floatx,floaty){return(x+y);}floatadd2(inti,intj){return(i+j);}類型強(qiáng)制轉(zhuǎn)換截取整數(shù)部分傳送給形參40C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程第40頁10.4.3數(shù)組作函數(shù)參數(shù)1.數(shù)組元素作為函數(shù)參數(shù)-按值傳遞數(shù)組元素作為函數(shù)實(shí)參和一個(gè)普通變量使用方法相同,函數(shù)調(diào)用時(shí)值傳送是把實(shí)參變量值賦予形參變量2.數(shù)組名作為函數(shù)參數(shù)-按地址傳遞數(shù)組名實(shí)際上是一個(gè)常量地址,當(dāng)用數(shù)組名作為實(shí)參時(shí),實(shí)際上是把該常量地址傳給形參。形參數(shù)組并不分配接收實(shí)參數(shù)組元素?cái)?shù)據(jù)空間,只是分配一個(gè)接收常量地址.
8/18/202441C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程第41頁例10.9數(shù)組元素作實(shí)參#include<stdio.h>intmain(){intiArr1[3]={2,5,3};intiA=2,iB=5,iC=3,iSum;intadd(intiA,intiB,intiC);iSum=add(iArr1[0],iArr1[1],iArr1[2]);/*數(shù)組元素作為實(shí)參*/printf("%d\n",iSum);iSum=add(iA,iB,iC);/*普通變量作為實(shí)參*/printf("%d\n",iSum);return0;}intadd(intiA,intiB,intiC){intiSum=(iA++)+(iB--)+iC;returniSum;}42C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程第42頁例10.10對(duì)數(shù)組中每個(gè)元素加1#include<stdio.h>intmain(){intiArr1[3]={2,5,3},iJ;voidadd(intiArr2[3]);/*輸出數(shù)組*/for(iJ=0;iJ<=2;iJ++) printf("%d",iArr1[iJ]);printf("\n");
add(iArr1);/*函數(shù)調(diào)用后,輸出數(shù)組*/for(iJ=0;iJ<=2;iJ++) printf("%d",iArr1[iJ]);printf("\n");return0;}voidadd(intiArr2[3]){intiI;for(iI=0;iI<=2;iI++) iArr2[iI]++;}43C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程第43頁10.4.3數(shù)組作函數(shù)參數(shù)2.數(shù)組名作為函數(shù)參數(shù)-按地址傳遞
通常為了能夠讓函數(shù)處理不一樣長度數(shù)組,函數(shù)參數(shù)表應(yīng)指定接收數(shù)組名及數(shù)組大小。一維形參數(shù)組能夠省略維數(shù),不過不能省略[]!
voidadd(intiArr[],intiLength);add(iArr1,3);/*intiArr1[3]*/add(iArr2,5);/*intiArr2[5]*/123iArriArr12348/18/202444C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程第44頁10.4.3數(shù)組作函數(shù)參數(shù)2.數(shù)組名作為函數(shù)參數(shù)-按地址傳遞多維數(shù)組也能夠作為函數(shù)參數(shù)。形參數(shù)組能夠指定每一維長度,也可省去第一維長度。
voidadd(intiArr2[][4],intiRow,intiCol);
add(iArr1,3,4);
/*intiArr1[3][4]*/add(iArr2,4,4);/*intiArr2[4][4]*/8/18/202445C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程第45頁10.5函數(shù)遞歸調(diào)用程序從主函數(shù)開始執(zhí)行;主函數(shù)由操作系統(tǒng)調(diào)用,主函數(shù)能夠調(diào)用其它函數(shù);其它函數(shù)能夠相互調(diào)用,但不能調(diào)用主函數(shù);全部函數(shù)是平行,不能嵌套定義!函數(shù)之間關(guān)系8/18/202446C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程第46頁main()調(diào)用fa()fa()調(diào)用fb()voidfa(){…}voidfb(){…}main(){fa()fb()}fb()
函數(shù)嵌套調(diào)用
8/18/202447C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程第47頁main()
調(diào)用fa()fa()調(diào)用fb()fb()voidfb(){}voidfa(){fb();}main(){…
fa()...}返回fa()
返回main()
函數(shù)嵌套調(diào)用
例:定義一個(gè)求bin(n,k)函數(shù)。8/18/202448C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程第48頁voidfa();intfb();intfc();voidmain(){fa();fc();}main()調(diào)用fa()fa()調(diào)用fb()fc()調(diào)用fc()調(diào)用fc()fb()
函數(shù)嵌套調(diào)用
例:驗(yàn)證歌德巴赫猜測Goldbach(intm)Prime(intn)printf8/18/202449C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程第49頁voidfa();{fa()}voidmain(){fa()}main()調(diào)用fa()Endfa()調(diào)用fa()fa()famain10.5函數(shù)遞歸調(diào)用8/18/202450C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程第50頁有5個(gè)人在一起,探討年紀(jì)問題問第5個(gè)人多少歲?他說比第4個(gè)人大2歲。問第4個(gè)人歲數(shù),他說比第3個(gè)人大2歲。問第3個(gè)人,又說比第2個(gè)人大2歲。問第2個(gè)人,說比第1個(gè)人大2歲。最終問第1個(gè)人,他說是10歲。請(qǐng)問第5個(gè)人多大。age(5)=age(4)+2age(4)=age(3)+2age(3)=age(2)+2age(2)=age(1)+2age(1)=10age(n)=10(n=1)age(n-1)+2(n>1)10.5函數(shù)遞歸調(diào)用8/18/202451C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程第51頁遞歸調(diào)用一個(gè)函數(shù)在其函數(shù)體中又直接或間接調(diào)用本身一個(gè)方法。把一個(gè)復(fù)雜問題層層轉(zhuǎn)化為一個(gè)與原問題相同規(guī)模較小問題來求解。遞歸需要有遞歸結(jié)束條件和簡化過程。10.5函數(shù)遞歸調(diào)用intage(intn){intc;if(n==1)c=10;elsec=age(n-1)+2;return(c);}8/18/202452C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程第52頁10.5函數(shù)遞歸調(diào)用遞歸函數(shù)
(recursivefunction)直接調(diào)用自己或經(jīng)過另一函數(shù)間接調(diào)用自己函數(shù)問題1:計(jì)算n階乘簡化過程:
n>1時(shí),n!=n*(n-1)!遞歸結(jié)束:
n=1時(shí),n!=18/18/202453C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程第53頁例10.13計(jì)算n階乘intfact(intn){if(n==1)return1;elsereturnn*fact(n-1);}intfact(intiN1){intiF1;if(iN1>1)iF1=fact(iN1-1)*iN1;/*遞歸調(diào)用fact函數(shù)*/else iF1=1;returniF1;}遞歸終止條件基本情況修改遞歸條件54C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程第54頁例10.13計(jì)算n階乘k3F(k)Output3!=?n3F(3)3*F(2)n2F(2)2*
F(1)n1F(0)1計(jì)算Fact(3)=3!F(1)n01*
F(0)遞歸是從復(fù)雜推到簡單(遞歸調(diào)用),再由簡單返回到復(fù)雜(返回值)一個(gè)過程55C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程第55頁例10.13計(jì)算n階乘k3F(k)Output3!=?n3F(3)3*F(2)n2F(2)2*
F(1)n1計(jì)算Fact(3)=3!F(1)1*
F(0)F(0)1n0F(1)=1遞歸是從復(fù)雜推到簡單(遞歸調(diào)用),再由簡單返回到復(fù)雜(返回值)一個(gè)過程56C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程第56頁例10.13計(jì)算n階乘k3F(k)Output3!=?n3F(3)3*F(2)n2F(2)計(jì)算Fact(3)=3!F(2)=2F(3)=63!=6遞歸是從復(fù)雜推到簡單(遞歸調(diào)用),再由簡單返回到復(fù)雜(返回值)一個(gè)過程57C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程第57頁k3F(3)k3F(3)n3F(3)3*F(2)n2F(2)2*
F(1)n1F(0)1F(1)n01*
F(0)F(1)=1F(2)=2F(3)=6Output3!=6intFact(intn){if(n==0)return1;elsereturnn*Factorial(n-1);}計(jì)算Factorial(3)=3!58C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程第58頁intfact(intiN1){intiF1;if(iN1>1)iF1=fact(iN1-1)*iN1;
elseiF1=1;returniF1;}59C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程第59頁10.5函數(shù)遞歸調(diào)用問題2:計(jì)算斐波那契數(shù)列第n個(gè)數(shù)f(n)
簡化過程:f(n)=f(n-1)+f(n-2)遞歸結(jié)束:當(dāng)n=1或n=2時(shí)f(n)=1
8/18/202460C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程第60頁例遞歸定義斐波那契數(shù)列intfib(intiN1){intiF1;if(iN1==1||iN1==2)iF1=1;else iF1=fib(iN1-1)+fib(iN1-2);/*遞歸調(diào)用fib函數(shù)*/returniF1;}函數(shù)體內(nèi)調(diào)用兩次本身61C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程第61頁10.5函數(shù)遞歸調(diào)用問題3:
在n個(gè)數(shù)(a[1],a[2],…a[n])中找出最大數(shù)f(n)
簡化過程:f(n)=f(n-1)和a[n]最大值
遞歸結(jié)束:當(dāng)n=1時(shí)f(n)=a[1]
8/18/202462C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程第62頁intmax(intiArr1[],intiN1){intiMax1,iTemp;if(iN1>1){iTemp=max(iArr1,iN1-1);/*遞歸調(diào)用max函數(shù)*/if(iTemp>iArr1[iN1])iMax1=iTemp;else iMax1=iArr1[iN1];}elseiMax1=iArr1[1];returniMax1;}iMax=max(iArr,iN);63C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程第63頁遞歸調(diào)用討論
10.5函數(shù)遞歸調(diào)用遞歸目標(biāo)是簡化程序設(shè)計(jì);
能更自然地反應(yīng)問題,使程序更輕易了解。遞歸增加了系統(tǒng)開銷,
延長了CPU執(zhí)行時(shí)間,多占用了內(nèi)存??臻g;非遞歸效率高,不過程序可讀性差;
大多數(shù)遞歸函數(shù)都能用非遞歸函數(shù)來代替
8/18/202464C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程第64頁遞歸思想10.5函數(shù)遞歸調(diào)用遞歸函數(shù)將復(fù)雜問題分成兩個(gè)部分:函數(shù)中不能夠處理部分-遞歸調(diào)用遞歸調(diào)用,要模擬原問題,但稍作簡化或縮小。
遞歸步驟與關(guān)鍵字return:函數(shù)中能夠處理部分——基本情況
對(duì)基本情況函數(shù)調(diào)用只是簡單地返回一個(gè)結(jié)果。
遞歸不能無限調(diào)用!遞歸函數(shù)要有條件調(diào)用本身,必須有遞歸停頓條件
8/18/202465C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程第65頁10.6變量作用域與生存期標(biāo)識(shí)符生存期是其在內(nèi)存中存在時(shí)間。變量有效性范圍稱變量作用域。變量說明方式不一樣,其作用域也不一樣。按作用域范圍可分局部變量和全局變量。
標(biāo)識(shí)符作用域是程序中能引用它區(qū)域。存放類說明符:auto、register、extern、static兩個(gè)存放類:自動(dòng)存放類&靜態(tài)存放類
8/18/202466C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程第66頁10.6.1變量作用域變量按作用域不一樣可分為兩類:局部變量(localvariable)在一個(gè)函數(shù)內(nèi)部定義變量是內(nèi)部變量只在本函數(shù)范圍內(nèi)有效:
全局變量(globalvariable)在函數(shù)之外定義變量是外部變量有效范圍為從定義變量位置開始到根源文件結(jié)束8/18/202467C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程第67頁10.6.1變量作用域1.局部變量-內(nèi)部變量。局部變量是在函數(shù)內(nèi)作定義說明。其作用域僅限于函數(shù)內(nèi),離開該函數(shù)后再使用這種變量是非法。intmax(intiA,intiB){intiC;if(iA>iB)returniA;elsereturniB;}
voidmain(){intiM=1,iN=2;intiA=iM,iB=iN;intiC=max(iM,iN);iC=max(iA,iB);}實(shí)參和形參為同名變量8/18/202468C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程第68頁10.6.1變量作用域局部變量作用域幾點(diǎn)說明:(1)主函數(shù)中定義變量也只能在主函數(shù)中使用,不能在其它函數(shù)中使用。主函數(shù)中也不能使用其它函數(shù)中定義變量。(2)形參變量是屬于被調(diào)函數(shù)局部變量,實(shí)參變量是屬于主調(diào)函數(shù)局部變量。(3)允許在不一樣函數(shù)中使用相同變量名,它們代表不一樣對(duì)象,分配不一樣單元,互不干擾,也不會(huì)發(fā)生混同。8/18/202469C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程第69頁例10.16復(fù)合語句中局部變量作用域#include<stdio.h>intmain(){intiJ=1,iK=2;{
intiK=3,iL=4;printf("iJ=%d\n",iJ); printf("iK=%d\n",iK); printf("iL=%d\n",iL);}printf("iJ=%d\n",iJ);printf("iK=%d\n",iK);printf("iL=%d\n",iL);return0;}編譯報(bào)錯(cuò),iL未定義
復(fù)合語句中定義變量只在本復(fù)合語句范圍內(nèi)有效。同名時(shí)內(nèi)部變量屏蔽外部!
70C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程第70頁10.6.1變量作用域2.全局變量-外部變量在函數(shù)外部定義變量。它不屬于任何函數(shù),作用域是整個(gè)程序,有效范圍為從定義變量位置開始到根源文件結(jié)束。全局變量說明符為extern。在一個(gè)函數(shù)之前定義全局變量,在該函數(shù)內(nèi)使用可不再加以說明。intiA,iB;voidf1(){……}floatfX,fY;intf2(){……}voidmain(){……}8/18/202471C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程第71頁例10.17輸入長方體長寬高l、w、h,求體積及表面積#include<stdio.h>intiArea;intvolumeAndArea(intiL,intiW,intiH){iArea=2*(iL*iW+iL*iH+iW*iH);returniL*iW*iH;}intmain(){intiL,iW,iH,iVolume;printf("inputlength,widthandheight\n");scanf("%d%d%d",&iL,&iW,&iH);iVolume=volumeAndArea(iL,iW,iH);printf("\nvolume=%d\narea=%d\n",iVolume,iArea);return0;}函數(shù)調(diào)用返回體積表面積存放在全局變量中72C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程第72頁例10.18輸入長方體長寬高l、w、h,求體積及表面積#include<stdio.h>intiArea;intvolumeAndArea(intiL,intiW,intiH){intiArea;/*定義局部變量iArea,與全局變量同名*/iArea=2*(iL*iW+iL*iH+iW*iH);returniL*iW*iH;}intmain(){intiL,iW,iH,iVolume;printf("inputlength,widthandheight\n");scanf("%d%d%d",&iL,&iW,&iH);iVolume=volumeAndArea(iL,iW,iH);printf("\nvolume=%d\narea=%d\n",iVolume,iArea);return0;}表面積值為0全局變量iArea73C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程第73頁10.6.1變量作用域2.全局變量-外部變量允許全局變量和局部變量同名。在局部變量作用域內(nèi),全局變量被屏蔽。
無須要時(shí)盡可能不要使用全局變量全局變量可加強(qiáng)函數(shù)模塊之間數(shù)據(jù)聯(lián)絡(luò),不過又使函數(shù)要依賴這些變量,使得函數(shù)獨(dú)立性降低。全局變量在程序全部執(zhí)行過程中都占用內(nèi)存。8/18/202474C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程第74頁10.6.2變量存放類別與生存期程序內(nèi)存區(qū)域數(shù)據(jù)區(qū)(dataarea)動(dòng)態(tài)存放區(qū)存放類存放特征代碼區(qū)(codearea)靜態(tài)存放區(qū)
全局?jǐn)?shù)據(jù)和靜態(tài)數(shù)據(jù)局部數(shù)據(jù)和動(dòng)態(tài)數(shù)據(jù)靜態(tài)存放變量在編譯時(shí)就分定存放單元并一直保持不釋放直至整個(gè)程序結(jié)束。動(dòng)態(tài)存放變量在程序執(zhí)行過程中,使用它時(shí)才分配存放單元,使用完成馬上釋放。
8/18/202475C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程第75頁10.6.2變量存放類別與生存期標(biāo)識(shí)符生存期是其在內(nèi)存中存在時(shí)間。因?yàn)樽兞看娣欧绞讲灰粯佣a(chǎn)生特征稱變量生存期。存放類說明符:
auto、register、extern、static分為兩個(gè)存放類:自動(dòng)存放類(automaticstorageclass)靜態(tài)存放類(staticstorageclass)8/18/202476C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程第76頁10.6.2變量存放類別與生存期自動(dòng)變量和存放器變量屬于動(dòng)態(tài)存放方式,外部變量和靜態(tài)變量屬于靜態(tài)存放方式。變量申明定義完整形式:存放類型說明符數(shù)據(jù)類型說明符變量名,變量名…;staticintiA,iB;申明定義靜態(tài)類型變量autocharcA,cB;申明定義自動(dòng)字符變量registerintiK=1;申明定義存放器變量externintiX,iY;申明外部整型變量
8/18/202477C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程第77頁10.6.2變量存放類別與生存期1.自動(dòng)變量auto自動(dòng)存放變量屬于動(dòng)態(tài)存放方式,存放在動(dòng)態(tài)區(qū)進(jìn)入申明作用域時(shí)生成,離開作用域時(shí)刪除;函數(shù)參數(shù)和局部變量都是自動(dòng)存放類自動(dòng)存放是變量默認(rèn)狀態(tài)若不賦初值則沒有明確值intmax(intiA,intiB){autointiC;if(iA>iB)returniA;elsereturniB;}
8/18/202478C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程第78頁10.6.2變量存放類別與生存期2.外部變量extern外部變量定義時(shí)位于函數(shù)之外,即全局變量.全局變量是從它作用域提出,外部變量從存放方式提出,表示了其生存期。能夠在定義時(shí)作初始化賦值,即只賦初值一次,若定義時(shí)不賦初值,編譯時(shí)自動(dòng)賦初值:數(shù)值型變量初值0字符變量初值為空字符8/18/202479C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程第79頁10.6.2變量存放類別與生存期2.外部變量extern當(dāng)一個(gè)源程序由若干個(gè)源文件組成時(shí),
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(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ǔ)空間,僅對(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 應(yīng)急消防演練領(lǐng)導(dǎo)講話稿(6篇)
- 開學(xué)典禮活動(dòng)總結(jié)范文15篇
- 愚人節(jié)文案(匯編15篇)
- 收銀培訓(xùn)資料
- 中國電動(dòng)汽車充電站行業(yè)政策、市場規(guī)模及投資前景研究報(bào)告(智研咨詢發(fā)布)
- 肝升肺降湯治療慢性腎衰竭升降失?;颊叩呐R床療效觀察
- 組合式長周期光纖光柵傳感器及其特性研究
- 二零二五年度家政服務(wù)與家庭寵物養(yǎng)護(hù)合同3篇
- 二零二五年度城市消防管網(wǎng)消火栓安裝施工協(xié)議3篇
- 無人機(jī)分群的任務(wù)分配與拓?fù)淇刂萍夹g(shù)研究
- 蛋糕店服務(wù)員勞動(dòng)合同
- 土地買賣合同參考模板
- 2025高考數(shù)學(xué)二輪復(fù)習(xí)-專題一-微專題10-同構(gòu)函數(shù)問題-專項(xiàng)訓(xùn)練【含答案】
- 沈陽理工大學(xué)《數(shù)》2022-2023學(xué)年第一學(xué)期期末試卷
- 北京三甲中醫(yī)疼痛科合作方案
- QCT957-2023洗掃車技術(shù)規(guī)范
- 新外研版高中英語選擇性必修1單詞正序英漢互譯默寫本
- 自愿斷絕父子關(guān)系協(xié)議書電子版
- 人教版高中物理必修二同步練習(xí)及答案
- 2024年高考英語讀后續(xù)寫高分寶典專題08讀后續(xù)寫肢體動(dòng)作描寫積累1(詞-句-文)講義
- 時(shí)政述評(píng)培訓(xùn)課件
評(píng)論
0/150
提交評(píng)論