C程序設(shè)計(jì)ch08 函數(shù)_第1頁
C程序設(shè)計(jì)ch08 函數(shù)_第2頁
C程序設(shè)計(jì)ch08 函數(shù)_第3頁
C程序設(shè)計(jì)ch08 函數(shù)_第4頁
C程序設(shè)計(jì)ch08 函數(shù)_第5頁
已閱讀5頁,還剩49頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、第八章 函數(shù)v8.1 8.1 概述概述模塊化程序設(shè)計(jì)模塊化程序設(shè)計(jì)v若只有若只有main函數(shù),則程序太長、太復(fù)雜,導(dǎo)致跟蹤、函數(shù),則程序太長、太復(fù)雜,導(dǎo)致跟蹤、調(diào)試、維護(hù)困難調(diào)試、維護(hù)困難v基本思想:將一個(gè)大的程序按功能分割成一些小?;舅枷耄簩⒁粋€(gè)大的程序按功能分割成一些小模塊,各部分獨(dú)立編碼、調(diào)試、再集成。塊,各部分獨(dú)立編碼、調(diào)試、再集成。v特點(diǎn):特點(diǎn):各模塊相對獨(dú)立、功能單一、結(jié)構(gòu)清晰、接口簡單各模塊相對獨(dú)立、功能單一、結(jié)構(gòu)清晰、接口簡單控制了程序設(shè)計(jì)的復(fù)雜性控制了程序設(shè)計(jì)的復(fù)雜性易理解易理解易于維護(hù)和功能擴(kuò)充易于維護(hù)和功能擴(kuò)充v開發(fā)方法開發(fā)方法: 自上向下,逐步分解,分而治之自上向下,

2、逐步分解,分而治之C C程序結(jié)構(gòu)程序結(jié)構(gòu)lC C是是函數(shù)式函數(shù)式語言語言l必須有且只能有一個(gè)名為必須有且只能有一個(gè)名為mainmain的主函數(shù)的主函數(shù)lC程序的執(zhí)行總是程序的執(zhí)行總是從從mainmain函數(shù)開始,在函數(shù)開始,在mainmain中結(jié)束中結(jié)束l函數(shù)函數(shù)不能嵌套定義不能嵌套定義, ,可以可以嵌套嵌套調(diào)用調(diào)用C程序程序源程序文件源程序文件1源程序文件源程序文件2源程序文件源程序文件n預(yù)編譯命令預(yù)編譯命令函數(shù)函數(shù)1函數(shù)函數(shù)m說明部分說明部分執(zhí)行部分執(zhí)行部分函數(shù)分類函數(shù)分類v從用戶角度從用戶角度標(biāo)準(zhǔn)函數(shù)(庫函數(shù)):由系統(tǒng)提供標(biāo)準(zhǔn)函數(shù)(庫函數(shù)):由系統(tǒng)提供用戶自定義函數(shù)用戶自定義函數(shù)v從函數(shù)

3、形式從函數(shù)形式無參函數(shù)無參函數(shù)有參函數(shù)有參函數(shù)使用使用庫函數(shù)庫函數(shù)的一般方法:的一般方法:1、函數(shù)功能、函數(shù)功能2、函數(shù)參數(shù)的數(shù)目和順序,及各參數(shù)意義和類型、函數(shù)參數(shù)的數(shù)目和順序,及各參數(shù)意義和類型3、函數(shù)返回值意義和類型、函數(shù)返回值意義和類型4、需要使用的包含文件、需要使用的包含文件v8.2 8.2 自定義函數(shù)自定義函數(shù)多函數(shù)程序多函數(shù)程序#include stdio.hmain() void printstar(); printstar(); printf(This is a example of use C functionn); printstar();void printstar()

