第07章-函數(shù)與變量作用域_第1頁
第07章-函數(shù)與變量作用域_第2頁
第07章-函數(shù)與變量作用域_第3頁
第07章-函數(shù)與變量作用域_第4頁
第07章-函數(shù)與變量作用域_第5頁
已閱讀5頁,還剩58頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、2020/6/24,1,第7章 函數(shù)與變量作用域,C語言是通過函數(shù)來實現(xiàn)模塊化程序設(shè)計的。 教學(xué)目的: 掌握函數(shù)的定義與調(diào)用,變量的作用域; 了解函數(shù)的嵌套與遞歸調(diào)用,內(nèi)部、外部函數(shù)特點(diǎn),以及變量的存儲特性。,2020/6/24,2,教學(xué)內(nèi)容: 7.1* 函數(shù)的定義與調(diào)用 7.2 函數(shù)的嵌套調(diào)用與遞歸調(diào)用 7.3 內(nèi)部函數(shù)與外部函數(shù) 7.4* 內(nèi)部變量與外部變量 7.5 變量的存儲特性 本章要點(diǎn) 本章作業(yè)與上機(jī)實踐,2020/6/24,3,7.1* 函數(shù)定義與函數(shù)調(diào)用,7.1.1 函數(shù)定義 任何函數(shù)都是由函數(shù)說明和函數(shù)體兩部分組成。 1分類 根據(jù)函數(shù)有無參數(shù),將函數(shù)分為無參函數(shù)和有參函數(shù)。,2

2、020/6/24,4,(1)無參函數(shù) 函數(shù)類型 函數(shù)名( void ) 說明語句部分; 可執(zhí)行語句部分; (2)有參函數(shù) 函數(shù)類型 函數(shù)名(數(shù)據(jù)類型 參數(shù),數(shù)據(jù)類型 參數(shù)2 ) 說明語句部分; 可執(zhí)行語句部分; ,形參表。調(diào)用有參函數(shù)時,由調(diào)用函數(shù)為形參提供實際值,簡稱為實參。,在新標(biāo)準(zhǔn)中,函數(shù)不可缺省參數(shù)表;用“void”表示不需要參數(shù)。,2020/6/24,5,2函數(shù)的返回值與函數(shù)類型 語言的函數(shù),還可分為有返回值函數(shù)和無返回值函數(shù)兩種。 (1) 有返回值函數(shù)與return語句 一般格式: return( 返回值表達(dá)式 ); 功能:返回調(diào)用函數(shù),并將“返回值表達(dá)式”的值帶給調(diào)用函數(shù)。 注意

