科銳函數(shù)語(yǔ)言-講_第1頁(yè)
科銳函數(shù)語(yǔ)言-講_第2頁(yè)
科銳函數(shù)語(yǔ)言-講_第3頁(yè)
科銳函數(shù)語(yǔ)言-講_第4頁(yè)
科銳函數(shù)語(yǔ)言-講_第5頁(yè)
已閱讀5頁(yè),還剩32頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、第六講 函 數(shù)知識(shí)要點(diǎn)6.1 概述6.2 函數(shù)的定義6.3 函數(shù)的返回值6.4 函數(shù)的調(diào)用6.5 函數(shù)的遞歸調(diào)用6.1 概述C程序是由一個(gè)主函數(shù)和其它若干函數(shù)構(gòu)成,每個(gè)函數(shù)實(shí)現(xiàn)一定的功能,其中主函數(shù)main()是必需的,其它函數(shù)被主函數(shù)調(diào)用或者其它函數(shù)之間相互調(diào)用。C語(yǔ)言的函數(shù)可以分為三類:主函數(shù)main()、庫(kù)函數(shù)(如printf()、scanf()等)和用戶自定義函數(shù)。6.1 概述C程序總是從主函數(shù)開始執(zhí)行,其它函數(shù)只有在被主函數(shù)或其它正在執(zhí)行的函數(shù)調(diào)用時(shí)才能被程序執(zhí)行,執(zhí)行后返回調(diào)用函數(shù),最后返回到主函數(shù),在主函數(shù)中結(jié)束整個(gè)程序的運(yùn)行。所有的函數(shù)在定義時(shí)是相互獨(dú)立的,它們之間是平行關(guān)系,

2、所以不能在一個(gè)函數(shù)內(nèi)部定義另一個(gè)函數(shù),即不能嵌套定義。函數(shù)間可以互相調(diào)用,但是不能調(diào)用主函數(shù)。void main() int year,month,date,days,n; printf(please input year,month,date:); scanf(%d,%d,%d,&year,&month,&date); days=len_of_days(year,month,date); printf(%d/%d/%d is the %d in %dn,year,month,date,days,year); 知識(shí)要點(diǎn)6.1 概述6.2 函數(shù)的定義6.3 函數(shù)的返回值6.4 函數(shù)的調(diào)用6.5

3、函數(shù)的遞歸調(diào)用6.2 函數(shù)的定義常見的函數(shù)定義的形式如下:類型標(biāo)識(shí)符 函數(shù)名(形式參數(shù)類型說(shuō)明表列) 函數(shù)體double sqrt( double x ); 例如求兩個(gè)浮點(diǎn)數(shù)x、y中最大數(shù)的函數(shù)max()定義 float max(float x,float y) float z; if (xy) z=x; else z=y; return z; 6.2 函數(shù)的定義類型標(biāo)識(shí)符為函數(shù)的類型,與return語(yǔ)句返回值的類型相同,可以理解為函數(shù)最終的結(jié)果的類型。它可以是任何一種有效的類型,當(dāng)函數(shù)類型標(biāo)識(shí)符缺省時(shí)默認(rèn)是整型。上例中函數(shù)max()的結(jié)果為兩個(gè)浮點(diǎn)數(shù)的最大數(shù),即同樣是浮點(diǎn)數(shù)類型,其返回值z(mì)也

4、是浮點(diǎn)類型,所以函數(shù)的類型標(biāo)識(shí)符為float。如果函數(shù)無(wú)返回值時(shí),類型標(biāo)識(shí)符為void。函數(shù)名要符合C語(yǔ)言規(guī)定的標(biāo)識(shí)符的命名規(guī)則,函數(shù)名字必須唯一,不能與函數(shù)體內(nèi)變量或形式參數(shù)名相同。所以上例中如果變量z改為max將導(dǎo)致結(jié)論錯(cuò)誤。6.2 函數(shù)的定義形式參數(shù)類型說(shuō)明表中的形式參數(shù)用于接受主調(diào)函數(shù)傳遞過(guò)來(lái)的數(shù)值。例如max()是求兩個(gè)數(shù)的最大數(shù),需要從主調(diào)函數(shù)中傳過(guò)來(lái)兩個(gè)浮點(diǎn)數(shù),所以形式參數(shù)有兩個(gè)。如果max()改為求三個(gè)數(shù)的最大數(shù),則從主調(diào)函數(shù)中需要傳過(guò)來(lái)三個(gè)數(shù),此時(shí)形式參數(shù)需要定義三個(gè),并且形式參數(shù)的類型必須與傳過(guò)來(lái)數(shù)據(jù)類型一致。形式參數(shù)的命名只要符合變量的命名規(guī)則即可,無(wú)需與主調(diào)函數(shù)中的變量

