




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1、項目項目7 函數(shù)實現(xiàn)模塊化程序設(shè)計函數(shù)實現(xiàn)模塊化程序設(shè)計模塊模塊1認(rèn)識函數(shù)認(rèn)識函數(shù)模塊模塊2定義函數(shù)定義函數(shù)模塊模塊3函數(shù)的參數(shù)函數(shù)的參數(shù)模塊模塊4函數(shù)的返回值函數(shù)的返回值模塊模塊5函數(shù)的調(diào)用函數(shù)的調(diào)用模塊模塊6 函數(shù)原型函數(shù)原型模塊模塊 7 數(shù)組與函數(shù)參數(shù)數(shù)組與函數(shù)參數(shù)模塊模塊8 變量的作用域變量的作用域模塊模塊9變量的存儲方式和生存期變量的存儲方式和生存期模塊模塊10綜合實戰(zhàn)綜合實戰(zhàn)思考與練習(xí)思考與練習(xí)項目小結(jié)項目小結(jié)模塊模塊1認(rèn)識函數(shù)認(rèn)識函數(shù)任務(wù)1初識自定義函數(shù)任務(wù)描述任務(wù)描述:定義一個實現(xiàn)返回較大值的函數(shù)func,在主函數(shù)中輸入兩個值給實參變量a,b在主函數(shù)中調(diào)用該函數(shù),并輸出較大值。
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輸出結(jié)果:8v任務(wù)解析:任務(wù)解析:1C語言庫函數(shù)中沒有求較大值函數(shù),但我們用戶可以自定義一個求較大值的函數(shù)如程序代碼中的func()函數(shù)。2用戶自定義函數(shù)大體分為兩個部分:函數(shù)頭部分和花括號中的函數(shù)體部分。3函數(shù)頭部分,如程序代碼中int func(int x,int y)部分,它
3、規(guī)定了函數(shù)的類型、函數(shù)名和函數(shù)參數(shù)等;而函數(shù)體部分則集中體現(xiàn)函數(shù)的功能如程序代碼中z=xy?x:y;部分。4我們前面已經(jīng)知道:程序總是要從main()函數(shù)開始執(zhí)行,不管main()函數(shù)所處的位置如何,最終以main()函數(shù)結(jié)束;當(dāng)按順序執(zhí)行到max=func(a,b);時,變量max期待一個具體值才能繼續(xù)向下執(zhí)行,這時,需要調(diào)用func()函數(shù)。5語句 z=xy?x:y;很顯然是求x和y中的較大者賦值給z,最后通過retrun返回到函數(shù)調(diào)用處。模塊模塊1認(rèn)識函數(shù)認(rèn)識函數(shù)任務(wù)2函數(shù)的分類任務(wù)描述任務(wù)描述:定義一個輸出一行信息的函數(shù)dis,并在主函數(shù)中調(diào)用該函數(shù)。代碼提示:void dis()pr
4、intf(“NO PAINS,NO GAINS!n”);# include main() dis(); getch();輸出結(jié)果:NO PAINS,NO GAINS!v任務(wù)解析:任務(wù)解析:1.本例中dis()函數(shù)不是標(biāo)準(zhǔn)庫函數(shù),屬于用戶自定義函數(shù)。2.C程序始終要從main()函數(shù)開始執(zhí)行,當(dāng)按順序執(zhí)行到dis();時,故而轉(zhuǎn)入自定義函數(shù)體中,即顯示一行字符信息:NO PAINS,NO GAINS!。3.該自定義函數(shù)中void表示無需返回一個具體的結(jié)果,而是顯示一行信息。因此,函數(shù)從不同的角度可以按不同方式分類:u從用戶使用角度可以分為庫函數(shù)(也叫標(biāo)準(zhǔn)函數(shù)或系統(tǒng)函數(shù))和用戶自定義函數(shù)u從形式上
5、可以分為有參函數(shù)(如任務(wù)1中示例)和無參函數(shù)(如任務(wù)2中示例)。u從函數(shù)有無返回值可分為有返回值函數(shù)(如任務(wù)1中示例)和無返回值函數(shù)(如任務(wù)2中示例)。4.由上述兩個示例可見,一個C語言源程序是由一個或多個函數(shù)組成的。5.所有函數(shù)都是平行的,一個函數(shù)從不屬于另一個函數(shù),彼此之間可以相互調(diào)用,但不可以調(diào)用main()函數(shù)。模塊模塊2定義函數(shù)定義函數(shù)任務(wù)1無參函數(shù)的定義形式任務(wù)描述任務(wù)描述:在主函數(shù)中調(diào)用自定義函數(shù)xianshi,要求被調(diào)用的函數(shù)輸出如下字符串信息:Nice to meet you!代碼提示:void xianshi()printf(“Nice to meet you!n”);#
6、include main()xianshi();getch();輸出結(jié)果:Nice to meet you!v任務(wù)解析:任務(wù)解析:1如何定義無參函數(shù):函數(shù)類型說明符 函數(shù)名()聲明部分語句部分2由上述完義可知,本示例中函數(shù)類型為void(即空類型),函數(shù)名為xianshi,函數(shù)體中沒有需要聲明的部分,語句部分為一條輸出語句printf(“Nice to meet you!n”);3關(guān)于自定義的無參函數(shù):u函數(shù)類型說明符指的是函數(shù)返回值的類型,當(dāng)函數(shù)沒有返回值時需要用關(guān)鍵字void聲明,也可以省略,默認(rèn)為void(空類型)。u函數(shù)名同變量名的命名規(guī)則,在定義函數(shù)名時同樣力圖做到見名知意,同一文件
7、中不可以出現(xiàn)重名函數(shù)。u無參函數(shù)函數(shù)名后圓括號()為空,但括號“()”不能省。u自定義函數(shù)不可以單獨運行,必須有其它函數(shù)調(diào)用才行。模塊模塊2定義函數(shù)定義函數(shù)任務(wù)2有參函數(shù)的定義形式任務(wù)描述任務(wù)描述:定義一個求三個整數(shù)和的函數(shù)add,要求在主函數(shù)中定義并輸入三個實參變量a,b,c的值,在主函數(shù)中調(diào)用該函數(shù)并輸出三個數(shù)加法算式及結(jié)果值。代碼提示: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輸出結(jié)果:16v任務(wù)解析:任務(wù)解析:1.如何定義有參函數(shù):函數(shù)類型說明符 函數(shù)名(形參表列)聲明部分語句部分2關(guān)于自定義的有參函數(shù):u有參函數(shù)的類型說明符也可以省略,默認(rèn)為int型,如示例中自定義函數(shù)頭部分也可以寫成add(int x,int y,int z)u形參表列指的是用逗號“,”間隔的一組變量,包括類型說明和變量名兩部分,即使每個變量類型相同也必須分別指定數(shù)據(jù)類型。如上示例中自定義函數(shù)頭部分不可以寫成int add(int x,y,z)。模塊模塊3函數(shù)的參數(shù)函數(shù)的參數(shù)任務(wù)1認(rèn)
9、識函數(shù)中的兩種參數(shù)任務(wù)描述任務(wù)描述:定義一個求三個整數(shù)最小值的函數(shù)min,要求在主函數(shù)中輸入三個實參變量a,b,c的值,調(diào)用該函數(shù),并將函數(shù)返回值的結(jié)果存儲在變量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輸出結(jié)果:3v任務(wù)解析:任務(wù)解析:1函數(shù)的參數(shù)有兩種:實際參數(shù)(簡稱“實參”)和形式參數(shù)(簡稱“形參”)。2形參是在函數(shù)定義時設(shè)定的參數(shù)(位于自定義函數(shù)名后的括號內(nèi))如示例中的x,y,z。3.實參是有參函數(shù)調(diào)用時所用的參數(shù),如示例中的a,b,c。4.形參可以是相同類型,也可以是不同類型,本示例中形參的類型相同,都是int型。普通變量作為函數(shù)參數(shù),實參和形參之間是“單向值傳遞”,即實參的值傳給形參,而形參不能傳給實參。傳遞數(shù)據(jù)的參數(shù)之間應(yīng)滿足類型相同,數(shù)目相等,一一對應(yīng)。8.函數(shù)中的實參和形參如同身份證的原件和復(fù)印件,形參“肩負(fù)著實參賦予的使命”,把要實現(xiàn)的功
11、能“反饋”到主調(diào)函數(shù)中,本示例中自定義函數(shù)的功能在第4章已經(jīng)學(xué)習(xí)過,很顯然是求三個數(shù)中最小值的程序。模塊模塊3函數(shù)的參數(shù)函數(shù)的參數(shù)任務(wù)2形參和實參形式任務(wù)描述任務(wù)描述:分析程序段的運行結(jié)果,體驗形參和實參重名及形式特點。代碼提示: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();輸出結(jié)果:100,200,16.8v任務(wù)解析:任務(wù)解析:v1.形參是形式上的,編譯系統(tǒng)不為其分
12、配內(nèi)在空間,只有傳遞數(shù)據(jù)時臨時分配內(nèi)存空間,調(diào)用結(jié)束后,空間釋放數(shù)據(jù)丟失。v形參必須是變量,而實參可以是變量、常量或表達式。本示例中第二個實參為表達式x+y。v實參和形參可以重名,它們在內(nèi)存中是不同的對象,各自占用自己獨立的存儲單元,彼此互不干擾。本示例中的實參x,z和形參x,z重名。1.本示例中實參變量x=10,表達式x+y的值300,變量z=16.8雖然傳遞給形參x,y,z時三個形參變量對又都重新賦予新值,但函數(shù)調(diào)用結(jié)束后,形參的空間釋放,值立即丟失,并不能影響主調(diào)函數(shù)中的實現(xiàn)變量x,y,z。模塊模塊4函數(shù)的返回值函數(shù)的返回值任務(wù)1函數(shù)返回值的含義任務(wù)描述任務(wù)描述:定義一個能實現(xiàn)下述關(guān)系的
13、函數(shù),要求在主調(diào)函數(shù)中調(diào)用該函數(shù)。 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輸出結(jié)果:26v任務(wù)解析:任務(wù)解析:v函數(shù)調(diào)用后的結(jié)果稱為函數(shù)的返回值,函數(shù)返回值通過return語句實現(xiàn)。vreturn語句的形式有兩種:ureturn(表達式)ureturn表達式;如上示例中return(2*x*x-1);也可以寫成return2*x*x-1;v函數(shù)體中
14、可出現(xiàn)多條return語句,執(zhí)行到哪一條哪條起作用,從而返回到主調(diào)函數(shù),返回值僅有一個并且是一個確定的值。如示例中從鍵盤輸入-5后,根據(jù)我們前面的學(xué)習(xí)可知,實參a=-5按照單向值傳遞傳給形參x=-5,自定義函數(shù)體中if語句條件表達式為假故而執(zhí)行else分支return (x*x+1);從此函數(shù)調(diào)用結(jié)束,即return(2*x*x-1);和return (x*x+1);只有一條起作用。v在進行函數(shù)定義時,應(yīng)使return語句中的表達式的類型與函數(shù)類型說明保持一致;當(dāng)return語句中的表達式的類型與函數(shù)類型說明不一致時,則以函數(shù)類型說明為準(zhǔn),系統(tǒng)會自動將return語句中的表達式的值轉(zhuǎn)換為函數(shù)類
15、型說明所指定的類型。1.如果函數(shù)中沒有return語句,并不代表沒有返回值,而是返回一個不確定的值。模塊模塊5函數(shù)的調(diào)用函數(shù)的調(diào)用任務(wù)1函數(shù)的調(diào)用過程分析任務(wù)描述任務(wù)描述:分析下列程序段的運行結(jié)果,分析函數(shù)的調(diào)用過程及形式。代碼提示: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();輸出結(jié)果:0v任務(wù)解析:任務(wù)解析:v函數(shù)調(diào)用的一般形式為:v函數(shù)名(實參表列);或函
16、數(shù)名();v實參表列是一個或一組用逗號分隔的常量、變量或表達式v實參和形參要個數(shù)相等,類型相同,一一對應(yīng)。v如果調(diào)用無參函數(shù),實參表列可以省略,但括號不能省。1.上示例中的運行結(jié)果學(xué)生可自行分析得知。模塊模塊5函數(shù)的調(diào)用函數(shù)的調(diào)用任務(wù)2函數(shù)語句的調(diào)用方式任務(wù)描述任務(wù)描述:分析下列程序段的運行結(jié)果,體驗函數(shù)語句的調(diào)用形式。代碼提示: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、();輸出結(jié)果:x=6,y=3 a=3,b=6v任務(wù)解析:任務(wù)解析:v1本示例中是以語句的形式進行函數(shù)調(diào)用的,即函數(shù)調(diào)用單獨作為一個語句swap(a,b);這種調(diào)用方式通常沒有返回值,只要求函數(shù)完成一定的操作。具體分析如下:u定義函數(shù)時沒有指定swap()函數(shù)的類型,默認(rèn)為int型。u實參a=3,b=6按照單向值傳遞分別傳給形參x和y,自定義函數(shù)體中的函數(shù)體語句t=x;x=y;y=t;是交換形參x和y的值,通過前面的學(xué)習(xí)得知,形參和實參是彼此不同的存儲單元,因此,上述交換對實參沒有影響。1.在完成swpa()函數(shù)調(diào)用語句時,只是輸出形參交換后的值,完成調(diào)用后返回到主調(diào)函數(shù)繼續(xù)向下執(zhí)行,輸出實參
18、a和b的值。模塊模塊5函數(shù)的調(diào)用函數(shù)的調(diào)用任務(wù)3函數(shù)表達式的調(diào)用方式任務(wù)描述任務(wù)描述:分析下列程序段的運行結(jié)果,體驗以函數(shù)表達式方式調(diào)用函數(shù)的形式。代碼提示: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();輸出結(jié)果:result=11v任務(wù)解析:任務(wù)解析:v像示例中result=2*max(a,b)+1這種函數(shù)(max()出現(xiàn)在一個表達式中,這種表達式稱為函數(shù)表達式。1.示例中表達式result
19、=2*max(a,b)+1期待函數(shù)max()返回一個具體的值從而參與表達式的運算,自定義函數(shù)顯然是求兩個參數(shù)較大值的函數(shù)即將實參a和b兩者中的較大者即5反饋給表達式,因此,result=2*5+1=11;模塊模塊5函數(shù)的調(diào)用函數(shù)的調(diào)用任務(wù)4函數(shù)參數(shù)的調(diào)用方式任務(wù)描述任務(wù)描述:分析下列程序段的運行結(jié)果,體驗以函數(shù)參數(shù)方式調(diào)用函數(shù)的形式。代碼提示: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();輸出結(jié)果:10v任務(wù)解析:任務(wù)解析:1示例中f
20、(10,3)和f(4,8)作為外層函數(shù)f()的兩個參數(shù),稱為函數(shù)參數(shù)。2自定義函數(shù)f()的功能是求兩個數(shù)較大值的函數(shù)。3程序中共三次調(diào)用了函數(shù)f(),要使用函數(shù)f()的結(jié)果賦值給變量d,就得知道參數(shù)f(10,3)和f(4,8)的值,其中調(diào)用f(10,3)反饋回的結(jié)果為10,調(diào)用f(4,8)反饋回的結(jié)果為8,10和8又作為f()的兩個參數(shù),表達式變?yōu)閐=f(10,8)模塊模塊5函數(shù)的調(diào)用函數(shù)的調(diào)用任務(wù)5函數(shù)的嵌套調(diào)用任務(wù)描述任務(wù)描述:分析下列程序段的運行結(jié)果,認(rèn)識函數(shù)嵌套調(diào)用的含義。代碼提示:void fun1()fun2();fun2()printf(“knowledge is power!n
21、”);# include main() fun1();getch();輸出結(jié)果:knowledge is power!v任務(wù)解析:任務(wù)解析:1.C語言中函數(shù)地位是平行的,因此,函數(shù)內(nèi)部不可以定義其它函數(shù)(即嵌套定義),但函數(shù)之間可以相互調(diào)用(除其它函數(shù)不能調(diào)用主函數(shù)),在一個函數(shù)內(nèi)部調(diào)用另外一個函數(shù),稱為函數(shù)的嵌套調(diào)用。 2示例中主函數(shù)中調(diào)用了fun1()函數(shù),當(dāng)調(diào)用fun1()函數(shù)時又轉(zhuǎn)而去調(diào)用fun2()函數(shù),構(gòu)成了函數(shù)的嵌套調(diào)用,fun2()函數(shù)是輸出一行字符串信息返回到主調(diào)函數(shù)中輸出。模塊模塊5函數(shù)的調(diào)用函數(shù)的調(diào)用任務(wù)6函數(shù)的遞歸調(diào)用任務(wù)描述任務(wù)描述:已知數(shù)列前兩項的值為1,編寫一個函
22、數(shù)f,求數(shù)列1,1,2,3,5,8第10項的值,并在主調(diào)函數(shù)中輸出該項的值。代碼提示: 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();輸出結(jié)果:t10=55v任務(wù)解析:任務(wù)解析:1.我們知道,函數(shù)可以嵌套調(diào)用,如果一個函數(shù)直接或間接調(diào)用自身,稱為函數(shù)的遞歸調(diào)用。2.由已知題意可知,f(1)=1,f(2)=1,上述函數(shù)滿足如下關(guān)系: 1 (n=1,2)f(n)= f(n-1)+f(n-2) (
23、n2)3.第一次調(diào)用函數(shù)f()時,實參10按單向值傳遞傳給形參x,反饋回的是f(9)+f(8),即t10=f(9)+f(8);但f(9)和f(8)未知,數(shù)列第10項t10無法得到具體的值,因此,為使t10得到具體的值以便程序能順次向下執(zhí)行,需再一次調(diào)用f()函數(shù)以求得f(9)和f(8)的值;下一次9和8分別作為函數(shù)的實參,反饋回的是f(8)+f(7)和f(7)+(6)直到2和1作為函數(shù)的實參時才使得f(2)、f(1)變得已知,從而求得f(3)、f(4)、f(5)f(10)。 4從以上示例可知,解決上述問題的關(guān)鍵是找出臨界條件(n=1,2)和遞推公式(f(n)=f(n-1)+f(n-2)),在自
24、定義函數(shù)中內(nèi)嵌一個雙分支語句,if表達式是臨界條件,語句是臨界值,else語句是遞推公式。模塊模塊6 函數(shù)原型函數(shù)原型任務(wù) 函數(shù)原型的形式及意義任務(wù)描述任務(wù)描述: 定義一個求兩個浮點型小數(shù)乘積的函數(shù)f,要求定義的函數(shù)返回值為float型,定義的位置在主調(diào)函數(shù)之后,體驗函數(shù)原型的形式、位置及必要性。代碼提示:# 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;輸出結(jié)果:16.800001v任務(wù)解析:任務(wù)解析:1.調(diào)用一個函數(shù)除了必須定義該函數(shù)外,必要時還需要在調(diào)用該函數(shù)前對被調(diào)用的函數(shù)加以聲明,稱為函數(shù)的原型。這樣做的目的是將相關(guān)的信息通知編譯系統(tǒng),以便編譯系統(tǒng)對函數(shù)的類型、函數(shù)的參數(shù)加以核對,以防非法調(diào)用導(dǎo)致出錯。2函數(shù)原型的格式和定義函數(shù)的頭部有些相似,又不是完全相同,具體格式為:函數(shù)類型說明符 函數(shù)名(參數(shù)類型說明符1 參數(shù)1,參數(shù)類型說明符2 參數(shù)2,);簡單的可以說成,函數(shù)原型即是在自定義函數(shù)的函數(shù)頭后面加上分號“;”。3本任務(wù)具體分析:u上述函數(shù)原型也可以寫成簡易形式,即float f(float,float);這是因為編譯系統(tǒng)
26、并不檢查形參名,只是按順序依次檢查函數(shù)原型中的參數(shù)個數(shù),參數(shù)類型和必須和函數(shù)定義時完全相同,否則將出錯。u示例中函數(shù)原型float f(float x,float y);旨在通知編譯系統(tǒng)接下來接要調(diào)用的函數(shù)是float型,函數(shù)名f,函數(shù)中有兩個對數(shù),并且都是float,如果和聲明的不一致將提示報錯信息。u函數(shù)原型中的參數(shù)名字可以和定義函數(shù)中的形參名字不同,也可以省略。u當(dāng)調(diào)用函數(shù)f時,編譯系統(tǒng)會按照事先的函數(shù)原型加以對照各參數(shù)是否匹配,當(dāng)各參數(shù)完全一致時按照對應(yīng)規(guī)則完全實、形參的單向值傳遞。u該程序段代碼的含義很顯然定義一個求兩個浮點數(shù)乘積的程序,要求在主調(diào)函數(shù)中顯示輸出結(jié)果。4.函數(shù)原型可以
27、省略:當(dāng)自定義函數(shù)出現(xiàn)在主調(diào)函數(shù)之前,可以省略函數(shù)原型。如上例中程序代碼可以寫成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();從而省略了函數(shù)聲明。模塊模塊 7 數(shù)組與函數(shù)參數(shù)數(shù)組與函數(shù)參數(shù)任務(wù)1數(shù)組元素作函數(shù)參數(shù)任務(wù)描述任務(wù)描述:編寫一個求兩個數(shù)較大值的函數(shù)max,要求在主函數(shù)中定義一個長度為5的整型數(shù)組 score用來存儲某同學(xué)5科成績,通過鍵盤輸入用循環(huán)語句給數(shù)組中5個元素(即該生的5科成
28、績)賦值,將第一科的成績存儲在變量max1中,每次以max1和下一個元素為實參,在主函數(shù)中調(diào)用該函數(shù)并將每次返回的結(jié)果存儲在max1中,直到最后一個元素作為函數(shù)實參調(diào)用完畢,最終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輸出結(jié)果:max=96v任務(wù)解析:任務(wù)解析:1自定義函數(shù)max()的功能很顯然是求兩個數(shù)中較大者的函數(shù)。2.前面的學(xué)習(xí)已經(jīng)知道,函數(shù)的實參可以是常量、變量或表達式,由于數(shù)組元素同普通變量沒有二異性的差別,因此,數(shù)組元素同樣也可以作為函數(shù)的實參。 3.本示例中第一個for循環(huán)for(i=0;i5;i+) scanf(“%d”,&scorei);利用數(shù)組中的5個元素存儲該生的5科成績;max1=score0;語句是假設(shè)第一科成績是最高分;而for(i=1;i=0;i-)printf(%d ,bi);# include main()in
30、t a5=5,6,7,8,9;ant(a,5);getch();輸出結(jié)果:9 8 7 6 5v任務(wù)解析:任務(wù)解析:v除常量、變量、表達式和數(shù)組元素作為函數(shù)實參外,數(shù)組名也可以作為函數(shù)的實參,所不同的是數(shù)組名作為函數(shù)實參和形參之間并不是單向值傳遞。v示例中調(diào)用函數(shù)ant(a,5),a是數(shù)組名,如果是普通變量但未定義,這違背了變量須先定義后使用的原則,當(dāng)數(shù)組名作為函數(shù)參數(shù)時并不是將數(shù)組全部元素賦值給形參數(shù)組b,而是將數(shù)組a的首地址傳給形參數(shù)組,此時,形參和實參共享同一存儲單元,如同同一空間起兩個不同的名字。v定義函數(shù)ant()時,并未定義形參數(shù)組b的長度,這是因為C語言編譯系統(tǒng)對形參數(shù)組大小不做檢
31、查,因此形參數(shù)組可以不指定大小,但形參數(shù)組的方括號“”則不可以隨意省略。v實參數(shù)組與形參數(shù)組類型應(yīng)保持一致(示例中都為int型),如不一致,結(jié)果將會出錯。1.for(i=n-1;i=0;i-)中i的值從n-1開始,并不是從n開始,是因為數(shù)組元素的下標(biāo)從0開始,所以最后一次循環(huán)的條件是i=0,本例中最大下標(biāo)元素的下標(biāo)值是4。 模塊模塊8 變量的作用域變量的作用域任務(wù)1認(rèn)識局部變量任務(wù)描述任務(wù)描述:分析下列程序段的運行結(jié)果,熟悉局部變量的含義及特點。代碼提示: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();輸出結(jié)果:a=5,b=6 a=10,b=20v任務(wù)解析:任務(wù)解析:v域即范圍,變量的作用域也就是變量的作用范圍,指的是一個變量在哪個范圍內(nèi)有效。v在一個函數(shù)內(nèi)部定義的變量稱為局部變量(也叫內(nèi)部變量),局部變量只在本函數(shù)內(nèi)有效,如示例中int a=5,b=6;只在fun()函數(shù)中有效;int a=10,b=20;只在main()函數(shù)中有效。v不同函數(shù)中可以使用相同名字的變量,它們代表不同的對象,互不干擾。如示例中fun()函數(shù)中的變量a、b和main()函數(shù)中的a、b雖然重名但是不同的對象。v當(dāng)
33、調(diào)用fun()函數(shù)時,該函數(shù)是輸出a、b的值,此時輸出的是該函數(shù)中的a、b的值即a=5,b=6;當(dāng)函數(shù)調(diào)用結(jié)束后返回到主函數(shù)向下執(zhí)行過程中此時的printf(“a=%d,b=%dn”,a,b);是輸出main()函數(shù)中定義的a、b即a=10,b=20。v函數(shù)的形參也是局部變量,模塊6任務(wù)1示例中自定義函數(shù)int max(int x,int y)中的x,y只在該函數(shù)中有效。1.在一個函數(shù)內(nèi)部,可以在復(fù)合語句中定義變量,這樣的變量可以重名,它們代表的是不同的對象,這樣的變量只在該復(fù)合語句中有效。 模塊模塊8 變量的作用域變量的作用域任務(wù)2認(rèn)識全部變量任務(wù)描述任務(wù)描述:分析下列程序段的運行結(jié)果,熟悉
34、全部變量的含義及特點。代碼提示:int x=1;void fun()printf(“x=%dn”,x);# include main()int x=5;fun();printf(“x=%dn”,x);getch();輸出結(jié)果:x=1x=5v任務(wù)解析:任務(wù)解析:v在函數(shù)之外定義的變量,或者說不在任何一個函數(shù)內(nèi)定義的變量稱為全部變量(也叫外部變量)。如示例中的int x=1;它不在任何一個函數(shù)內(nèi)。v全局變量的作用范圍是從定義點開始到源文件結(jié)束。源文件中int x=1;作用范圍從定義點開始一直到源文件結(jié)束都有效即它是全局變量。1.全局變量和局部變量可以重名,在局部變量起作用的范圍內(nèi),全局作用不起作用
35、。示例中int x=5;是在main()函數(shù)中定義,因此,它僅在main()函數(shù)中有效,當(dāng)調(diào)用fun()函數(shù)時,由于fun()函數(shù)無返回值只是輸出變量x的值,在fun()函數(shù)中沒有定義變量x因此它沒有自己的局部變量,這時輸出的是全局變量的值,即x=1;完成函數(shù)調(diào)用結(jié)束后返回主函數(shù)繼續(xù)向下執(zhí)行printf(“x=%dn”,x);在main()函數(shù)內(nèi)部有自己的局部變量x,此時輸出x=5。模塊模塊9變量的存儲方式和生存期變量的存儲方式和生存期 任務(wù)1認(rèn)識自動變量任務(wù)描述任務(wù)描述:分析程序段的運行結(jié)果,體驗自動變量的特點。代碼提示: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();輸出結(jié)果:33v任務(wù)解析:任務(wù)解析:v變量除按作用范圍(空間劃分)分為局部變量和全局變量外,還有另外一個屬性,就是變量的值存在的時間,即生存期。變量的生存期取決于變量的存儲方式。在C語言中,變量的存儲方式可分為:動態(tài)存儲和靜態(tài)存儲。vC語言中內(nèi)存分為3個部分:程序區(qū)、靜態(tài)存儲區(qū)和動態(tài)存儲區(qū),程序區(qū)用來存儲程序的代碼,靜態(tài)和動態(tài)存儲區(qū)用來存儲數(shù)據(jù);其中有的變量在程序運行整個過程都是存在的,稱為靜態(tài)存儲;有的變量則是調(diào)用所在的函數(shù)時臨時分配的(如形參),而在函數(shù)調(diào)
37、用結(jié)束后空間釋放,變量值隨即丟失,稱為動態(tài)存儲。vC語言中每個變量都有兩個屬性:存儲類別和數(shù)據(jù)類型。存儲類別規(guī)定了變量在內(nèi)存中的存儲區(qū)域和存儲方式;數(shù)據(jù)類型規(guī)定了變量的數(shù)據(jù)范圍和在內(nèi)存中所占空間的大小及所能執(zhí)行的操作。v變量按存儲類別分為以下四種:自動變量(auto)、靜態(tài)局部變量(static)、寄存器變量(register)和外部變量(extern)。v一個變量完整的定義形式為:存儲類別說明符 存儲類型說明符 變量名1,變量名2,;存儲類別可以省略,默認(rèn)為自動變量(auto)。示例中auto int b=0;也可定義為:int b=0;1.主函數(shù)中調(diào)用f()函數(shù)兩次,第一次調(diào)用時形參a獲得
38、的值為2,b+;的作用使得b=1;反饋回主調(diào)函數(shù)中的結(jié)果為a+b即2+1=3的值;因為b是自動變量,當(dāng)函數(shù)調(diào)用結(jié)束后, 空間釋放,變量值隨即丟失。當(dāng)?shù)诙握{(diào)用f()函數(shù)時,使得b又重新定義,重新賦值即b=0;模塊模塊9變量的存儲方式和生存期變量的存儲方式和生存期任務(wù)任務(wù) 2 認(rèn)識靜態(tài)局部變量認(rèn)識靜態(tài)局部變量任務(wù)描述任務(wù)描述:分析程序段的運行結(jié)果,體驗自動變量的特點。代碼提示: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();輸出結(jié)果:3
39、4v任務(wù)解析:任務(wù)解析:v示例中定義形式static int b=0;中static不可省略,省略則默認(rèn)為auto型。v第一次調(diào)用函數(shù)f()時,b+;作用使得b=1;當(dāng)反饋到主調(diào)函數(shù)中結(jié)果3時,由于b被定義成static型,該變量存儲在靜態(tài)存儲區(qū),該區(qū)變量的特點是當(dāng)函數(shù)調(diào)用結(jié)束后值不消失繼續(xù)保持原值(b=1),當(dāng)下一次調(diào)用f()函數(shù)時,b要在上次調(diào)用后結(jié)果的基礎(chǔ)上進行b+;操作即b=2;此時,反饋回a+b即2+2=4。1.在定義局部變量時不賦初值的話,則對靜態(tài)局部變量來說,編譯時自動賦初值為0(對數(shù)值型數(shù)據(jù))或空字符(對字符型變量);而自動變量不賦初值則是一個不確定的值。模塊模塊9變量的存儲方
40、式和生存期變量的存儲方式和生存期任務(wù)任務(wù)3認(rèn)識寄存器變量認(rèn)識寄存器變量任務(wù)描述任務(wù)描述:求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();輸出結(jié)果:500500v任務(wù)解析:任務(wù)解析:v我們學(xué)習(xí)過的變量的值都是存儲在內(nèi)存中的,當(dāng)程序用到某個變量的值時,由控制器負(fù)責(zé)將內(nèi)存中的值送到運算器中運算,盡管CPU對內(nèi)存的讀寫速度很快,但當(dāng)頻繁使用某些變量時,為提高執(zhí)行效率,對集成在CPU芯片上的存取速度遠(yuǎn)高于內(nèi)存的讀取
41、速度,這種存儲在CPU通用寄存器中的變量稱為寄存器變量(關(guān)鍵字為register)。v示例中的變量sum和n要反復(fù)用到1000次,因此,為提高程序運行效率,均定義為寄存器變量。v11000的累加和超出了基本整型的最大值范圍(32767),因此,定義成長整型,輸出格式符為%ld。v計算機系統(tǒng)中的寄存器的數(shù)量是有限的,因此不能定義任意多個寄存器變量。1.隨著計算機技術(shù)性能越來越優(yōu)越,優(yōu)化后的編譯系統(tǒng)能夠自動識別使用頻繁的變量,對于一些沒被定義為寄存器類別的變量,編譯系統(tǒng)能自動將這些變量存儲到寄存器中,因此,現(xiàn)在用register聲明變量是不必要的。模塊模塊9變量的存儲方式和生存期變量的存儲方式和生
42、存期任務(wù)任務(wù)4認(rèn)識外部變量認(rèn)識外部變量任務(wù)描述任務(wù)描述:分析程序段的運行結(jié)果,體驗外部變量的特點。代碼提示:# include main() extern int x,y; x=x+y; printf(“%d,%dn”,x,y);getch();int x=2,y=3;輸出結(jié)果:5,3模塊模塊10綜合實戰(zhàn)綜合實戰(zhàn)v任務(wù)描述任務(wù)描述:已知一個2行3列的二維數(shù)組a,定義一個求所有元素中最大的值的函數(shù)max,以數(shù)組名a為函數(shù)的實參,要求在自定義函數(shù)中求出6個元素的最大值并通過return語句在主調(diào)函數(shù)中輸出該最大值。代碼提示: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();輸出結(jié)果:max=95v任務(wù)解析:任務(wù)解析:v數(shù)組名(a)作為函數(shù)的實際參數(shù),和形參之間是首地址傳遞,兩者之間共享同一存儲單元,即a00與b00共用同一單元,a01與b01共用同一單元因此,形參數(shù)組的一維行標(biāo)可以省略,但列標(biāo)不可省。v語句max1=b00;是假設(shè)第一個元素為最大值,由循環(huán)控制數(shù)組元素的下標(biāo)依次和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)系上傳者。文件的所有權(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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 《質(zhì)量控制年終工作總結(jié)》課件
- 《課件設(shè)計能力的培養(yǎng)》
- 高壓作業(yè)安全試題(含答案解析)
- 1月維修電工高級考試模擬題(附答案解析)
- 證券投資分析方法考核試卷
- 蛋品加工安全風(fēng)險評估與控制考核試卷
- 設(shè)計在包裝領(lǐng)域的環(huán)保策略考核試卷
- 《化學(xué)品事故應(yīng)急》課件
- 學(xué)校元旦文藝晚會策劃活動方案
- 2025年高質(zhì)量轎車用深沖鋼板項目發(fā)展計劃
- 新能源系統(tǒng) 課件 第10章 多能互補、可持續(xù)能源系統(tǒng)
- 井下動火安全技術(shù)措施
- 理解詞語句子的方法PPT
- 熱線心理咨詢技術(shù)-課件
- 碰撞與沖擊動力學(xué)
- 全等三角形第一課時課件
- 歌曲《我們》歌詞
- 頸部腫塊診斷及鑒別診斷課件
- 汽車前保險杠結(jié)構(gòu)及安全能分析學(xué)士學(xué)位參考
- 配電室八項制度(八張)
- 清算方案模板9篇
評論
0/150
提交評論