結構化程序設計的思想是將一個問題分解為若干個小問題_第1頁
結構化程序設計的思想是將一個問題分解為若干個小問題_第2頁
結構化程序設計的思想是將一個問題分解為若干個小問題_第3頁
結構化程序設計的思想是將一個問題分解為若干個小問題_第4頁
結構化程序設計的思想是將一個問題分解為若干個小問題_第5頁
已閱讀5頁,還剩8頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第八章函數(shù)8.1概述結構化程序設計的思想是將一個問題分解為若干個小問題,小問題由單獨的模塊來實現(xiàn)。C語言用函數(shù)來實現(xiàn)模塊,所以C語言是函數(shù)式的語言。一個C程序有一個由main開頭的主函數(shù),由主函數(shù)調用其他函數(shù),同一個函數(shù)可以被多次調用。mam()/*主函數(shù)*7piintstarQ;pnntmessQ;printstarQ;pnntstarQ/*自定義函數(shù)*/printf(H*iin)pnntmess()嚴自定義函數(shù)*/printf(Tliisisanexample!);函數(shù)說明:(1)一個源程序文件由一個或多個函數(shù)構成,一個源程序文件是一個編譯單位。(2)一個C程序由一個或多個源程序文件組成,

2、可以分別編譯;一個程序可以多次被調用。(3)C程序從niainQ開始執(zhí)行和結束執(zhí)行(4)所有函數(shù)是平行的,不可以嵌套定義,但可以嵌套調用(5)從用戶的角度看,函數(shù)分為標準函數(shù)(庫函數(shù))和用戶自定義函數(shù)(6)從函數(shù)形式看,分為有參函數(shù)和無參函數(shù)8.2函數(shù)定義的一般形式類型標識符函數(shù)名(形式參數(shù)列表)聲明部分;語句部分;說明:(1)當函數(shù)不需要返回值時,可以沒有類型說明符(2)可以沒有形參(3)函數(shù)體可以為空,只有一個人括號8.3函數(shù)參數(shù)和函數(shù)值8.3.1函數(shù)的形式參數(shù)和實際參數(shù)調用函數(shù)時,主調函數(shù)和被調函數(shù)Z間有數(shù)據傳遞關系。定義函數(shù)時括號內的參數(shù)稱為形式參數(shù),形參是變最;調用時給定的參數(shù)稱為實

3、際參數(shù),實參可以是變最,也可以是表達式。mam()inta,b,c;scanf(“d,%d”,&a,&b);c=max(a,b);pnntf(fctmaxis:%dnn,c);max(intxjntv)mtz;if(x=y)z=x;elsez=y;letuinz;說明:形參只有在函數(shù)調用時才分配單尤,調用結束后形參所占的單尤隨即釋放實參可以是常量、變量或表達式定義函數(shù)時,必須指定形參的類型實參與形參的類型相同或賦值兼容,整型可對應實型形參(低對高)C語言中,實參燉形參的數(shù)據傳遞是值傳遞,所以形參的值不會反過來影響實參swap(iiitx,inty)inttemp;temp=x;x=y;y=te

4、mp;mam()mta=10,b=20;swap(a.b);pnntff%a=%d.b=%difa,b);輸出:a=10,b=20實參與形參的結合過程:用FLASH實現(xiàn)ab1020(1)(2)(3)return語句向主調函數(shù)返回值當return返回的值的類型與函數(shù)定義的類型不同時,以函數(shù)類型為準定義函數(shù)時應給出函數(shù)類型,如果沒有給定,C語言按整型處理,如果不需要函數(shù)返回值,可用void明確標識8.4函數(shù)的調用&4.1函數(shù)調用的一般形式函數(shù)名(實際參數(shù));&4.1函數(shù)調用的一般形式8.4.2函數(shù)調用的方式(1)函數(shù)語句,如pnntstai();(2)函數(shù)表達式:出現(xiàn)在表達式可以出現(xiàn)的地方,如賦值