5、名一致。如果函數(shù)不需要從主調(diào)函數(shù)處接受數(shù)據(jù),可以不帶形式參數(shù),此時(shí)形式參數(shù)類型說(shuō)明表是空的,但是函數(shù)名后面的圓括號(hào)不能省。6.2 函數(shù)的定義例6.1 顯示如下圖形: * * * * * * *#include void star()printf(“*n”);void main() int i,j; for (i=1;i=4;i+) for(j=1;j=1;i-) for(j=1;jy) z=x; else x=y; return z; 常見的函數(shù)定義的形式如下:類型標(biāo)識(shí)符 函數(shù)名(形式參數(shù)類型說(shuō)明表列) 函數(shù)體知識(shí)要點(diǎn)6.1 概述6.2 函數(shù)的定義6.3 函數(shù)的返回值6.4 函數(shù)的調(diào)用6.5

6、函數(shù)的遞歸調(diào)用6.3 函數(shù)的返回值在調(diào)用函數(shù)時(shí),有時(shí)需要將運(yùn)算結(jié)果返回主調(diào)函數(shù),此時(shí)需要使用return語(yǔ)句返回一個(gè)值,稱作函數(shù)返回值。return語(yǔ)句形式: return (表達(dá)式);例如: return z; return 0;return (xy?x:y);float max(float x,float y)float z; if (xy) z=x; else z=y; return z; float max(float x,float y)return (xy?x:y); int is_leap_year(int year) if (year%4=0&year%100!=0|year%

7、400=0) return (1); else return(0);6.3 函數(shù)的返回值函數(shù)返回值的類型應(yīng)該與函數(shù)類型一致,如果不一致時(shí),函數(shù)類型決定返回值的類型。函數(shù)無(wú)返回值時(shí),函數(shù)類型說(shuō)明為void。例如:void star()printf(“*n”);知識(shí)要點(diǎn)6.1 概述6.2 函數(shù)的定義6.3 函數(shù)的返回值6.4 函數(shù)的調(diào)用6.5 函數(shù)的遞歸調(diào)用6.4 函數(shù)的調(diào)用函數(shù)只有在被調(diào)用時(shí)才能執(zhí)行。當(dāng)一個(gè)函數(shù)調(diào)用另一個(gè)函數(shù)時(shí),程序就從主調(diào)函數(shù)轉(zhuǎn)移到被調(diào)函數(shù),并且從被調(diào)函數(shù)的函數(shù)體起始位置開始執(zhí)行,直到函數(shù)體執(zhí)行結(jié)束,返回到主調(diào)函數(shù)的調(diào)用位置繼續(xù)往下執(zhí)行。函數(shù)調(diào)用的一般形式函數(shù)名(實(shí)參表列);當(dāng)

8、實(shí)參表列中含有多個(gè)參數(shù),則各參數(shù)用逗號(hào)間隔例如max(a,b)。實(shí)參表列也可以沒有,但括號(hào)不能省略,如例6.1中star()。float max(float x,float y)return (xy?x:y); 6.4 函數(shù)的調(diào)用實(shí)參和形參必須個(gè)數(shù)相等、類型一致、順序?qū)?yīng),進(jìn)行數(shù)據(jù)的“值傳遞”。例1.3中,主調(diào)函數(shù)出現(xiàn)max(a,b),用戶自定義函數(shù)為float max(float x,float y),則執(zhí)行到c=max(a,b)時(shí),實(shí)參a的值傳給形參x、實(shí)參b的值傳給形參y,這樣x、y等于a的值和b的值。 #include float max(float x, float y) float

9、 z; if (xy) z=x; else z=y; return z; void main( ) float a,b,c; printf(Please input two numbers (a,b):); scanf(%f,%f,&a,&b); c=max(a,b); printf(%f,%f,the max is %fn,a,b,c); 6.4 函數(shù)的調(diào)用實(shí)參和形參必須個(gè)數(shù)相等、類型一致、順序?qū)?yīng),進(jìn)行數(shù)據(jù)的“值傳遞”。特別要注意的是:實(shí)參和形參之間是“單向的值傳遞”,即a、b的值可以傳給x、y,而x、y的值不能傳給a、b,x、y的改變也不影響a、b。#include void chang

10、e(int x,int y) int t; printf (“x=%d,y=%dn”,x,y); t=x; x=y; y=t; printf (“x=%d,y=%dn”,x,y); void main() int a=3,b=4; printf (“a=%d,b=%dn”,a,b); change(a,b); printf (“a=%d,b=%dn”,a,b); 6.4 函數(shù)的調(diào)用實(shí)參可以是常量、變量、表達(dá)式或函數(shù)。#include void main() float min(float x,float y); /*函數(shù)定義在調(diào)用的函數(shù)之后,要先聲明*/ float a=3.9,b=4.1;

