2023學(xué)年完整公開課版函數(shù)1_第1頁
2023學(xué)年完整公開課版函數(shù)1_第2頁
2023學(xué)年完整公開課版函數(shù)1_第3頁
2023學(xué)年完整公開課版函數(shù)1_第4頁
2023學(xué)年完整公開課版函數(shù)1_第5頁
已閱讀5頁,還剩52頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第6章函數(shù)掌握C語言函數(shù)的概念掌握函數(shù)定義的方法掌握函數(shù)調(diào)用的方法函數(shù)的嵌套調(diào)用與遞歸調(diào)用引例--系統(tǒng)函數(shù)的調(diào)用例:利用庫函數(shù),求x的絕對值y,打印輸出。解法:查找附錄系統(tǒng)函數(shù)的功能和函數(shù)原型,確定:函數(shù)名、參數(shù)個(gè)數(shù)及類型、函數(shù)的返回值及類型

#include“math.h” main() {intx=-2,y; y=abs(x);printf(“%d”,y); }6.1函數(shù)的引入例求組合數(shù)C(n,k)=n!/(k!*(n-k)!)【引例】調(diào)用函數(shù),每行輸出10個(gè)“*”,共輸出三行。

#include<stdio.h>

voidmyprint(){inti;for(i=1;i<=10;i++)printf("*");printf("\n");}main(){myprint();myprint();myprint();}******************************輸出一行10個(gè)“*”

******************************

intmax(intx,inty)/*定義有參函數(shù)max*/

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

}

main()

{inta,b,c;

scanf(”%d,%d”,&a,&b);

c=max(a,b);

printf(”maxis%d”,c); }函數(shù)定義函數(shù)調(diào)用,a、b為實(shí)參函數(shù)分類:

從用戶角度標(biāo)準(zhǔn)函數(shù)(庫函數(shù)):由系統(tǒng)提供用戶自定義函數(shù)從函數(shù)形式無參函數(shù)有參函數(shù)1、無參數(shù)無返回值的函數(shù)不需要函數(shù)值時(shí),設(shè)為voidvoidmyprint(){inti;for(i=1;i<=10;i++)printf("*");printf("\n");return;}參數(shù)的個(gè)數(shù)與類型函數(shù)名返回函數(shù)值,無函數(shù)值return可省略函數(shù)體2、有參數(shù)無返回值的函數(shù)voidprintmax(intx,inty){if(x>y)printf(“%d“,x);else printf(“%d“,y);return;}main(){inta=2,b=4;printmax(a,b);}X、Y是形式參數(shù)a、b是實(shí)際參數(shù),函數(shù)調(diào)用需給出實(shí)際參數(shù),實(shí)參與形參需匹配函數(shù)值3、有參數(shù)有返回值的函數(shù)函數(shù)值的類型intmax(intx,inty){intz;if(x>y)z=x;elsez=y;returnz;}main(){inta=2,b=4;printf(“%d”,max(a,b));}

函數(shù)的返回值;return語句的執(zhí)行過程是先計(jì)算表達(dá)式的值,再將計(jì)算的結(jié)果返回給主調(diào)函數(shù)。Return(x>y?x:y);函數(shù)的形象理解主函數(shù)-----公司函數(shù)-----加工廠函數(shù)的類型-----公司可以委拖加工廠對零件進(jìn)行加工,在委托前應(yīng)確定加工的性質(zhì)(手工或機(jī)械),函數(shù)的功能即是加工的過程函數(shù)實(shí)參-----送去的零配件函數(shù)返回值-----公司要的最后的成品

6.2函數(shù)的定義、調(diào)用及簡單應(yīng)用

函數(shù)使用的3個(gè)步驟:

函數(shù)聲明 函數(shù)定義 函數(shù)調(diào)用

intmax(intx,inty);

intmax(intx,inty)/*定義有參函數(shù)max*/

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

}

main()

{inta,b,c;

scanf(”%d,%d”,&a,&b);

c=max(a,b);

printf(”maxis%d”,c); }函數(shù)聲明函數(shù)定義函數(shù)調(diào)用,a、b為實(shí)參1、無參數(shù)無返回值的函數(shù)voidmyprint(){inti;for(i=1;i<=10;i++)printf("*");printf("\n");return;}

main(){myprint();myprint();myprint();}可省略2、有參數(shù)無返回值的函數(shù)voidprintmax(intx,inty){if(x>y)printf(“%d“,x);else printf(“%d“,y);return;}main(){inta=2,b=4;printmax(a,b);}

函數(shù)值3、有參數(shù)有返回值的函數(shù)intmax(intx,inty){intz;if(x>y)z=x;elsez=y;returnz;}

main(){inta=2,b=4;printf(“%d”,max(a,b));}