4、 printf(*n);函數(shù)控制流函數(shù)控制流函數(shù)與變量的對比函數(shù)與變量的對比函數(shù)名和變量名均以標(biāo)識(shí)符體現(xiàn)函數(shù)名和變量名均以標(biāo)識(shí)符體現(xiàn)函數(shù)和變量均有對應(yīng)的類型,如函數(shù)和變量均有對應(yīng)的類型,如int函數(shù)和變量一樣,均要函數(shù)和變量一樣,均要prototype函數(shù)定義格式函數(shù)定義格式函數(shù)函數(shù)體體合法標(biāo)識(shí)符合法標(biāo)識(shí)符函數(shù)返回值類型函數(shù)返回值類型缺省缺省int型型無返回值無返回值void函數(shù)類型函數(shù)類型 函數(shù)名(形參類型說明表)函數(shù)名(形參類型說明表)說明部分說明部分語句部分語句部分return 語句語句以上以上紅色的紅色的為函數(shù)的為函數(shù)的6個(gè)元素個(gè)元素函數(shù)類型函數(shù)類型 函數(shù)名(形參表)函數(shù)名(形參表)形

5、參類型說明形參類型說明說明部分說明部分語句部分語句部分傳統(tǒng)風(fēng)格傳統(tǒng)風(fēng)格: :例例 有參函數(shù)(傳統(tǒng)風(fēng)格)有參函數(shù)(傳統(tǒng)風(fēng)格) int max(x,y) int x,y; int z; z=xy?x:y; return(z); 函數(shù)類型函數(shù)類型void printstar() printf(*); void swap(int x,int y ) int temp; temp=x; x=y; y=temp; float squre(float x ) return (x*x); int get_number(void) int temp=1; return temp; int mathoperati

6、on(int a,int b,int *s) 返回多個(gè)數(shù)據(jù)返回多個(gè)數(shù)據(jù) 返回語句返回語句v形式:形式: return(表達(dá)式表達(dá)式); 或或 return 表達(dá)式表達(dá)式; 或或 return;v功能:使程序控制從被調(diào)用函數(shù)返回到調(diào)用函數(shù)功能:使程序控制從被調(diào)用函數(shù)返回到調(diào)用函數(shù)中,同時(shí)把返值帶給調(diào)用函數(shù)中,同時(shí)把返值帶給調(diào)用函數(shù)例例 無返回值函數(shù)無返回值函數(shù) void swap(int x,int y ) int temp; temp=x; x=y; y=temp; return; 函數(shù)中可有多個(gè)函數(shù)中可有多個(gè)return語句語句若無若無return語句,遇語句,遇時(shí),自動(dòng)返回調(diào)用函數(shù)時(shí),自動(dòng)

7、返回調(diào)用函數(shù)若函數(shù)類型與若函數(shù)類型與return語句中表達(dá)式值的類型不一語句中表達(dá)式值的類型不一致,按前者為準(zhǔn),自動(dòng)轉(zhuǎn)換致,按前者為準(zhǔn),自動(dòng)轉(zhuǎn)換函數(shù)調(diào)用轉(zhuǎn)換函數(shù)調(diào)用轉(zhuǎn)換void型函數(shù)型函數(shù)函數(shù)的調(diào)用函數(shù)的調(diào)用調(diào)用形式調(diào)用形式 函數(shù)名函數(shù)名(實(shí)參表實(shí)參表);例例 比較兩個(gè)數(shù)并輸出大者比較兩個(gè)數(shù)并輸出大者main() float a,b; int t; scanf(%f,%f,&a,&b); t=max(a,b); /函數(shù)調(diào)用函數(shù)調(diào)用 printf(Max is %dn,t);max(float x, float y)/函數(shù)定義函數(shù)定義 float z; z=xy?x:y; return(z);三

8、個(gè)數(shù)最大值的問題:三個(gè)數(shù)最大值的問題: t=max(a,max(b,c);函數(shù)調(diào)用機(jī)制(參數(shù)及其傳遞方式)函數(shù)調(diào)用機(jī)制(參數(shù)及其傳遞方式)v實(shí)際參數(shù):調(diào)用函數(shù)時(shí)函數(shù)名后面括號(hào)中的表達(dá)式實(shí)際參數(shù):調(diào)用函數(shù)時(shí)函數(shù)名后面括號(hào)中的表達(dá)式v形式參數(shù):定義函數(shù)時(shí)函數(shù)名后面括號(hào)中的變量名形式參數(shù):定義函數(shù)時(shí)函數(shù)名后面括號(hào)中的變量名c=max(a,b);(main 函數(shù))函數(shù))(max 函數(shù))函數(shù))max(int x, int y) int z; z=xy?x:y; return(z); main() int a,b,t; int max(int, int); scanf(%d,%d,&a,&b); t=ma

