




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、第第8章函數章函數主要內容:主要內容:1,函數的定義的普通方式,函數的定義的普通方式2,函數參數和函數值,函數參數和函數值3,函數的普通調用、嵌套調用和遞歸調用,函數的普通調用、嵌套調用和遞歸調用4,數組作為函數參數,數組作為函數參數5,部分變量和全局變量,部分變量和全局變量6,變量的存儲類別,變量的存儲類別7,內部函數和外部函數,內部函數和外部函數1 1,掌握函數的定義方式,調用格式,前往值,掌握函數的定義方式,調用格式,前往值,值傳送與地址傳送的區別;值傳送與地址傳送的區別; 2 2,掌握變量的作用域,存在范圍,存儲類,掌握變量的作用域,存在范圍,存儲類別別 要求一個較大型的程序普通均分成
2、多個模塊,每個模塊完成一個特定的功能。在C言語中用函數來實現模塊。一個C程序可由一個main函數和假設干個其他函數構成。由主函數調用其他函數,其他函數之間也可相互調用,甚至可以調用函數本人遞歸調用,但不能調用主函數。程序開發人員常用的方法是將一些經常運用的功能編寫成函數,放在公共函數庫中。 C C言語程序的構造如下圖。在每個程序中,主函數言語程序的構造如下圖。在每個程序中,主函數mainmain是是必需的,它是一切程序的執行起點,必需的,它是一切程序的執行起點,mainmain函數只調用其它函數只調用其它函數,不能為其它函數調用。其它函數沒有主從關系,可函數,不能為其它函數調用。其它函數沒有主
3、從關系,可以相互調用。一切函數都可以調用庫函數。程序的總體功以相互調用。一切函數都可以調用庫函數。程序的總體功能經過函數的調用來實現。能經過函數的調用來實現。f11( )f11( )f31( )f1( )f11( );f2( )f11( );f22( );main( )f1( );f2( );參見書中參見書中P155頁例頁例8.1 了解了解C程序經過函數調用實現所需功能程序經過函數調用實現所需功能例例8.1函數調用的簡單例子函數調用的簡單例子#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,一個源程序文件由一個或多個函數組成,一個源程序文件由一個或多個函數組成,編譯是以源程序為單位;編譯是以源程序為單位;3,程序的執行是由主函數開場到主函數終了,程序的執行是由主函數開場到主函數終了,其它函數是經過函數調用來實現的。其它函數是經過函
5、數調用來實現的。4,一切函數都是平行的。即函數定義不能嵌,一切函數都是平行的。即函數定義不能嵌套,即函數內不能定義函數,但函數之間可套,即函數內不能定義函數,但函數之間可以相互調用,甚至可以調用該函數本身遞以相互調用,甚至可以調用該函數本身遞歸調用但不能調用主函數歸調用但不能調用主函數5,從用戶的角度函數分為:規范函數即庫,從用戶的角度函數分為:規范函數即庫函數和用戶定義函數。函數和用戶定義函數。6,從函數的方式看,函數分為無參函數和有,從函數的方式看,函數分為無參函數和有參函數參函數8.2.1無參函數定義的普通方式無參函數定義的普通方式 函數類型函數類型 函數名函數名( void ) 變量聲
6、明部分;變量聲明部分; 可執行語句部分;可執行語句部分; 當函數類型為當函數類型為int型時可以省略。型時可以省略。8.2.2. 有參函數定義的普通方式有參函數定義的普通方式函數類型函數類型 函數名函數名( 數據類型數據類型 參數參數,數據類型,數據類型 參數參數2 ) 闡明語句部分;闡明語句部分; 可執行語句部分;可執行語句部分; 有參函數比無參函數多了一個參數表。調用有有參函數比無參函數多了一個參數表。調用有參函數時,調用函數將賦予這些參數實踐的值。參函數時,調用函數將賦予這些參數實踐的值。為了與調用函數提供的實踐參數區別,將函數為了與調用函數提供的實踐參數區別,將函數定義中的參數表稱為方
7、式參數表,簡稱形參表。定義中的參數表稱為方式參數表,簡稱形參表。例定義一個函數用以前往兩個數中的大者例定義一個函數用以前往兩個數中的大者int max(int x, int y)int z;/*聲明部分*/z=xy?x:y;return(z);函數類型函數名參數類型方式參數執行部分函數的前往值8.2.3空函數空函數它的方式為:它的方式為:類型闡明符函數名類型闡明符函數名() 對形參聲明的傳統方式對形參聲明的傳統方式int max(x, y)int max(x, y)int x, y;int x, y;return xy?x:y;return xy?x:y;函數定義舉例:函數定義舉例:輸入三個整
8、數,求三個整數中的最大值輸入三個整數,求三個整數中的最大值不運用函數不運用函數(除除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); 運用函數運用函數#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; 和調用庫函數和調用庫函數一樣調用一樣調用函數定義函數定義8.3函數的參數和函數值函數的參數和函數值8.3.1表達式參數和實踐參數表達式參數和實踐參數函數的參數分為形參和實參兩種,作用是實現函數的參數分為形參和實參兩種,作用是實現數據傳送。數據傳送。形參出如今函數定義中,只能在該函數體內運形參出如今函數定義中,只能在該函數體內運用。發生函數調用時,調用函
10、數把實參的值復用。發生函數調用時,調用函數把實參的值復制制1份,傳送給被調用函數的形參,從而實現份,傳送給被調用函數的形參,從而實現調用函數向被調用函數的數據傳送。調用函數向被調用函數的數據傳送。 例例8.2調用函數時的數據傳送調用函數時的數據傳送#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形參變量只需在被調用時,才分配內存單元;調用終了
11、時,即刻釋形參變量只需在被調用時,才分配內存單元;調用終了時,即刻釋放放所分配的內存單元。因此,形參只需在該函數內有效。調用終了,前往調所分配的內存單元。因此,形參只需在該函數內有效。調用終了,前往調用函數后,那么不能再運用該形參變量。用函數后,那么不能再運用該形參變量。2實參可以是常量、變量、表達式、函數等。無論實參是何種類型的實參可以是常量、變量、表達式、函數等。無論實參是何種類型的量,量,在進展函數調用時,它們都必需具有確定的值,以便把這些值傳送給形參在進展函數調用時,它們都必需具有確定的值,以便把這些值傳送給形參因此,應預先用賦值、輸入等方法,使實參獲得確定的值。因此,應預先用賦值、輸
12、入等方法,使實參獲得確定的值。3在被定義的函數中,每個形參都必需指定其類型。在被定義的函數中,每個形參都必需指定其類型。4實參和形參必需賦值兼容。實參和形參必需賦值兼容。5實參對形參的數據傳送是單向的,即只能把實參的值傳送給形參,實參對形參的數據傳送是單向的,即只能把實參的值傳送給形參,而而不能把形參的值反向地傳送給實參。不能把形參的值反向地傳送給實參。8.3.2函數的前往值函數的前往值1,函數的前往是經過,函數的前往是經過return語句,格式為:語句,格式為:return(表達式;或表達式;或 return 表達式;表達式;表達式的值即為函數前往的值。當程序執行表達式的值即為函數前往的值。
13、當程序執行return時會將流程轉移到被調函數。時會將流程轉移到被調函數。2,前往值的類型:為函數的類型函數名前,前往值的類型:為函數的類型函數名前的類型,當表達式的類型與函數類型不一的類型,當表達式的類型與函數類型不一樣時系統會自動轉換成函數類型。樣時系統會自動轉換成函數類型。3,沒有,沒有return語句時系統將前往一個不確定語句時系統將前往一個不確定的值。的值。4,假設不需求前往數據,那么可將函數類型,假設不需求前往數據,那么可將函數類型聲明為空類型聲明為空類型(void)例例8.3前往值類型與函數類型不同前往值類型與函數類型不同#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函數調用函數調用8.4.1函數調用的普通方式:函數調用的普通方式:函數名實參表列函數名實參表列闡明:闡明:1,其中實參表列中的
15、實參個數應和形,其中實參表列中的實參個數應和形參個數一樣,且對應位置上的實參與形參的參個數一樣,且對應位置上的實參與形參的數據類型必需一樣。數據類型必需一樣。2,實參之間用逗號分隔。,實參之間用逗號分隔。3,對實參的求值是從右到左的順序執行的。,對實參的求值是從右到左的順序執行的。8.4.2函數調用的方式函數調用的方式函數調用可以是單獨調用,或在表達式中,函數調用可以是單獨調用,或在表達式中,或作為函數參數。或作為函數參數。如如printstar();c=2*max(a,b);m=max(a,max(b,c);8.4.3對被調用的聲明和函數原型對被調用的聲明和函數原型1對自定義函數。當函數定義
16、在函數調用對自定義函數。當函數定義在函數調用后面且函數類型不是后面且函數類型不是int型時必需在調用前對調型時必需在調用前對調用函數進展闡明,闡明格式為:用函數進展闡明,闡明格式為:函數類型函數名形參類型函數類型函數名形參類型1,形參類型,形參類型2,.);2對庫函數,那么必需將包含該庫的原型對庫函數,那么必需將包含該庫的原型聲明的頭文件包含到程序中:聲明的頭文件包含到程序中:#include例例8.5對被調函數的聲明。對被調函數的聲明。#includevoid main()float add(float,float); /*對被調函數的聲明對被調函數的聲明*/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:寫一個判素數的函數,在主函數中輸入一個:寫一個判素數的函數,在主函數中輸入一個整數,輸出能否素數的信息整數,輸出能否素數的信息主函數:主函數:函數聲明與變量聲明函數聲明與變量聲明輸入一個整數輸入一個整數函數調用并根據前往值輸出能否素數的信息函數調用并根據前往值輸出能否素數的信息判別素數函數:判別素數函數:for i=2 to n/2 假設假設n能被某一整數整除那么前往能被某一整數整除那么前往0前往前往1#
18、includevoid main() int n,prime(int); printf(輸入一個正整數輸入一個正整數:n); scanf(%d,&n); if(prime(n) printf(%d是一個素數是一個素數n,n); else printf(%d不是一個素數不是一個素數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函數的嵌套調用被調函數也可調用其它函數,構成調用的嵌被調函數也可調用其它函數,構成調用的嵌套,前往時必需一層層前往。套,前往時必需一層層前往。例:一個函數的嵌
19、套調用的例例:一個函數的嵌套調用的例#includevoid main() void f1(); printf(n調用函數調用函數f1之前之前:);f1();printf(n調用函數調用函數f1之后之后:);void f1()void f2();printf(n這是函數這是函數f1:);f2();void f2()printf( n這是函數這是函數f2:n);8.6函數的遞歸調用函數的遞歸調用函數的遞歸調用是指,一個函數在它的函數體內,直函數的遞歸調用是指,一個函數在它的函數體內,直接或間接地調用它本身。接或間接地調用它本身。言語允許函數的遞歸調用。在遞歸調用中,調用函言語允許函數的遞歸調用。
20、在遞歸調用中,調用函數又是被調用函數,執行遞歸函數將反復調用其本身。數又是被調用函數,執行遞歸函數將反復調用其本身。每調用一次就進入新的一層。每調用一次就進入新的一層。為了防止遞歸調用無終止地進展,必需在函數內有終為了防止遞歸調用無終止地進展,必需在函數內有終止遞歸調用的手段。常用的方法是加條件判別,滿足止遞歸調用的手段。常用的方法是加條件判別,滿足某種條件后就不再作遞歸調用,然后逐層前往。某種條件后就不再作遞歸調用,然后逐層前往。例例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 數組作為函數參數數組作為函數參數數組作為函數參數的主要功能是將整個數組的數據傳送給被數組作為函數參數的主要功能是將整個數組的數據傳送給被調函數。調函數。8.7.1. 數組元素作為函數實參數組元素作為函數實參運用方法和變量作為函數參數一樣,只須把數組元素看作變運用方法和變量作為函數參數一樣,
23、只須把數組元素看作變量。量。此時實參為數組元素,形參為與數組一樣類型的變量。此時實參為數組元素,形參為與數組一樣類型的變量。例例8.108.10有兩個數組有兩個數組a,ba,b,比較其大小。,比較其大小。算法設計:算法設計:1 1,用,用2 2個個forfor循環語句輸入數組元素循環語句輸入數組元素2 2,for(i=0;i10;i+)for(i=0;ibiaibi的個數的個數/調用函數進展比較調用函數進展比較用用m m表示表示ai=biai=bi的個數的個數用用k k表示表示aibiaibi的個數的個數 3 3,輸出結果,輸出結果4 4,定義比較函數,定義比較函數#includevoid m
24、ain()int large(int,int);int a10,b10,i,n=0,m=0,k=0;printf(請輸入數組請輸入數組a的的10個數,用空格分隔個數,用空格分隔n);for(i=0;i10;i+) scanf(%d,&ai);printf(n請輸入數組請輸入數組b的的10個數,用空格分隔個數,用空格分隔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. 數組名作為函數參數數組名作為函數參數調用格式
25、:函數名調用格式:函數名( (數組名數組名函數定義格式:類型函數名函數定義格式:類型函數名( (數組類型數組名數組類型數組名 ) )闡明:闡明:1 1用數組名作函數參數,應該在調用函數用數組名作函數參數,應該在調用函數和被調用函數中分別定義數組,且數據類型必需一致,和被調用函數中分別定義數組,且數據類型必需一致,否那么結果將出錯。否那么結果將出錯。2 2C C編譯系統對形參數組大小不作檢查,所以形參編譯系統對形參數組大小不作檢查,所以形參數組可以不指定大小。數組可以不指定大小。3 3數組名作為函數參數采用的是地址傳送方法,數組名作為函數參數采用的是地址傳送方法,假設在函數中對形參數組作了改動,
26、前往后實參數組假設在函數中對形參數組作了改動,前往后實參數組也會作相應的改動。也會作相應的改動。例例8.11有一個一維數組有一個一維數組score,內放,內放10個學生個學生的成果,求平均成果的成果,求平均成果算法設計算法設計1 1,用,用forfor循環語句輸入數組元素循環語句輸入數組元素2 2,調用函數求平均值,調用函數求平均值3 3,輸出平均值,輸出平均值4 4,定義求平均值函數,定義求平均值函數4.14.1用用forfor循環語句求總成果循環語句求總成果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);形參數組實參例例8.13 用選擇法對數組的用選擇法對數組的10個元素排序個元素排序算法設計算法設計S1用用for循環語句輸入數組元素循環語句輸入數組元素S2調用函數排序調用函數排序S3用
28、用for循環語句輸出數組元素循環語句輸出數組元素S4定義排序函數定義排序函數選擇法排序的根本思想:選擇法排序的根本思想:第第1輪:從輪:從a2到到an中選擇最小的數與中選擇最小的數與a1交換交換第第2輪:從輪:從a3到到an中選擇最小的數與中選擇最小的數與a2交換交換第第3輪:從輪:從a4到到an中選擇最小的數與中選擇最小的數與a3交換交換第第i輪:從輪:從ai+1到到an中選擇最小的數與中選擇最小的數與ai交換交換第第n-1輪:從輪:從an到到an中選擇最小的數與中選擇最小的數與an-1交換交換for(i=1;in;i+) for(j=i+1;j=n;j+)/從剩余的數中找最小的數的下標從剩
29、余的數中找最小的數的下標 找出找出aj中最小數的下標中最小數的下標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多維數組名作為函數參數多維數組名作為函數參數例:有一個例:有一個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 部分變量和全局變量部分變量和全局變量 言語中一切的變量都有本人的作用域。變量闡明的位置不言語中一切的變量都有本人的作用域。變量闡明的位置不同,其作用域也不同,據此將言語中的變量分為內部變量和外同,其作用域也不同,據此將言語中的變量分為內部變量和外部變量。部變量。 在一個函數內部闡明的變量是內部變量,它只在該函數范圍在一個函數內部闡明的變量是內部變量,它只在該函數范圍內有效。內有效。也就是說,只需在包含變量闡明的函數內部,才干運用被闡也就是說,只需在包含
32、變量闡明的函數內部,才干運用被闡明的變量,在此函數之外就不能運用這些變量了。所以內部變量明的變量,在此函數之外就不能運用這些變量了。所以內部變量也稱也稱部分變量部分變量。例如:例如:int f1(int a) /*函數函數f1*/ int b,c; /*a,b,c作用域:僅限于函數作用域:僅限于函數f1()中中*/ int f2(int x) /*函數函數f2*/ int y,z; /*x,y,z作用域:僅限于函數作用域:僅限于函數f2()中中*/ main() int m,n; /*m,n作用域:僅限于函數作用域:僅限于函數main()中中*/關于部分變量的作用域還要闡明以下幾點:關于部分變
33、量的作用域還要闡明以下幾點:1主函數主函數main()中定義的內部變量,也只能在主函數中運用,中定義的內部變量,也只能在主函數中運用,其它函數不能運用。同時,主函數中也不能運用其它函數中定其它函數不能運用。同時,主函數中也不能運用其它函數中定義的內部變量。由于主函數也是一個函數,與其它函數是平行義的內部變量。由于主函數也是一個函數,與其它函數是平行關系。這一點是與其它言語不同的,應予以留意。關系。這一點是與其它言語不同的,應予以留意。2形參變量也是內部變量,屬于被調用函數;實參變量,那形參變量也是內部變量,屬于被調用函數;實參變量,那么是調用函數的內部變量。么是調用函數的內部變量。3允許在不同
34、的函數中運用一樣的變量名,它們代表不同的允許在不同的函數中運用一樣的變量名,它們代表不同的對象,分配不同的單元,互不干擾,也不會發生混淆。對象,分配不同的單元,互不干擾,也不會發生混淆。4在復合語句中也可定義變量,其作用域只在復合語句范圍在復合語句中也可定義變量,其作用域只在復合語句范圍內。內。8.8.2 全局變量全局變量 在函數外部定義的變量稱為外部變量。以此類推,在函數外部定義的變量稱為外部變量。以此類推,在函數外部定義的數組就稱為外部數組。在函數外部定義的數組就稱為外部數組。外部變量不屬于任何一個函數,其作用域是:從外部外部變量不屬于任何一個函數,其作用域是:從外部變量的定義位置開場,到
35、本文件終了為止。變量的定義位置開場,到本文件終了為止。 外部變量可被作用域內的一切函數直接援用,所外部變量可被作用域內的一切函數直接援用,所以外部變量又稱全局變量。以外部變量又稱全局變量。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、變量可加強函數模塊之間的數據聯絡,但又使這些函外部變量可加強函數模塊之間的數據聯絡,但又使這些函數依賴這些外部變量,因此使得這些函數的獨立性降低。數依賴這些外部變量,因此使得這些函數的獨立性降低。從模塊化程序設計的觀念來看這是不利的,因此不是非用不可從模塊化程序設計的觀念來看這是不利的,因此不是非用不可時,不要運用外部變量。時,不要運用外部變量。2 2在同一源文件中,允許外部變量和內部變量同名。在內部在同一源文件中,允許外部變量和內部變量同名。在內部變量的作用域內,外部變量將被屏蔽而不起作用。變量的作用域內,外部變量將被屏蔽而不起作用。3 3外部變量的作用域是從定義點到本文件終了。假設定義點外
37、部變量的作用域是從定義點到本文件終了。假設定義點之前的函數需求援用這些外部變量時,需求在函數內對被援用之前的函數需求援用這些外部變量時,需求在函數內對被援用的外部變量進展闡明。外部變量闡明的普通方式為:的外部變量進展闡明。外部變量闡明的普通方式為:extern extern 數據類型數據類型 外部變量外部變量 ,外部變量,外部變量22; 留意:外部變量的定義和外部變量的闡明是兩回事。外部變量留意:外部變量的定義和外部變量的闡明是兩回事。外部變量的定義,必需在一切的函數之外,且只能定義一次。而外部變的定義,必需在一切的函數之外,且只能定義一次。而外部變量的闡明,出如今要運用該外部變量的函數內,而
38、且可以出現量的闡明,出如今要運用該外部變量的函數內,而且可以出現多次。多次。例例8.15有一個一維數組,內放有一個一維數組,內放10個學生的成果,寫一個函數個學生的成果,寫一個函數求出平均分,最高分和最低分。求出平均分,最高分和最低分。分析:函數只能前往一個值,現要前往三個值,可將其中兩個分析:函數只能前往一個值,現要前往三個值,可將其中兩個設為外部變量,如最高分和最低分。設為外部變量,如最高分和最低分。算法設計:算法設計:average函數:函數:1,定義變量,定義變量2,求出總分,最高分和最低分,求出總分,最高分和最低分3,前往平均分,前往平均分主函數:主函數:1,定義變量,數組,定義變量
39、,數組2,輸入成果,輸入成果3,函數調用,函數調用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動態存儲方式與靜態存儲方式動態存儲方式與靜態存儲方式在言語中,對變量的存儲類型闡明有以下四種:在言語中,對變量的存儲類型闡明有以下四種:自動變量自動變量(auto)(auto)、存放器變量、存放器變量(register)(register)、外部變量、外部變量(extern)(extern)、靜態變量、靜態變量(static)(stat
41、ic)。 自動變量和存放器變量屬于動態存儲方式,外部變自動變量和存放器變量屬于動態存儲方式,外部變量和靜態內部變量屬于靜態存儲方式。量和靜態內部變量屬于靜態存儲方式。動態存儲方式:運用時分配存儲空間,運用完釋放。動態存儲方式:運用時分配存儲空間,運用完釋放。靜態存儲方式:程序開場執行時分配存儲空間,程靜態存儲方式:程序開場執行時分配存儲空間,程序終了時釋放。序終了時釋放。8.9.2auto變量自動變量變量自動變量1定義格式:定義格式:auto 數據類型數據類型 變量表;變量表;其中存儲類型符其中存儲類型符auto可以省略。可以省略。2存儲特點存儲特點1自動變量屬于動態存儲方式。在函數中定義的自
42、動變量,只自動變量屬于動態存儲方式。在函數中定義的自動變量,只在該函數內有效;函數被調用時分配存儲空間,調用終了就釋放。在該函數內有效;函數被調用時分配存儲空間,調用終了就釋放。在復合語句中定義的自動變量,只在該復合語句中有效;退出復在復合語句中定義的自動變量,只在該復合語句中有效;退出復合語句后,也不能再運用,否那么將引起錯誤。合語句后,也不能再運用,否那么將引起錯誤。2定義而不初始化,那么其值是不確定的。假設初始化,那么定義而不初始化,那么其值是不確定的。假設初始化,那么賦初值操作是在調用時進展的,且每次調用都要重新賦一次初值。賦初值操作是在調用時進展的,且每次調用都要重新賦一次初值。3由
43、于自動變量的作用域和生存期,都局限于定義它的個體內由于自動變量的作用域和生存期,都局限于定義它的個體內函數或復合語句,因此不同的個體中允許運用同名的變量而函數或復合語句,因此不同的個體中允許運用同名的變量而不會混淆。即使在函數內定義的自動變量,也可與該函數內部的不會混淆。即使在函數內定義的自動變量,也可與該函數內部的復合語句中定義的自動變量同名。復合語句中定義的自動變量同名。8.9.3用用static聲明部分變量靜態變量聲明部分變量靜態變量1定義格式:定義格式: static 數據類型數據類型 內部變量表;內部變量表;2存儲特點存儲特點1靜態內部變量屬于靜態存儲。在程序執行過程中,即使所在靜態內部變量屬于靜態存儲。在程序執行過程中,即使所在函數調用終了也不釋放。換句話說,在程序執行期間,靜態函數調用終了也不釋放。換句話說,在程序執行期間,靜態內部變量一直存在,但其它函數是不能援用它們的。內部變量一直存在,但其它函數是不能援用它們的。2定義但不
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 鄭州電力職業技術學院《世界音樂文化》2023-2024學年第一學期期末試卷
- 山東體育學院《高等天然藥物化學》2023-2024學年第一學期期末試卷
- 山東司法警官職業學院《高級阿拉伯語》2023-2024學年第二學期期末試卷
- 四川省眉山市外國語學校2024-2025學年高三下學期單元檢測試題英語試題含解析
- 武漢航海職業技術學院《英語綜合技能訓練》2023-2024學年第二學期期末試卷
- 外交學院《智慧城市工程》2023-2024學年第一學期期末試卷
- 四川省西昌市禮州中學2024-2025學年初三8月月考物理試題含解析
- 金屬活動順序的比較
- 2025建筑材料產品購銷合同
- 2025建筑外墻保溫施工合同協議書
- 人教pep版小學英語三年級下冊【全冊】單元測試卷期中期末復習試卷
- 電梯維保工程施工組織設計方案
- DB32T-公路橋梁水下結構檢測評定標準
- 低壓配電系統運行維護操作手冊
- 高職藥學專業《藥物制劑技術》說課課件
- 低碳環保管理制度
- 2024年憲法知識競賽必考重點知識(共50個)
- 急診科提高出診車物品放置規范率PDCA項目
- 2024年江蘇省淮安市中考一模物理試題(含答案解析)
- 風電場檢查合同協議書
- 佛云學校多功能室、電教室、體育館設備采購項目招標文件
評論
0/150
提交評論