5、號的右側或打印語句中c=max(a,b);(3)函數(shù)參數(shù):做為另一個函數(shù)的實際參數(shù)m=max(a,max(b,c);所以,函數(shù)不可以做套定義,但可以詼套調用8.4.3對被調用函數(shù)的聲明和函數(shù)原型在一個函數(shù)中調用另一個函數(shù)的條件:(1)被調用函數(shù)己經存在(2)使用庫函數(shù),用include命令將有關庫函數(shù)包含進來(3)如果是用戶自定義的函數(shù),則被調函數(shù)應與主調函數(shù)在同一文件,一般情況卜在主調函數(shù)中對被調函數(shù)進行聲明;如果刈函數(shù)沒有聲明,編譯系統(tǒng)會把第一次遇到該函數(shù)(定義或調用)作為函數(shù)聲明,并將函數(shù)類型默認為int型,但最好做盧明,便于編譯程序進行全面合法性檢查。所以可以有以卜幾種處理方法:先定義

6、被調函數(shù)后定義被調函數(shù),且被調函數(shù)為整型后定義非整型被調函數(shù),有主調函數(shù)中聲明在所有函數(shù)(包括mam函數(shù))定義Z前,在函數(shù)的外部已做了函數(shù)聲明,則在各個主調函數(shù)中不必對所調用的函數(shù)再作說明chailettei(chai;char);floatf(floatfloat);mti(float,float);chailettei(charcl.chai-c2)聲明函數(shù)不同定義函數(shù),只給出函數(shù)類型,名字及參數(shù),這種形式稱為函數(shù)原型。函數(shù)原型的一般形式:(1)函數(shù)類型函數(shù)名(參數(shù)類型1,參數(shù)類型2);(2)函數(shù)類型函數(shù)名(參數(shù)類型1參數(shù)名1,參數(shù)類型2參數(shù)名2,);例,floatadd(floata,f

7、loatb);或floatadd(float.float);8.5函數(shù)的嵌套調用c語言不允許嵌套定義函數(shù),但允許嵌套調用例川弦截法求方程f(x)=x3.5x2+16x-80=0的根。#include#iiiclude/*定義函數(shù)f(x)*/floatRfloatx)floaty;y=x*x*x-5*x*x+16*x-80;letuiny;/*求(xl.f(xl)和(x2,f(x2)所構成的直線與x軸的交點*/floatxpomt(floatxl.floatx2)floatx;x=(xl*f(x2)-x2*f(x1)/(f(x2)-f(x1);letuinx;/*用眩解法求方程的根*/float

8、root(floatxl.floatx2)floatxyyl;yi=f(xi);dox=xpoint(xl,x2);y=f(x);if(y*yl0)xl=x;yl=y;elsex2=x;wlule(fabs(y)=le-6);retuinx;嚴主函數(shù)*7mam()floatxl,x2,x,fl,f2;doprmtf(Mmputxlandx2:iin);scanf(H%f%f&x1x2);fl=f(xl);2=f(x2);wlule(fl*2=0);x=root(xl,x2);pnntftherootofequationis:%fn,x);8.6函數(shù)的遞歸調用函數(shù)直接或間接地調用自己,稱為遞歸調