11、printf (“%.1fn”,min(a,b); printf (“%.1f n”,min(5,a*b); printf (“%.1f n”,min(b-1,min(a,b); float min(float x,float y) return (xy) z=x; else z=y; return z; c=max(a,b);max(int x,int y) int z; if(xy) z=x; else z=y; return z;a,b為實(shí)際參數(shù)x,y為形式參數(shù)函數(shù)的調(diào)用函數(shù)的返回/*- 程序L1_3.C :輸入 a、b兩個(gè)數(shù),輸出其中最大數(shù) -*/ #include /* 包含輸入輸出

12、頭文件 */ float max(float x, float y) /* 定義求x、y的最大值的函數(shù)max*/ float z; /* 定義實(shí)數(shù)變量z*/ if (xy) z=x; /* 如果x大于y,則z等于x */ else z=y; /* 否則z 等于y */ return z; /* 返回z, 則max函數(shù)值為z的值 */ main( ) /* 定義主函數(shù) */ float a,b,c; /* 定義實(shí)數(shù)變量a、b、c */ printf(Please input two numbers (a,b):); scanf(%f,%f,&a,&b); /* 從鍵盤輸入a、b */ c=max

13、(a,b); /* c等于a、b的最大數(shù) */ printf(%f,%f,the max is %fn,a,b,c); 輸入年、月、日,輸出該日期是該年的第幾天main()len_of_days()len_of_month()ls_leap_year()scanf()printf()len_of_days()len_of_month()ls_leap_year()給出某年月日給出某年某月給出年份返回該日期的天數(shù)返回該月天數(shù)返回是否是 閏年的結(jié)論/*- 程序L5_11.C功能:輸入年、月、日,輸出該日期是該年的第幾天 -*/ #include /*函數(shù)is_leap_year()判斷年year是

14、否是閏年,如果是返回值為1,否則為0*/ int is_leap_year(int year) int leap; if (year%4=0&year%100!=0|year%400=0) leap=1; else leap=0; return leap;/*函數(shù)len_of_month()的返回值為某年year的某月month的天數(shù)*/ int len_of_month(int year,int month) int month_days; if (month=2) if (is_leap_year(year) month_days=29; else month_days=28; else

15、if (month=4|month=6|month=9|month=11) month_days=30; else month_days=31; return month_days; /*函數(shù)len_of_days()的返回值為該日期date是該年year的第幾天*/ int len_of_days(int year,int month,int date) int total_days,n; for(n=1,total_days=0;n1)由公式可知n!可以由(n-1)!表示。令an=n!,則an= n*an-1,即第n項(xiàng)的值可以由它的第n-1項(xiàng)固定公式來(lái)表示,凡是可以化成這種定義方法an=f

16、(an-1)的,都可以采用遞歸調(diào)用。例如1+2+n可以表示為an=an-1+n。實(shí)際上只要第n項(xiàng)的值可以由它前面的一項(xiàng)或幾項(xiàng)固定地表示,就可以適用遞歸算法。例如Fibonacci數(shù)列的通項(xiàng)為an=an-1+an-2,也可以使用遞歸算法。n!=6.5 函數(shù)的遞歸調(diào)用在編寫遞歸算法的時(shí)要特別注意:遞歸調(diào)用必須可以滿足一定條件時(shí)結(jié)束遞歸調(diào)用,否則無(wú)限地遞歸調(diào)用將導(dǎo)致程序無(wú)法結(jié)束。例如n!中當(dāng)n=1時(shí),令結(jié)果為1則可以結(jié)束遞歸調(diào)用,否則它將繼續(xù)調(diào)用(0)!而無(wú)限繼續(xù)下去。對(duì)于由多個(gè)通項(xiàng)表示的情況,如Fibonacci數(shù)列,則需要給出最后一個(gè)遞歸調(diào)用的所有項(xiàng)的值,即直接給出n=1時(shí)的結(jié)果以及n=2時(shí)結(jié)果

17、才可以結(jié)束遞歸調(diào)用。 調(diào)用過(guò)程返回過(guò)程 fac(3) 6 return(3*fac(2) return(3*2) return(2*fac(1) return(2*1) return(1)舉一反三 :使用遞歸算法編寫計(jì)算 1+2+3+n的函數(shù)。6.5 函數(shù)的遞歸調(diào)用#include long fac(int n) if (n= =1) return 1L; /*“1L”為長(zhǎng)整型常量*/ else return n*fac(n-1);void main() int m; scanf (“%d”,&m); printf(%2d!=%dn,m,fac(m);Fibonacci數(shù)列某人買回一對(duì)小兔,一個(gè)月后小兔長(zhǎng)成大兔。再過(guò)一個(gè)月,大兔生了一對(duì)小兔,以后,每對(duì)大兔每月都生一對(duì)小兔,小兔一個(gè)月后長(zhǎng)成大兔。如此下去,問(wèn)一年后此人共有多少對(duì)兔子按這個(gè)規(guī)律,可以把兔子數(shù)一直寫下去:1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,。若記第n個(gè)月的兔子數(shù)為fn,就有f0f1f2,f1f2f3,f2f3f4一般的,有fn-2fn-1=fn。fac(int x) int result;if (x=1|x=2) result=1; else result=fac(x

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論