第8章函數(shù)ppt課件_第1頁
第8章函數(shù)ppt課件_第2頁
第8章函數(shù)ppt課件_第3頁
第8章函數(shù)ppt課件_第4頁
第8章函數(shù)ppt課件_第5頁
已閱讀5頁,還剩53頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第第8章函數(shù)章函數(shù)主要內(nèi)容:主要內(nèi)容:1,函數(shù)的定義的普通方式,函數(shù)的定義的普通方式2,函數(shù)參數(shù)和函數(shù)值,函數(shù)參數(shù)和函數(shù)值3,函數(shù)的普通調(diào)用、嵌套調(diào)用和遞歸調(diào)用,函數(shù)的普通調(diào)用、嵌套調(diào)用和遞歸調(diào)用4,數(shù)組作為函數(shù)參數(shù),數(shù)組作為函數(shù)參數(shù)5,部分變量和全局變量,部分變量和全局變量6,變量的存儲類別,變量的存儲類別7,內(nèi)部函數(shù)和外部函數(shù),內(nèi)部函數(shù)和外部函數(shù)1 1,掌握函數(shù)的定義方式,調(diào)用格式,前往值,掌握函數(shù)的定義方式,調(diào)用格式,前往值,值傳送與地址傳送的區(qū)別;值傳送與地址傳送的區(qū)別; 2 2,掌握變量的作用域,存在范圍,存儲類,掌握變量的作用域,存在范圍,存儲類別別 要求一個較大型的程序普通均分成

2、多個模塊,每個模塊完成一個特定的功能。在C言語中用函數(shù)來實現(xiàn)模塊。一個C程序可由一個main函數(shù)和假設干個其他函數(shù)構(gòu)成。由主函數(shù)調(diào)用其他函數(shù),其他函數(shù)之間也可相互調(diào)用,甚至可以調(diào)用函數(shù)本人遞歸調(diào)用,但不能調(diào)用主函數(shù)。程序開發(fā)人員常用的方法是將一些經(jīng)常運用的功能編寫成函數(shù),放在公共函數(shù)庫中。 C C言語程序的構(gòu)造如下圖。在每個程序中,主函數(shù)言語程序的構(gòu)造如下圖。在每個程序中,主函數(shù)mainmain是是必需的,它是一切程序的執(zhí)行起點,必需的,它是一切程序的執(zhí)行起點,mainmain函數(shù)只調(diào)用其它函數(shù)只調(diào)用其它函數(shù),不能為其它函數(shù)調(diào)用。其它函數(shù)沒有主從關系,可函數(shù),不能為其它函數(shù)調(diào)用。其它函數(shù)沒有主

3、從關系,可以相互調(diào)用。一切函數(shù)都可以調(diào)用庫函數(shù)。程序的總體功以相互調(diào)用。一切函數(shù)都可以調(diào)用庫函數(shù)。程序的總體功能經(jīng)過函數(shù)的調(diào)用來實現(xiàn)。能經(jīng)過函數(shù)的調(diào)用來實現(xiàn)。f11( )f11( )f31( )f1( )f11( );f2( )f11( );f22( );main( )f1( );f2( );參見書中參見書中P155頁例頁例8.1 了解了解C程序經(jīng)過函數(shù)調(diào)用實現(xiàn)所需功能程序經(jīng)過函數(shù)調(diào)用實現(xiàn)所需功能例例8.1函數(shù)調(diào)用的簡單例子函數(shù)調(diào)用的簡單例子#includevoid main() void printstar(); void print_message(); printstar(); prin

4、t_message(); printstar();void printstar()printf(*n);void print_message()printf( How do you do!n); 闡明:闡明:1,一個,一個C程序由一個或多個程序模塊組成。程序由一個或多個程序模塊組成。每一個程序模塊作為一個源程序文件。每一個程序模塊作為一個源程序文件。2,一個源程序文件由一個或多個函數(shù)組成,一個源程序文件由一個或多個函數(shù)組成,編譯是以源程序為單位;編譯是以源程序為單位;3,程序的執(zhí)行是由主函數(shù)開場到主函數(shù)終了,程序的執(zhí)行是由主函數(shù)開場到主函數(shù)終了,其它函數(shù)是經(jīng)過函數(shù)調(diào)用來實現(xiàn)的。其它函數(shù)是經(jīng)過函

5、數(shù)調(diào)用來實現(xiàn)的。4,一切函數(shù)都是平行的。即函數(shù)定義不能嵌,一切函數(shù)都是平行的。即函數(shù)定義不能嵌套,即函數(shù)內(nèi)不能定義函數(shù),但函數(shù)之間可套,即函數(shù)內(nèi)不能定義函數(shù),但函數(shù)之間可以相互調(diào)用,甚至可以調(diào)用該函數(shù)本身遞以相互調(diào)用,甚至可以調(diào)用該函數(shù)本身遞歸調(diào)用但不能調(diào)用主函數(shù)歸調(diào)用但不能調(diào)用主函數(shù)5,從用戶的角度函數(shù)分為:規(guī)范函數(shù)即庫,從用戶的角度函數(shù)分為:規(guī)范函數(shù)即庫函數(shù)和用戶定義函數(shù)。函數(shù)和用戶定義函數(shù)。6,從函數(shù)的方式看,函數(shù)分為無參函數(shù)和有,從函數(shù)的方式看,函數(shù)分為無參函數(shù)和有參函數(shù)參函數(shù)8.2.1無參函數(shù)定義的普通方式無參函數(shù)定義的普通方式 函數(shù)類型函數(shù)類型 函數(shù)名函數(shù)名( void ) 變量聲