9、x(a,b); printf(Max is %d,t);max(int x, int y) int z; z=xy?x:y; return(z);形參形參實(shí)參實(shí)參實(shí)參必須有確定的值實(shí)參必須有確定的值形參必須指定類型形參必須指定類型形參與實(shí)參形參與實(shí)參類型一致,個(gè)數(shù)相同類型一致,個(gè)數(shù)相同若形參與實(shí)參類型不一致,自動(dòng)按形參類型轉(zhuǎn)換若形參與實(shí)參類型不一致,自動(dòng)按形參類型轉(zhuǎn)換函數(shù)調(diào)用轉(zhuǎn)換函數(shù)調(diào)用轉(zhuǎn)換形參在函數(shù)被調(diào)用前不占內(nèi)存形參在函數(shù)被調(diào)用前不占內(nèi)存;函數(shù)調(diào)用時(shí)為形參分函數(shù)調(diào)用時(shí)為形參分配內(nèi)存;調(diào)用結(jié)束,內(nèi)存釋放配內(nèi)存;調(diào)用結(jié)束,內(nèi)存釋放,實(shí)參單元仍保留并維,實(shí)參單元仍保留并維持原值。也就是說,形參與

10、實(shí)參占用持原值。也就是說,形參與實(shí)參占用不同不同的內(nèi)存單的內(nèi)存單元元單向單向傳遞值傳遞傳遞值傳遞例 計(jì)算x的立方#include float cube(float x) return(x*x*x);main() float a, product; printf(Please input value of a:); scanf(%f,&a); product=cube(a); printf(”Cube of %.4f is %.4fn,a,product);xaproduct1.21.21.728 printstar() printf(*);main() int a; a=printstar()

11、; printf(%dn,a);例例 函數(shù)帶回不確定值函數(shù)帶回不確定值輸出:輸出:10void printstar() printf(*);main() int a; a=printstar(); printf(%dn,a);編譯錯(cuò)誤!編譯錯(cuò)誤!#include stdio.hint f(int a, int b) int c; if(ab) c=1; else if(a=b) c=0; else c=-1; return(c);main() int i=2,p; p=f(i,+i); printf(%dn,p);例例 參數(shù)求值順序參數(shù)求值順序#include stdio.hint f(int

12、 a, int b) int c; if(ab) c=1; else if(a=b) c=0; else c=-1; return(c);main() int i=2,p; p=f(i, i+); printf(%dn,p);運(yùn)行結(jié)果:運(yùn)行結(jié)果:0運(yùn)行結(jié)果:運(yùn)行結(jié)果:1對被調(diào)用函數(shù)要求:對被調(diào)用函數(shù)要求:必須是已存在的函數(shù)必須是已存在的函數(shù)庫函數(shù)庫函數(shù): #include 用戶自定義函數(shù)用戶自定義函數(shù): 函數(shù)類型說明函數(shù)類型說明要求使用函數(shù)之前做要求使用函數(shù)之前做函數(shù)說明函數(shù)說明一般形式:一般形式: 函數(shù)類型函數(shù)類型 函數(shù)名函數(shù)名(形參類型形參類型 形參形參名名,. );作用:告訴編譯系統(tǒng)作用

13、:告訴編譯系統(tǒng)函數(shù)類型、參數(shù)個(gè)數(shù)及類型,以便函數(shù)類型、參數(shù)個(gè)數(shù)及類型,以便檢驗(yàn)檢驗(yàn)函數(shù)說明位置:函數(shù)說明位置:程序的數(shù)據(jù)說明部分(函數(shù)內(nèi)或外)程序的數(shù)據(jù)說明部分(函數(shù)內(nèi)或外)下列情況下,可不作函數(shù)說明下列情況下,可不作函數(shù)說明v若函數(shù)返值是若函數(shù)返值是char或或int型型,系統(tǒng)自動(dòng)按,系統(tǒng)自動(dòng)按int型處理型處理v被調(diào)用函數(shù)定義出現(xiàn)在主調(diào)函數(shù)之前被調(diào)用函數(shù)定義出現(xiàn)在主調(diào)函數(shù)之前例例 函數(shù)說明舉例函數(shù)說明舉例main() float a,b; int c; scanf(%f,%f,&a,&b); c=max(a,b); printf(Max is %dn,c);max(float x, flo

14、at y) float z; z=xy?x:y; return(z);int型函數(shù)可不作函數(shù)說明型函數(shù)可不作函數(shù)說明(VC+不行)不行)/*/float add(float x, float y) float z; z=x+y; return(z);main() float a,b,c; scanf(%f,%f,&a,&b); c=add(a,b); printf(sum is %f,c);被調(diào)函數(shù)出現(xiàn)在主調(diào)函數(shù)被調(diào)函數(shù)出現(xiàn)在主調(diào)函數(shù)之前,不必函數(shù)說明之前,不必函數(shù)說明main() float add(float,float); /*function declaration*/ float a

