c語言程序設(shè)計(jì)與項(xiàng)目實(shí)踐第8章_第1頁
c語言程序設(shè)計(jì)與項(xiàng)目實(shí)踐第8章_第2頁
c語言程序設(shè)計(jì)與項(xiàng)目實(shí)踐第8章_第3頁
c語言程序設(shè)計(jì)與項(xiàng)目實(shí)踐第8章_第4頁
c語言程序設(shè)計(jì)與項(xiàng)目實(shí)踐第8章_第5頁
已閱讀5頁,還剩20頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、第8章 函數(shù) 本章的學(xué)習(xí)重點(diǎn)函數(shù)的分類函數(shù)的定義函數(shù)的調(diào)用與聲明函數(shù)的實(shí)參與形參局部變量和全局變量函數(shù)的嵌套調(diào)用 8.1 函數(shù)的定義 函數(shù)是C語言的基本組成單位,它是模塊化程序設(shè)計(jì)的主要構(gòu)成單元。模塊單元是指實(shí)現(xiàn)某一功能的程序段,通常以函數(shù)形式實(shí)現(xiàn)。 8.1.1 函數(shù)的分類 1按照定義類型劃分:主函數(shù)、庫函數(shù)和用戶自定義函數(shù)。主函數(shù):主函數(shù)的調(diào)用名稱為main(),它是C語言中最主要的函數(shù),在C語言中具有唯一性。庫函數(shù):庫函數(shù)通常由開發(fā)編譯系統(tǒng)的人員編寫,并加以封裝后嵌入到C語言編譯系統(tǒng)中。用戶自定義函數(shù):用戶自定義函數(shù)是由用戶定義,用于完成某些特定功能的程序段,通常也將用戶自定義函數(shù)稱為子函

2、數(shù)。2按照是否能夠返回值劃分按照能不能返回?cái)?shù)值分為返回值類型函數(shù)和無返回類型函數(shù)。 8.1.1 函數(shù)的分類 返回值類型函數(shù):返回值類型函數(shù)在定義時(shí)應(yīng)指定返回值的類型。例如:int max()程序段無返回類型函數(shù):無返回類型函數(shù)在定義時(shí)應(yīng)在函數(shù)名前面標(biāo)注void說明符,以說明該函數(shù)為無返回類型。 3按照函數(shù)是否帶參數(shù)劃分 按照函數(shù)是否帶有參數(shù)分為有參函數(shù)和無參函數(shù)。有參函數(shù):函數(shù)定義和調(diào)用時(shí)時(shí)含有輸入?yún)?shù)的函數(shù)。無參函數(shù):函數(shù)定義和調(diào)用時(shí)都不帶參數(shù)的函數(shù)類型。 8.1.2 函數(shù)的定義 函數(shù)定義的一般表達(dá)形式為:類型說明符 函數(shù)名(形參表列)程序體 函數(shù)構(gòu)成的程序結(jié)構(gòu)如下:函數(shù)名1( 參數(shù)表列)程

3、序體1 8.1.2 函數(shù)的定義 1無返回值函數(shù)定義無返回值類型的函數(shù)定義使用void作函數(shù)類型說明符。例如:void test()printf(“This is a function testn”);2返回值函數(shù)定義帶有返回值的函數(shù)定義時(shí)類型說明符可以使用除void以外的任何數(shù)據(jù)類型。函數(shù)使用return語句返回?cái)?shù)值。例如:01int Sum( )0203int i=0, sum=0;04while(ib)04return a;05else06return b;07函數(shù)max判斷兩個(gè)整型數(shù)值a和b的大小,并返回較大的一個(gè)。 8.2 函數(shù)的調(diào)用與聲明 函數(shù)定義后,通過被調(diào)用來執(zhí)行。通常情況下,在

