c語言程序設計與項目實踐第8章_第1頁
c語言程序設計與項目實踐第8章_第2頁
c語言程序設計與項目實踐第8章_第3頁
c語言程序設計與項目實踐第8章_第4頁
c語言程序設計與項目實踐第8章_第5頁
已閱讀5頁,還剩20頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

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

2、數。2按照是否能夠返回值劃分按照能不能返回數值分為返回值類型函數和無返回類型函數。 8.1.1 函數的分類 返回值類型函數:返回值類型函數在定義時應指定返回值的類型。例如:int max()程序段無返回類型函數:無返回類型函數在定義時應在函數名前面標注void說明符,以說明該函數為無返回類型。 3按照函數是否帶參數劃分 按照函數是否帶有參數分為有參函數和無參函數。有參函數:函數定義和調用時時含有輸入參數的函數。無參函數:函數定義和調用時都不帶參數的函數類型。 8.1.2 函數的定義 函數定義的一般表達形式為:類型說明符 函數名(形參表列)程序體 函數構成的程序結構如下:函數名1( 參數表列)程

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

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

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

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

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

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

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

10、如下圖: 范例8.3 ExchangeTwoValueInSubFunc.c 設計一個函數,命名為ExchangeValue,函數的作用是交換由主調函數輸入的兩個變量的值,并在主調函數中輸出函數調用前后兩個變量的值,函數定義類型為void類型。 8.2.3 函數的參數 范例8.3 ExchangeValue()函數調用時m和n以及a和b的內存結構變化圖:8.3 局部變量與全局變量 局部變量的作用域僅限在函數內部,即變量的定義和使用都只能在函數內進行。如下面程序中所示: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的作用域,僅用于函數test1()內部。形參m和n,變量x和y的作用域,僅用于函數test2()內部。變量w、vf1、f2和res的作用域,僅用于函數main()內部。變量next的作用域8.3 局部變量與全局變量 范例8.4 PartVariable.c 定義一個函數int

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

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

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

溫馨提示

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

評論

0/150

提交評論