項目7函數實現(xiàn)模塊化程序設計_第1頁
項目7函數實現(xiàn)模塊化程序設計_第2頁
項目7函數實現(xiàn)模塊化程序設計_第3頁
項目7函數實現(xiàn)模塊化程序設計_第4頁
項目7函數實現(xiàn)模塊化程序設計_第5頁
已閱讀5頁,還剩46頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、項目項目7 函數實現(xiàn)模塊化程序設計函數實現(xiàn)模塊化程序設計模塊模塊1認識函數認識函數模塊模塊2定義函數定義函數模塊模塊3函數的參數函數的參數模塊模塊4函數的返回值函數的返回值模塊模塊5函數的調用函數的調用模塊模塊6 函數原型函數原型模塊模塊 7 數組與函數參數數組與函數參數模塊模塊8 變量的作用域變量的作用域模塊模塊9變量的存儲方式和生存期變量的存儲方式和生存期模塊模塊10綜合實戰(zhàn)綜合實戰(zhàn)思考與練習思考與練習項目小結項目小結模塊模塊1認識函數認識函數任務1初識自定義函數任務描述任務描述:定義一個實現(xiàn)返回較大值的函數func,在主函數中輸入兩個值給實參變量a,b在主函數中調用該函數,并輸出較大值。

2、代碼提示:int func(int x,int y)int z;z=xy?x:y;return z;# include main()int a,b,max;scanf(“%d,%d”,&a,&b);max=func(a,b);printf(“max=%dn”,max);getch();鍵盤輸入:5,8輸出結果:8v任務解析:任務解析:1C語言庫函數中沒有求較大值函數,但我們用戶可以自定義一個求較大值的函數如程序代碼中的func()函數。2用戶自定義函數大體分為兩個部分:函數頭部分和花括號中的函數體部分。3函數頭部分,如程序代碼中int func(int x,int y)部分,它

3、規(guī)定了函數的類型、函數名和函數參數等;而函數體部分則集中體現(xiàn)函數的功能如程序代碼中z=xy?x:y;部分。4我們前面已經知道:程序總是要從main()函數開始執(zhí)行,不管main()函數所處的位置如何,最終以main()函數結束;當按順序執(zhí)行到max=func(a,b);時,變量max期待一個具體值才能繼續(xù)向下執(zhí)行,這時,需要調用func()函數。5語句 z=xy?x:y;很顯然是求x和y中的較大者賦值給z,最后通過retrun返回到函數調用處。模塊模塊1認識函數認識函數任務2函數的分類任務描述任務描述:定義一個輸出一行信息的函數dis,并在主函數中調用該函數。代碼提示:void dis()pr

4、intf(“NO PAINS,NO GAINS!n”);# include main() dis(); getch();輸出結果:NO PAINS,NO GAINS!v任務解析:任務解析:1.本例中dis()函數不是標準庫函數,屬于用戶自定義函數。2.C程序始終要從main()函數開始執(zhí)行,當按順序執(zhí)行到dis();時,故而轉入自定義函數體中,即顯示一行字符信息:NO PAINS,NO GAINS!。3.該自定義函數中void表示無需返回一個具體的結果,而是顯示一行信息。因此,函數從不同的角度可以按不同方式分類:u從用戶使用角度可以分為庫函數(也叫標準函數或系統(tǒng)函數)和用戶自定義函數u從形式上

5、可以分為有參函數(如任務1中示例)和無參函數(如任務2中示例)。u從函數有無返回值可分為有返回值函數(如任務1中示例)和無返回值函數(如任務2中示例)。4.由上述兩個示例可見,一個C語言源程序是由一個或多個函數組成的。5.所有函數都是平行的,一個函數從不屬于另一個函數,彼此之間可以相互調用,但不可以調用main()函數。模塊模塊2定義函數定義函數任務1無參函數的定義形式任務描述任務描述:在主函數中調用自定義函數xianshi,要求被調用的函數輸出如下字符串信息:Nice to meet you!代碼提示:void xianshi()printf(“Nice to meet you!n”);#

6、include main()xianshi();getch();輸出結果:Nice to meet you!v任務解析:任務解析:1如何定義無參函數:函數類型說明符 函數名()聲明部分語句部分2由上述完義可知,本示例中函數類型為void(即空類型),函數名為xianshi,函數體中沒有需要聲明的部分,語句部分為一條輸出語句printf(“Nice to meet you!n”);3關于自定義的無參函數:u函數類型說明符指的是函數返回值的類型,當函數沒有返回值時需要用關鍵字void聲明,也可以省略,默認為void(空類型)。u函數名同變量名的命名規(guī)則,在定義函數名時同樣力圖做到見名知意,同一文件