4、調(diào)用函數(shù)時(shí),應(yīng)先對函數(shù)進(jìn)行聲明。 8.2.1 函數(shù)的調(diào)用 函數(shù)在定義之后,可以由它本身或其他函數(shù)體調(diào)用。函數(shù)調(diào)用的一般表達(dá)形式為:函數(shù)名(實(shí)參表列)其中函數(shù)名就是函數(shù)定義的函數(shù)名稱,在這里,函數(shù)稱為被調(diào)函數(shù)。范例8.1 SubFuncCalcMaxVal.c 設(shè)計(jì)一個(gè)返回int類型的函數(shù)max,功能是計(jì)算主調(diào)函數(shù)中兩個(gè)變量的大小,返回較大的一個(gè),當(dāng)兩個(gè)數(shù)相同時(shí),打印數(shù)據(jù)相同的信息。范例分析:1子函數(shù)max的定義2函數(shù)頭3形參 8.2.1 函數(shù)的調(diào)用 4函數(shù)調(diào)用語句 5程序的入口6程序的執(zhí)行 自定義函數(shù)可以在程序中被多次調(diào)用,使用不同的實(shí)參,返回結(jié)果也有所不同。由于函數(shù)具有很好的模塊管理功能以及

5、支持反復(fù)調(diào)用功能,因此函數(shù)被廣泛用于程序中實(shí)際問題的解決。 實(shí)訓(xùn)8.1計(jì)算數(shù)學(xué)分段函數(shù) 數(shù)學(xué)分段函數(shù)P(m, n)由兩部分組成,當(dāng)mn時(shí),P(m, n)的值為 ,當(dāng)m=n時(shí),P(m, n)的值為0。編寫程序,鍵盤輸入m和n的值,使用子函數(shù)計(jì)算階乘,調(diào)用該函數(shù),實(shí)現(xiàn)對數(shù)學(xué)函數(shù) 的計(jì)算。1需求分析:需求1:計(jì)算分段數(shù)學(xué)函數(shù)的值需求2:設(shè)計(jì)程序子函數(shù)factorial,用于計(jì)算階乘。2技術(shù)應(yīng)用對于需求1,使用ifelse分支語句實(shí)現(xiàn)分段數(shù)學(xué)函數(shù)的計(jì)算。對于需求2,設(shè)計(jì)名為factorial的子函數(shù),該函數(shù)含有一個(gè)形參,返回值類型為double,避免因?yàn)榉祷刂禂?shù)值過大導(dǎo)致數(shù)值溢出。 源程序:SubFu

6、ncCalcPartsFunction.c 8.2.2 函數(shù)的聲明 1函數(shù)聲明的一般形式 函數(shù)聲明應(yīng)該放在調(diào)用函數(shù)處的前面,其一般表達(dá)形式為:類型標(biāo)識符 函數(shù)名(類型標(biāo)識符1 形參名1, 類型標(biāo)識符2 形參名2,);也可以省略形參名,只保留類型標(biāo)識符:類型標(biāo)識符 函數(shù)名(類型標(biāo)識符1, 類型標(biāo)識符2,);例如:int min(int a, int b);或者int min(int, int); 8.2.2 函數(shù)的聲明 2函數(shù)聲明的位置函數(shù)聲明的作用是告訴編譯系統(tǒng)有一個(gè)已經(jīng)定義好的子函數(shù)可以調(diào)用,因此,通常將函數(shù)聲明放在函數(shù)的頭部,而將函數(shù)定義放在調(diào)用函數(shù)位置之后。例如:int callback

7、_test(int a, int b);/函數(shù)聲明void main()/主函數(shù)a = callback_test(x, y);/函數(shù)調(diào)用語句int callback_test(int a, int b)/函數(shù)的定義函數(shù)體8.2.2 函數(shù)的聲明 范例8.2 CalcOverTurnSeqNum.c 計(jì)算數(shù)列M = 1-2+3-+(n-1)-n。設(shè)計(jì)一個(gè)函數(shù),命名為OverTurnSeqNum,函數(shù)的功能是計(jì)算M的值,其中n由形參傳入。3多文件系統(tǒng)的函數(shù)聲明當(dāng)需要調(diào)用的函數(shù)與本身的函數(shù)不在一個(gè)文件中時(shí),必須使用函數(shù)聲明,以保證程序編譯時(shí)能夠找到該函數(shù),并使程序正確運(yùn)行。 實(shí)訓(xùn)8.2近似計(jì)算圓周率