15、,b,c; scanf(%f,%f,&a,&b); c=add(a,b); printf(sum is %f,c);float add(float x, float y) float z; z=x+y; return(z);float add();711x:y:調(diào)用前:調(diào)用前:調(diào)用結(jié)束:調(diào)用結(jié)束:711x:y:例例 值傳遞舉例:交換兩個(gè)數(shù)值傳遞舉例:交換兩個(gè)數(shù)/*swap a pair number*/#include main() int x=7,y=11; int swap(int, int); printf(x=%d,ty=%dn,x,y); printf(swapped:n); swa

16、p(x,y); printf(x=%d,ty=%dn,x,y);swap(int a,int b) int temp; temp=a; a=b; b=temp;調(diào)用:調(diào)用:711a:b:711x:y:swap:711x:y:117a:b:temp/*call by address*/swap(int *p1,int *p2) int p; p=*p1; *p1=*p2; *p2=p;main() int a,b; int swap(int *, int *); scanf(%d,%d,&a,&b); printf(“a=%d,b=%dn”,a,b); printf(“swapped:n”);

17、swap(&a,&b); printf(”a=%d,b=%dn,a,b);例例 交換兩個(gè)數(shù)交換兩個(gè)數(shù)a59b調(diào)前:調(diào)前:a59b調(diào)調(diào)swap:p1&a&bp2a95b交換:交換:p1&a&bp2a95b返回:返回:傳遞數(shù)組給函數(shù)傳遞數(shù)組給函數(shù)v數(shù)組元素作函數(shù)實(shí)參數(shù)組元素作函數(shù)實(shí)參值傳遞值傳遞例例 兩個(gè)數(shù)組大小比較兩個(gè)數(shù)組大小比較432105a562312107688432105b212343986654n=0m=0k=0in=0m=0k=1in=0m=1k=1in=1m=1k=1in=1m=1k=2in=2m=1k=2in=3m=1k=2a a和和b b為有為有1010個(gè)元素的整型數(shù)組個(gè)元素的

18、整型數(shù)組比較兩數(shù)組對應(yīng)元素比較兩數(shù)組對應(yīng)元素變量變量n,m,kn,m,k記錄記錄aibi, ai=bi,aibi, ai=bi,aibiaik,nk,認(rèn)為數(shù)組認(rèn)為數(shù)組abab 若若nk,nk,認(rèn)為數(shù)組認(rèn)為數(shù)組abab 若若n=k,n=k,認(rèn)為數(shù)組認(rèn)為數(shù)組a=ba=b#include main() int a10,b10,i,n=0,m=0,k=0; int large(int ,int); printf(Enter array a:n); for(i=0;i10;i+)scanf(%d,&ai); printf(Enter array b:n); for(i=0;i10;i+)scanf(%d

19、,&bi); for(i=0;iy) flag=1; else if(xy) flag=-1; else flag=0; return(flag);v數(shù)組名作函數(shù)參數(shù)數(shù)組名作函數(shù)參數(shù)地址傳遞地址傳遞形參數(shù)組大小形參數(shù)組大小(多維數(shù)組第一維多維數(shù)組第一維)可不指定。常用方法可不指定。常用方法是用另一參數(shù)傳遞數(shù)組長度是用另一參數(shù)傳遞數(shù)組長度形參數(shù)組名是形參數(shù)組名是地址變量地址變量例例 求學(xué)生的平均成績求學(xué)生的平均成績 #include float average(int , int); void main() int score10, i; float av; printf(Input 10 sc