7、中不可以出現(xiàn)重名函數。u無參函數函數名后圓括號()為空,但括號“()”不能省。u自定義函數不可以單獨運行,必須有其它函數調用才行。模塊模塊2定義函數定義函數任務2有參函數的定義形式任務描述任務描述:定義一個求三個整數和的函數add,要求在主函數中定義并輸入三個實參變量a,b,c的值,在主函數中調用該函數并輸出三個數加法算式及結果值。代碼提示:int add(int x,int y,int z)int t;t=x+y+z;return t;# include main()int a,b,c,sum;scanf(“%d,%d,%d”,&a,&b,&c);sum=add(a,

8、b,c);printf(“%d+%d+%d=%dn”,a,b,c,sum);getch();鍵盤輸入:3,5,8輸出結果:16v任務解析:任務解析:1.如何定義有參函數:函數類型說明符 函數名(形參表列)聲明部分語句部分2關于自定義的有參函數:u有參函數的類型說明符也可以省略,默認為int型,如示例中自定義函數頭部分也可以寫成add(int x,int y,int z)u形參表列指的是用逗號“,”間隔的一組變量,包括類型說明和變量名兩部分,即使每個變量類型相同也必須分別指定數據類型。如上示例中自定義函數頭部分不可以寫成int add(int x,y,z)。模塊模塊3函數的參數函數的參數任務1認

9、識函數中的兩種參數任務描述任務描述:定義一個求三個整數最小值的函數min,要求在主函數中輸入三個實參變量a,b,c的值,調用該函數,并將函數返回值的結果存儲在變量min2中,并輸出該最小值。代碼提示:int min(int x,int y,int z)int min1;if(xy) min1=x;else min1=y;if(zmin1) min1=z;return min1;# include main()int a,b,c,min2;scanf(“%d,%d,%d”,&a,&b,&c);min2=min(a,b,c);printf(“MIN=%dn”,min2);g

10、etch();鍵盤輸入:5,3,10輸出結果:3v任務解析:任務解析:1函數的參數有兩種:實際參數(簡稱“實參”)和形式參數(簡稱“形參”)。2形參是在函數定義時設定的參數(位于自定義函數名后的括號內)如示例中的x,y,z。3.實參是有參函數調用時所用的參數,如示例中的a,b,c。4.形參可以是相同類型,也可以是不同類型,本示例中形參的類型相同,都是int型。普通變量作為函數參數,實參和形參之間是“單向值傳遞”,即實參的值傳給形參,而形參不能傳給實參。傳遞數據的參數之間應滿足類型相同,數目相等,一一對應。8.函數中的實參和形參如同身份證的原件和復印件,形參“肩負著實參賦予的使命”,把要實現(xiàn)的功

11、能“反饋”到主調函數中,本示例中自定義函數的功能在第4章已經學習過,很顯然是求三個數中最小值的程序。模塊模塊3函數的參數函數的參數任務2形參和實參形式任務描述任務描述:分析程序段的運行結果,體驗形參和實參重名及形式特點。代碼提示:void fun(int x,int y,float z)x=8;y=9;z=10.5;# include main()int x=100,y=200;float z=16.8;fun(x,x+y,z);printf(“%d,%d,%.1fn”,x,y,z);getch();輸出結果:100,200,16.8v任務解析:任務解析:v1.形參是形式上的,編譯系統(tǒng)不為其分

12、配內在空間,只有傳遞數據時臨時分配內存空間,調用結束后,空間釋放數據丟失。v形參必須是變量,而實參可以是變量、常量或表達式。本示例中第二個實參為表達式x+y。v實參和形參可以重名,它們在內存中是不同的對象,各自占用自己獨立的存儲單元,彼此互不干擾。本示例中的實參x,z和形參x,z重名。1.本示例中實參變量x=10,表達式x+y的值300,變量z=16.8雖然傳遞給形參x,y,z時三個形參變量對又都重新賦予新值,但函數調用結束后,形參的空間釋放,值立即丟失,并不能影響主調函數中的實現(xiàn)變量x,y,z。模塊模塊4函數的返回值函數的返回值任務1函數返回值的含義任務描述任務描述:定義一個能實現(xiàn)下述關系的