6、明部分;變量聲明部分; 可執(zhí)行語句部分;可執(zhí)行語句部分; 當函數(shù)類型為當函數(shù)類型為int型時可以省略。型時可以省略。8.2.2. 有參函數(shù)定義的普通方式有參函數(shù)定義的普通方式函數(shù)類型函數(shù)類型 函數(shù)名函數(shù)名( 數(shù)據(jù)類型數(shù)據(jù)類型 參數(shù)參數(shù),數(shù)據(jù)類型,數(shù)據(jù)類型 參數(shù)參數(shù)2 ) 闡明語句部分;闡明語句部分; 可執(zhí)行語句部分;可執(zhí)行語句部分; 有參函數(shù)比無參函數(shù)多了一個參數(shù)表。調(diào)用有有參函數(shù)比無參函數(shù)多了一個參數(shù)表。調(diào)用有參函數(shù)時,調(diào)用函數(shù)將賦予這些參數(shù)實踐的值。參函數(shù)時,調(diào)用函數(shù)將賦予這些參數(shù)實踐的值。為了與調(diào)用函數(shù)提供的實踐參數(shù)區(qū)別,將函數(shù)為了與調(diào)用函數(shù)提供的實踐參數(shù)區(qū)別,將函數(shù)定義中的參數(shù)表稱為方

7、式參數(shù)表,簡稱形參表。定義中的參數(shù)表稱為方式參數(shù)表,簡稱形參表。例定義一個函數(shù)用以前往兩個數(shù)中的大者例定義一個函數(shù)用以前往兩個數(shù)中的大者int max(int x, int y)int z;/*聲明部分*/z=xy?x:y;return(z);函數(shù)類型函數(shù)名參數(shù)類型方式參數(shù)執(zhí)行部分函數(shù)的前往值8.2.3空函數(shù)空函數(shù)它的方式為:它的方式為:類型闡明符函數(shù)名類型闡明符函數(shù)名() 對形參聲明的傳統(tǒng)方式對形參聲明的傳統(tǒng)方式int max(x, y)int max(x, y)int x, y;int x, y;return xy?x:y;return xy?x:y;函數(shù)定義舉例:函數(shù)定義舉例:輸入三個整

8、數(shù),求三個整數(shù)中的最大值輸入三個整數(shù),求三個整數(shù)中的最大值不運用函數(shù)不運用函數(shù)(除除main外外)#includevoid main() int n1,n2,n3, max; scanf(%d%d%d,&n1,&n2,&n3); if(n1n2) max=n1; else max=n2; if(n3max) max=n3; printf(max=%dn,max); 運用函數(shù)運用函數(shù)#includevoid main() int n1,n2,n3,nmax; int max(int,int,int); scanf(%d%d%d,&n1,&n2,&n

9、3); nmax=max(n1,n2,n3); printf(max=%dn,nmax); int max(int x,int y,int z) int m; if(xy) m=x; else m=y; if(zm)m=z; return m; 和調(diào)用庫函數(shù)和調(diào)用庫函數(shù)一樣調(diào)用一樣調(diào)用函數(shù)定義函數(shù)定義8.3函數(shù)的參數(shù)和函數(shù)值函數(shù)的參數(shù)和函數(shù)值8.3.1表達式參數(shù)和實踐參數(shù)表達式參數(shù)和實踐參數(shù)函數(shù)的參數(shù)分為形參和實參兩種,作用是實現(xiàn)函數(shù)的參數(shù)分為形參和實參兩種,作用是實現(xiàn)數(shù)據(jù)傳送。數(shù)據(jù)傳送。形參出如今函數(shù)定義中,只能在該函數(shù)體內(nèi)運形參出如今函數(shù)定義中,只能在該函數(shù)體內(nèi)運用。發(fā)生函數(shù)調(diào)用時,調(diào)用函

10、數(shù)把實參的值復用。發(fā)生函數(shù)調(diào)用時,調(diào)用函數(shù)把實參的值復制制1份,傳送給被調(diào)用函數(shù)的形參,從而實現(xiàn)份,傳送給被調(diào)用函數(shù)的形參,從而實現(xiàn)調(diào)用函數(shù)向被調(diào)用函數(shù)的數(shù)據(jù)傳送。調(diào)用函數(shù)向被調(diào)用函數(shù)的數(shù)據(jù)傳送。 例例8.2調(diào)用函數(shù)時的數(shù)據(jù)傳送調(diào)用函數(shù)時的數(shù)據(jù)傳送#includevoid main()int a,b,c,max(int,int);scanf(%d%d,&a,&b);c=max(a,b);printf(Max is %d,c);int max(int x, int y)int z;z=xy?x:y;return(z);闡明:闡明:1形參變量只需在被調(diào)用時,才分配內(nèi)存單元;調(diào)用終了