20、ores:n); for( i=0; i10; i+ ) scanf(%d, &scorei); av=average(score,10); printf(Average is:%.2f, av); float average(int stu10, int n) int i; float av,total=0; for( i=0; in; i+ ) total += stui; av = total/n; return av; 實(shí)參用數(shù)組名實(shí)參用數(shù)組名形參用數(shù)組定義形參用數(shù)組定義, int stu .2109score562312.88stu例例 數(shù)組元素與數(shù)組元素與 數(shù)組名數(shù)組名 作函數(shù)參數(shù)

21、比較作函數(shù)參數(shù)比較12a調(diào)用前調(diào)用前a0a112a調(diào)用調(diào)用a0a112xy21xy交換交換12a返回返回#include void swap2(int x,int y) int z; z=x; x=y; y=z;main() int a2=1,2; void swap2(int, int); swap2(a0,a1); printf(a0=%dna1=%dn,a0,a1);值傳遞值傳遞12a調(diào)用前調(diào)用前12ax調(diào)用調(diào)用21ax交換交換21a返回返回#include void swap2(int x) int z; z=x0; x0=x1; x1=z;main() int a2=1,2; voi

22、d swap2(int ); swap2(a); printf(a0=%dna1=%dn,a0,a1);數(shù)組首地址數(shù)組首地址傳遞傳遞例例 數(shù)組元素與數(shù)組元素與 數(shù)組名數(shù)組名 作函數(shù)參數(shù)比較作函數(shù)參數(shù)比較例例 數(shù)組排序數(shù)組排序-簡單選擇排序簡單選擇排序0123456789a4968573299927137688arraykjjjkjkjjjjj949i=0例例 數(shù)組排序數(shù)組排序-簡單選擇排序簡單選擇排序kjjkjkjjjjj0123456789a4968573299927137688array949kk1368i=10123456789a9132732495768768899arrayi=8例例

23、 數(shù)組排序數(shù)組排序-簡單選擇排序簡單選擇排序#include stdio.hvoid sort(int array,int n) int i,j,k,t; for(i=0;in-1;i+) k=i; for(j=i+1;jn;j+) if(arrayjarrayk) k=j; if(k!=i) t=arrayi; arrayi=arrayk; arrayk=t; main() int a10,i; void sort(int ,int); for(i=0;i10;i+)scanf(%d,&ai); sort(a,10); for(i=0;i10;i+) printf(%d ,ai); prin

24、tf(n);例例 求二維數(shù)組中最大元素值求二維數(shù)組中最大元素值1 3 5 72 4 6 815 17 34 12ijmax=11 3 5 72 4 6 815 17 34 12ijmax=31 3 5 72 4 6 815 17 34 12ijmax=5j1 3 5 72 4 6 815 17 34 12imax=7j1 3 5 72 4 6 815 17 34 12imax=7j1 3 5 72 4 6 815 17 34 12imax=34#include stdio.hint max_value(int array34) int i,j,k,max; max=array00; for(i

25、=0;i3;i+) for(j=0;jmax) max=arrayij; return(max);main() int a34=1,3,5,7, 2,4,6,8,15,17,34,12; int max_value(int 4); printf(max value is %dn,max_value(a);按按ANSI C,多維形參數(shù)組第一維維數(shù),多維形參數(shù)組第一維維數(shù)可省略,第二維必須相同可省略,第二維必須相同 int array 4在在VC+中,要求用二級(jí)指針中,要求用二級(jí)指針例例 求二維數(shù)組中各行元素之和求二維數(shù)組中各行元素之和#include stdio.hget_sum_row(int

26、 x3, int result ,int row, int col) int i,j; for(i=0;irow;i+) resulti=0;for(j=0;jcol;j+) resulti+=xij; main() int a23=3,6,9,1,4,7; int sum_row2,row=2,col=3,i; get_sum_row(a,sum_row,row,col); for(i=0;irow;i+) printf(The sum of row%d=%dn,i+1,sum_rowi);314679asum_rowxresult1812v8.3 8.3 函數(shù)的嵌套與遞歸調(diào)用函數(shù)的嵌套與遞