Return(x>y?x:y);return語句的執(zhí)行過程是先計(jì)算表達(dá)式的值,再將計(jì)算的結(jié)果返回給主調(diào)函數(shù)。函數(shù)的形參與實(shí)參(1)定義形參時(shí)要說明形參的數(shù)據(jù)類型,形參只在函數(shù)執(zhí)行時(shí)才有意義。函數(shù)執(zhí)行完畢后,即釋放該參數(shù)。實(shí)參是函數(shù)調(diào)用時(shí)使用的參數(shù)。實(shí)參可以是常量、變量、表達(dá)式或函數(shù),無論實(shí)參是何種類型的數(shù)據(jù),在執(zhí)行函數(shù)調(diào)用時(shí),必須有明確的值,以便把值傳給形參。(2)在函數(shù)調(diào)用時(shí),將實(shí)參的值復(fù)制一份,傳遞給形參,這種參數(shù)的傳遞方式稱為值傳遞。變量做函數(shù)參數(shù)時(shí)是單向的值傳遞,只能從實(shí)形向形參傳遞,而不能由形參傳回實(shí)參。(3)實(shí)參與形參占用不同的內(nèi)存單元,即使同名也不影響。函數(shù)使用的3個(gè)步驟:

函數(shù)聲明 函數(shù)定義 函數(shù)調(diào)用

試一試問題6.3:請編寫一個(gè)小計(jì)算器的求和函數(shù),從鍵盤上輸入兩個(gè)數(shù)據(jù),輸出兩數(shù)之和?!窘忸}步驟】1.定義兩個(gè)變量iNum1,iNum2保存輸入的數(shù)據(jù);2.以iNum1,iNum2為實(shí)參調(diào)用函數(shù)求兩個(gè)數(shù)之和;3.輸出兩個(gè)數(shù)之和。函數(shù)中算法如下:1.設(shè)計(jì)兩個(gè)形參,2.定義變量iSum保存兩個(gè)數(shù)的和;3.計(jì)算兩個(gè)數(shù)的和,并保存到iSum中;4.返回iSum的值。流程圖

【程序代碼】intfnSum(int

iN1,intiN2);intfnSum(intiN1,intiN2){intiSum;iSum=iN1+iN2;returniSum;/*將isum的值返回到調(diào)用函數(shù)處*/}voidmain(){intiNum1,iNum2,iNum3;printf(“\npleaseinputtwonumber:”);scanf(“%d%d”,&iNum1,&iNum2);iNum3=fnSum(iNum1,iNum2);/*將fnSum函數(shù)的返回值賦給iNum3*/printf(“thesumis%d”,iNum3);}

再試一試調(diào)用上面求兩數(shù)之和的函數(shù)求3個(gè)數(shù)之和voidmain(){intiNum1,iNum2,iNum3,iNum4;printf(“\npleaseinputthreenumber:”);scanf(“%d%d%d”,&iNum1,&iNum2,,&iNum3);

printf(“thesumis%d”,iNum4);iNum4

=fnSum(fnSum(iNum1,iNum2),iNum3);進(jìn)一步如果輸入是實(shí)型數(shù),程序怎么修改?不同函數(shù)能否采用相同名稱的變量?在函數(shù)內(nèi)定義的變量為局部變量,只在在其函數(shù)內(nèi)部有效練一練編寫函數(shù),求1~n整數(shù)之和【解題步驟】1.設(shè)計(jì)一個(gè)形參;2.構(gòu)造循環(huán),輸出1~n之和。intfnSum(intn){inti,iSum=0;For(i=1;i<=n;i++)iSum=iSum+i;Return(iSum);}練習(xí)(ex6-2)編程求組合數(shù)C(n,k)=n!/(k!*(n-k)!)【解題步驟】1.聲明一個(gè)函數(shù)jc();2.在main()中調(diào)用jc()函數(shù)。jc函數(shù)中算法如下:1.設(shè)計(jì)一個(gè)形參;2.構(gòu)造循環(huán),輸出n!。#include"stdio.h"longjc(intn);longjc(intn){inti;longs=1;for(i=1;i<=n;i++)s=s*i;returns;}main(){intn,k;Longc;

scanf("%d%d",&n,&k);c=jc(n)/jc(k)/jc(n-k);printf("%ld",c);getch();}

通過函數(shù)調(diào)用在屏幕上輸出一行15個(gè)”*” **************

#include“stdio.h” voidfnPrint();/*函數(shù)聲明*/

voidfnPrint()/*函數(shù)定義*/ {inti; for(i=0;i<15;i++)printf(“*”);}