9、用,且分別稱為直接遞歸和間接遞歸。例1,有5個人坐在一起,問第5個人多少歲,他說比第4個大2歲。問最后一個人,他說10歲。請問第5個人多人10巒(哄age(“)+210巒(哄age(“)+2(n=l)(nl)intage(mtn)intc;if(n=l)c=10;elsec=age(n-l)+2;returnc;main()prmtf(“d”,age(5);例2,求n!可以用遞推和遞歸兩種方法求解。floatfac(intn)mti;floatt=l;if(n0)printfCerroF);exit(O);elsefor(i=l;i=n;i+)t=t*i;returnt;floatfac(in

10、tn)floatt;if(n%cjTXy);/*遞歸函數(shù)wvoidhamo(intncharx,chary,charz)if(n=l)move(x,z);elsehamo(ml“z,y);move(x.z);hanio(n-l、y、x、z);main()mtm;pnntfCplsinputthenumberofdisksiT);scanf(,%d,&m);hanio(m?A,BVC,);8.7數(shù)組做為函數(shù)參數(shù)8.7.1數(shù)組元素做為參數(shù)(實參)同一般的變屋,也是值傳遞。8.7.2數(shù)組名作參數(shù)(形參、實參)形參和實參都用數(shù)組名,是地址傳遞。有以卜幾種形式處理形參:floataver(floatar

11、ray10)實參數(shù)組的人小不起作用,只是用數(shù)組名來接收地址floataver(floatariay)同(1)floataver(floatarray.mtn)如果函數(shù)中需要數(shù)組的人小,則別設一參數(shù)n來動態(tài)表示元素多少,這種方式最常用由于數(shù)組是地址傳遞,所以形參的變化反過來影響實參例1,用簡單選擇排序対數(shù)組中的元素進行從小到大排序。用FLASH演示(地址傳遞,排序過程)voidsort(floatauav4ntn)intij,k;floattemp;fbr(i=0;in-l;i+)k=i;for(j=i+ljn;j+)if(airavjairayk)kj;if(k!=i)temp=arraykj

12、;arrayk=anayi;anayi=temp;mam()floata10;inti;foi(i=0;i10;i-H-)scanf(H%f&ai);sort(aJO);fbi(i=0;i10;i-H-)pnntf(”62f/i);8.7.3用多維數(shù)組名作函數(shù)參數(shù)多維數(shù)組作為形參時,可以省略第一維的人小,其余的不可以省略。mtanay310;mtarray10;二維數(shù)組是由若干個一維數(shù)組構成,而形參數(shù)組的類型應與實參數(shù)組相同,所以它們必須由具有相同長度的一維數(shù)組所組成。不能只指定第一維而省略第二維。intarray3;是錯誤的在第二維相同的情況卜,第一維可以不同,實參:intscore習10;

13、形參可以是:intarray310;或mtanav810;8.8局部變量和全局變量8.8.1局部變量在函數(shù)內部定義并使用的變鼠稱為局部變吊,主函數(shù)中定義的變崑也只有在主函數(shù)中有效。不同函數(shù)內定義的變量可以用相同的名字形參是局部變量函數(shù)中的復合語句內可以定義變量,只在復合語句內有效mam()inta,b=l;scanfC%P,&a);mtc;c=a+b;pnntf(“d”,c);出錯,因為c是復介語句內疋義的,在外面是無效的mam()inta,b=l;scanf(”d;&a);mta;a=10;prmtf(Humera=%dn,a);pnntf(Hextera=%dn”,a);輸入:100輸出:

14、innera=10extera=1008.8.2全局變量在函數(shù)Z外定義的變起是全局變最,作用范闈是從定義處直到源文件結束。對全局變帚的兒點說明:全局變最增加了函數(shù)間數(shù)據聯(lián)系的渠道。一個函數(shù)只能返回一個值,如果要返回多個值,可以借助全局變量(2)C語言有一個不成文的約定,全局變量名的第一個字母大寫(3)不必耍的時候不要使用全局變量,因為:全局變量在程序運行過程中一直占存貯單元;降低了程序的模塊化程度降低了程序的清晰性(4)外部變量與內部變耄同名,則在局部變屋的作用范圍內,外部變崑不起作用。8.9變量的存貯類別8.9.1動態(tài)存貯方式與靜態(tài)存貯方式從變最的生存時間將變最分為靜態(tài)存貯方式和動態(tài)存貯方式

15、靜態(tài)存貯方式:程序運行期間分配固定的存貯空間的方式。動態(tài)存貯方式:程序運行期間根據需要進行動態(tài)分配存貯空間的方式存貯空間的劃分:用戶區(qū)程序區(qū)靜態(tài)存貯區(qū)動態(tài)存貯區(qū)全局變最存貯靜態(tài)存貯區(qū)動態(tài)存貯區(qū)存貯:(1)函數(shù)形參(2)自動變量,未加static說明的變量(3)函數(shù)調用時的現(xiàn)場保護和返回地址C語言中的變駅和函數(shù)都有兩個屬性:數(shù)據類型和數(shù)據的存貯類別。存貯類別指數(shù)據在內存中的存貯方式。存貯方式分為兩人類:靜態(tài)存貯和動態(tài)存貯,具體包括:自動的(auto),靜態(tài)的(static),寄存器的(register),外部的(extern)o根據變鼠的存貯類別可以知道變量的作用域和生存期。892auto變量動

16、態(tài)分配和釋放空間的局部變最。形參和函數(shù)中定義的變最是auto變帚,auto可以不寫8.9.3用static聲明局部變量函數(shù)執(zhí)行結束后不釋放存貯空間,變屋的值仍然保留,可用static明局部靜態(tài)變最Hinta)autointb=0;staticc=3該語旬不等效Jstaticc;c=3;,改厲結果為7,7,7b=b+l;c=c+l;retuni(a+b+c);mam()inta=2;inti;fbr(i=0;i3;i+)運行結果為789說明:局部表態(tài)變量屬F靜態(tài)存貯類別,在靜態(tài)存貯區(qū)內分配存貯單元對靜態(tài)局部變最是在編譯時賦初值的,只賦值一次,程序運行時不再重新賦初值,定義時不賦初值的話,編譯時自

17、動賦初值0或空字符;自動變鼠不賦初值則它的值是一個不確定的值盡管靜態(tài)局部變最在函數(shù)調用結束后仍然存在,但其他函數(shù)不能引用適合用靜態(tài)局部變量的場合:需要保留上一次調用值時初始化后變覺只被引用而不改變其值,免得每次調用時重新賦值例,打印1到4的階乘值intfac(intn)staticmtf=l;f=f*n;retuinf;mamQmti;for(i=l;i=5;i+)pnntf(4%d!=%dn”d,fac(i);894register為提高變最的訪問速度,將一些經常存取的變覺放在寄存器中,這種變炭稱為寄存器變量,用關鍵字register聲明。registerinti,f=l;只有局部自動變最和

18、形式參數(shù)可以作為寄存器變最,其他不行;局部靜態(tài)變量不可以定義為寄存器變量,不能寫成registerstaticinta,b,c;定義的寄存器變磧數(shù)目不能太多,因為寄存器數(shù)目有限,現(xiàn)代編譯系統(tǒng)可以自動識別使用頻繁的變量,然后分配成寄存器變量895用extern聲明外部變量(1)在一個文件內部聲明外部變量外部變量的作用域是從定義處到文件的末尾,要在定義Z前使用,則用extem聲明mam()externmtA,B;/j!*明A,B是已經定義的外部變量,這樣就可以在main函數(shù)中使用pnntff%dn,max(A,B);mtA=13,b=8;在多文件的程序中聲明外部變量一個C程序可以由多個源文件組成,當一個文件中要使用另一個文件中定義的變量時用e

溫馨提示

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

評論

0/150

提交評論