27、歸調(diào)用嵌套調(diào)用嵌套調(diào)用 p271C規(guī)定:規(guī)定:函數(shù)定義不可嵌套函數(shù)定義不可嵌套,但,但可以嵌套調(diào)用可以嵌套調(diào)用函數(shù)函數(shù)main( )調(diào)用函數(shù)調(diào)用函數(shù)a結(jié)束結(jié)束a函數(shù)函數(shù)b函數(shù)函數(shù)調(diào)用函數(shù)調(diào)用函數(shù)b例例 求三個(gè)數(shù)中最大數(shù)和最小數(shù)的差值求三個(gè)數(shù)中最大數(shù)和最小數(shù)的差值#include void main() int a,b,c,d; int dif(int ,int ,int ); scanf(%d%d%d,&a,&b,&c); d=dif(a,b,c); printf(Max-Min=%dn,d); int dif(int x,int y,int z) int max(int ,int ,int

28、); int min(int ,int ,int ); return max(x,y,z)-min(x,y,z); 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) int r; r=xy?x:y; return(rz?r:z); main( )調(diào)用函數(shù)調(diào)用函數(shù)dif輸出輸出結(jié)束結(jié)束dif函數(shù)函數(shù)max函數(shù)函數(shù)調(diào)用函數(shù)調(diào)用函數(shù)max調(diào)用函數(shù)調(diào)用函數(shù)minmin函數(shù)函數(shù)例例 用弦截法求方程根用弦截法求方程根08016523xxxxyf(x)0 x1x2xf(x1)f(x2)

29、()()()(121221xfxfxfxxfxx求求f(x1)與與f(x2)連線與連線與x軸的交點(diǎn)軸的交點(diǎn)x輸入輸入x1,x2,求求f(x1),f(x2)直到直到f(x1)與與f(x2)異號(hào)異號(hào)y=f(x),y1=f(x1)y與與y1同號(hào)同號(hào)真真假假x1=xx2=x直到直到 |y|=0; ) printf(Input x1,x2:n); scanf(%f%f,&x1,&x2); f1=f(x1); f2=f(x2);運(yùn)行情況:運(yùn)行情況:Input x1,x2:2 6 A root of equation is 5.0000main( )調(diào)用函數(shù)調(diào)用函數(shù)root輸出根輸出根 x結(jié)束結(jié)束root函