8、pi 編寫程序,利用公式 計(jì)算圓周率pi,定義子函數(shù)計(jì)算pi,并將該子函數(shù)保存于單獨(dú)的文件中,在主函數(shù)中輸出計(jì)算所得的pi的值。輸入n的值以確定pi的精度。1需求分析:需求1:計(jì)算的值需求2:通過調(diào)用數(shù)學(xué)庫函數(shù)sqrt計(jì)算pi的值需求3:輸入n的值確定pi的精度需求4:定義的子函數(shù)在一個(gè)單獨(dú)的文件中需求5:聲明子函數(shù),并定義在declare.h文件。2技術(shù)應(yīng)用對需求1,定義子函數(shù)Calc_pi(double n),計(jì)算公式的值。對需求2,子函數(shù)Calc_pi(double n)中調(diào)用sqrt函數(shù)。對需求3,主函數(shù)中輸入n的值,以確定pi的精度。對需求4,將子函數(shù)定義在單獨(dú)的文件中,命名為Cal

9、c_pi.c。對需求5,新建文件,命名為declare.h,將子函數(shù)Calc_pi(double n)的聲明放到改文件中,在主函數(shù)所屬文件中包含該頭文件。 8.2.3 函數(shù)的參數(shù) 1函數(shù)的形參形參僅出現(xiàn)在被調(diào)函數(shù)中,類似于函數(shù)內(nèi)定義的變量,在函數(shù)體內(nèi)任何位置都可以使用。但形參只能用于本函數(shù)體內(nèi),不能用于其他函數(shù)。2函數(shù)的實(shí)參實(shí)參僅出現(xiàn)在主調(diào)函數(shù)中。通常,實(shí)參是能夠計(jì)算為數(shù)值的變量或表達(dá)式,也可以是指針、數(shù)組名和函數(shù)等。3函數(shù)調(diào)用時(shí)的實(shí)參與形參關(guān)系函數(shù)調(diào)用時(shí),主調(diào)函數(shù)將實(shí)參的值傳遞給被調(diào)函數(shù)的形參,從而實(shí)現(xiàn)主調(diào)函數(shù)向被調(diào)函數(shù)的數(shù)據(jù)傳送。8.2.3 函數(shù)的參數(shù) 函數(shù)調(diào)用時(shí)實(shí)參和形參之間的值傳遞過程

10、如下圖: 范例8.3 ExchangeTwoValueInSubFunc.c 設(shè)計(jì)一個(gè)函數(shù),命名為ExchangeValue,函數(shù)的作用是交換由主調(diào)函數(shù)輸入的兩個(gè)變量的值,并在主調(diào)函數(shù)中輸出函數(shù)調(diào)用前后兩個(gè)變量的值,函數(shù)定義類型為void類型。 8.2.3 函數(shù)的參數(shù) 范例8.3 ExchangeValue()函數(shù)調(diào)用時(shí)m和n以及a和b的內(nèi)存結(jié)構(gòu)變化圖:8.3 局部變量與全局變量 局部變量的作用域僅限在函數(shù)內(nèi)部,即變量的定義和使用都只能在函數(shù)內(nèi)進(jìn)行。如下面程序中所示:01char test1(char c)0203int a, b;040506int test2(int m, int n)07

11、08int x, y;091011void main()1213char w=A, v;14int f1 = 10, f2 = 12, res=0;15v = test1(w);16res = test2(f1, f2);1718int next = 0;19next = v + res;202122 形參c,變量a和b的作用域,僅用于函數(shù)test1()內(nèi)部。形參m和n,變量x和y的作用域,僅用于函數(shù)test2()內(nèi)部。變量w、vf1、f2和res的作用域,僅用于函數(shù)main()內(nèi)部。變量next的作用域8.3 局部變量與全局變量 范例8.4 PartVariable.c 定義一個(gè)函數(shù)int