voidmain() {fnPrint();/*調(diào)用函數(shù)*/ }試一試拓展上題,輸出3行,第一行3個(gè),以后每行增加3個(gè),輸出圖形如下:******************【解題步驟】1.聲明一個(gè)函數(shù)fnPrint;2.在main()中分別使用3、6、9做實(shí)參調(diào)用fnPrint函數(shù)。fnPrint函數(shù)中算法如下:1.設(shè)計(jì)形參為輸出的*號(hào)的個(gè)數(shù);2.構(gòu)造循環(huán),輸出多個(gè)*。流程圖

【程序代碼】#include“stdio.h”voidfnPrint();/*函數(shù)聲明*/voidfnPrint(int

n)/*函數(shù)定義*/{inti;for(i=0;i<n;i++)printf(“*”);}voidmain(){fnPrint(3);/*調(diào)用函數(shù)*/fnPrint(6);/*調(diào)用函數(shù)*/fnPrint(9);/*調(diào)用函數(shù)*/}main(){intx=3,y=5;printf("x=%d,y=%d\n",x,y);myswap(x,y);printf("x=%d,y=%d\n",x,y);}z=x;x=y;y=z;{

intz;voidmyswap(intx,inty)}分析以下程序的運(yùn)行結(jié)果調(diào)用之前x3y5x=3,y=5printf("x=%d,y=%d\n",x,y);x3y5調(diào)用開始實(shí)參形參xyx=3,y=535開辟x3y5調(diào)用期間實(shí)參形參xyx=3,y=53535z=x;x=y;y=z;x3y5調(diào)用完畢實(shí)參形參xyx=3,y=553釋放x=3,y=5“按值”單向傳遞printf("x=%d,y=%d\n",x,y);小結(jié):函數(shù)的形參與實(shí)參(1)實(shí)參與行參個(gè)數(shù)相同,類型一致。(2)實(shí)參與形參占用不同的內(nèi)存單元,即使同名也不影響。(3)在函數(shù)調(diào)用時(shí),將實(shí)參的值傳遞給形參。變量做函數(shù)參數(shù)時(shí)是單向的值傳遞,只能從實(shí)形向形參傳遞,而不能由形參傳回實(shí)參。練習(xí)通過鍵盤輸入兩個(gè)數(shù)x與y值,實(shí)現(xiàn)xy要求用兩種方法實(shí)現(xiàn)

1、調(diào)用庫函數(shù)pow(ex6-1)

2、自編函數(shù)mypow,然后調(diào)用(ex6-2)若庫中未提供求xy的函數(shù),則用戶先編寫后再使用#include"math.h"main(){doublex,y;scanf("%lf%lf",&x,&y);printf("%f",pow(x,y));getch();}longmypow(intx,inty);longmypow(intx,inty){longz=1;inti;for(i=1;i<=y;i++)z=z*x;returnz;}main(){intx,y;longz;scanf("%d%d",&x,&y);z=mypow(x,y);printf("%ld",z);getch();}思考

對比系統(tǒng)函數(shù)調(diào)用pow與自定義函數(shù)mypow的區(qū)別:

系統(tǒng)庫函數(shù):#include頭文件自定義函數(shù):先寫代碼實(shí)現(xiàn)“函數(shù)定義”

小結(jié):

函數(shù)聲明:被調(diào)用的函數(shù)需先聲明后調(diào)用。但若定義位于調(diào)用前面,可省掉聲明。為統(tǒng)一或標(biāo)準(zhǔn)化起見,一般將自定義的所有函數(shù)都在程序前面予以聲明。編一函數(shù),求

x2+1(x>1)f(x)= x2(-1<=x<=1)x2–1(x<-1)

的值,要求函數(shù)原型為doublefun(doublex);函數(shù)的嵌套調(diào)用與遞歸調(diào)用1.函數(shù)的嵌套調(diào)用是指,在執(zhí)行被調(diào)用函數(shù)時(shí),被調(diào)用函數(shù)又調(diào)用了其它函數(shù)。

2.函數(shù)的遞歸調(diào)用是指,一個(gè)函數(shù)在它的函數(shù)體內(nèi),直接或間接地調(diào)用該函數(shù)本身。

分析一下 main() { hello(); }

voidhello() { printf(“Hello,morning!\n”); }#include<stdio.h>intdif(intx,inty,intz);intmax(intx,inty,intz);intmin(intx,inty,intz);voidmain(){inta,b,c,d;scanf("%d%d%d",&a,&b,&c);d=dif(a,b,c);printf("Max-Min=%d\n",d);}intdif(intx,inty,intz){returnmax(x,y,z)-min(x,y,z);}intmax(intx,inty,intz){intr;r=x>y?x:y;return(r>z?r:z);}intmin(intx,inty,intz){intr;r=x<y?x:y;return(r<z?r:z);}main()調(diào)用函數(shù)dif輸出結(jié)束dif函數(shù)max函數(shù)調(diào)用函數(shù)max調(diào)用函數(shù)minmin函數(shù)例求三個(gè)數(shù)中最大數(shù)和最小數(shù)的差值用嵌套的方法,編寫函數(shù)mysum,用以求