30、數(shù)函數(shù)xpoint函數(shù)函數(shù)調(diào)用函數(shù)調(diào)用函數(shù)xpoint調(diào)用函數(shù)調(diào)用函數(shù)ff函數(shù)函數(shù)/直線直線與與x軸的交點(diǎn)軸的交點(diǎn)xfloat xpoint(float x1,float x2) float y; y=(x1*f(x2)-x2*f(x1)/(f(x2)-f(x1); return(y);(x, y)122122xxxxxfxfyxf)()()(令令y=0, 即得即得與與x軸的交點(diǎn)軸的交點(diǎn)x遞歸調(diào)用遞歸調(diào)用 p272v定義:函數(shù)直接或間接的調(diào)用自身叫函數(shù)的遞歸調(diào)用定義:函數(shù)直接或間接的調(diào)用自身叫函數(shù)的遞歸調(diào)用f( )調(diào)調(diào)f調(diào)調(diào)f2調(diào)調(diào)f1f1( )f2( )int f(int x) int y,

31、z; z=f(y); . return(2*z);int f1(int x) int y,z; z=f2(y); . return(2*z);int f2(int t) int a,c; c=f1(a); . return(3+c);例例 求求n的階乘的階乘)()!(),(!11101nnnnn/*factorial*/#include int fac(int n) int f; if(n0) printf(n%cn,getone,putone); void hanoi(int n,char one,char two,char three) if(n=1) move(one,three); e

32、lse hanoi(n-1,one,three,two);move(one,three);hanoi(n-1,two,one,three); main() int m; printf(Input the number of disks:); scanf(%d,&m); printf(The steps to moving %3d disks:n,m); hanoi(m,A,B,C);ABCC編譯系統(tǒng)對遞歸函數(shù)的自調(diào)用次數(shù)沒編譯系統(tǒng)對遞歸函數(shù)的自調(diào)用次數(shù)沒有限制有限制每調(diào)用函數(shù)一次,在內(nèi)存堆棧區(qū)分配空每調(diào)用函數(shù)一次,在內(nèi)存堆棧區(qū)分配空間,用于存放函數(shù)變量、返回值等信息,間,用于存放函數(shù)變量、返回

33、值等信息,所以遞歸次數(shù)過多,可能引起堆棧溢出所以遞歸次數(shù)過多,可能引起堆棧溢出v6.4 變量的存儲(chǔ)屬性變量的存儲(chǔ)屬性 p279概述概述v變量是對程序中數(shù)據(jù)的存儲(chǔ)空間的抽象變量是對程序中數(shù)據(jù)的存儲(chǔ)空間的抽象main() int a; a=10; printf(“%d”,a);編譯或函數(shù)調(diào)用時(shí)為其分配內(nèi)存單元編譯或函數(shù)調(diào)用時(shí)為其分配內(nèi)存單元.10局部變量局部變量v局部變量局部變量-內(nèi)部變量內(nèi)部變量規(guī)則:規(guī)則:在函數(shù)內(nèi)定義在函數(shù)內(nèi)定義,只在本函數(shù)內(nèi)有效只在本函數(shù)內(nèi)有效不同函數(shù)中同名變量,占不同內(nèi)存單元。形不同函數(shù)中同名變量,占不同內(nèi)存單元。形參屬于局部變量參屬于局部變量#include stdio.

34、hmain() int a,b; int sub(); a=3; b=4; printf(main:a=%d,b=%dn,a,b); sub(); printf(main:a=%d,b=%dn,a,b);sub() int a,b; a=6; b=7; printf(sub:a=%d,b=%dn,a,b);v局部變量可用存儲(chǔ)類型:局部變量可用存儲(chǔ)類型: auto(默認(rèn))(默認(rèn)) register staticv可定義在復(fù)合語句中有效的變量可定義在復(fù)合語句中有效的變量#include stdio.h#define N 5main() int i; int aN=1,2,3,4,5; for(i=

35、0;iN/2;i+) int temp;temp=ai;ai=aN-i-1;aN-i-1=temp; for(i=0;iN;i+) printf(%d ,ai);#include main() void increment(void); increment(); increment(); increment();void increment(void) int x=0; x+; printf(“%dn”,x);例例 觀察局部靜態(tài)變量觀察局部靜態(tài)變量運(yùn)行結(jié)果:運(yùn)行結(jié)果:1 1 1#include main() void increment(void); increment(); incremen

36、t(); increment();void increment(void) static int x=0; x+; printf(“%dn”,x);運(yùn)行結(jié)果:1 2 3全局變量全局變量/外部變量外部變量規(guī)則:在函數(shù)外定義,可為本文件所有函規(guī)則:在函數(shù)外定義,可為本文件所有函數(shù)共用??捎么鎯?chǔ)類型:數(shù)共用??捎么鎯?chǔ)類型: 缺省缺省 或或 static有效范圍:有效范圍: 從定義變量的位置開始到本源文件結(jié)束,從定義變量的位置開始到本源文件結(jié)束,及有及有extern聲聲明的其它源文件明的其它源文件 當(dāng)外部變量與局部變量同名時(shí),外部變量當(dāng)外部變量與局部變量同名時(shí),外部變量被屏蔽被屏蔽#include s