3、:函數(shù)中無return語句,返回1個不確定的值??捎谩皏oid”定義成“無(空)類型” ,明確表示不返回值 。,括號可以缺省,2020/6/24,6,(2) 函數(shù)類型 函數(shù)類型應(yīng)與return語句中“返回值表達(dá)式”的類型一致。 如果不一致,則以函數(shù)類型為準(zhǔn)。 如果缺省函數(shù)類型,則系統(tǒng)一律按int型處理。 良好的程序設(shè)計習(xí)慣: 為了使程序具有良好的可讀性并減少出錯,將無返回值函數(shù)定義為空類型void; 同時,也不使用系統(tǒng)對函數(shù)類型的缺省處理。,2020/6/24,7,案例7.1 定義一個求兩個整數(shù)中極大值的max()函數(shù)。 /*功能:求2個整數(shù)中的較大數(shù) */ /*形參:2個,整型 */ /*返

4、回值: 2個整數(shù)中的較大數(shù) */ int max( int n1, int n2) /*函數(shù)定義 */ return ( n1 n2 ? n1 : n2); /*/ void main( void ) int max(int n1, int n2); /*對被調(diào)用函數(shù)進(jìn)行說明*/ int num1,num2; printf(input two numbers: ); scanf(%d%d, ,2020/6/24,12,顯然,對于被多個函數(shù)調(diào)用的自定義函數(shù)而言,采用預(yù)先統(tǒng)一說明方式進(jìn)行說明,可以有效地減少函數(shù)說明次數(shù)。 注意: 如果被調(diào)用函數(shù)的定義體,出現(xiàn)在調(diào)用函數(shù)之前,可以缺省說明。,2020

5、/6/24,13,2、函數(shù)調(diào)用 函數(shù)名(實參表) 例如,在案例7.1的主函數(shù)中: printf(, max (num1, num2) ); 注意:調(diào)用有參函數(shù),必須提供實參(常量/變量/表達(dá)式/函數(shù)) 。調(diào)用時,實參必須具有確定的值,且與形參個數(shù)相等、類型匹配。,2020/6/24,14,(1) 調(diào)用方式 語句方式無返回值函數(shù)的調(diào)用,可作為一條獨(dú)立的語句。 例如,printf()、scanf ()等庫函數(shù)的調(diào)用,均作為一條獨(dú)立的語句。 表達(dá)式方式有返回值函數(shù)作為表達(dá)式的一項,以函數(shù)返回值參與表達(dá)式的運(yùn)算。 例如,“max = max(x, y)”是一個賦值表達(dá)式,把max()函數(shù)的返回值賦予變

6、量max。,2020/6/24,15,(2) 斷點(diǎn)與函數(shù)調(diào)用的返回 斷點(diǎn)被調(diào)用函數(shù)執(zhí)行完畢,返回調(diào)用函數(shù)后繼續(xù)執(zhí)行的位置。 調(diào)用函數(shù)中的斷點(diǎn)位置分兩種情況: 語句調(diào)用方式:斷點(diǎn)為函數(shù)調(diào)用語句的下一條語句。 例如,案例7.1中的語句調(diào)用“printf();”,其斷點(diǎn)為該語句的下一條語句“getch();” 。,2020/6/24,16, 表達(dá)式調(diào)用方式:斷點(diǎn)為函數(shù)調(diào)用所在的表達(dá)式。 例如,在案例7.1中,“printf(, max(num1, num2) );”語句中的表達(dá)式調(diào)用“max(num1, num2)”: 其斷點(diǎn)為該表達(dá)式調(diào)用所在的表達(dá)式“max(num1, num2)”(在本例中,“

7、max(num1, num2)”函數(shù)調(diào)用既是表達(dá)式調(diào)用,本身又構(gòu)成一個簡單表達(dá)式)。,2020/6/24,17,7.1.3 參數(shù)傳遞 發(fā)生函數(shù)調(diào)用時,根據(jù)參數(shù)值的性質(zhì)不同,將參數(shù)傳遞分為兩種: (1) 值傳遞參數(shù)值是一個一般數(shù)據(jù)(整形、實型、字符型數(shù)據(jù)等)。 系統(tǒng)把實參值復(fù)制1份給形參;被調(diào)用函數(shù)結(jié)束時,形參值不能傳回給實參。 (2) 地址(引用)傳遞參數(shù)值是一個地址。,2020/6/24,18,執(zhí)行案例7.1時的參數(shù)傳遞: int max( int n1, int n2) return ( n1 n2 ? n1 : n2); main( ) int max(int n1, int n2);

8、int num1,num2; printf(input two numbers: ); scanf(%d%d, /*調(diào)用函數(shù)sum( )*/ void sum(int num) sum += factor (loop); /*求累計和*/ long factor (int num) /*求num的階乘*/ ,2020/6/24,24,在案例7.3中,主函數(shù)main()調(diào)用求和函數(shù)sum( ),sum( ) 又循環(huán)調(diào)用求階乘的函數(shù)factor( )。 一般地說,函數(shù)的嵌套調(diào)用是指,在執(zhí)行被調(diào)用函數(shù)時,該函數(shù)又調(diào)用其它函數(shù)的情形。 注意:被調(diào)用函數(shù)執(zhí)行完畢后,將返回到調(diào)用函數(shù)的斷點(diǎn)繼續(xù)執(zhí)行。 簡言

9、之,誰調(diào)用,返回到誰的斷點(diǎn)繼續(xù)執(zhí)行。,2020/6/24,25,7.2.2 函數(shù)的遞歸調(diào)用 案例7.4 用遞歸法計算n!(1! = 1,n! = (n-1)! * n (n2))。 算法設(shè)計要點(diǎn): (1) 根據(jù)計算n!的遞歸定義可知,為了計算n!,必須首先計算(n-1)?。灰源祟愅?,直至1?。?! = 1)。 (2) 依據(jù)1!求2!=1!*2,再依據(jù)2!求3!=2!*3;同理,依據(jù)(n-1)!求n!= (n-1)!*n。,2020/6/24,26,long factor( int num ) long fact; if( num 1) fact = factor( num 1 ) * num;

10、 else fact = 1; return( fact ); 以num = 5為例,其執(zhí)行過程詳見教材7.2.2。,遞歸調(diào)用自己,2020/6/24,27,語言允許函數(shù)直接(或間接)地調(diào)用它自己,稱為遞歸調(diào)用;這種函數(shù)稱為遞歸函數(shù)。 例如,案例7.4中的函數(shù)factor()就是一個遞歸函數(shù)。 防止遞歸調(diào)用無終止地進(jìn)行的常用辦法:添加1個繼續(xù)(或終止)遞歸調(diào)用的條件判斷。 例如,案例7.4中函數(shù)factor( )中的“if( num 1)” 。 返回,2020/6/24,28,7.3 內(nèi)部函數(shù)和外部函數(shù),C語言程序中的函數(shù),是通過被調(diào)用而執(zhí)行的,所以一個函數(shù)需要被其它函數(shù)調(diào)用。 但是,當(dāng)一個程

11、序由多個源文件組成時,在一個源文件中定義的函數(shù),能否被其它源文件中的函數(shù)調(diào)用呢? 語言據(jù)此將函數(shù)分為內(nèi)部函數(shù)和外部函數(shù)。,2020/6/24,29,7.3.1 內(nèi)部函數(shù)(又稱靜態(tài)函數(shù)) 如果在一個源文件中定義的函數(shù),只能被本源文件中的其它函數(shù)調(diào)用,這種函數(shù)稱為內(nèi)部函數(shù)。 1定義 static 函數(shù)類型 函數(shù)名(形參表) 2 特點(diǎn):只能被本文件中的函數(shù)所調(diào)用。 3 好處:不用擔(dān)心與其它源文件中的函數(shù)同名,因為即使同名也沒關(guān)系。,2020/6/24,30,7.3.2 外部函數(shù) 如果在某源文件中定義的函數(shù),可被同一程序中所有源文件中的函數(shù)調(diào)用,這種函數(shù)稱為外部函數(shù)。 1定義:extern 函數(shù)類型

12、函數(shù)名( 形參表 ) 2特點(diǎn):允許被所有源文件中的函數(shù)所調(diào)用。 3調(diào)用其它源文件中的外部函數(shù)時,需要對其進(jìn)行說明: extern 函數(shù)類型 函數(shù)名(形參表),函數(shù)名2(形參表2 );,2020/6/24,31,案例7.5 將加、減、乘、除和求余數(shù)運(yùn)算練習(xí)程序(第3版)的源文件組織形式改為:實現(xiàn)加、減、乘、除和求余數(shù)運(yùn)算的程序段,均作為1個獨(dú)立的函數(shù)、存儲在1個獨(dú)立的源文件中。 程序框架如下(完整程序詳見案例源代碼):,2020/6/24,32, /*外部函數(shù)說明*/ extern void addition(int n1, int n2); extern void subtraction(in

13、t n1, int n2); extern void multiplication (int n1, int n2); extern void division(int n1, int n2); extern void remainder(int n1, int n2); void main() ,2020/6/24,33,7.3.3 多個源文件的編譯和連接 在軟件工程項目中,采用結(jié)構(gòu)化方法進(jìn)行程序設(shè)計與編程,通常會產(chǎn)生多個源文件(例如源程序文件、數(shù)據(jù)結(jié)構(gòu)定義文件等)。 那么,如何將這些源文件編譯、連接成一個統(tǒng)一的可執(zhí)行文件呢? 一般有兩種方法:,2020/6/24,34,(1)分別編譯、一并

14、連接 C編譯程序是以源文件為編譯單位。 當(dāng)一個程序中的函數(shù)和數(shù)據(jù)結(jié)構(gòu)分放在多個源文件中時:先將各文件分別編譯,再通過link命令產(chǎn)生一個可執(zhí)行文件(.exe) 。 (2)集中編譯、連接 利用編譯預(yù)處理命令#include,將其它源文件包含到主函數(shù)main( )所在的源文件的開頭;然后直接編譯該文件即可。,2020/6/24,35,例如,在案例7.5中的主函數(shù)main()所在的源文件case75_1.c的開頭添加如下幾行: /*將其它各源文件包含進(jìn)來*/ #include case75_2.c #include case75_3.c #include case75_4.c #include ca

15、se75_5.c #include case75_6.c void main( ) 返回,2020/6/24,36,7.4* 內(nèi)部變量與外部變量,語言中的變量,定義位置不同,其作用域也不同,據(jù)此將變量分為內(nèi)部變量和外部變量。 7.4.1 內(nèi)部變量 1、內(nèi)部變量在函數(shù)內(nèi)(函數(shù)說明+函數(shù)體)定義的變量。 2、作用域只在該函數(shù)范圍內(nèi)有效。 所以內(nèi)部變量也稱“局部變量”。,2020/6/24,37,例如,在案例7.4中,主函數(shù)main( ) 中定義的變量num就是內(nèi)部變量,它僅在主函數(shù)main()中才能使用; 求階乘的factor( )函數(shù),函數(shù)說明中的形參變量num,以及函數(shù)體中定義的變量fact,

16、均屬內(nèi)部變量,都只能在factor( )函數(shù)中使用。 說明:在不同的函數(shù)中,允許使用同名內(nèi)部變量。它們代表不同的對象,互不干擾。 例如,在案例7.4中,主函數(shù)main()中的內(nèi)部變量num,與函數(shù)factor()中的內(nèi)部變量num同名。,2020/6/24,38,案例 內(nèi)部變量的應(yīng)用。 void main( ) void sum(int num); int num = 100; printf(“num_main()=%dn”, num); /*調(diào)用前實參的值*/ sum( num ); /*調(diào)用函數(shù)*/ printf(num_main()=%dn, num); /*調(diào)用后實參的值*/ getc

17、h(); void sum(int num) int i; printf(num_sum()=%dn, num); /*改變前的形參值*/ for(i=num-1; i=1; i-) num += i; /*改變形參的值*/ printf(num_sum()=%dn, num); /*改變后的形參值*/ ,2020/6/24,39,7.4.2 外部變量 1、外部變量在函數(shù)外部定義的變量。 2、作用域:從外部變量的定義位置開始,到本文件結(jié)束為止。 外部變量不從屬于任何一個函數(shù),可被作用域內(nèi)的所有函數(shù)使用,所以外部變量又稱全局變量。,2020/6/24,40,案例7.6 設(shè)計一個函數(shù)cuboid(

18、int length, int width, int height)(3個參數(shù)依次為長方體的長、寬、高),用于求長方體的體積及正、側(cè)、頂三個面的面積。 算法設(shè)計要點(diǎn): 函數(shù)cuboid (int length, int width, int height)本身只能返回1個值(本案例選定體積),正、側(cè)、頂三個面的面積就只能通過外部變量來進(jìn)行數(shù)據(jù)共享。 參考程序框架如下:,2020/6/24,41, long area1, area2, area3; /*定義3個外部變量,用于數(shù)據(jù)共享*/ long cuboid (int length, int width, int height); /*函數(shù)說

19、明*/ void main( ) volume = cuboid (length, width, height); printf(n volume = %ld, area1 = %ld, area2 = %ld, area3 = %ld , volume, area1, area2, area3); ,2020/6/24,42,long cuboid (int length, int width, int height) long volume; volume = length * width * height; /*計算體積*/ area1= length * width; /*計算3個面的

20、面積*/ area2= width * height; area3= length * height; return( volume); /*返回體積值*/ ,2020/6/24,43,3、說明 (1)外部變量的作用域:從定義點(diǎn)到本文件結(jié)束。 為方便使用,建議:將外部變量的定義放在文件開頭,如 案例7.6所示。 (2)在同一源文件中,允許外部變量和內(nèi)部變量同名。 在內(nèi)部變量的作用域內(nèi),外部變量不起作用。,2020/6/24,44,(3)外部變量可實現(xiàn)函數(shù)之間的數(shù)據(jù)共享,但又使這些函數(shù)依賴這些外部變量,因而使得這些函數(shù)的獨(dú)立性降低。 注:從模塊化程序設(shè)計觀點(diǎn)來看,這是不利的。因此不是非用不可時,

21、不要使用外部變量。,2020/6/24,45,案例 內(nèi)部、外部變量的同名應(yīng)用。 int len=3, width=4, high=5; int vs(int len, int width) int vol; vol = len * width * high;/*引用外部變量high*/ return v; main() int len=5; printf(len=%d, width=%d, high=%d , vol=%d, len, width, high, vs(len, width); ,len = ? width = ?,len = ?,2020/6/24,46,7.4.3 小結(jié) 1內(nèi)部變量在函數(shù)內(nèi)(函數(shù)說明+函數(shù)體)定義的變量,其作用域:只在該函數(shù)范圍內(nèi)有效。 不同函數(shù)中的同名內(nèi)部變量,互不干擾。 2外部變量在函數(shù)外部定義的變量,其作用域:從外部變量的定義位置開始,到本文件結(jié)束為止。 允許內(nèi)部、外部變量同名。在內(nèi)部變量的作用域內(nèi),外部變量不起作用。 返回,2020/6/24,47,7.5

溫馨提示

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

最新文檔

評論

0/150

提交評論