語言版第8章函數(shù)_第1頁
語言版第8章函數(shù)_第2頁
語言版第8章函數(shù)_第3頁
語言版第8章函數(shù)_第4頁
語言版第8章函數(shù)_第5頁
免費預覽已結束,剩余18頁可下載查看

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、8. /.01./2(4567.8. /.01./2(4567. ./389./3:. 678/9;:. ./3?./?34567. s register88.1 /|3?; /3.(Turbo CdMSC.y.=i&Q0./|73RSde#$T&;RSU&gVWkH&g3XYRSZ 1. cafethahargetsputsstrcat./ ,12) ;2(./ji;%p&3./k&;2(./d,-1) 2) U./?2(3=MAUFd2) ;2(./ji;%p&3./k&;2(./d,-1) 2) U./?2(3=MAUFd1) m8./j./2(./JDI./?p ,J8/kv?./9B

2、?./D 2) t8./OMJ8/.2(I/Jrt8M678/(MRCUFfU./j&RC%ASCIISfUjRTd/RdUVRCdfWCd YC3RUQyp./j&YDOSdBIOS9qv3ypk IsnU./,-&4u|35c&k (sab0+,4Of4./d-3hde#$pdNt3./2(dq2v./mainmain./hv./d(I?(./d(,9:B(./?kwde&g 30+9hbmain./:;dMj(./3?F#=main./dFi./Rb)returna; else return b;第一行說明 max 函數(shù)是一個整型函數(shù),其返回的函數(shù)值是一個整數(shù)。形參為 a,b整型量。a,

3、b 的具體值是由主調函數(shù)在調用時傳送過來的。在中的有使用其它變量,因此只有語maxreturn句是把a(b)的值作為函數(shù)的值返回給主調函數(shù)。有返回值函數(shù)中至少應有一個 return 語句。在程序中,一個函數(shù)的定義可以放在任意位置,既可放在主函數(shù) main 之前main后例如可把max 函數(shù)置在 main也可以把它放在main前。修改后的程序如下所示【例8.13 類型標識符 函數(shù)名(形式參數(shù)表列類型標識符 函數(shù)名()else return b;f(inputtwo現(xiàn)可以從函數(shù)定義、函數(shù)說明及函數(shù)調用的角度來分析整個程序,從中進一步解函數(shù)else return b;f(inputtwo現(xiàn)可以從函數(shù)

4、定義、函數(shù)說明及函數(shù)調用的角度來分析整個程序,從中進一步解函數(shù)的各種特點對 max數(shù)進行說明8義和函數(shù)說明并不是一回事,在后面還要專門討論。 可以看出函數(shù)說明與函數(shù)定義中的函數(shù)頭部分相同,但是末尾要加分號。程序第 12 行為max數(shù),并把x, y的值傳送給maxa, b。maxa將返回給變量z。最后由主函數(shù)輸出z值8.3 8.3.1函數(shù)的形參和實參具有以下特形參變量只有在被調用時才分配內結束即所分配的內因此,形參只有在函量有效。函數(shù)調用結束返回主調函數(shù)后則不能再使用該形參實參和形參在數(shù)量上,類型上,順序上應嚴格一致,否則會發(fā)生類型不匹配函數(shù)調用中發(fā)生的數(shù)據(jù)傳送是單向的。即只能把實參的值傳送給形

5、參,而不能把形參值反向地傳送給實參。 因此在函數(shù)調用,形參的值發(fā)生改變,而實4 【例8.2】可以說明這個問題。 f(input本程序中定義了一個函數(shù) s,該函數(shù)的功能是求【例8.2】可以說明這個問題。 f(input本程序中定義了一個函數(shù) s,該函數(shù)的功能是求ni 的值。在主函數(shù)中輸入 n 值,并作為實參,在調s 函數(shù)的形參量n( 注意,本例的形參變量和實參變量的標識都為 n,但這是兩個不同的量,各自的作用域不同)。在主函數(shù)中用 f值,這個n實參n在函數(shù)s也用f 語句輸出了一次n這個n是參最后取n0。從運行情況看,輸入n為100。即實參n值為100。把此值傳函數(shù)s形參n100,在執(zhí)行函數(shù),形參

6、n變?yōu)?050。返回主函之后,輸出實參 n 的值仍為 100。可見實參的值不隨形參的8.3.2函數(shù)的值是指函數(shù)被調用之后,執(zhí)行函數(shù)體中的程序段所取得的并返回給主調函數(shù)的81的mx1) 函數(shù)的值只能通過return句返回主調函數(shù)return 語句的一般形式return表達式5 或者為return (表達式該語句的功能是計算表有多個 語句,但每次調用只能有一個 return 語句被執(zhí)行,因此只能返回一個函數(shù)值或者為return (表達式該語句的功能是計算表有多個 語句,但每次調用只能有一個 return 語句被執(zhí)行,因此只能返回一個函數(shù)值如函數(shù)值為整型,在函數(shù)定義時可以省去類型說明不返回函數(shù)值的函

7、數(shù),可以明確定義為“空類型”,類型說明符為“void”。如8.2函數(shù) s函數(shù)返函數(shù)值,因此可定義為void一旦函數(shù)被定義為空類型后,就不能在主調函數(shù)中使用被調函數(shù)的函例如,在定義 s 為空類型后,在主函數(shù)中就是錯誤的為了使程序有良好的可讀性并減少出錯, 凡不要求返回值的函數(shù)都應定義空類型8.4 8.4.1前面已經在程中是通過對函數(shù)調用來執(zhí)函數(shù)體其過程與它語言的子程序調用相。語言中,函數(shù)調用的一般形式函數(shù)名(實際參數(shù)表8.4.2在語言中,可以用以下幾種方式調用函數(shù)算。這種方式要求函數(shù)是有返回值的。例如:z=axx,)是一個賦值表達式,把 m的返回值賦予變量。函數(shù)語句: 函數(shù)調用的一般形式加上分號

8、即函數(shù)語句。例如:f(%d,a);scanf (%d,&b);都是以函數(shù)語句的方式調用函數(shù)函數(shù)實參:函數(shù)作為另一個函數(shù)調用的實際參數(shù)出現(xiàn)。這種情況是把該函數(shù)的返回值為 實參 進 行傳, 因此求 該 函數(shù) 必須是 有 返 回值的。 例 如:max用的返f實參來用的。在函數(shù)調用中還應該注意的一個問題是求值。所謂求值順序是指對6 參表中各量是自左右使用呢,還是右至左使對此,各統(tǒng)的規(guī)定不一定同。介紹rf 函數(shù)時已提到,參表中各量是自左右使用呢,還是右至左使對此,各統(tǒng)的規(guī)定不一定同。介紹rf 函數(shù)時已提到,這里從函數(shù)調的度再強調。f(%dn%dn%dn%dn,+i,-i,i+,i-如按照從右至左的順序求

9、值。運行結果應為8778如對9889f 語句中的+i,-i,i+,i應特別注意的是,無論是從左至右求值, 還是自右至左求值,其輸出順序都是不變的,為8,7,7,8。上述問題如還不理解,上機一試就明白了。8.4.3在主調函數(shù)中調用某函數(shù)之前應對該被調函數(shù)進行說明,其一般形式類型說明符 被調函數(shù)名(類型 形參,類型 形參); 類型說明符 被調函數(shù)名(類型,類型括號內給出了形參的類型和形參名,或只給出形參類型。這便于編譯系防止可能出現(xiàn)8.1 mainmax說明或寫為,語言中又規(guī)定在以下幾種情況時可以省去主調函數(shù)中對被調函數(shù)的函數(shù)說明82的主函數(shù)中未對函數(shù)s作說當被調函數(shù)的函數(shù)定義出現(xiàn)在主調函數(shù)之前時

10、,在主調函數(shù)中也可以不對被調函7 #LJD(xy?kz5z8.1pd./max32(Rmainmain./p01max3) #LJD(xy?kz5z8.1pd./max32(Rmainmain./p01max3) charfloatf(floatb); charfloatf(floatp,4dJ+str./9fstr 9 f 4) 4./3?,pf2乘值longlongc=1; returnlongs=0;在程序中,函數(shù) f1 和 f2 均為長整型,都在主函數(shù)之前定義,故不必再在主函數(shù)中對 f1 和f2程序中,執(zhí)行循環(huán)程序依i參調用函數(shù)f1 求i2值。在f1又發(fā)f2用,這時i2的值作為實參f2

11、,在f2 中完成求的計算。f2行完畢把C 值(即i2!f1,再由f1實現(xiàn)累加。至此,由函數(shù)的嵌套調用實現(xiàn)了題目的要求。由于數(shù)值很大,所以函數(shù)和一些變量的類型都說明為長9 8.6 例 函數(shù)freturnz;這個函數(shù)是一個行該函數(shù)將無休止地調用其自這當然是不正確的8.6 例 函數(shù)freturnz;這個函數(shù)是一個行該函數(shù)將無休止地調用其自這當然是不正確的為了防止遞歸調用無終止地進行,必須在函數(shù)內有終止遞歸段。常用的件判斷,滿足某種條件后就不再作遞歸調用,然后逐層返回。下面舉例說明遞歸調用的執(zhí)過程【例8.5】用遞歸法計算用遞歸法計算 n!可用下述公式表示按公式可編程如下longlongif(n0)el

12、seif(n=0|n=1)(n-longf(ninputeager程序中給出的函數(shù) ff 是一個遞歸函數(shù)。主函數(shù)調ff 后即進入函ff 執(zhí)行,如nnoM5dwD./Fi&1_OM#zJDsc&kV0+&gnoM5dwD./Fi&1_0+s#?ffLIJ?w(n-1*,(5-*+YIJ?Fdff./68$x3:PM1_,#NIJ?(:;X=vff1)/ df()3=:M 1*=2ff3) 2*3=6d f(43*24ff(5)M24*5=120kz8.5OI,IJ3ACGMjk5IIaCdwb1:;QI2d#QIxkwhtP s#IJBC,#; FhHanoidXz8.6YHanoid5j5.4

13、NWk&A.64ughbAfiWCfsd-Ys#iW4ughdiWIj k B f*+kw;tld;tfs3ghron./qhQdXhskDiW3% BCfZ5QdVAstnuh+k 54n1d1gbAxyiWCk 54n=2dj1.1As3n-1(&1uBs 2.#1As34ughiCs3Bs3n-1(&)ughiC54A.1As3n-1(&dn)ughiB(jk&C)%(1)1As3n-1(&1)Csk(2)1As34ughi()Cs3n-1(&1)B.1As34ughiC.1Bs3n-1(&dn)ughiC(jkAdm(1)1Bs3n-1(&1)Ak(2)1Bs34uh+i()As3n-

14、1(&1)bsfZIgOd%nq&2AAs3n-1ughiBAAs34ughiCABs3n-1ughiC%n=3d,4%9,6%/fMUc36%dwAn-1ufsd.F3 n=n-1k f(%c-move(n-f(%c-move(n-f(ninputf(thesteptomoving%2dmove(n-f(%c-move(n-f(ninputf(thesteptomoving%2d從程序中可以看出,move數(shù)是一個遞歸函數(shù),它有四個形參n,x,y,z。n示圓盤數(shù), 接把x上的圓盤移至z輸出xzn!=1遞歸moven-1個n=n-1n值逐次遞減,最后n=1層返回input4thesteptomo

15、ving 48.7 數(shù)組可以作為函數(shù)的參數(shù)使用,進行數(shù)據(jù)傳送。數(shù)組用作函數(shù)參數(shù)有兩種形式12 把數(shù)組元素(下標變量)作為實參使用;另一種是把數(shù)組名作為函數(shù)的形參和實參使用1. 數(shù)組元素把數(shù)組元素(下標變量)作為實參使用;另一種是把數(shù)組名作為函數(shù)的形參和實參使用1. 數(shù)組元素作函數(shù)實 .4【例8.7】判別一個整數(shù)數(shù)組中各元素的0 則輸出該值,若小于等于0值。編程如下voidf(%df(%df(input5本程序中首先定義一個無返回值函數(shù) nzp,并說明其形參 v 為整型變量。在函數(shù)體中根據(jù) v出相應的結果。在 main中用for輸入數(shù)組各元素,每輸入一個就以該元素作實參nzp函數(shù),即把aiv,供

16、nzp用。數(shù)組名作為函數(shù)參用數(shù)組名作函數(shù)參數(shù)與用數(shù)組元素作實參有幾點不同值都賦予形參數(shù)組的各個元素。因為實際上形參數(shù)組并不存在,編譯系統(tǒng)不為形數(shù)組分配內存。那么,數(shù)據(jù)的傳送是如何實現(xiàn)的曾介紹過,數(shù)組名就間13 上圖說明了這種情形。a組,類型為整型。a上圖說明了這種情形。a組,類型為整型。a占有以2000首地組a首地址傳送給形參數(shù)組名b,于是b取得該地址2000。于是a,b數(shù)組共同占有以2000址的一段連續(xù)內存單元。從圖中ab相同的元素實際上也占相同的兩個內存單元(整型數(shù)組每個元素占二字節(jié)a0和b0都占用20002001元a0等于b0ai等于bi【例8.8】數(shù)組a了一個學生5程的成績,求平均成績

17、。 float aver(float a5)return av;voidf(ninput5f(averagescoreis本程序首先定義了一個實型函數(shù) aver,有一個形參為實型數(shù)組 a,長度為 5。在函數(shù) aver 中,把各元素值相加求出平均值,返回給主函數(shù)。主函數(shù) main 中首先完成數(shù)sco然后以sco為aver數(shù),函av,最后輸出值。 從運行情況可以看出,程序實現(xiàn)了所要求的功能3) 前面已過,在變量作函數(shù)參數(shù)時,所進行的值傳送是單向的。即只能從實用函數(shù)之后實參數(shù)組的值將由于形參數(shù)組值的變化而變化。為了說明這種情況14 5.45.6形式【例8.9】題目同8.7。改用數(shù)組名作函數(shù)參數(shù)voi

18、df(nvaluesofarrayaif(ai0) 5.45.6形式【例8.9】題目同8.7。改用數(shù)組名作函數(shù)參數(shù)voidf(nvaluesofarrayaif(ai0) f(%df(ninput5f(initialvaluesofarraybf(%df(nlastvaluesofarraybf(%d本程序中nzp形參為整數(shù)組a,長度為5。主函數(shù)b為整型,長度也為5。在主函數(shù)中首先輸b值,然后輸出數(shù)組b初始值。然后以數(shù)組名b實nzp數(shù)nzp,按要求把負值單元清0,并輸出形參數(shù)組a 的值。 返回主函數(shù)之后,再次輸出數(shù)組b可以看出,數(shù)組 b初值和終值是不同的,數(shù)組 b值和數(shù)組a的。這說明實參形參為

19、同一數(shù)組,它們的值同時得以改變。用數(shù)組名作為函數(shù)參數(shù)時還應注意形參數(shù)組和實參數(shù)組的類型必須一致,否則將引起錯誤形參數(shù)組和實參數(shù)組的長度可以不相同,因為在調用時,只傳送首地址查形參數(shù)組的長度。當形參數(shù)組的長度與實參數(shù)組不一致時,雖不至于出法錯誤(編譯能通過),但程序執(zhí)行結果將與實際不符,這是應予以注意的【例8.10】如把例:voidf(nvaluesofarray15 f(%df(ninput5f(initialvaluesofarraybf(%df(nlastvaluesofarraybf(%d本程序與例 8.9 程序比,nzp 函數(shù)的形參f(%df(ninput5f(initialvalue

20、sofarraybf(%df(nlastvaluesofarraybf(%d本程序與例 8.9 程序比,nzp 函數(shù)的形參數(shù)組長度改為 8,函數(shù)體中,for 語句的循環(huán)條件也改為 i8。因此,形參數(shù)組 ab長度不一致。編譯能夠通過,但從結果看,數(shù)組a 的元素a5,a6,a7顯然是無意義的。c. 在函數(shù)形參表中,允許不給出形參數(shù)組的長度,或用一個變量來表示數(shù)組元素例如,可以寫為void或寫void其中形a有給出長度,而由n度。n由主8.10為例8.11式【例8.11voidf(nvaluesofarrayaif(ai0) f(%d16 f(ninput5f(initialvaluesofarra

21、ybf(%df(nlastvaluesofarraybf(%d本程序nzp參數(shù)組a長度n 動f(ninput5f(initialvaluesofarraybf(%df(nlastvaluesofarraybf(%d本程序nzp參數(shù)組a長度n 動態(tài)確定該長度main函數(shù)調用語句為nzp(b,5),其中實參5予形參n為形參數(shù)組的長度。數(shù)組也可以作為函數(shù)的參數(shù)。在函數(shù)長度,也可省去第一維的長度。因此,以下寫法都是合法的或a10)8.8 在束立函數(shù)的形參變量時曾經提到,形參變量只在被調用期間才分配內存單元,調用。這一點表明形參變量只有在函數(shù)內才是有效的,離開該函數(shù)就不能再使用了種,即局部變量和全局變量

22、8.8.1局部變量也稱局部變量是在函數(shù)內作定義說明離開該函數(shù)后再使用這種變量例如/*函數(shù)a,b,c17 /*函數(shù)m,n在函數(shù)f1義了三個變量,a形參,b,c一般變量/*函數(shù)m,n在函數(shù)f1義了三個變量,a形參,b,c一般變量。在 f1a,b,ca,b,cf1同理,x,y,z用域限于f2m,n作用于 main 函數(shù)內。關于局部變量的作形參變量是屬于被調函數(shù)的局部變量,實參變量是屬于主調函數(shù)的局部變量允許在不同的函數(shù)中使用相同的變量名,它們代表不同的對象,分配不同的單互不干擾,也不會發(fā)許的例中,形參和實參的變量名都為 n,是完例如在復合語句中也可定義變量,其作用域只在復合語句范圍內/*b/*s,a

23、用域18 本程序在maini,j,k其中k賦初值。而在復合語句內又定義了一個變量k,并本程序在maini,j,k其中k賦初值。而在復合語句內又定義了一個變量k,并賦初8。應該注意這兩個k句外由main義的 k作用,而在復合語句內則由在復合語句內定義的 k作用。4k main 所定義,其值應為 5。第 7 行輸出 k 值,該行在復合語句內,由復合語句內定義的 k起作用,其初8,故輸出89輸出i,ki在整個程序中有效7行對i值為3,故以輸出也為3。而第9之外k 應為main定k,此k由第4 行已獲得為5,故輸出也為58.8.2 xtrn例如/*外部變量/*函數(shù)voidfloatx,y; /*外部變

24、量/*函數(shù)/*主函數(shù)從上例可以看出abxy 都是在函數(shù)外部定義的外部變量x,y 定義在函數(shù)f1后,而在f1又無對x,y們在f1a,b源程序最前面,因f1,f2main使用。【例 8.13】輸入正方體的長寬高 l,w,h。求體積及三個面 x*y,x*z,y*z 的面積。 19 returnv;f(ninputnd【例8.14】外部變量與局部變量同名。 /*a,b為外部變量b) /*a,b變量如果同一個源文件中,外部變量與returnv;f(ninputnd【例8.14】外部變量與局部變量同名。 /*a,b為外部變量b) /*a,b變量如果同一個源文件中,外部變量與局部變量同名,則在局部變量的作用范圍內,外部即它不起作用8.9 8.9.1前面已經介紹了,從變量的作用域(即從空間)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論