37、tdio.hfloat max,min;float average(float array, int n) int i; float sum=array0; max=min=array0; for(i=1;imax) max=arrayi; else if(arrayiy?x:y; return(z);#include stdio.hmain() extern int a,b; int max(int,int); printf(max=%dn,max(a,b);int a=13,b=-8;extern int a,b;int max() int z; z=ab?a:b; return(z);#

38、include stdio.hmain() printf(max=%d,max();int a=13,b=-8; 定義定義 聲明聲明u次數(shù):次數(shù): 只能只能1次次 可說明多次可說明多次u位置:位置: 所有函數(shù)之外所有函數(shù)之外 函數(shù)內(nèi)或函數(shù)外函數(shù)內(nèi)或函數(shù)外u內(nèi)存:內(nèi)存: 分配內(nèi)存分配內(nèi)存 不分配內(nèi)存不分配內(nèi)存 可初始化可初始化 不可初始化不可初始化外部變量定義與聲明的區(qū)別:外部變量定義與聲明的區(qū)別:1應(yīng)盡量少使用全局變量應(yīng)盡量少使用全局變量#include stdio.hint a=3,b=5;max(int a, int b) int c; c=ab?a:b; return(c);main()

39、 int a=8; printf(max=%dn,max(a,b);例例 外部變量被局部變量屏蔽外部變量被局部變量屏蔽 回顧第四章求定積分的例題,其算法如下:回顧第四章求定積分的例題,其算法如下: 例例p292 One method of calculating the area under a curve is to divide to the area into a number of trapezoids of same width and summing up the area of individual trapezoids. The area of a trapezoid is g

40、iven by area=0.5*(h1+h2)*b; f(x) is the function of curve, h1=f(x1);h2=f(x2); 現(xiàn)在我們把算法分為兩個(gè)模塊:初始化現(xiàn)在我們把算法分為兩個(gè)模塊:初始化a,b,梯形個(gè)數(shù);求梯形個(gè)數(shù);求梯形面積總和梯形面積總和0yxa a+ha+iha+(i+1)hbf(x)dxxxfba24)(存儲(chǔ)方式和生存期存儲(chǔ)方式和生存期v存儲(chǔ)方式存儲(chǔ)方式靜態(tài)存儲(chǔ):程序運(yùn)行期間分配固定存儲(chǔ)空間靜態(tài)存儲(chǔ):程序運(yùn)行期間分配固定存儲(chǔ)空間動(dòng)態(tài)存儲(chǔ):運(yùn)行期間根據(jù)需要?jiǎng)討B(tài)分配存儲(chǔ)空間動(dòng)態(tài)存儲(chǔ):運(yùn)行期間根據(jù)需要?jiǎng)討B(tài)分配存儲(chǔ)空間v內(nèi)存區(qū)內(nèi)存區(qū)程序區(qū)程序區(qū)靜態(tài)存儲(chǔ)區(qū)靜

41、態(tài)存儲(chǔ)區(qū)動(dòng)態(tài)存儲(chǔ)區(qū)動(dòng)態(tài)存儲(chǔ)區(qū)全局變量、局部靜態(tài)變量全局變量、局部靜態(tài)變量形參變量形參變量局部動(dòng)態(tài)變量(局部動(dòng)態(tài)變量(auto register)函數(shù)調(diào)用現(xiàn)場保護(hù)和返回地址等函數(shù)調(diào)用現(xiàn)場保護(hù)和返回地址等v生存期生存期靜態(tài)變量靜態(tài)變量:從程序開始執(zhí)行到程序結(jié)束從程序開始執(zhí)行到程序結(jié)束動(dòng)態(tài)變量動(dòng)態(tài)變量:從包含該變量定義的函數(shù)從包含該變量定義的函數(shù)/復(fù)合語句至函復(fù)合語句至函數(shù)數(shù)/復(fù)合語句結(jié)束復(fù)合語句結(jié)束變量存儲(chǔ)類型變量存儲(chǔ)類型靜態(tài)靜態(tài)動(dòng)態(tài)動(dòng)態(tài)存儲(chǔ)方式存儲(chǔ)方式程序整個(gè)運(yùn)行期間程序整個(gè)運(yùn)行期間函數(shù)調(diào)用開始至結(jié)束函數(shù)調(diào)用開始至結(jié)束生存期生存期編譯時(shí)賦初值,編譯時(shí)賦初值,只賦一次只賦一次每次函數(shù)調(diào)用時(shí)每次函數(shù)調(diào)用時(shí)賦初值賦初值自動(dòng)賦初值自動(dòng)賦初值0或空字符或空字符不確定不確定未賦初值未賦初值靜態(tài)存儲(chǔ)區(qū)靜態(tài)存儲(chǔ)區(qū)動(dòng)態(tài)區(qū)動(dòng)態(tài)區(qū)存儲(chǔ)區(qū)存儲(chǔ)區(qū)寄存器寄存器局部變量局部變量外部變量外部變量作用域作用域定義變量的函數(shù)或復(fù)合語句內(nèi)定義變量的函數(shù)或復(fù)合語句內(nèi)本文件本文件其它文件其它文件registe

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論