13、函數,要求在主調函數中調用該函數。 2x2-1 (x=0)y= x2+1 (x=0) return(2*x*x-1);else return (x*x+1);# include main()int a,b;scanf(“%d”,&a);b=fun(a);printf(“%dn”,b);getch();鍵盤輸入:-5輸出結果:26v任務解析:任務解析:v函數調用后的結果稱為函數的返回值,函數返回值通過return語句實現(xiàn)。vreturn語句的形式有兩種:ureturn(表達式)ureturn表達式;如上示例中return(2*x*x-1);也可以寫成return2*x*x-1;v函數體中

14、可出現(xiàn)多條return語句,執(zhí)行到哪一條哪條起作用,從而返回到主調函數,返回值僅有一個并且是一個確定的值。如示例中從鍵盤輸入-5后,根據我們前面的學習可知,實參a=-5按照單向值傳遞傳給形參x=-5,自定義函數體中if語句條件表達式為假故而執(zhí)行else分支return (x*x+1);從此函數調用結束,即return(2*x*x-1);和return (x*x+1);只有一條起作用。v在進行函數定義時,應使return語句中的表達式的類型與函數類型說明保持一致;當return語句中的表達式的類型與函數類型說明不一致時,則以函數類型說明為準,系統(tǒng)會自動將return語句中的表達式的值轉換為函數類

15、型說明所指定的類型。1.如果函數中沒有return語句,并不代表沒有返回值,而是返回一個不確定的值。模塊模塊5函數的調用函數的調用任務1函數的調用過程分析任務描述任務描述:分析下列程序段的運行結果,分析函數的調用過程及形式。代碼提示:int f(int a,int b) int c;if(ab) c=1;else if(a=b) c=0; else c=-1;return c;# include main()int i=2,j,t; j=+i; t=f(i,j);printf(“%dn”,t);getch();輸出結果:0v任務解析:任務解析:v函數調用的一般形式為:v函數名(實參表列);或函

16、數名();v實參表列是一個或一組用逗號分隔的常量、變量或表達式v實參和形參要個數相等,類型相同,一一對應。v如果調用無參函數,實參表列可以省略,但括號不能省。1.上示例中的運行結果學生可自行分析得知。模塊模塊5函數的調用函數的調用任務2函數語句的調用方式任務描述任務描述:分析下列程序段的運行結果,體驗函數語句的調用形式。代碼提示:swap(int x,int y)int t; t=x; x=y; y=t; printf(“x=%d,y=%dn”,x,y);# include main() int a=3,b=6; swap(a,b);printf(“a=%d,b=%dn”,a,b);getch

17、();輸出結果:x=6,y=3 a=3,b=6v任務解析:任務解析:v1本示例中是以語句的形式進行函數調用的,即函數調用單獨作為一個語句swap(a,b);這種調用方式通常沒有返回值,只要求函數完成一定的操作。具體分析如下:u定義函數時沒有指定swap()函數的類型,默認為int型。u實參a=3,b=6按照單向值傳遞分別傳給形參x和y,自定義函數體中的函數體語句t=x;x=y;y=t;是交換形參x和y的值,通過前面的學習得知,形參和實參是彼此不同的存儲單元,因此,上述交換對實參沒有影響。1.在完成swpa()函數調用語句時,只是輸出形參交換后的值,完成調用后返回到主調函數繼續(xù)向下執(zhí)行,輸出實參

18、a和b的值。模塊模塊5函數的調用函數的調用任務3函數表達式的調用方式任務描述任務描述:分析下列程序段的運行結果,體驗以函數表達式方式調用函數的形式。代碼提示:int max(int x,int y)return xy?x:y;# include main()int a=4,b=5,result;result=2*max(a,b)+1;printf(“result=%dn”,result);getch();輸出結果:result=11v任務解析:任務解析:v像示例中result=2*max(a,b)+1這種函數(max()出現(xiàn)在一個表達式中,這種表達式稱為函數表達式。1.示例中表達式result

19、=2*max(a,b)+1期待函數max()返回一個具體的值從而參與表達式的運算,自定義函數顯然是求兩個參數較大值的函數即將實參a和b兩者中的較大者即5反饋給表達式,因此,result=2*5+1=11;模塊模塊5函數的調用函數的調用任務4函數參數的調用方式任務描述任務描述:分析下列程序段的運行結果,體驗以函數參數方式調用函數的形式。代碼提示:int f(int x,int y)x=xy?x:y;return x;# include main() int d; d=f(f(10,3),f(4,8); printf(“%dn”,d);getch();輸出結果:10v任務解析:任務解析:1示例中f

