第8章函數(shù)3.ppt_第1頁
第8章函數(shù)3.ppt_第2頁
第8章函數(shù)3.ppt_第3頁
第8章函數(shù)3.ppt_第4頁
第8章函數(shù)3.ppt_第5頁
已閱讀5頁,還剩31頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、8.5 函數(shù)的嵌套與遞歸調(diào)用P167 嵌套調(diào)用,C規(guī)定:函數(shù)定義不可嵌套,但可以嵌套調(diào)用函數(shù),習(xí)題集六單元 一、6,例 求三個(gè)數(shù)中最大數(shù)和最小數(shù)的差值,#include int dif(int x,int y,int z); int max(int x,int y,int z); int min(int x,int y,int z); void main() int a,b,c,d; scanf(%d%d%d, ,int max(int x,int y,int z) int r; r=xy?x:y; return(rz ? r : z); int min(int x,int y,int z)

2、int r; r=xy?x:y; return(rz?r:z); int dif(int x,int y,int z) int m,n; m=max(x,y,z); n=min(x,y,x); return m-n; ,遞歸調(diào)用 定義:函數(shù)直接或間接的調(diào)用自身叫函數(shù)的遞歸調(diào)用,int f(int x) int y,z; z=f(y); . return(2*z); ,遞歸調(diào)用,遞歸問題的特點(diǎn) : 1. 遞歸問題的出口,即終止遞歸的條件。 2. 問題的轉(zhuǎn)化:把一個(gè)問題轉(zhuǎn)化為一個(gè)新的問題,新的問題與原來的問題相同,只不過所處理的對象有規(guī)律的遞增或遞減。,例8.8 求n的階乘,遞推法:n!= 1 2

3、(n-2)(n-1) n 其特點(diǎn)是從一個(gè)已知的事實(shí)出發(fā),按一定規(guī)律推出下一個(gè)事實(shí),再從這個(gè)新的已知事實(shí)出發(fā),再向下推出一個(gè)新的事實(shí) 遞歸法: n!= (n-1)! n, (n-1)!= (n-2)! (n-1), . , 3!= (3-1)! 3, 2!= (2-1)! 2, 1!= (1-1)! 1,#include int fac(int n) int f; if(n= =0|n= =1) f=1; else f = n * fac(n-1); return( f ); void main() int n, y; printf(Input a integer number:); scanf

