




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第一講練習(xí)1第二講練習(xí)2第五章 函數(shù)5.1 概述結(jié)構(gòu)化程序設(shè)計(jì)v基本思想:將一個(gè)大的程序按功能分割成一些小模塊,v特點(diǎn):l各模塊相對(duì)獨(dú)立、功能單一、結(jié)構(gòu)清晰、接口簡(jiǎn)單l控制了程序設(shè)計(jì)的復(fù)雜性l提高元件的可靠性l縮短開(kāi)發(fā)周期l避免程序開(kāi)發(fā)的重復(fù)勞動(dòng)l易于維護(hù)和功能擴(kuò)充v開(kāi)發(fā)方法: 自上向下,逐步分解,分而治之C是結(jié)構(gòu)化程序設(shè)計(jì)語(yǔ)言源程序文件1預(yù)編譯命令說(shuō)明部分執(zhí)行部分函數(shù)1函數(shù)n源程序文件i源程序文件nC程序C程序結(jié)構(gòu)&C是函數(shù)式語(yǔ)言&必須有且只能有一個(gè)名為main的主函數(shù)&C程序的執(zhí)行總是從main函數(shù)開(kāi)始,在main中結(jié)束&函數(shù)不能嵌套定義,可以嵌套調(diào)用函數(shù)分
2、類v從用戶角度l 標(biāo)準(zhǔn)函數(shù)(庫(kù)函數(shù)):由系統(tǒng)提供l 用戶自定義函數(shù)使用庫(kù)函數(shù)應(yīng)注意:1、函數(shù)功能2、函數(shù)參數(shù)的數(shù)目和順序,及各參數(shù)意義和類型3、函數(shù)返回值意義和類型4、需要使用的包含文件Ch7_201.cP.288.v從函數(shù)形式l無(wú)參函數(shù)l有參函數(shù)5.2 函數(shù)的定義main () int a,b; a=1;b=2; a=2;b=3; if(a=b) printf(”max=%dn”,a);else printf(”max=%dn”,b);輸出為:max=2輸出為:max=3if(a=b) printf(”max=%dn”,a);else printf(”max=%dn”,b);無(wú)返回值的函數(shù)m
3、ain () int a,b; a=1;b=2; a=2;b=3; if(a=b) printf(”max=%dn”,a);else printf(”max=%dn”,b);if(a=b) printf(”max=%dn”,a);else printf(”max=%dn”,b);if(a=b) printf(”max=%dn”,a);else printf(”max=%dn”,b);maxmaxmax( a, b)intint無(wú)返回值的函數(shù)main() int a,b; a=1;b=2; a=2;b=3; if(a=b) printf(”max=%dn”,a);else printf(”max
4、=%dn”,b);maxmaxmax( a, b)intint(a,b);(a,b);輸出為:max=2輸出為:max=3有返回值的函數(shù)main() int a,b; a=1;b=2; a=2;b=3; if(a=b) printf(”max=%dn”,a);return(a);else printf(”max=%dn”,b);return(b);maxmaxmax( a, b)intint(a,b);(a,b);有返回值的函數(shù)main() int a,b;int c; a=1;b=2; c=2*max(a,b); a=2;b=3; c=2*max(a,b); c=2*2=4c=2*3=6c=
5、max(a,b);c=2c=max(a,b);c=3if(a=b) printf(”max=%dn”,a);return(a);else printf(”max=%dn”,b);return(b);max ( a, b)intint5.2 函數(shù)的定義一般格式合法標(biāo)識(shí)符函數(shù)返回值類型缺省int型無(wú)返回值void函數(shù)體函數(shù)類型 函數(shù)名(形參類型說(shuō)明表)說(shuō)明部分語(yǔ)句部分 例 空函數(shù) dummy( ) 函數(shù)體為空例 無(wú)參函數(shù) printstar( ) printf(“*n”); 或 printstar(void ) printf(“*n”); 例 有參函數(shù) int max(int x,int y) i
6、nt z; z=xy?x:y; return(z); 函數(shù)頭部5.3 函數(shù)的返回值返回語(yǔ)句v形式: return(表達(dá)式); 或 return 表達(dá)式; 或 return;v功能:使程序控制從被調(diào)用函數(shù)返回到調(diào)用函數(shù)中,同時(shí)把返值(表達(dá)式的值)帶給調(diào)用函數(shù)v說(shuō)明:l函數(shù)中可有多個(gè)return語(yǔ)句l若無(wú)return語(yǔ)句,遇時(shí),自動(dòng)返回調(diào)用函數(shù)l對(duì)于基本類型,若函數(shù)類型與return語(yǔ)句中表達(dá)式值的類型不一致,按前者為準(zhǔn),自動(dòng)轉(zhuǎn)換-函數(shù)調(diào)用轉(zhuǎn)換lvoid型函數(shù)例 無(wú)返回值函數(shù) void swap(int x,int y ) int temp; temp=x; x=y; y=temp; 例 無(wú)返回值
7、函數(shù) void max(int a,int b ) if(a=b) printf(”max=%dn”,a); else printf(”max=%dn”,b); 5.4 函數(shù)的調(diào)用調(diào)用形式 函數(shù)名(實(shí)參表);說(shuō)明:l實(shí)參與形參個(gè)數(shù)相等,類型一致,按順序一一對(duì)應(yīng)l實(shí)參表求值順序,因系統(tǒng)而定(Turbo C 自右向左)調(diào)用方式v函數(shù)語(yǔ)句:無(wú)返回值的函數(shù)只能使用此種方式 例 printstar(); max(a,b); printf(“Hello,World!n”);v函數(shù)表達(dá)式:有返回值的函數(shù) 例 m=max(a,b)*2; printf(“%d”,max(a,b); m=max(a,max(b,
8、c);函數(shù)說(shuō)明v對(duì)被調(diào)用函數(shù)要求:l必須是已存在的函數(shù) 庫(kù)函數(shù): #include 用戶自定義函數(shù): 函數(shù)類型說(shuō)明v函數(shù)說(shuō)明l一般形式: 函數(shù)類型 函數(shù)名(形參類型 形參名,. ); 或 函數(shù)類型 函數(shù)名();l作用:告訴編譯系統(tǒng)函數(shù)類型、參數(shù)個(gè)數(shù)及類型,以便檢驗(yàn)l函數(shù)定義與函數(shù)說(shuō)明不同l若被調(diào)用函數(shù)定義出現(xiàn)在主調(diào)函數(shù)之前,可不作函數(shù)說(shuō)明; 若不說(shuō)明,則會(huì)把第一次遇到的該函數(shù)形式(函數(shù)定義或函數(shù)調(diào)用)作為函數(shù)的說(shuō)明,并將函數(shù)類型默認(rèn)為 int 型l有些系統(tǒng)(如Borland C+)要求函數(shù)說(shuō)明指出函數(shù)返值類型和形參類型,并且對(duì)void 和 int 型函數(shù)也要進(jìn)行函數(shù)說(shuō)明例 函數(shù)說(shuō)明舉例/*ch
9、7_5.c*/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ù)之前,不必函數(shù)說(shuō)明/*ch7_5.c*/void main(void) float add(float,float); /*function declaration*/ float a,b,c; scanf(%f,%f,&a,&b); c=add(a,b); printf(
10、sum is %f,c);float add(float x, float y) float z; z=x+y; return(z);5.5 函數(shù)參數(shù)及其傳遞方式形參與實(shí)參v形式參數(shù):定義函數(shù)時(shí)函數(shù)名后面括號(hào)中的變量名v實(shí)際參數(shù):調(diào)用函數(shù)時(shí)函數(shù)名后面括號(hào)中的表達(dá)式 c=max(a,b); (main 函數(shù)) (max 函數(shù))int max(int x, int y) int z; z=xy?x:y; return(z); 例 比較兩個(gè)數(shù)并輸出大者int max(int x, int y) int z; z=xy?x:y; return(z);void main(void) int a,b,c;
11、 scanf(%d,%d,&a,&b); c=max(a,b); printf(Max is %d,c);形參實(shí)參v說(shuō)明:l實(shí)參必須有確定的值l形參必須指定類型l形參與實(shí)參類型一致,個(gè)數(shù)相同l若形參與實(shí)參類型不一致,自動(dòng)按形參類型轉(zhuǎn)換函數(shù)調(diào)用轉(zhuǎn)換l形參在函數(shù)被調(diào)用前不占內(nèi)存;函數(shù)調(diào)用時(shí)為形參分配內(nèi)存;調(diào)用結(jié)束,內(nèi)存釋放5.5 函數(shù)參數(shù)及其傳遞方式形參與實(shí)參v形式參數(shù):定義函數(shù)時(shí)函數(shù)名后面括號(hào)中的變量名v實(shí)際參數(shù):調(diào)用函數(shù)時(shí)函數(shù)名后面括號(hào)中的表達(dá)式函數(shù)調(diào)用的執(zhí)行過(guò)程:1、程序在執(zhí)行過(guò)程中一旦遇到一個(gè)函數(shù)調(diào)用,系統(tǒng)首先為每個(gè)形參分配一定數(shù)目的臨時(shí)存儲(chǔ)單元(存儲(chǔ)單元的字節(jié)數(shù)由參數(shù)的類
12、型決定);然后計(jì)算實(shí)參表達(dá)式的值,并將實(shí)參的值送到形參對(duì)應(yīng)的存儲(chǔ)單元中(實(shí)參與形參按位置對(duì)應(yīng));2、將執(zhí)行的控制轉(zhuǎn)移到被調(diào)用函數(shù)的第一個(gè)執(zhí)行語(yǔ)句處開(kāi)始執(zhí)行,直到函數(shù)體末尾或遇到一個(gè)return語(yǔ)句為止;3、當(dāng)執(zhí)行到函數(shù)體末尾或執(zhí)行return語(yǔ)句時(shí),如果函數(shù)有返回值,則將控制返回到調(diào)用點(diǎn)同時(shí)返回一個(gè)值,這個(gè)返回值就是函數(shù)調(diào)用表達(dá)式的值;否則只返回控制。另外,返回后,形參所占的臨時(shí)存儲(chǔ)單元被釋放??刂品祷氐秸{(diào)用函數(shù)之后,從函數(shù)調(diào)用點(diǎn)繼續(xù)向后執(zhí)行。例 計(jì)算x的立方#include float cube(float x) return(x*x*x);void main(void) float a,
13、product; printf(Please input value of a:); scanf(%f,&a); product=cube(a); printf(”Cube of %.4f is %.4fn,a,product);xaproduct28參數(shù)傳遞方式v值傳遞方式l方式:函數(shù)調(diào)用時(shí),為形參分配單元,并將實(shí)參的值復(fù)制到形參中;調(diào)用結(jié)束,形參單元被釋放,實(shí)參單元仍保留并維持原值l特點(diǎn):u形參與實(shí)參占用不同的內(nèi)存單元u單向傳遞void swap(int x,int y) int temp; temp=x; x=y; y=temp;void main(void)
14、int a=10,b=20; swap(a,b); printf(“a=%d,b=%dn,a,b);例 交換兩個(gè)變量的值.10變量a 變量b(main)20 變量temp 變量y 變量x(swap)101020 1020COPY目錄void swap(int x,int y) int temp; temp=x; x=y; y=temp;void main(void) int a=10,b=20; swap(a,b); printf(“a=%d,b=%dn,a,b);例 交換兩個(gè)變量的值.10變量a 變量b(main)20目錄運(yùn)行結(jié)果:a=10,b=20#include long sum(int
15、 a, int b); long factorial(int n);void main(void) int n1,n2; long a; scanf(%d,%d,&n1,&n2); a=sum(n1,n2); printf(a=%1d,a); long sum(int a,int b) long c1,c2; c1=factorial(a); c2=factorial(b); return(c1+c2); long factorial(int n) long rtn=1; int i; for(i=1;i=n;i+) rtn*=i; return(rtn); 文件包含編譯預(yù)處理
16、命令函數(shù)類型說(shuō)明函數(shù)調(diào)用函數(shù)調(diào)用函數(shù)返回值形參實(shí)參函數(shù)定義5.6 函數(shù)的嵌套與遞歸調(diào)用嵌套調(diào)用C規(guī)定:函數(shù)定義不可嵌套,但可以嵌套調(diào)用函數(shù)main( )調(diào)用函數(shù)a結(jié)束a函數(shù)b函數(shù)調(diào)用函數(shù)b例 求三個(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(void) int a,b,c,d; scanf(%d%d%d,&a,&b,&c); d=dif(a,b,c); printf(Max-Min=%dn
17、,d); Ch7_202.cint dif(int x,int y,int z) 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ù)dif輸出結(jié)束dif函數(shù)max函數(shù)調(diào)用函數(shù)max調(diào)用函數(shù)minmin函數(shù)遞歸調(diào)用v定義:函數(shù)直接或間接的調(diào)用自身叫函數(shù)的遞歸調(diào)用f( )調(diào)f調(diào)f2調(diào)f1f1( )f2( )v說(shuō)明lC編譯系統(tǒng)對(duì)遞歸
18、函數(shù)的自調(diào)用次數(shù)沒(méi)有限制l每調(diào)用函數(shù)一次,在內(nèi)存堆棧區(qū)分配空間,用于存放函數(shù)變量、返回值等信息,所以遞歸次數(shù)過(guò)多,可能引起堆棧溢出int f(int x) int y,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);遞歸函數(shù)的算法是遞推公式(或稱為遞歸定義)。數(shù)學(xué)上有很多計(jì)算方法使用的是遞推公式。例如,計(jì)算n的階乘的遞推公式: 1 ,n=0n!= n*(n-1)! ,n0計(jì)算m與n的最大公約數(shù)的遞推公式: m
19、,n=0gcd(m,n)= gcd(n,m%n) ,n0上述計(jì)算問(wèn)題都可以寫成遞歸函數(shù)。從以上遞推公式可見(jiàn),遞歸算法都有一個(gè)計(jì)算的初始條件,這個(gè)初始條件也是遞歸調(diào)用的結(jié)束條件。也就是說(shuō),遞歸函數(shù)必須有遞歸結(jié)束條件;否則遞歸過(guò)程將永不終止,即所謂的無(wú)窮遞歸。無(wú)窮遞歸的最后結(jié)果是使系統(tǒng)不能正常工作甚至“死機(jī)”。用遞歸法求用遞歸法求 n! 分析:分析: 4!=3!*43!=2!*3 2!=1!*2 float fac( int n) float f; if(n=0) f=1; else f=n*fac(n-1); return (f); n*(n-1)! ,n01 ,n=0n!=例例5.10 用遞歸
20、的方法求用遞歸的方法求n!#includeunsigned long fac( int n) unsigned long h; if (!n) h= 1; else h= n* fac(n-1); return(h); main( ) int n; unsigned long h; h=fac(3); printf(“%d!=%lu n”,n,h); 例例5.10 用遞歸的方法求用遞歸的方法求n!main( ) int n; unsigned long h; h=fac(3); printf(“%d!=%lu n”,n,h); unsigned long h; if (!n) h= 1; el
21、se h=3* fac(3-1); return(h);unsigned long h; if (!n) h= 1; else h= 2* fac(2-1); return(h);unsigned long h; if (!n) h= 1; else h=1* fac(1-1); return(h);unsigned long h; if (!n) h= 1; else h=n* fac(n-1); return(h);1!2!3!1用遞歸的方法打印#includefac( int n) if (!n) return 0; else fac(n-1); printf(“%d * ”,n); m
22、ain( ) fac(3);main( ) fac(3);if (!n) return 0; else fac(3-1); printf(“%d * ”,3); if (!n) return 0; else fac(2-1); printf(“%d * ”,2); unsigned long h; if (!n) return 0; else fac(1-1); printf(“%d * ”,1); if (!n) return 0; else fac(n-1); printf(“%d * ”,3); 1 * 2 * 3 * 遞歸方法一般既能用遞歸函數(shù)實(shí)現(xiàn)也能用循環(huán)實(shí)現(xiàn)。 遞歸函數(shù)使算法簡(jiǎn)化、
23、程序結(jié)構(gòu)緊湊、程序代碼簡(jiǎn)潔,但遞歸函數(shù)在存儲(chǔ)空間上和運(yùn)行速度上都不如循環(huán)效率高: 因?yàn)閳?zhí)行遞歸調(diào)用時(shí),每次調(diào)用都要把本次調(diào)用的參數(shù)和局部標(biāo)量的值保存到棧頂(稱為進(jìn)棧);每當(dāng)從下一層調(diào)用返回道上一層調(diào)用時(shí),又要從棧頂恢復(fù)本層調(diào)用原來(lái)的參數(shù)和局部變量的值(稱為退棧)。進(jìn)棧和退棧既需要開(kāi)銷存儲(chǔ)空間,也需要開(kāi)銷處理時(shí)間;此外,函數(shù)調(diào)用要執(zhí)行控制轉(zhuǎn)移,這也需要開(kāi)銷時(shí)間。 因此對(duì)于遞推方法,能用循環(huán)實(shí)現(xiàn)時(shí)最好不用遞歸函數(shù)。5.7 數(shù)組作為函數(shù)參數(shù)數(shù)組元素作函數(shù)實(shí)參值傳遞例 兩個(gè)數(shù)組大小比較432105a562312107688432105b212343986654n=0m=0k=0in=0m=0k=1in
24、=0m=1k=1in=1m=1k=1in=1m=1k=2in=2m=1k=2in=3m=1k=2a和b為有10個(gè)元素的整型數(shù)組比較兩數(shù)組對(duì)應(yīng)元素變量n,m,k記錄aibi, ai=bi,aik,認(rèn)為數(shù)組ab 若nk,認(rèn)為數(shù)組ab 若n=k,認(rèn)為數(shù)組a=b#include main() int a10,b10,i,n=0,m=0,k=0; 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,&bi); for(i=0;iy)
25、flag=1; else if(xy) flag=-1; else flag=0; return(flag);數(shù)組名作函數(shù)參數(shù)v地址傳遞v在主調(diào)函數(shù)與被調(diào)函數(shù)分別定義數(shù)組,且類型應(yīng)一致v形參數(shù)組大小(多維數(shù)組第一維)可不指定v形參數(shù)組名是地址變量例 求學(xué)生的平均成績(jī) #include float average(int stu10, int n); void main() int score10, i; float av; printf(Input 10 scores:n); for( i=0; i10; i+ ) scanf(%d, &scorei); av=average(scor
26、e,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ù)組定義, int stu .2109score562312.88stu例 數(shù)組元素與 數(shù)組名 作函數(shù)參數(shù)比較12a調(diào)用前a0a112a調(diào)用a0a112xy21xy交換12a返回#include void swap2(int x,int y) int z; z=x; x=y;
27、y=z;main() int a2=1,2; swap2(a0,a1); printf(a0=%dna1=%dn,a0,a1);值傳遞12a調(diào)用前12ax調(diào)用21ax交換21a返回#include void swap2(int x) int z; z=x0; x0=x1; x1=z;main() int a2=1,2; swap2(a); printf(a0=%dna1=%dn,a0,a1);地址傳遞例 數(shù)組元素與 數(shù)組名 作函數(shù)參數(shù)比較例 數(shù)組排序-簡(jiǎn)單選擇排序void sort(int array,int n) int i,j,k,t; for(i=0;in-1;i+) k=i; for(
28、j=i+1;jn;j+) if(arrayjarrayk) k=j; if(k!=i) t=arrayi; arrayi=arrayk; arrayk=t; main() int a10,i; for(i=0;i10;i+)scanf(%d,&ai); sort(a,10); for(i=0;i10;i+) printf(%d ,ai); printf(n);0123456789a4968573299927137688arraykjjjkjkjjjjj949i=0例 數(shù)組排序-簡(jiǎn)單選擇排序void sort(int array,int n) int i,j,k,t; for(i=0;i
29、n-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; for(i=0;i10;i+)scanf(%d,&ai); sort(a,10); for(i=0;i10;i+) printf(%d ,ai); printf(n);kjjkjkjjjjj0123456789a4968573299927137688array949kk1368i=10123456789a9132732495768768899arrayi=8例
30、數(shù)組排序-簡(jiǎn)單選擇排序void 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; for(i=0;i10;i+)scanf(%d,&ai); sort(a,10); for(i=0;i10;i+) printf(%d ,ai); printf(n);例 求二維數(shù)組中最大元素值1 3 5 72 4 6 815 17 34 12
31、ijmax=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=34int max_value(int array34) int i,j,k,max; max=array00; for(i=0;i3;i+) for(j=0;jmax) max=arrayij; return(max);main() int a34=1,3,5,7,
32、 2,4,6,8,15,17,34,12; printf(max value is %dn,max_value(a);多維形參數(shù)組第一維維數(shù)可省略,第二維必須相同 int array4例 求二維數(shù)組中各行元素之和get_sum_row(int 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
33、,row,col); for(i=0;irow;i+) printf(The sum of row%d=%dn,i+1,sum_rowi);314679asum_rowxresult1812上機(jī)練習(xí)1:1.請(qǐng)將教材 P.69. 例 3.3 的最后三句定義成函數(shù)實(shí)現(xiàn)2.匯編7.22,添加主函數(shù),在主函數(shù)中進(jìn)行:(1)輸入數(shù)組,輸入要查找的整數(shù)(2)調(diào)用 binary 函數(shù)(3)結(jié)果輸出完整程序應(yīng)能實(shí)現(xiàn)在10個(gè)升序整數(shù)中查找的功能,找到則輸出其下標(biāo),未找到則輸出 1 。3. 匯編: 15,17,22,28,40課件下載:74. 上
34、傳作業(yè):(1)保證學(xué)號(hào)文件夾中有相應(yīng)的 exe 文件(2)將學(xué)號(hào)文件夾復(fù)制到: /incoming/3班第5章練習(xí)15.8 變量的存儲(chǔ)屬性概述v變量是對(duì)程序中數(shù)據(jù)的存儲(chǔ)空間的抽象內(nèi)存.main() int a; a=10; printf(“%d”,a);編譯或函數(shù)調(diào)用時(shí)為其分配內(nèi)存單元1020002001程序中使用變量名對(duì)內(nèi)存操作v變量的屬性l數(shù)據(jù)類型:變量所持有的數(shù)據(jù)的性質(zhì)(操作屬性)l存儲(chǔ)屬性u(píng)存儲(chǔ)器類型:寄存器、靜態(tài)存儲(chǔ)區(qū)、動(dòng)態(tài)存儲(chǔ)區(qū)u生存期:變量在某一時(shí)刻存在-靜態(tài)變量與動(dòng)態(tài)變量u作用域:變量在某區(qū)域內(nèi)有效-局部變量與全局變量v變量的存儲(chǔ)類型laut
35、o -自動(dòng)型lregister-寄存器型lstatic -靜態(tài)型lextern -外部型v變量定義格式: 存儲(chǔ)類型 數(shù)據(jù)類型 變量表;5.8 變量的存儲(chǔ)屬性概述v變量是對(duì)程序中數(shù)據(jù)的存儲(chǔ)空間的抽象如: int sum; auto int a,b,c; register int i; static float x,y;局部變量與全局變量v局部變量-內(nèi)部變量l定義:在函數(shù)內(nèi)定義,只在本函數(shù)內(nèi)有效l說(shuō)明:umain中定義的變量只在main中有效u不同函數(shù)中同名變量,占不同內(nèi)存單元u形參屬于局部變量u可定義在復(fù)合語(yǔ)句中有效的變量u局部變量可用存儲(chǔ)類型:auto register static (默認(rèn)為
36、auto)float f1(int a) int b,c; .char f2(int x,int y) int i,j; main() int m,n; .a,b,c有效x,y,i,j有效m,n有效例 不同函數(shù)中同名變量main() int a,b; 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);例 復(fù)合語(yǔ)句中變量#define N 5main() int i; int aN=1,2,3,4
37、,5; for(i=0;iN/2;i+) int temp;temp=ai;ai=aN-i-1;aN-i-1=temp; for(i=0;iN;i+) printf(%d ,ai);運(yùn)行結(jié)果:5 4 3 2 1例 復(fù)合語(yǔ)句中變量#define N 5main() int i; int aN=1,2,3,4,5; for(i=0;iN/2;i+) int temp;temp=ai;ai=aN-i-1;aN-i-1=temp; for(i=0;iN;i+) printf(%d ,ai);例 不同函數(shù)中同名變量main() int a,b; a=3; b=4; printf(main:a=%d,b=
38、%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);運(yùn)行結(jié)果:main:a=3,b=4sub:a=6,b=7main:a=3,b=4v全局變量 在所有函數(shù)外定義l 外部變量u有效范圍:從定義變量的位置開(kāi)始到本文件結(jié)束, 通過(guò)做引用說(shuō)明,可將作用域擴(kuò)大到整個(gè)程序的所有文件中的函數(shù) 定義 說(shuō)明u次數(shù): 只能1次 可說(shuō)明多次u位置: 所有函數(shù)之外 函數(shù)內(nèi)或函數(shù)外u分配內(nèi)存: 分配內(nèi)存,可初始化 不分配內(nèi)存,不可初始化 應(yīng)盡量少使用全局變量,因?yàn)椋篩全局變量在程
39、序全部執(zhí)行過(guò)程中占用存儲(chǔ)單元Y降低了函數(shù)的通用性、可靠性,可移植性Y降低程序清晰性,容易出錯(cuò)u外部變量說(shuō)明: extern 數(shù)據(jù)類型 變量表;u外部變量定義與外部變量說(shuō)明不同u若外部變量與局部變量同名,則外部變量被屏蔽l外部靜態(tài)變量:staticu所說(shuō)明的變量只限于本文件引用,而不能被其他文件引用y?x:y; return(z);main() extern int a,b; printf(max=%d,max(a,b);int a=13,b=-8;運(yùn)行結(jié)果:max=13extern int a,b;int max() int z; z=ab?a:b; return(z);main() prin
40、tf(max=%d,max();int a=13,b=-8;/*ch7_17.c*/int a=3,b=5;max(int a, int b) int c; c=ab?a:b; return(c);main() int a=8; printf(max=%d,max(a,b);例 外部變量與局部變量同名運(yùn)行結(jié)果:max=8int i;main() void prt(); for(i=0;i5;i+) prt();void prt() for(i=0;i5;i+) printf(“%c”,*); printf(“n”);例 外部變量副作用運(yùn)行結(jié)果:*動(dòng)態(tài)變量與靜態(tài)變量v存儲(chǔ)方式l靜態(tài)存儲(chǔ):程序運(yùn)行
41、期間分配固定存儲(chǔ)空間l動(dòng)態(tài)存儲(chǔ):程序運(yùn)行期間根據(jù)需要?jiǎng)討B(tài)分配存儲(chǔ)空間v內(nèi)存用戶區(qū)程序區(qū)靜態(tài)存儲(chǔ)區(qū)動(dòng)態(tài)存儲(chǔ)區(qū)全局變量、局部靜態(tài)變量形參變量局部動(dòng)態(tài)變量(auto register)函數(shù)調(diào)用現(xiàn)場(chǎng)保護(hù)和返回地址等v生存期l靜態(tài)變量:從整個(gè)兒程序開(kāi)始執(zhí)行到最后結(jié)束l動(dòng)態(tài)變量:從包含該變量定義的函數(shù)開(kāi)始執(zhí)行至該函數(shù)執(zhí)行結(jié)束變量存儲(chǔ)類型靜態(tài)動(dòng)態(tài)存儲(chǔ)方式程序整個(gè)運(yùn)行期間函數(shù)調(diào)用開(kāi)始至結(jié)束生存期編譯時(shí)賦初值,只賦一次每次函數(shù)調(diào)用時(shí)賦初值自動(dòng)賦初值0或空字符不確定未賦初值靜態(tài)存儲(chǔ)區(qū)動(dòng)態(tài)區(qū)存儲(chǔ)區(qū)寄存器局部變量全局變量作用域定義變量的函數(shù)或復(fù)合語(yǔ)句內(nèi)本文件可其它文件u局部變量默認(rèn)為auto型,全局變量默認(rèn)為exte
42、rn型uregister型變量個(gè)數(shù)受限u局部static變量具有全局壽命和局部可見(jiàn)性(使得錯(cuò)誤局部化)u局部static變量具有可繼承性u(píng)extern可擴(kuò)展外部變量作用域register局部staticauto外部staticextern存儲(chǔ)類別例 文件file1.cint a;main( ) . . f2; . f1; .f1( ) auto int b; f2; .f2( ) static int c; C作用域b作用域a作用域mainf2f1mainf1f2maina生存期:b生存期:c生存期:例 auto 變量的作用域main() int x=1; void prt(void); in
43、t x=3; prt(); printf(“2nd x=%dn”,x); printf(“1st x=%dn”,x);void prt(void) int x=5; printf(“3th x=%dn”,x);運(yùn)行結(jié)果:3th x=52nd x=31st x=1x=1作用域x=1作用域x=3作用域x=5作用域main() void increment(void); increment(); increment(); increment();void increment(void) int x=0; x+; printf(“%dn”,x);例 局部靜態(tài)變量值具有可繼承性運(yùn)行結(jié)果:1 1 1mai
44、n() void increment(void); increment(); increment(); increment();void increment(void) static int x=0; x+; printf(“%dn”,x);運(yùn)行結(jié)果:1 2 3例 變量的壽命與可見(jiàn)性#include int i=1;void main() static int a; register int b=-10; int c=0; printf(-MAIN-n); printf(i:%d a:%d b:%d c:%dn,i,a,b,c); c=c+8; other(); printf(-MAIN-n)
45、; printf(i:%d a:%d b:%d c:%dn,i,a,b,c); i=i+10; other();other() static int a=2; static int b; int c=10; a=a+2; i=i+32; c=c+5; printf(-OTHER-n); printf(i:%d a:%d b:%d c:%dn,i,a,b,c); b=a;-Main-i:1 a:0 b:-10 c:0 -Other-i:33 a:4 b:0 c:15 -Main-i:33 a:0 b:-10 c:8-Other-i:75 a:6 b:4 c:15全局i1main: a0b:-10
46、registermain:c0靜態(tài)存儲(chǔ)區(qū)動(dòng)態(tài)存儲(chǔ)區(qū)other: a2other: b0other: c10843315443other: c10675156main() void gx(),gy(); extern int x,y; printf(“1: x=%dty=%dn”,x,y); y=246; gx(); gy();void gx() extern int x,y; x=135; printf(“2: x=%dty=%dn”,x,y);int x,y;void gy() printf(“3: x=%dty=%dn”,x,y);例 用extern擴(kuò)展外部變量作用域運(yùn)行結(jié)果:1: x=0
47、 y=02: x=135 y=2463: x=135 y=246例 引用其它文件中的外部變量int global;extern float x;main() int local;.extern int global;static int number;func2().float x;static int number;func3() extern int global;.file1.cfile2.cfile3.c例 引用其它文件中的變量,輸出ab和a的m次方int a;main() int power(int n); int b=3,c,d,m; printf(Enter the number
48、 a and its power:n); scanf(%d,%d,&a,&m); c=a*b; printf(%d*%d=%dn,a,b,c); d=power(m); printf(%d*%d=%d,a,m,d);extern int a;int power(int n) int i,y=1; for(i=1;i=n;i+)y*=a; return(y);(y)?(x):(y) .main() int a,b,c,d,t; . t=MAX(a+b,c+d); 宏展開(kāi):t=(a+b)(c+d)?(a+b):(c+d);int max(int x,int y) return(xy
49、?x:y);main() int a,b,c,d,t; . t=max(a+b,c+d); 例 用宏定義和函數(shù)實(shí)現(xiàn)同樣的功能v帶參的宏與函數(shù)區(qū)別帶參宏函數(shù)處理過(guò)程不分配內(nèi)存簡(jiǎn)單的字符置換分配內(nèi)存先求實(shí)參值,再代入形參處理時(shí)間編譯時(shí)程序運(yùn)行時(shí)參數(shù)類型無(wú)類型問(wèn)題定義實(shí)參,形參類型程序長(zhǎng)度變長(zhǎng)不變運(yùn)行速度不占運(yùn)行時(shí)間調(diào)用和返回占時(shí)間5.9.2 文件包含(文件嵌入)功能:一個(gè)源文件可將另一個(gè)源文件的內(nèi)容全部包含進(jìn)來(lái)一般形式: #include “文件名” 或 #include #include “file2.c”file1.cfile2.cfile1.cfile2.cABA處理過(guò)程:預(yù)編譯時(shí),用被包含
50、文件的內(nèi)容取代該預(yù)處理命令,再對(duì)“包含”后的文件作一個(gè)源文件編譯 直接按標(biāo)準(zhǔn)目錄搜索“” 先在當(dāng)前目錄搜索,再搜索標(biāo)準(zhǔn)目錄可指定路徑被包含文件內(nèi)容v源文件(*.c)v頭文件(*.h)宏定義數(shù)據(jù)結(jié)構(gòu)定義函數(shù)說(shuō)明等文件包含可嵌套#include “file2.c”file1.cAfile3.cC#include “file3.c”file2.c Bfile1.cAfile3.cfile2.c例 文件包含舉例/* powers.h */#define sqr(x) (x)*(x)#define cube(x) (x)*(x)*(x)#define quad(x) (x)*(x)*(x)*(x)/*c
51、h8_10.c*/#include #include d:fengyibkcpowers.h#define MAX_POWER 10void main() int n; printf(numbert exp2t exp3t exp4n); printf(-t-t-t-n); for(n=1;n=MAX_POWER;n+) printf(%2dt %3dt %4dt %5dn,n,sqr(n),cube(n),quad(n);課后練習(xí)1:匯編第七章 15,17,22,28,40課后練習(xí)2: 54,59,61,62,66第八章14,7,8,21,22,4345上機(jī)練習(xí)2:1.有 n=4 個(gè)整數(shù),用
52、冒泡法從小到大輸出這 n 個(gè)數(shù)。要求:用函數(shù) void sort(int m ,int n)實(shí)現(xiàn)排序編寫主函數(shù) main(),完成數(shù)據(jù)的輸入和排序后的輸出參考:7.632. 匯編7.88,編寫完整程序,包括自定義函數(shù)和主函數(shù)3. 匯編: 54,59,61,62,66課件下載:74. 上傳作業(yè):(1)保證學(xué)號(hào)文件夾中有相應(yīng)的 exe 文件(2)將學(xué)號(hào)文件夾復(fù)制到: /incoming/4班第5章練習(xí)2習(xí)題:第七章25,917,19,2232,34,3740,4250,5269,7276,78,
53、79,82上機(jī)編程:(1) 8388,9093(2) 有四個(gè)整數(shù):82,31,65,9,用冒泡法從小到大輸出這四個(gè)數(shù)。要求:a.用函數(shù) void sort(int m ,int n)實(shí)現(xiàn)排序b.編寫主函數(shù) main(),完成數(shù)據(jù)的輸入和排序后的輸出(3) 有四個(gè)整數(shù):82,31,65,9,用選擇法從小到大輸出這四個(gè)數(shù)。要求:a.用函數(shù) void sort(int m ,int n)實(shí)現(xiàn)排序b.編寫主函數(shù) main(),完成數(shù)據(jù)的輸入和排序后的輸出第八章14,7,8,21,22,4345例 5.11 Hanoi(漢諾)塔問(wèn)題。有三根桿A,B,C。A桿上有64個(gè)盤子,大的在下小的在上。要把這64個(gè)
54、盤子從A移到B,在移動(dòng)過(guò)程中可以借助C,每次只允許移動(dòng)一個(gè)盤子,且在移動(dòng)過(guò)程中在三根桿上始終都要保持大盤在下,小盤在上。要求編出程序打印出移動(dòng)的步驟。漢諾塔問(wèn)題04030201030201abc04分析: 1. 將A上的n-1個(gè)盤借助B先移到C上; (n-1,a,c,b) 2將A上第n個(gè)盤移到B上; 3將n-1個(gè)盤從C上借助A移到B上。 (n-1,c,b,a)void hanoi(int n,char a,char b,char c) if(n=1) printf(%d: %c-%cn,n,a,b); else hanoi(n-1,a,c,b); printf(%d: %c-%cn,n,a,b); hanoi (n-1,c,b,a); main( ) int n; printf(input n:); scanf(%d,&n); hanoi(n,A,B,C);4個(gè)盤執(zhí)行情況個(gè)盤執(zhí)行情況input n: 41:
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 雪糕配送合伙合同范本
- 腦電波數(shù)據(jù)分析服務(wù)合同
- 2025至2030年山地車燈叉項(xiàng)目投資價(jià)值分析報(bào)告
- 2025至2030年中國(guó)拉壓支座數(shù)據(jù)監(jiān)測(cè)研究報(bào)告
- 2025至2030年中國(guó)雙針串式平縫機(jī)數(shù)據(jù)監(jiān)測(cè)研究報(bào)告
- 12 干點(diǎn)家務(wù)活 (教學(xué)設(shè)計(jì))2023-2024學(xué)年統(tǒng)編版道德與法治一年級(jí)下冊(cè)
- 二氯異氰尿酸行業(yè)深度研究報(bào)告
- 新疆2025年新疆伊犁師范大學(xué)引進(jìn)高層次人才70人筆試歷年參考題庫(kù)附帶答案詳解
- 2025年雞塊盒項(xiàng)目可行性研究報(bào)告
- 廣西興安縣興安中學(xué)教科版高中信息技術(shù)必修一教學(xué)設(shè)計(jì):4.2.2 表格數(shù)據(jù)的圖形化
- 中央2025年公安部部分直屬事業(yè)單位招聘84人筆試歷年參考題庫(kù)附帶答案詳解
- 2024年公安部直屬事業(yè)單位招聘筆試真題
- 民政局2025年度離婚協(xié)議書(shū)官方模板4篇
- 上海市2024-2025學(xué)年高一上學(xué)期期末考試數(shù)學(xué)試題(含答案)
- 2024-2025學(xué)年五年級(jí)數(shù)學(xué)上冊(cè)名校真題 期末考試綜合檢測(cè)卷
- 2025年市青年企業(yè)家商會(huì)工作計(jì)劃
- DGTJ 08-2176-2024 瀝青路面預(yù)防養(yǎng)護(hù)技術(shù)標(biāo)準(zhǔn)(正式版含條文說(shuō)明)
- 2023年湖南長(zhǎng)沙自貿(mào)投資發(fā)展集團(tuán)有限公司招聘筆試真題
- 《電子技能與實(shí)訓(xùn)》課件
- 基礎(chǔ)攝影培訓(xùn)
- 高一政治學(xué)科期末考試質(zhì)量分析報(bào)告(7篇)
評(píng)論
0/150
提交評(píng)論