20、(10,3)和f(4,8)作為外層函數f()的兩個參數,稱為函數參數。2自定義函數f()的功能是求兩個數較大值的函數。3程序中共三次調用了函數f(),要使用函數f()的結果賦值給變量d,就得知道參數f(10,3)和f(4,8)的值,其中調用f(10,3)反饋回的結果為10,調用f(4,8)反饋回的結果為8,10和8又作為f()的兩個參數,表達式變?yōu)閐=f(10,8)模塊模塊5函數的調用函數的調用任務5函數的嵌套調用任務描述任務描述:分析下列程序段的運行結果,認識函數嵌套調用的含義。代碼提示:void fun1()fun2();fun2()printf(“knowledge is power!n

21、”);# include main() fun1();getch();輸出結果:knowledge is power!v任務解析:任務解析:1.C語言中函數地位是平行的,因此,函數內部不可以定義其它函數(即嵌套定義),但函數之間可以相互調用(除其它函數不能調用主函數),在一個函數內部調用另外一個函數,稱為函數的嵌套調用。 2示例中主函數中調用了fun1()函數,當調用fun1()函數時又轉而去調用fun2()函數,構成了函數的嵌套調用,fun2()函數是輸出一行字符串信息返回到主調函數中輸出。模塊模塊5函數的調用函數的調用任務6函數的遞歸調用任務描述任務描述:已知數列前兩項的值為1,編寫一個函

22、數f,求數列1,1,2,3,5,8第10項的值,并在主調函數中輸出該項的值。代碼提示: int f(int n) if(n=1|n=2) return 1; else return f(n-1)+f(n-2); # include main()int t10;t10=f(10);printf(“t10=%dn”,t10);getch();輸出結果:t10=55v任務解析:任務解析:1.我們知道,函數可以嵌套調用,如果一個函數直接或間接調用自身,稱為函數的遞歸調用。2.由已知題意可知,f(1)=1,f(2)=1,上述函數滿足如下關系: 1 (n=1,2)f(n)= f(n-1)+f(n-2) (

23、n2)3.第一次調用函數f()時,實參10按單向值傳遞傳給形參x,反饋回的是f(9)+f(8),即t10=f(9)+f(8);但f(9)和f(8)未知,數列第10項t10無法得到具體的值,因此,為使t10得到具體的值以便程序能順次向下執(zhí)行,需再一次調用f()函數以求得f(9)和f(8)的值;下一次9和8分別作為函數的實參,反饋回的是f(8)+f(7)和f(7)+(6)直到2和1作為函數的實參時才使得f(2)、f(1)變得已知,從而求得f(3)、f(4)、f(5)f(10)。 4從以上示例可知,解決上述問題的關鍵是找出臨界條件(n=1,2)和遞推公式(f(n)=f(n-1)+f(n-2)),在自

24、定義函數中內嵌一個雙分支語句,if表達式是臨界條件,語句是臨界值,else語句是遞推公式。模塊模塊6 函數原型函數原型任務 函數原型的形式及意義任務描述任務描述: 定義一個求兩個浮點型小數乘積的函數f,要求定義的函數返回值為float型,定義的位置在主調函數之后,體驗函數原型的形式、位置及必要性。代碼提示:# include main() float f(float x,float y);float a,b,c; a=3.5;b=4.8;c=f(a,b);printf(“%fn”,c);getch();float f(float x,float y)float pd;pd=x*y;return

25、 pd;輸出結果:16.800001v任務解析:任務解析:1.調用一個函數除了必須定義該函數外,必要時還需要在調用該函數前對被調用的函數加以聲明,稱為函數的原型。這樣做的目的是將相關的信息通知編譯系統(tǒng),以便編譯系統(tǒng)對函數的類型、函數的參數加以核對,以防非法調用導致出錯。2函數原型的格式和定義函數的頭部有些相似,又不是完全相同,具體格式為:函數類型說明符 函數名(參數類型說明符1 參數1,參數類型說明符2 參數2,);簡單的可以說成,函數原型即是在自定義函數的函數頭后面加上分號“;”。3本任務具體分析:u上述函數原型也可以寫成簡易形式,即float f(float,float);這是因為編譯系統(tǒng)