12、cal(int m, int n),在函數(shù)內(nèi)部定義內(nèi)部變量mn和nm,計(jì)算m和n之間的差。 8.3.2 全局變量 要引用其他文件的全局變量,需要對全局變量進(jìn)行聲明,聲明全局變量的一般表達(dá)形式為:extern 類型標(biāo)識符 變量名 1全局變量的定義和聲明全局變量可以定義在程序的前面,也可以定義在程序中間,當(dāng)定義在程序前面時(shí),可以不對其聲明而直接使用,但當(dāng)定義在程序中間時(shí),必須進(jìn)行變量的聲明。 范例8.4 OutVariable.c函數(shù)使用全局變量時(shí),應(yīng)該將該全局變量的定義放在函數(shù)前面,否則,就要先聲明該全局變量,然后才能在函數(shù)內(nèi)使用。在一個(gè)自定義函數(shù)內(nèi)對兩個(gè)全局變量進(jìn)行自增運(yùn)算,其中一個(gè)全局變量在

13、函數(shù)后面定義,使用前先聲明該變量。 8.3.2 全局變量 2全局變量的作用域全局變量可以被任何函數(shù)使用,在每個(gè)函數(shù)中修改這類變量都會(huì)引起該變量值的變化,并對其他函數(shù)使用該變量產(chǎn)生影響。范例8.5 OutVariableControl.c 交換兩個(gè)變量的值在C語言中經(jīng)常用到,但在范例8.3中并沒有在子函數(shù)中實(shí)現(xiàn)變量值的交換。設(shè)計(jì)一個(gè)子函數(shù)exchange(),在這個(gè)函數(shù)內(nèi)交換兩個(gè)全局變量的值。3全局變量的命名當(dāng)全局變量與局部變量的名字相同時(shí),在局部變量作用域內(nèi),全局變量將不起作用。8.4 函數(shù)的嵌套調(diào)用和遞歸 C語言允許在一個(gè)函數(shù)中調(diào)用另一個(gè)函數(shù)。這種方式稱為函數(shù)的嵌套調(diào)用。如圖所示為函數(shù)嵌套調(diào)

14、用示意圖。范例8.6 ReCallbackFunc.c 判斷三個(gè)數(shù)中的最大值有很多方法,使用嵌套函數(shù)調(diào)用也是其中一種方法,設(shè)計(jì)兩個(gè)函數(shù),實(shí)現(xiàn)求三個(gè)數(shù)的最大值,并使用嵌套函數(shù)調(diào)用實(shí)現(xiàn)。 實(shí)訓(xùn)8.3漢諾塔程序設(shè)計(jì) 漢諾塔游戲又稱為圓盤游戲,玩法是有三個(gè)柱子A、B和C,其中柱子A上按由大到小穿插著n個(gè)中間含孔的圓盤,要求借助柱子B,將這n個(gè)圓盤移動(dòng)到柱子C上,每次只能移動(dòng)一個(gè)盤子,并且任何時(shí)候都不能出現(xiàn)大盤在上,小盤在下的情況,編寫程序,實(shí)現(xiàn)移動(dòng)n個(gè)盤子的漢諾塔移動(dòng)方法程序設(shè)計(jì)。1需求分析:需求1:移動(dòng)一個(gè)盤子時(shí)的移動(dòng)方法需求2:移動(dòng)n個(gè)盤子時(shí)的移動(dòng)方法2技術(shù)應(yīng)用對于需求1,當(dāng)僅需要移動(dòng)一個(gè)盤子時(shí),就是要將該盤子從A移動(dòng)到C,方法為AC。對于需求2,當(dāng)有n個(gè)盤子需要移動(dòng)時(shí),先考慮如何將上面n-1個(gè)盤子移動(dòng)到B,如果有方法能夠?qū)⑸厦鎛-1個(gè)盤子借住C移動(dòng)到B,則最下面一個(gè)盤子可以按照需求1的方法將盤子移動(dòng)到C,然后再借助同樣的方法將B上的n-1個(gè)盤子借住A移動(dòng)到C。源代碼:Hanoi.c 8.5 數(shù)組作函數(shù)參數(shù) 范例8.7 CheckArrayCompnent.c 有一個(gè)字符數(shù)組,其中各元素可能

溫馨提示

  • 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

提交評論