其中f(i)=i+5}{returni+5;}

scanf("%d",&n);printf("%d,%d\n",n,mysum(n));main(){intn;}intmysum(intn){inti,s=0;for(i=0;i<=n;i++)s=s+myf(i);returns;intmyf(inti)intmysum(intn);intmyf(inti);……for(i=0;i<=n;i++)s=s+myf(i);returns;7……scanf("%d",&n);s=mysum(n);printf(“…",n,s);main函數(shù)mysumreturni+5;myf2220051111221818輸出2與1856任務(wù)7計(jì)算s=1!+2!+3!+┉+n!

用函數(shù)嵌套的方法編制函數(shù),完成上述功能。主函數(shù)中調(diào)用自定義的函數(shù),求解和。分析:觀察表達(dá)式可以得知,應(yīng)先計(jì)算n!,然后再計(jì)算階乘之和,所以應(yīng)該有兩個(gè)函數(shù),一個(gè)函數(shù)計(jì)算n!,另外一個(gè)函數(shù)計(jì)算階乘之和?!窘忸}步驟】1.定義一個(gè)長整型變量保存階乘之和;2.以長整型變量作實(shí)參調(diào)用函數(shù)求階乘之和;3.輸出階乘之和。求階乘之和的函數(shù)的算法:1.定義一個(gè)長整型變量lSum保存階乘之和;2.構(gòu)造循環(huán),分別調(diào)用函數(shù)求1-n的階乘并累加到lSum中;3.將lSum返回到調(diào)用函數(shù)。求階乘的函數(shù)的算法:1.設(shè)計(jì)一個(gè)長整型變量為形參,定義一個(gè)長整型變量lFact保存階乘之和,賦初值為1;2.構(gòu)造循環(huán),將1-n的乘積并累乘到lFact中;3.將lFact返回到調(diào)用函數(shù)。流程圖程序代碼longfnFact(intn);longfnFactSum(intn);#include<stdio.h>longfnFact(intn){inti;longlFact=1;for(i=1;i<=n;i++)lFact=lFact*i;returnlFact;}longfnFactSum(intn){inti;longlSum=0;for(i=1;i<=n;i++)lSum+=fnFact(i);/*調(diào)用fnFact函數(shù)*/returnlSum;}voidmain(){intiNum;longlFactsum;printf("\nInputanumber(<=12):");scanf("%d",&iNum);lFactsum=fnFactSum(iNum);/*調(diào)用fnFactSum函數(shù)*/printf("\n1!+2!+3!+…+%d!=%ld\n",iNum,lFactsum);}試一試問題6.11有5個(gè)人坐在一起,問第5個(gè)人多少歲?他說比第4個(gè)人大2歲。問第4個(gè)人多少歲?他說比第3個(gè)人大2歲。問第3個(gè)人多少歲?他說比第2個(gè)人大2歲。問第2個(gè)人多少歲?他說比第1個(gè)人大2歲。問第1個(gè)人多少歲?他說是10歲。請問第5個(gè)人多大。fnAge(5)=fnAge(4)+2fnAge(4)=fnAge(3)+2fnAge(3)=fnAge(2)+2fnAge(2)=fnAge(1)+2fnAge(1)=10解題步驟【解題步驟】1.主函數(shù)中調(diào)用求年齡函數(shù),計(jì)算第5個(gè)人年齡并輸出。求年齡函數(shù)的算法:1.定義一個(gè)整型變量保存年齡;2.判斷是否為第一個(gè)人,如果是第一個(gè),則年齡=10,否則繼續(xù)調(diào)用年齡函數(shù)。流程圖程序清單#include<stdio.h>intfnAge(intn);intfnAge(intn)/*定義遞歸函數(shù)*/{intiAge;if(n==1)iAge=10;/*終止條件*/elseiAge=fnAge(n-1)+2;/*遞歸調(diào)用*/returniAge;}voidmain(){printf("第5個(gè)人的年齡是%d\n",fnAge(5));}inta=100,b=10;main(){inta=1,c;c=a+b;printf("%d,",c);

{inta=2,b=2;c=a+b;printf("%d,",c);

}printf("%d",a+b);}外部變量(全局變量)

內(nèi)部變量(局部變量)

變量的定義在所有函數(shù)外部

變量的定義在函數(shù)內(nèi)部或復(fù)合語句內(nèi)部

內(nèi)部變量與外部變量

intp,q;

floatfl(inta)

{intb,c;

……}

charf2(intx,inty)

{inti,j;

溫馨提示

  • 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

提交評論