26、并不檢查形參名,只是按順序依次檢查函數原型中的參數個數,參數類型和必須和函數定義時完全相同,否則將出錯。u示例中函數原型float f(float x,float y);旨在通知編譯系統(tǒng)接下來接要調用的函數是float型,函數名f,函數中有兩個對數,并且都是float,如果和聲明的不一致將提示報錯信息。u函數原型中的參數名字可以和定義函數中的形參名字不同,也可以省略。u當調用函數f時,編譯系統(tǒng)會按照事先的函數原型加以對照各參數是否匹配,當各參數完全一致時按照對應規(guī)則完全實、形參的單向值傳遞。u該程序段代碼的含義很顯然定義一個求兩個浮點數乘積的程序,要求在主調函數中顯示輸出結果。4.函數原型可以

27、省略:當自定義函數出現(xiàn)在主調函數之前,可以省略函數原型。如上例中程序代碼可以寫成float f(float x,float y)float pd;pd=x*y;return pd;# include main() float a,b,c; a=3.5;b=4.8;c=f(a,b);printf(“%fn”,c);getch();從而省略了函數聲明。模塊模塊 7 數組與函數參數數組與函數參數任務1數組元素作函數參數任務描述任務描述:編寫一個求兩個數較大值的函數max,要求在主函數中定義一個長度為5的整型數組 score用來存儲某同學5科成績,通過鍵盤輸入用循環(huán)語句給數組中5個元素(即該生的5科成

28、績)賦值,將第一科的成績存儲在變量max1中,每次以max1和下一個元素為實參,在主函數中調用該函數并將每次返回的結果存儲在max1中,直到最后一個元素作為函數實參調用完畢,最終max1中存儲的是該生5科成績的最高分并輸出。 代碼提示:int max(int x,int y) return xy?x:y;# include main() int score5,i,max1; for(i=0;i5;i+) scanf(“%d”,&scorei); max1=score0;for(i=1;i5;i+) max1=max(max1,scorei);printf(“max=%dn”,max1)

29、;getch();鍵盤輸入:95 84 96 90 86輸出結果:max=96v任務解析:任務解析:1自定義函數max()的功能很顯然是求兩個數中較大者的函數。2.前面的學習已經知道,函數的實參可以是常量、變量或表達式,由于數組元素同普通變量沒有二異性的差別,因此,數組元素同樣也可以作為函數的實參。 3.本示例中第一個for循環(huán)for(i=0;i5;i+) scanf(“%d”,&scorei);利用數組中的5個元素存儲該生的5科成績;max1=score0;語句是假設第一科成績是最高分;而for(i=1;i=0;i-)printf(%d ,bi);# include main()in

30、t a5=5,6,7,8,9;ant(a,5);getch();輸出結果:9 8 7 6 5v任務解析:任務解析:v除常量、變量、表達式和數組元素作為函數實參外,數組名也可以作為函數的實參,所不同的是數組名作為函數實參和形參之間并不是單向值傳遞。v示例中調用函數ant(a,5),a是數組名,如果是普通變量但未定義,這違背了變量須先定義后使用的原則,當數組名作為函數參數時并不是將數組全部元素賦值給形參數組b,而是將數組a的首地址傳給形參數組,此時,形參和實參共享同一存儲單元,如同同一空間起兩個不同的名字。v定義函數ant()時,并未定義形參數組b的長度,這是因為C語言編譯系統(tǒng)對形參數組大小不做檢

31、查,因此形參數組可以不指定大小,但形參數組的方括號“”則不可以隨意省略。v實參數組與形參數組類型應保持一致(示例中都為int型),如不一致,結果將會出錯。1.for(i=n-1;i=0;i-)中i的值從n-1開始,并不是從n開始,是因為數組元素的下標從0開始,所以最后一次循環(huán)的條件是i=0,本例中最大下標元素的下標值是4。 模塊模塊8 變量的作用域變量的作用域任務1認識局部變量任務描述任務描述:分析下列程序段的運行結果,熟悉局部變量的含義及特點。代碼提示:void fun() int a=5,b=6; printf(“a=%d,b=%dn”,a,b);# include main() int