4、(%d, ,返回值1,返回值2,返回值6,返回值24, 是回推過程,一直回推到某個(gè)終止條件 是遞推過程,int fac(int n) int f; if(n= =0|n= =1) f=1; else f = n * fac(n-1); return (f); ,以n=4為例,執(zhí)行過程如下:,void main( ) int x,n; scanf (%d%d, ,例: 求 xn (n=0),float f(int x,int n) float z; if (n=0) z=1; else if (n=1) z=x; else z=x*f(x,n-1); return z; ,float f(int

5、 x, int n) float z; if (n=0) z=1; else if (n=1) z=x; else z=x*f(x,n-1); return z; ,float f(int x, int n) float z; if (n=0) z=1; else if (n=1) z=x; else z=x*f(x,n-1); return z; ,float f(int x, int n) float z; if (n=0) z=1; else if (n=1) z=x; else z=x*f(x,n-1); return z; ,float f(int x, int n) float z

6、; if (n=0) z=1; else if (n=1) z=x; else z=x*f(x,n-1); return z; ,f(5,4),5,3,5,2,5,1,z=5;,習(xí)題集六單元 一、9 二、3,11 三、3,8.8 局部變量和全局變量P184,一、局部變量(內(nèi)部變量):在一個(gè)函數(shù)內(nèi)部定義的變量,只在本函數(shù)內(nèi)部有效。即只能在本函數(shù)內(nèi)部使用. 或者說局部變量的作用域是定義它的函數(shù),int max(int x,int y) int z; z = xy ? x : y; return z; void main() int a,b,c; scanf(“%d%d”, ,z=20;,x,y,z

7、是局部變量 作用域是max函數(shù),a,b,c是局部變量 作用域是main函數(shù),說明:(4點(diǎn)) 1. main中定義的變量,只在main中有效。 2. 函數(shù)形參是函數(shù)的局部變量。 3. 不同函數(shù)中可以定義同名的變量,它們互不干擾。,void test() int c=10; printf(“test c=%dn”,c); void main() int c=20; test(); printf(“main c=%dn”,c); ,結(jié)果: test c=10 main c=20,說明:(4點(diǎn)),4. 函數(shù)內(nèi)部的復(fù)合語句中也可定義局部變量,有效范圍在該復(fù)合語句中。建議:不宜用。,習(xí)題集六單元 一、3,

8、main ( ) int a,b; . int c; c=a+b; . . ,c 的有效范圍,a , b 的有效范圍,二、全局變量(外部變量):在函數(shù)之外定義的變量。有效范圍:從定義點(diǎn)到文件結(jié)束,f1(int a) int b, c; ,f2(float x, float y) int i, j; ,main() int i, j, x, m; ,p, q 有效 在f1,f2,main 中均可使用,c1,c2 有效 在f2,main 中可以使用,int p, q;,char c1, c2;,說明: 全局變量沒有賦初值時(shí),系統(tǒng)自動(dòng)賦為0 同一個(gè).c文件中,全局與局部變量同名時(shí),外部變量被屏蔽,即

9、局部優(yōu)先。,int a; void test() int a=20; printf(“test a=%dn”,a); void main() a+; test(); printf(“main a=%dn”,a); ,結(jié)果: test a=20 main a=1,int a=3,b=5; void main() int max(int a,int b); int a=10; printf(“max=%dn”,max(a,b); int max(int a,int b) int c; c= ab?a:b; return c; ,結(jié)果: max=10,例8.16 寫出程序結(jié)果,全局變量,局部變量,作

10、用域?yàn)閙ain函數(shù),a、b為形參,局部變量,作用域?yàn)閙ax函數(shù),習(xí)題集六單元 二、8,例8.15 :在一維數(shù)組中存放10個(gè)學(xué)生的成績,寫一個(gè)函數(shù),求出平均分,最高分和最低分。,分析: 1. 平均分由函數(shù)值帶回 2. 設(shè)max,min為全局變量,ave score 10 max min,aver array n max min,main( ),average( ),全局變量增加了函數(shù)間的數(shù)據(jù)聯(lián)系。,void main() int i; float aver,score10; for(i=0;i10;i+) scanf(“%f”, ,#include float Max=0,Min=0; floa

11、t average( float array ,int n) int i; float aver,sum = array0; Max=Min=array0; for(i=1;iMax) Max=arrayi; if(arrayiMin) Min=arrayi; sum +=arrayi; aver = sum / n; return aver; ,8.9 變量的存儲類型P188,從變量的作用域(即從空間)角度來分,可以分為全局變量和局部變量。 從變量值存在的時(shí)間角度來分,又可以分為靜態(tài)存儲方式和動(dòng)態(tài)存儲方式。 靜態(tài)存儲方式:指在程序運(yùn)行期間由系統(tǒng)分配固定的存儲空間的方式。 動(dòng)態(tài)存儲方式:則是在

12、程序運(yùn)行期間根據(jù)需要進(jìn)行動(dòng)態(tài)的分配存儲空間的方式,變量和函數(shù)有兩個(gè)屬性:數(shù)據(jù)類型和數(shù)據(jù)的存儲類別。存儲類別指的是數(shù)據(jù)在內(nèi)存中存儲的方式。 存儲方式分為兩大類:靜態(tài)存儲類和動(dòng)態(tài)存儲類。包含: 自動(dòng)的(auto); 靜態(tài)的(static); 寄存器的(register); 外部的(extern)。 根據(jù)變量的存儲類別,可以知道變量的作用域和生存期。,auto變量,自動(dòng)變量auto:不專門聲明為static存儲類別的局部變量都是動(dòng)態(tài)分配存儲空間,在調(diào)用該函數(shù)時(shí)系統(tǒng)會給它們分配存儲空間,在函數(shù)調(diào)用結(jié)束時(shí)就自動(dòng)釋放這些存儲空間。因此這類局部變量稱為自動(dòng)變量。 函數(shù)中的形參和在函數(shù)中定義的變量(包括在復(fù)合

13、語句中定義的變量),都屬此類。 自動(dòng)變量用關(guān)鍵字auto作存儲類別的聲明。,例如: int (int ) *定義f函數(shù),為形參 * auto int ,;/*定義、為自動(dòng)變量 * /* auto可省略,隱含確定為自動(dòng)存儲類別 *,#include int max (int x,int y) int n; n=xy?x:y; return n; void main() int a,b,c; scanf(“%d%d”, ,a,b,x,y,n,3,4,3,4,4,main函數(shù),max函數(shù),靜態(tài)變量:全局變量和靜態(tài)局部變量。 特點(diǎn): 程序在開始執(zhí)行時(shí),分配存儲空間; 程序執(zhí)行完畢時(shí),釋放存儲空間; 在

14、程序執(zhí)行的全部過程中,占據(jù)固定的存儲單元。,靜態(tài)局部變量(static) 定義方式: static 類型 變量名; 例如:static int a,b; 特點(diǎn): 靜態(tài)局部變量屬于靜態(tài)存儲變量; 靜態(tài)局部變量只賦初值一次,每次調(diào)用都保留上次調(diào)用結(jié)束時(shí)的值; 靜態(tài)局部變量在函數(shù)調(diào)用后仍然存在,但其它函數(shù)不能引用。 若局部靜態(tài)變量定義時(shí)不賦初值,則系統(tǒng)自動(dòng)賦初值(數(shù)值型為0,字符型為空字符); 應(yīng)用:需要保留函數(shù)上一次調(diào)用結(jié)束時(shí)的值。,int f(int a) int b=0; static int c=3; b=b+1;c=c+1 return(a+b+c); main( ) int a=2,i;

15、 for (i=0;i3;i+) printf(“%d”,f(a); ,a,b是自動(dòng)局部變量,是動(dòng)態(tài)存儲變量 c是靜態(tài)局部變量 作用域是f函數(shù),a是自動(dòng)局部變量,是動(dòng)態(tài)存儲變量 作用域是main函數(shù),例8.17:,void fun() static int a; a+; printf(“a=%dn”,a); main( ) int a=2,i; for (i=0;i3;i+) fun(); printf(“main a=%d”,a); ,程序運(yùn)行結(jié)果: a=1 a=2 a=3 main a=2,靜態(tài)局部變量舉例:,對靜態(tài)局部變量的說明: (1) 靜態(tài)局部變量屬于靜態(tài)存儲類別,在靜態(tài)存儲區(qū)內(nèi)分配

16、存儲單元。在程序整個(gè)運(yùn)行期間都不釋放。而自動(dòng)變量(即動(dòng)態(tài)局部變量)屬于動(dòng)態(tài)存儲類別,占動(dòng)態(tài)存儲區(qū)空間而不占靜態(tài)存儲區(qū)空間,函數(shù)調(diào)用結(jié)束后即釋放。 (2)對靜態(tài)局部變量是在編譯時(shí)賦初值的,即只賦初值一次,在程序運(yùn)行時(shí)它已有初值。以后每次調(diào)用函數(shù)時(shí)不再重新賦初值而只是保留上次函數(shù)調(diào)用結(jié)束時(shí)的值。,(3)如在定義局部變量時(shí)不賦初值的話,則對靜態(tài)局部變量來說,編譯時(shí)自動(dòng)賦初值(對數(shù)值型變量)或空字符(對字符變量)。而對自動(dòng)變量來說,如果不賦初值則它的值是一個(gè)不確定的值。 (4)雖然靜態(tài)局部變量在函數(shù)調(diào)用結(jié)束后仍然存在,但其他函數(shù)不能引用它。,習(xí)題集六單元 一、7、8 二、4,5,9,register變

17、量,變量的值是存放在內(nèi)存中的。當(dāng)程序中用到那一個(gè)變量的值時(shí),由控制器發(fā)出指令將內(nèi)存中該變量的值送到運(yùn)算器中。 經(jīng)過運(yùn)算器進(jìn)行運(yùn)算,如果需要存數(shù),再從運(yùn)算器將數(shù)據(jù)送到內(nèi)存存放。,如果有一些變量使用頻繁,則為存取變量的值要花費(fèi)不少時(shí)間。為提高執(zhí)行效率,語言允許將局部變量的值放在CPU中的寄存器中,需要用時(shí)直接從寄存器取出參加運(yùn)算,不必再到內(nèi)存中去存取。由于對寄存器的存取速度遠(yuǎn)高于對內(nèi)存的存取速度,因此這樣做可以提高執(zhí)行效率。這種變量叫做寄存器變量,用關(guān)鍵字register作聲明。,例819使用寄存器變量 #include void main ( ) long fac(long); long i,n; scanf(%ld, ,用extern聲明外部變量,外部變量是在函數(shù)的外部定義的全局變量,它的作用域是從變量的定義處開始,到本程序文件的末尾。在此作用域內(nèi),全局變量可以為程序中各個(gè)函數(shù)所引用。編譯時(shí)將外部變量分配在靜態(tài)存儲區(qū)。 用extern來聲明外部變量,以擴(kuò)展外部變量的作用域。,1. 在一個(gè)文件內(nèi)聲明外部變量,例820 用extern聲明外部變量,擴(kuò)展它在程序文件中的作用域 #include void main() int max(int,int

溫馨提示

  • 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論