11、時,即刻釋形參變量只需在被調(diào)用時,才分配內(nèi)存單元;調(diào)用終了時,即刻釋放放所分配的內(nèi)存單元。因此,形參只需在該函數(shù)內(nèi)有效。調(diào)用終了,前往調(diào)所分配的內(nèi)存單元。因此,形參只需在該函數(shù)內(nèi)有效。調(diào)用終了,前往調(diào)用函數(shù)后,那么不能再運用該形參變量。用函數(shù)后,那么不能再運用該形參變量。2實參可以是常量、變量、表達式、函數(shù)等。無論實參是何種類型的實參可以是常量、變量、表達式、函數(shù)等。無論實參是何種類型的量,量,在進展函數(shù)調(diào)用時,它們都必需具有確定的值,以便把這些值傳送給形參在進展函數(shù)調(diào)用時,它們都必需具有確定的值,以便把這些值傳送給形參因此,應預先用賦值、輸入等方法,使實參獲得確定的值。因此,應預先用賦值、輸

12、入等方法,使實參獲得確定的值。3在被定義的函數(shù)中,每個形參都必需指定其類型。在被定義的函數(shù)中,每個形參都必需指定其類型。4實參和形參必需賦值兼容。實參和形參必需賦值兼容。5實參對形參的數(shù)據(jù)傳送是單向的,即只能把實參的值傳送給形參,實參對形參的數(shù)據(jù)傳送是單向的,即只能把實參的值傳送給形參,而而不能把形參的值反向地傳送給實參。不能把形參的值反向地傳送給實參。8.3.2函數(shù)的前往值函數(shù)的前往值1,函數(shù)的前往是經(jīng)過,函數(shù)的前往是經(jīng)過return語句,格式為:語句,格式為:return(表達式;或表達式;或 return 表達式;表達式;表達式的值即為函數(shù)前往的值。當程序執(zhí)行表達式的值即為函數(shù)前往的值。

13、當程序執(zhí)行return時會將流程轉(zhuǎn)移到被調(diào)函數(shù)。時會將流程轉(zhuǎn)移到被調(diào)函數(shù)。2,前往值的類型:為函數(shù)的類型函數(shù)名前,前往值的類型:為函數(shù)的類型函數(shù)名前的類型,當表達式的類型與函數(shù)類型不一的類型,當表達式的類型與函數(shù)類型不一樣時系統(tǒng)會自動轉(zhuǎn)換成函數(shù)類型。樣時系統(tǒng)會自動轉(zhuǎn)換成函數(shù)類型。3,沒有,沒有return語句時系統(tǒng)將前往一個不確定語句時系統(tǒng)將前往一個不確定的值。的值。4,假設不需求前往數(shù)據(jù),那么可將函數(shù)類型,假設不需求前往數(shù)據(jù),那么可將函數(shù)類型聲明為空類型聲明為空類型(void)例例8.3前往值類型與函數(shù)類型不同前往值類型與函數(shù)類型不同#includevoid main()int a,b,c,

14、max(float,float);scanf(%d%d,&a,&b);c=max(a,b);printf(Max is %d,c);int max(float x, float y)return xy?x:y;例例8.4:實參求值順序:實參求值順序#includevoid main()void f(int,int);int i=2;f(i,+i);f(+i,i);void f(int a,int b)printf(ta=%dtb=%dn,a,b);8.4函數(shù)調(diào)用函數(shù)調(diào)用8.4.1函數(shù)調(diào)用的普通方式:函數(shù)調(diào)用的普通方式:函數(shù)名實參表列函數(shù)名實參表列闡明:闡明:1,其中實參表列中的

15、實參個數(shù)應和形,其中實參表列中的實參個數(shù)應和形參個數(shù)一樣,且對應位置上的實參與形參的參個數(shù)一樣,且對應位置上的實參與形參的數(shù)據(jù)類型必需一樣。數(shù)據(jù)類型必需一樣。2,實參之間用逗號分隔。,實參之間用逗號分隔。3,對實參的求值是從右到左的順序執(zhí)行的。,對實參的求值是從右到左的順序執(zhí)行的。8.4.2函數(shù)調(diào)用的方式函數(shù)調(diào)用的方式函數(shù)調(diào)用可以是單獨調(diào)用,或在表達式中,函數(shù)調(diào)用可以是單獨調(diào)用,或在表達式中,或作為函數(shù)參數(shù)。或作為函數(shù)參數(shù)。如如printstar();c=2*max(a,b);m=max(a,max(b,c);8.4.3對被調(diào)用的聲明和函數(shù)原型對被調(diào)用的聲明和函數(shù)原型1對自定義函數(shù)。當函數(shù)定義

16、在函數(shù)調(diào)用對自定義函數(shù)。當函數(shù)定義在函數(shù)調(diào)用后面且函數(shù)類型不是后面且函數(shù)類型不是int型時必需在調(diào)用前對調(diào)型時必需在調(diào)用前對調(diào)用函數(shù)進展闡明,闡明格式為:用函數(shù)進展闡明,闡明格式為:函數(shù)類型函數(shù)名形參類型函數(shù)類型函數(shù)名形參類型1,形參類型,形參類型2,.);2對庫函數(shù),那么必需將包含該庫的原型對庫函數(shù),那么必需將包含該庫的原型聲明的頭文件包含到程序中:聲明的頭文件包含到程序中:#include例例8.5對被調(diào)函數(shù)的聲明。對被調(diào)函數(shù)的聲明。#includevoid main()float add(float,float); /*對被調(diào)函數(shù)的聲明對被調(diào)函數(shù)的聲明*/float a,b;scanf(

17、%f%f,&a,&b);printf(sun is %f,add(a,b);float add(float a, float b)return a+b;課堂練習習題習題8.3:寫一個判素數(shù)的函數(shù),在主函數(shù)中輸入一個:寫一個判素數(shù)的函數(shù),在主函數(shù)中輸入一個整數(shù),輸出能否素數(shù)的信息整數(shù),輸出能否素數(shù)的信息主函數(shù):主函數(shù):函數(shù)聲明與變量聲明函數(shù)聲明與變量聲明輸入一個整數(shù)輸入一個整數(shù)函數(shù)調(diào)用并根據(jù)前往值輸出能否素數(shù)的信息函數(shù)調(diào)用并根據(jù)前往值輸出能否素數(shù)的信息判別素數(shù)函數(shù):判別素數(shù)函數(shù):for i=2 to n/2 假設假設n能被某一整數(shù)整除那么前往能被某一整數(shù)整除那么前往0前往前往1#

18、includevoid main() int n,prime(int); printf(輸入一個正整數(shù)輸入一個正整數(shù):n); scanf(%d,&n); if(prime(n) printf(%d是一個素數(shù)是一個素數(shù)n,n); else printf(%d不是一個素數(shù)不是一個素數(shù)n,n);int prime(int n) int i;for(i=2;i=n/2;i+) if(n%i=0) return 0;return 1;8.5函數(shù)的嵌套調(diào)用被調(diào)函數(shù)也可調(diào)用其它函數(shù),構(gòu)成調(diào)用的嵌被調(diào)函數(shù)也可調(diào)用其它函數(shù),構(gòu)成調(diào)用的嵌套,前往時必需一層層前往。套,前往時必需一層層前往。例:一個函數(shù)的嵌

19、套調(diào)用的例例:一個函數(shù)的嵌套調(diào)用的例#includevoid main() void f1(); printf(n調(diào)用函數(shù)調(diào)用函數(shù)f1之前之前:);f1();printf(n調(diào)用函數(shù)調(diào)用函數(shù)f1之后之后:);void f1()void f2();printf(n這是函數(shù)這是函數(shù)f1:);f2();void f2()printf( n這是函數(shù)這是函數(shù)f2:n);8.6函數(shù)的遞歸調(diào)用函數(shù)的遞歸調(diào)用函數(shù)的遞歸調(diào)用是指,一個函數(shù)在它的函數(shù)體內(nèi),直函數(shù)的遞歸調(diào)用是指,一個函數(shù)在它的函數(shù)體內(nèi),直接或間接地調(diào)用它本身。接或間接地調(diào)用它本身。言語允許函數(shù)的遞歸調(diào)用。在遞歸調(diào)用中,調(diào)用函言語允許函數(shù)的遞歸調(diào)用。

20、在遞歸調(diào)用中,調(diào)用函數(shù)又是被調(diào)用函數(shù),執(zhí)行遞歸函數(shù)將反復調(diào)用其本身。數(shù)又是被調(diào)用函數(shù),執(zhí)行遞歸函數(shù)將反復調(diào)用其本身。每調(diào)用一次就進入新的一層。每調(diào)用一次就進入新的一層。為了防止遞歸調(diào)用無終止地進展,必需在函數(shù)內(nèi)有終為了防止遞歸調(diào)用無終止地進展,必需在函數(shù)內(nèi)有終止遞歸調(diào)用的手段。常用的方法是加條件判別,滿足止遞歸調(diào)用的手段。常用的方法是加條件判別,滿足某種條件后就不再作遞歸調(diào)用,然后逐層前往。某種條件后就不再作遞歸調(diào)用,然后逐層前往。例例8.8用遞歸方法求用遞歸方法求n!。#includestdio.hfloat fac(int n) float f; if(n1) f=n*fac(n-1);

21、else f=1; return(f); void main()int n;float y;printf(input a integer number:);scanf(%d,&n);y=fac(n);printf(%d!=%15.0f,n,y);課堂練習課堂練習習題習題8.13:用遞歸方法求:用遞歸方法求n階勒讓德多項式的階勒讓德多項式的值值1/)() 1()() 12(101)(21nnxPnxxPnnxnxPnnn#includevoid main() float p(int,int); int x,n; printf(輸入輸入n和和x的值:的值:n); scanf(%d%d,&a

22、mp;n,&x); printf(np%d(%d)=%6.2f,n,x,p(n,x);float p(int n,int x)if(n=0) return 1;if(n=1) return x;if(n1) return (2*n-1)*x*p(n-1,x)-(n-1)*p(n-2,x)/n;8.7 數(shù)組作為函數(shù)參數(shù)數(shù)組作為函數(shù)參數(shù)數(shù)組作為函數(shù)參數(shù)的主要功能是將整個數(shù)組的數(shù)據(jù)傳送給被數(shù)組作為函數(shù)參數(shù)的主要功能是將整個數(shù)組的數(shù)據(jù)傳送給被調(diào)函數(shù)。調(diào)函數(shù)。8.7.1. 數(shù)組元素作為函數(shù)實參數(shù)組元素作為函數(shù)實參運用方法和變量作為函數(shù)參數(shù)一樣,只須把數(shù)組元素看作變運用方法和變量作為函數(shù)參數(shù)一樣,

23、只須把數(shù)組元素看作變量。量。此時實參為數(shù)組元素,形參為與數(shù)組一樣類型的變量。此時實參為數(shù)組元素,形參為與數(shù)組一樣類型的變量。例例8.108.10有兩個數(shù)組有兩個數(shù)組a,ba,b,比較其大小。,比較其大小。算法設計:算法設計:1 1,用,用2 2個個forfor循環(huán)語句輸入數(shù)組元素循環(huán)語句輸入數(shù)組元素2 2,for(i=0;i10;i+)for(i=0;ibiaibi的個數(shù)的個數(shù)/調(diào)用函數(shù)進展比較調(diào)用函數(shù)進展比較用用m m表示表示ai=biai=bi的個數(shù)的個數(shù)用用k k表示表示aibiaibi的個數(shù)的個數(shù) 3 3,輸出結(jié)果,輸出結(jié)果4 4,定義比較函數(shù),定義比較函數(shù)#includevoid m

24、ain()int large(int,int);int a10,b10,i,n=0,m=0,k=0;printf(請輸入數(shù)組請輸入數(shù)組a的的10個數(shù),用空格分隔個數(shù),用空格分隔n);for(i=0;i10;i+) scanf(%d,&ai);printf(n請輸入數(shù)組請輸入數(shù)組b的的10個數(shù),用空格分隔個數(shù),用空格分隔n);for(i=0;i10;i+) scanf(%d,&bi);for(i=0;ik) printf(na比比b大大n);if(ny) return 1;if(xy) return -1;return 0;2. 2. 數(shù)組名作為函數(shù)參數(shù)數(shù)組名作為函數(shù)參數(shù)調(diào)用格式

25、:函數(shù)名調(diào)用格式:函數(shù)名( (數(shù)組名數(shù)組名函數(shù)定義格式:類型函數(shù)名函數(shù)定義格式:類型函數(shù)名( (數(shù)組類型數(shù)組名數(shù)組類型數(shù)組名 ) )闡明:闡明:1 1用數(shù)組名作函數(shù)參數(shù),應該在調(diào)用函數(shù)用數(shù)組名作函數(shù)參數(shù),應該在調(diào)用函數(shù)和被調(diào)用函數(shù)中分別定義數(shù)組,且數(shù)據(jù)類型必需一致,和被調(diào)用函數(shù)中分別定義數(shù)組,且數(shù)據(jù)類型必需一致,否那么結(jié)果將出錯。否那么結(jié)果將出錯。2 2C C編譯系統(tǒng)對形參數(shù)組大小不作檢查,所以形參編譯系統(tǒng)對形參數(shù)組大小不作檢查,所以形參數(shù)組可以不指定大小。數(shù)組可以不指定大小。3 3數(shù)組名作為函數(shù)參數(shù)采用的是地址傳送方法,數(shù)組名作為函數(shù)參數(shù)采用的是地址傳送方法,假設在函數(shù)中對形參數(shù)組作了改動,

26、前往后實參數(shù)組假設在函數(shù)中對形參數(shù)組作了改動,前往后實參數(shù)組也會作相應的改動。也會作相應的改動。例例8.11有一個一維數(shù)組有一個一維數(shù)組score,內(nèi)放,內(nèi)放10個學生個學生的成果,求平均成果的成果,求平均成果算法設計算法設計1 1,用,用forfor循環(huán)語句輸入數(shù)組元素循環(huán)語句輸入數(shù)組元素2 2,調(diào)用函數(shù)求平均值,調(diào)用函數(shù)求平均值3 3,輸出平均值,輸出平均值4 4,定義求平均值函數(shù),定義求平均值函數(shù)4.14.1用用forfor循環(huán)語句求總成果循環(huán)語句求總成果4.24.2前往平均值前往平均值float average(float array)int i;float aver,sum=arra

27、y0;for(i=1;i10;i+) sum+=arrayi;aver=sum/10;return aver;main()float score10,aver; int i;printf(input 10 score:n);for(i=0;i10;i+) scanf(%f,&scorei);aver=average(score);printf(naverage score is %5.2f,aver);形參數(shù)組實參例例8.13 用選擇法對數(shù)組的用選擇法對數(shù)組的10個元素排序個元素排序算法設計算法設計S1用用for循環(huán)語句輸入數(shù)組元素循環(huán)語句輸入數(shù)組元素S2調(diào)用函數(shù)排序調(diào)用函數(shù)排序S3用

28、用for循環(huán)語句輸出數(shù)組元素循環(huán)語句輸出數(shù)組元素S4定義排序函數(shù)定義排序函數(shù)選擇法排序的根本思想:選擇法排序的根本思想:第第1輪:從輪:從a2到到an中選擇最小的數(shù)與中選擇最小的數(shù)與a1交換交換第第2輪:從輪:從a3到到an中選擇最小的數(shù)與中選擇最小的數(shù)與a2交換交換第第3輪:從輪:從a4到到an中選擇最小的數(shù)與中選擇最小的數(shù)與a3交換交換第第i輪:從輪:從ai+1到到an中選擇最小的數(shù)與中選擇最小的數(shù)與ai交換交換第第n-1輪:從輪:從an到到an中選擇最小的數(shù)與中選擇最小的數(shù)與an-1交換交換for(i=1;in;i+) for(j=i+1;j=n;j+)/從剩余的數(shù)中找最小的數(shù)的下標從剩

29、余的數(shù)中找最小的數(shù)的下標 找出找出aj中最小數(shù)的下標中最小數(shù)的下標k if(aiak)交換交換ai與與ak#includevoid main() int a11,i; printf(input 10 number:n); for(i=1;i=10;i+) scanf(%d,&ai); sort(a,10); printf(nthe sorted array:n); for(i=1;i11;i+) printf(%5d,ai);void sort(int array,int n) int i, j, k,t; for(i=1;in;i+) k=i; for(j=i+1; j=n; j+)

30、 if(arrayjarrayk t=arrayi; arrayi=arrayk; arrayk=t; /endfori/end sort8.7.3多維數(shù)組名作為函數(shù)參數(shù)多維數(shù)組名作為函數(shù)參數(shù)例:有一個例:有一個33的矩陣,求一切元素中的最大值。的矩陣,求一切元素中的最大值。#includevoid main( ) int max_value(int array34); int a34=1,3,5,7,2,4,6,8,15,17,34,12; printf(max value is %dn, max_value(a);int max_value(int array34) int i,j,max

31、; max=array00; for(i=0;i3;i+) for(j=0;jmax) max=arrayij; return max;8.8 部分變量和全局變量部分變量和全局變量 言語中一切的變量都有本人的作用域。變量闡明的位置不言語中一切的變量都有本人的作用域。變量闡明的位置不同,其作用域也不同,據(jù)此將言語中的變量分為內(nèi)部變量和外同,其作用域也不同,據(jù)此將言語中的變量分為內(nèi)部變量和外部變量。部變量。 在一個函數(shù)內(nèi)部闡明的變量是內(nèi)部變量,它只在該函數(shù)范圍在一個函數(shù)內(nèi)部闡明的變量是內(nèi)部變量,它只在該函數(shù)范圍內(nèi)有效。內(nèi)有效。也就是說,只需在包含變量闡明的函數(shù)內(nèi)部,才干運用被闡也就是說,只需在包含

32、變量闡明的函數(shù)內(nèi)部,才干運用被闡明的變量,在此函數(shù)之外就不能運用這些變量了。所以內(nèi)部變量明的變量,在此函數(shù)之外就不能運用這些變量了。所以內(nèi)部變量也稱也稱部分變量部分變量。例如:例如:int f1(int a) /*函數(shù)函數(shù)f1*/ int b,c; /*a,b,c作用域:僅限于函數(shù)作用域:僅限于函數(shù)f1()中中*/ int f2(int x) /*函數(shù)函數(shù)f2*/ int y,z; /*x,y,z作用域:僅限于函數(shù)作用域:僅限于函數(shù)f2()中中*/ main() int m,n; /*m,n作用域:僅限于函數(shù)作用域:僅限于函數(shù)main()中中*/關于部分變量的作用域還要闡明以下幾點:關于部分變

33、量的作用域還要闡明以下幾點:1主函數(shù)主函數(shù)main()中定義的內(nèi)部變量,也只能在主函數(shù)中運用,中定義的內(nèi)部變量,也只能在主函數(shù)中運用,其它函數(shù)不能運用。同時,主函數(shù)中也不能運用其它函數(shù)中定其它函數(shù)不能運用。同時,主函數(shù)中也不能運用其它函數(shù)中定義的內(nèi)部變量。由于主函數(shù)也是一個函數(shù),與其它函數(shù)是平行義的內(nèi)部變量。由于主函數(shù)也是一個函數(shù),與其它函數(shù)是平行關系。這一點是與其它言語不同的,應予以留意。關系。這一點是與其它言語不同的,應予以留意。2形參變量也是內(nèi)部變量,屬于被調(diào)用函數(shù);實參變量,那形參變量也是內(nèi)部變量,屬于被調(diào)用函數(shù);實參變量,那么是調(diào)用函數(shù)的內(nèi)部變量。么是調(diào)用函數(shù)的內(nèi)部變量。3允許在不同

34、的函數(shù)中運用一樣的變量名,它們代表不同的允許在不同的函數(shù)中運用一樣的變量名,它們代表不同的對象,分配不同的單元,互不干擾,也不會發(fā)生混淆。對象,分配不同的單元,互不干擾,也不會發(fā)生混淆。4在復合語句中也可定義變量,其作用域只在復合語句范圍在復合語句中也可定義變量,其作用域只在復合語句范圍內(nèi)。內(nèi)。8.8.2 全局變量全局變量 在函數(shù)外部定義的變量稱為外部變量。以此類推,在函數(shù)外部定義的變量稱為外部變量。以此類推,在函數(shù)外部定義的數(shù)組就稱為外部數(shù)組。在函數(shù)外部定義的數(shù)組就稱為外部數(shù)組。外部變量不屬于任何一個函數(shù),其作用域是:從外部外部變量不屬于任何一個函數(shù),其作用域是:從外部變量的定義位置開場,到

35、本文件終了為止。變量的定義位置開場,到本文件終了為止。 外部變量可被作用域內(nèi)的一切函數(shù)直接援用,所外部變量可被作用域內(nèi)的一切函數(shù)直接援用,所以外部變量又稱全局變量。以外部變量又稱全局變量。int p=1, q=5; /*外部變量外部變量p,q*/float f1(int a)/*a, b, c為部分變量為部分變量*/int b, c;.char c1, c2;/*外部變量外部變量ch1, ch2*/char f2(int x,int y)int i, j;.main()int m, n;.p與q的作用范圍c1與c2的作用范圍對于全局變量還有以下幾點闡明:對于全局變量還有以下幾點闡明:1 1外部

36、變量可加強函數(shù)模塊之間的數(shù)據(jù)聯(lián)絡,但又使這些函外部變量可加強函數(shù)模塊之間的數(shù)據(jù)聯(lián)絡,但又使這些函數(shù)依賴這些外部變量,因此使得這些函數(shù)的獨立性降低。數(shù)依賴這些外部變量,因此使得這些函數(shù)的獨立性降低。從模塊化程序設計的觀念來看這是不利的,因此不是非用不可從模塊化程序設計的觀念來看這是不利的,因此不是非用不可時,不要運用外部變量。時,不要運用外部變量。2 2在同一源文件中,允許外部變量和內(nèi)部變量同名。在內(nèi)部在同一源文件中,允許外部變量和內(nèi)部變量同名。在內(nèi)部變量的作用域內(nèi),外部變量將被屏蔽而不起作用。變量的作用域內(nèi),外部變量將被屏蔽而不起作用。3 3外部變量的作用域是從定義點到本文件終了。假設定義點外

37、部變量的作用域是從定義點到本文件終了。假設定義點之前的函數(shù)需求援用這些外部變量時,需求在函數(shù)內(nèi)對被援用之前的函數(shù)需求援用這些外部變量時,需求在函數(shù)內(nèi)對被援用的外部變量進展闡明。外部變量闡明的普通方式為:的外部變量進展闡明。外部變量闡明的普通方式為:extern extern 數(shù)據(jù)類型數(shù)據(jù)類型 外部變量外部變量 ,外部變量,外部變量22; 留意:外部變量的定義和外部變量的闡明是兩回事。外部變量留意:外部變量的定義和外部變量的闡明是兩回事。外部變量的定義,必需在一切的函數(shù)之外,且只能定義一次。而外部變的定義,必需在一切的函數(shù)之外,且只能定義一次。而外部變量的闡明,出如今要運用該外部變量的函數(shù)內(nèi),而

38、且可以出現(xiàn)量的闡明,出如今要運用該外部變量的函數(shù)內(nèi),而且可以出現(xiàn)多次。多次。例例8.15有一個一維數(shù)組,內(nèi)放有一個一維數(shù)組,內(nèi)放10個學生的成果,寫一個函數(shù)個學生的成果,寫一個函數(shù)求出平均分,最高分和最低分。求出平均分,最高分和最低分。分析:函數(shù)只能前往一個值,現(xiàn)要前往三個值,可將其中兩個分析:函數(shù)只能前往一個值,現(xiàn)要前往三個值,可將其中兩個設為外部變量,如最高分和最低分。設為外部變量,如最高分和最低分。算法設計:算法設計:average函數(shù):函數(shù):1,定義變量,定義變量2,求出總分,最高分和最低分,求出總分,最高分和最低分3,前往平均分,前往平均分主函數(shù):主函數(shù):1,定義變量,數(shù)組,定義變量

39、,數(shù)組2,輸入成果,輸入成果3,函數(shù)調(diào)用,函數(shù)調(diào)用4,輸出平均分最高分和最低分,輸出平均分最高分和最低分float max=0,min=0;float average(float score ,int n)int i; float aver, sum=score0;max=min=score0;for(i=1;imax) max=scorei; if(scoreimin) min=scorei; aver=sum/n;return (aver);main()int i;float ave,score10;printf(input 10 numbern);for(i=0;i10;i+) scan

40、f(%f,&scorei);ave=average(score,10);printf( max=%6.2fn min=%6.2fnaverage=%6.2f,max,min,ave);getch();8.9變量的存儲類別變量的存儲類別8.9.18.9.1動態(tài)存儲方式與靜態(tài)存儲方式動態(tài)存儲方式與靜態(tài)存儲方式在言語中,對變量的存儲類型闡明有以下四種:在言語中,對變量的存儲類型闡明有以下四種:自動變量自動變量(auto)(auto)、存放器變量、存放器變量(register)(register)、外部變量、外部變量(extern)(extern)、靜態(tài)變量、靜態(tài)變量(static)(stat

41、ic)。 自動變量和存放器變量屬于動態(tài)存儲方式,外部變自動變量和存放器變量屬于動態(tài)存儲方式,外部變量和靜態(tài)內(nèi)部變量屬于靜態(tài)存儲方式。量和靜態(tài)內(nèi)部變量屬于靜態(tài)存儲方式。動態(tài)存儲方式:運用時分配存儲空間,運用完釋放。動態(tài)存儲方式:運用時分配存儲空間,運用完釋放。靜態(tài)存儲方式:程序開場執(zhí)行時分配存儲空間,程靜態(tài)存儲方式:程序開場執(zhí)行時分配存儲空間,程序終了時釋放。序終了時釋放。8.9.2auto變量自動變量變量自動變量1定義格式:定義格式:auto 數(shù)據(jù)類型數(shù)據(jù)類型 變量表;變量表;其中存儲類型符其中存儲類型符auto可以省略。可以省略。2存儲特點存儲特點1自動變量屬于動態(tài)存儲方式。在函數(shù)中定義的自

42、動變量,只自動變量屬于動態(tài)存儲方式。在函數(shù)中定義的自動變量,只在該函數(shù)內(nèi)有效;函數(shù)被調(diào)用時分配存儲空間,調(diào)用終了就釋放。在該函數(shù)內(nèi)有效;函數(shù)被調(diào)用時分配存儲空間,調(diào)用終了就釋放。在復合語句中定義的自動變量,只在該復合語句中有效;退出復在復合語句中定義的自動變量,只在該復合語句中有效;退出復合語句后,也不能再運用,否那么將引起錯誤。合語句后,也不能再運用,否那么將引起錯誤。2定義而不初始化,那么其值是不確定的。假設初始化,那么定義而不初始化,那么其值是不確定的。假設初始化,那么賦初值操作是在調(diào)用時進展的,且每次調(diào)用都要重新賦一次初值。賦初值操作是在調(diào)用時進展的,且每次調(diào)用都要重新賦一次初值。3由

43、于自動變量的作用域和生存期,都局限于定義它的個體內(nèi)由于自動變量的作用域和生存期,都局限于定義它的個體內(nèi)函數(shù)或復合語句,因此不同的個體中允許運用同名的變量而函數(shù)或復合語句,因此不同的個體中允許運用同名的變量而不會混淆。即使在函數(shù)內(nèi)定義的自動變量,也可與該函數(shù)內(nèi)部的不會混淆。即使在函數(shù)內(nèi)定義的自動變量,也可與該函數(shù)內(nèi)部的復合語句中定義的自動變量同名。復合語句中定義的自動變量同名。8.9.3用用static聲明部分變量靜態(tài)變量聲明部分變量靜態(tài)變量1定義格式:定義格式: static 數(shù)據(jù)類型數(shù)據(jù)類型 內(nèi)部變量表;內(nèi)部變量表;2存儲特點存儲特點1靜態(tài)內(nèi)部變量屬于靜態(tài)存儲。在程序執(zhí)行過程中,即使所在靜態(tài)內(nèi)部變量屬于靜態(tài)存儲。在程序執(zhí)行過程中,即使所在函數(shù)調(diào)用終了也不釋放。換句話說,在程序執(zhí)行期間,靜態(tài)函數(shù)調(diào)用終了也不釋放。換句話說,在程序執(zhí)行期間,靜態(tài)內(nèi)部變量一直存在,但其它函數(shù)是不能援用它們的。內(nèi)部變量一直存在,但其它函數(shù)是不能援用它們的。2定義但不

溫馨提示

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

評論

0/150

提交評論