32、a=10,b=20; fun(); printf(“a=%d,b=%dn”,a,b);getch();輸出結果:a=5,b=6 a=10,b=20v任務解析:任務解析:v域即范圍,變量的作用域也就是變量的作用范圍,指的是一個變量在哪個范圍內有效。v在一個函數內部定義的變量稱為局部變量(也叫內部變量),局部變量只在本函數內有效,如示例中int a=5,b=6;只在fun()函數中有效;int a=10,b=20;只在main()函數中有效。v不同函數中可以使用相同名字的變量,它們代表不同的對象,互不干擾。如示例中fun()函數中的變量a、b和main()函數中的a、b雖然重名但是不同的對象。v當

33、調用fun()函數時,該函數是輸出a、b的值,此時輸出的是該函數中的a、b的值即a=5,b=6;當函數調用結束后返回到主函數向下執(zhí)行過程中此時的printf(“a=%d,b=%dn”,a,b);是輸出main()函數中定義的a、b即a=10,b=20。v函數的形參也是局部變量,模塊6任務1示例中自定義函數int max(int x,int y)中的x,y只在該函數中有效。1.在一個函數內部,可以在復合語句中定義變量,這樣的變量可以重名,它們代表的是不同的對象,這樣的變量只在該復合語句中有效。 模塊模塊8 變量的作用域變量的作用域任務2認識全部變量任務描述任務描述:分析下列程序段的運行結果,熟悉

34、全部變量的含義及特點。代碼提示:int x=1;void fun()printf(“x=%dn”,x);# include main()int x=5;fun();printf(“x=%dn”,x);getch();輸出結果:x=1x=5v任務解析:任務解析:v在函數之外定義的變量,或者說不在任何一個函數內定義的變量稱為全部變量(也叫外部變量)。如示例中的int x=1;它不在任何一個函數內。v全局變量的作用范圍是從定義點開始到源文件結束。源文件中int x=1;作用范圍從定義點開始一直到源文件結束都有效即它是全局變量。1.全局變量和局部變量可以重名,在局部變量起作用的范圍內,全局作用不起作用

35、。示例中int x=5;是在main()函數中定義,因此,它僅在main()函數中有效,當調用fun()函數時,由于fun()函數無返回值只是輸出變量x的值,在fun()函數中沒有定義變量x因此它沒有自己的局部變量,這時輸出的是全局變量的值,即x=1;完成函數調用結束后返回主函數繼續(xù)向下執(zhí)行printf(“x=%dn”,x);在main()函數內部有自己的局部變量x,此時輸出x=5。模塊模塊9變量的存儲方式和生存期變量的存儲方式和生存期 任務1認識自動變量任務描述任務描述:分析程序段的運行結果,體驗自動變量的特點。代碼提示:f(int a)auto int b=0;b+;return(a+b)

36、;# include main() int i,x=2;for(i=0;i2;i+)printf(“%dn”,f(x);getch();輸出結果:33v任務解析:任務解析:v變量除按作用范圍(空間劃分)分為局部變量和全局變量外,還有另外一個屬性,就是變量的值存在的時間,即生存期。變量的生存期取決于變量的存儲方式。在C語言中,變量的存儲方式可分為:動態(tài)存儲和靜態(tài)存儲。vC語言中內存分為3個部分:程序區(qū)、靜態(tài)存儲區(qū)和動態(tài)存儲區(qū),程序區(qū)用來存儲程序的代碼,靜態(tài)和動態(tài)存儲區(qū)用來存儲數據;其中有的變量在程序運行整個過程都是存在的,稱為靜態(tài)存儲;有的變量則是調用所在的函數時臨時分配的(如形參),而在函數調

37、用結束后空間釋放,變量值隨即丟失,稱為動態(tài)存儲。vC語言中每個變量都有兩個屬性:存儲類別和數據類型。存儲類別規(guī)定了變量在內存中的存儲區(qū)域和存儲方式;數據類型規(guī)定了變量的數據范圍和在內存中所占空間的大小及所能執(zhí)行的操作。v變量按存儲類別分為以下四種:自動變量(auto)、靜態(tài)局部變量(static)、寄存器變量(register)和外部變量(extern)。v一個變量完整的定義形式為:存儲類別說明符 存儲類型說明符 變量名1,變量名2,;存儲類別可以省略,默認為自動變量(auto)。示例中auto int b=0;也可定義為:int b=0;1.主函數中調用f()函數兩次,第一次調用時形參a獲得

38、的值為2,b+;的作用使得b=1;反饋回主調函數中的結果為a+b即2+1=3的值;因為b是自動變量,當函數調用結束后, 空間釋放,變量值隨即丟失。當第二次調用f()函數時,使得b又重新定義,重新賦值即b=0;模塊模塊9變量的存儲方式和生存期變量的存儲方式和生存期任務任務 2 認識靜態(tài)局部變量認識靜態(tài)局部變量任務描述任務描述:分析程序段的運行結果,體驗自動變量的特點。代碼提示:f(int a)static int b=0;b+;return(a+b);# include main() int i,x=2;for(i=0;i2;i+)printf(“%dn”,f(x);getch();輸出結果:3

39、4v任務解析:任務解析:v示例中定義形式static int b=0;中static不可省略,省略則默認為auto型。v第一次調用函數f()時,b+;作用使得b=1;當反饋到主調函數中結果3時,由于b被定義成static型,該變量存儲在靜態(tài)存儲區(qū),該區(qū)變量的特點是當函數調用結束后值不消失繼續(xù)保持原值(b=1),當下一次調用f()函數時,b要在上次調用后結果的基礎上進行b+;操作即b=2;此時,反饋回a+b即2+2=4。1.在定義局部變量時不賦初值的話,則對靜態(tài)局部變量來說,編譯時自動賦初值為0(對數值型數據)或空字符(對字符型變量);而自動變量不賦初值則是一個不確定的值。模塊模塊9變量的存儲方

40、式和生存期變量的存儲方式和生存期任務任務3認識寄存器變量認識寄存器變量任務描述任務描述:求1+2+3+1000。代碼提示:# include main() register long n,sum=0; for(n=1;n=1000;n+) sum+=n; printf(“1+2+1000=%ldn”,sum);getch();輸出結果:500500v任務解析:任務解析:v我們學習過的變量的值都是存儲在內存中的,當程序用到某個變量的值時,由控制器負責將內存中的值送到運算器中運算,盡管CPU對內存的讀寫速度很快,但當頻繁使用某些變量時,為提高執(zhí)行效率,對集成在CPU芯片上的存取速度遠高于內存的讀取

41、速度,這種存儲在CPU通用寄存器中的變量稱為寄存器變量(關鍵字為register)。v示例中的變量sum和n要反復用到1000次,因此,為提高程序運行效率,均定義為寄存器變量。v11000的累加和超出了基本整型的最大值范圍(32767),因此,定義成長整型,輸出格式符為%ld。v計算機系統(tǒng)中的寄存器的數量是有限的,因此不能定義任意多個寄存器變量。1.隨著計算機技術性能越來越優(yōu)越,優(yōu)化后的編譯系統(tǒng)能夠自動識別使用頻繁的變量,對于一些沒被定義為寄存器類別的變量,編譯系統(tǒng)能自動將這些變量存儲到寄存器中,因此,現(xiàn)在用register聲明變量是不必要的。模塊模塊9變量的存儲方式和生存期變量的存儲方式和生

42、存期任務任務4認識外部變量認識外部變量任務描述任務描述:分析程序段的運行結果,體驗外部變量的特點。代碼提示:# include main() extern int x,y; x=x+y; printf(“%d,%dn”,x,y);getch();int x=2,y=3;輸出結果:5,3模塊模塊10綜合實戰(zhàn)綜合實戰(zhàn)v任務描述任務描述:已知一個2行3列的二維數組a,定義一個求所有元素中最大的值的函數max,以數組名a為函數的實參,要求在自定義函數中求出6個元素的最大值并通過return語句在主調函數中輸出該最大值。代碼提示:int max(int b3) int i,j,k,max1; max1=

43、b00; for(i=0;i2;i+)for(j=0;jmax1) max1=bij;return max1;# include main()int a23=32,45,2,95,4,-23; printf(“max=%dn”,max(a);getch();輸出結果:max=95v任務解析:任務解析:v數組名(a)作為函數的實際參數,和形參之間是首地址傳遞,兩者之間共享同一存儲單元,即a00與b00共用同一單元,a01與b01共用同一單元因此,形參數組的一維行標可以省略,但列標不可省。v語句max1=b00;是假設第一個元素為最大值,由循環(huán)控制數組元素的下標依次和max1進行比較,第一次比較完max1中存儲的是b00和b01中的較大者;第二次比較完max1中存儲的是b00、b01和b02中的最大者最后一次循環(huán)也是最后一個元素即b12比較完,max1中存儲的是六個元素b00、b01、

溫馨提示

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

評論

0/150

提交評論