




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、請用請用PowerPoint 2003PowerPoint 2003播放播放教學目的教學目的 要求學生了解要求學生了解模塊化程序設計與函數,模塊化程序設計與函數,重點掌握函數的定義與調用重點掌握函數的定義與調用 ;重點掌握參數的重點掌握參數的傳遞和函數的嵌套調用,掌握遞歸調用傳遞和函數的嵌套調用,掌握遞歸調用 ;了解了解變量的作用域與存儲方式,重點掌握編譯預處理變量的作用域與存儲方式,重點掌握編譯預處理及綜合應用及綜合應用 。教學重點教學重點 函數參數傳遞與返回值;變量的作用域與函數參數傳遞與返回值;變量的作用域與存儲類型;模塊化原則存儲類型;模塊化原則。關鍵詞關鍵詞模塊化;函數;函數定義;函
2、數調用;模塊化;函數;函數定義;函數調用;變量作用域;變量存儲方式;編譯預處理。變量作用域;變量存儲方式;編譯預處理。 授課時量授課時量理論學時:理論學時:6 6例例4.1 1). 一個源程序文件由一個或多個函數組成。一個源程 序文件是一個編譯單位,即以源文件為單位進行編譯,而不是以函數為單位進行編譯。2). 一個程序由一個或多個源程序文件組成。一個源文件可以為多個程序公用。3). 一個程序有且只能有一個名為main的主函數,程序的執行從 main 函數開始,調用其它函數后流程回到 main 函數,在 main 函數中結束整個程序的運行。main 函數是系統定義的。 4). 所有函數都是平等的
3、,即在定義函數時是互相獨立的,一個函數并不從屬于另一個函數,即函數不能嵌套定義,但可以互相調用(main 函數不能調用)。 5). 從用戶使用的角度看,函數有兩種:標準函數,即庫函數。這是由系統提供的。使用時應注意:函數功能、函數參數的數目和順序,及各參數意義和類型、函數返回值意義和類型、需要使用的包含文件用戶自己定義的函數,以解決用戶的專門需要。所謂編程實質就是編寫自定義功能函數,通過各函數的相互調用實現算法,甚至可以考慮把相關的函數集合到一起,形成自己的函數庫,并加以相應的頭文件,實現商業化。6). 從函數的形式看,函數分兩類無參函數。調用時,主調函數無數據傳送給被調函數。有參函數。調用時
4、,主調函數與被調函數之間有參數傳遞。 7). 函數調用完成后,通過return語句返回函數值,若無該語句將返回不確定值,若函數類型定義為void(空)類型,該函數將沒有返回值。 合法標識符函數返回值類型缺省int型無返回值void函數體函數類型函數名(形參類型說明表)說明部分語句部分現代風格:例有參函數(現代風格)intmax(intx,inty)intz;z=xy?x:y;return(z);例有參函數(現代風格)intmax(intx,y)intz;z=xy?x:y;return(z);例空函數dummy()函數體為空例無參函數printstar()printf(“*n”);或prints
5、tar(void)printf(“*n”);函數類型函數名(形參表)形參類型說明說明部分語句部分傳統風格:例有參函數(傳統風格)intmax(x,y)intx,y;intz;z=xy?x:y;return(z);main()inti=2,p;p=f(i,+i);printf(%d,p);intf(inta,intb)intc;if(ab)c=1;elseif(a=b)c=0;elsec=-1;return(c);例參數求值順序main()inti=2,p;p=f(i,i+);printf(%d,p);intf(inta,intb)intc;if(ab)c=1;elseif(a=b)c=0;el
6、sec=-1;return(c);運行結果:0運行結果:1c=max(a,b);(main函數)(max函數)max(intx,inty)intz;z=xy?x:y;return(z);例比較兩個數并輸出大者main()inta,b,c;scanf(%d,%d,&a,&b);c=max(a,b);printf(Maxis%d,c);max(intx,inty)intz;z=xy?x:y;return(z);形參實參例計算x的立方#includefloatcube(floatx)return(x*x*x);main()floata,product;printf(Pleaseinp
7、utvalueofa:);scanf(%f,&a);product=cube(a);printf(”Cubeof%.4fis%.4fn,a,product);xaproduct1.21.21.728711x:y:調用前:調用結束:711x:y:例交換兩個數/*ch7_2.c*/#includemain()intx=7,y=11;printf(x=%d,ty=%dn,x,y);printf(swapped:n);swap(x,y);printf(x=%d,ty=%dn,x,y);swap(inta,intb)inttemp;temp=a;a=b;b=temp;調用:711a:b:711x
8、:y:swap:711x:y:117a:b:temp/*ch9_3.c*/swap(p1,p2)int*p1,*p2;intp;p=*p1;*p1=*p2;*p2=p;main()inta,b;scanf(%d,%d,&a,&b);printf(“a=%d,b=%dn”,a,b);printf(“swapped:n”);swap(&a,&b);printf(”a=%d,b=%dn,a,b);例交換兩個數a59b調前:a59b調swap:p1&a&bp2a95b交換:p1&a&bp2a95b返回:#includelongsum(in
9、ta,intb);longfactorial(intn);main()intn1,n2;longa;scanf(%d,%d,&n1,&n2);a=sum(n1,n2);printf(a=%1d,a);longsum(inta,intb)longc1,c2;c1=factorial(a);c2=factorial(b);return(c1+c2);longfactorial(intn)longrtn=1;inti;for(i=1;iy?x:y;return(z);輸入:5.6,7.3輸出:7 注:當函數返回值類型與函數的類型不一致的時候,按函數的類型轉換。 例函數說明舉例main
10、()floata,b;intc;scanf(%f,%f,&a,&b);c=max(a,b);printf(Maxis%dn,c);max(floatx,floaty)floatz;z=xy?x:y;return(z);int型函數可不作函數說明(VisualC+不行)/*ch4_10.c*/floatadd(floatx,floaty)floatz;z=x+y;return(z);main()floata,b,c;scanf(%f,%f,&a,&b);c=add(a,b);printf(sumis%f,c);被調函數出現在主調函數之前,不必函數說明/*ch4_1
11、0.c*/main()floatadd(float,float);/*functiondeclaration*/floata,b,c;scanf(%f,%f,&a,&b);c=add(a,b);printf(sumis%f,c);floatadd(floatx,floaty)floatz;z=x+y;return(z);float add();main()調用函數a結束a函數b函數調用函數b例求三個數中最大數和最小數的差值#includeintdif(intx,inty,intz);intmax(intx,inty,intz);intmin(intx,inty,intz);vo
12、idmain()inta,b,c,d;scanf(%d%d%d,&a,&b,&c);d=dif(a,b,c);printf(Max-Min=%dn,d);Ch7_202.cintdif(intx,inty,intz)returnmax(x,y,z)-min(x,y,z);intmax(intx,inty,intz)intr;r=xy?x:y;return(rz?r:z);intmin(intx,inty,intz)intr;r=xy?x:y;return(rz?r:z);main()調用函數dif輸出結束dif函數max函數調用函數max調用函數minmin函數例用弦截
13、法求方程的根)()()()(121221xfxfxfxxfxxxyf(x)0 x1x2xf(x1)f(x2)077951923xxx求f(x1)與f(x2)連線與x軸的交點x輸入x1,x2,求f(x1),f(x2)直到f(x1)與f(x2)異號y=f(x),y1=f(x1)y與y1同號真假x1=xy1=yx2=x直到|y|root=x輸出rootroot函數運行情況:Inputx1,x2:2,6Arootofequationis5.0000main()調用函數root輸出根x結束root函數xpoint函數調用函數xpoint調用函數ff函數f()調f調f2調f1f1()f2()intf(in
14、tx)inty,z;z=f(y);.return(2*z);intf1(intx)inty,z;z=f2(y);.return(2*z);intf2(intt)inta,c;c=f1(a);.return(3+c);例求n的階乘) 1()!1() 1 , 0(1!nnnnn/*ch4_14.c*/#includeintfac(intn)intf;if(n0)printf(n%cn,getone,putone);voidhanoi(intn,charone,chartwo,charthree)if(n=1)move(one,three);elsehanoi(n-1,one,three,two);
15、move(one,three);hanoi(n-1,two,one,three);main()intm;printf(Inputthenumberofdisks:);scanf(%d,&m);printf(Thestepstomoving%3ddisks:n,m);hanoi(m,A,B,C);ABC運行情況如下:Inputthenumberofdisks:3Inputthenumberofdisks:A-CA-BC-BA-CB-AB-CA-C說明:main函數中定義的變量只在main函數中有效;不同函數中同名變量,屬于不同的變量,占不同內存單元;形參屬于局部變量;可定義在復合語句中有
16、效的變量,上級語句塊定義的變量對下級語句塊有效(除非下級語句塊定義了同名變量將屏蔽上級語句塊定義的變量) floatf1(inta)intb,c;.charf2(intx,inty)inti,j;main()intm,n;.a,b,c有效x,y,i,j有效m,n有效例不同函數中同名變量main()inta,b;a=3;b=4;printf(main:a=%d,b=%dn,a,b);sub();printf(main:a=%d,b=%dn,a,b);sub()inta,b;a=6;b=7;printf(sub:a=%d,b=%dn,a,b);例復合語句中變量#defineN5main()inti
17、;intaN=1,2,3,4,5;for(i=0;iN/2;i+)inttemp;temp=ai;ai=aN-i-1;aN-i-1=temp;for(i=0;iN;i+)printf(%d,ai);運行結果:54321例復合語句中變量#defineN5main()inti;intaN=1,2,3,4,5;for(i=0;iN/2;i+)inttemp;temp=ai;ai=aN-i-1;aN-i-1=temp;for(i=0;ifloatmax,min;floataverage(floatarray,intn)inti;floatsum=array0;max=min=array0;for(i=
18、1;imax)max=arrayi;elseif(arrayiy?x:y;return(z);main()externinta,b;printf(max=%d,max(a,b);inta=13,b=-8;運行結果:max=13externinta,b;intmax()intz;z=ab?a:b;return(z);main()printf(max=%d,max();inta=13,b=-8;inta=3,b=5;max(inta,intb)intc;c=ab?a:b;return(c);main()inta=8;printf(max=%d,max(a,b);例外部變量與局部變量運行結果:max
19、=8inti;main()voidprt();for(i=0;i5;i+)prt();voidprt()for(i=0;i5;i+)printf(“%c”,*);printf(“n”);例外部變量副作用運行結果:*如:intsum;autointa,b,c;registerinti;staticfloatx,y;程序區靜態存儲區動態存儲區全局變量、局部靜態變量形參變量局部動態變量(autoregister)函數調用現場保護和返回地址等靜態動態存儲方式程序整個運行期間函數調用開始至結束生存期編譯時賦初值,只賦一次每次函數調用時賦初值自動賦初值0或空字符不確定未賦初值靜態存儲區動態區存儲區寄存器局
20、部變量外部變量作用域定義變量的函數或復合語句內本文件其它文件u局部變量默認為auto型uregister型變量個數受限,且不能為long, double, float型u局部static變量具有全局壽命和局部可見性u局部static變量具有可繼承性uextern不是變量定義,可擴展外部變量作用域register局部staticauto外部static外部存儲類別例文件file1.cinta;main().f2;.f1;.f1()autointb;f2;.f2()staticintc;C作用域b作用域a作用域mainf2f1mainf1f2maina生存期:b生存期:c生存期:例auto變量的作
21、用域main()intx=1;voidprt(void);intx=3;prt();printf(“2ndx=%dn”,x);printf(“1stx=%dn”,x);voidprt(void)intx=5;printf(“3thx=%dn”,x);運行結果:3thx=52ndx=31stx=1x=1作用域x=1作用域x=3作用域x=5作用域main()voidincrement(void);increment();increment();increment();voidincrement(void)intx=0;x+;printf(“%dn”,x);例局部靜態變量值具有可繼承性運行結果:11
22、1main()voidincrement(void);increment();increment();increment();voidincrement(void)staticintx=0;x+;printf(“%dn”,x);運行結果:123other()staticinta=2;staticintb;intc=10;a=a+2;i=i+32;c=c+5;printf(-OTHER-n);printf(i:%da:%db:%dc:%dn,i,a,b,c);b=a;#includeinti=1;main()staticinta;registerintb=-10;intc=0;printf(-M
23、AIN-n);printf(i:%da:%db:%dc:%dn,i,a,b,c);c=c+8;other();printf(-MAIN-n);printf(i:%da:%db:%dc:%dn,i,a,b,c);i=i+10;other();全局i1main:a0b:-10registermain:c0靜態存儲區動態存儲區other:a2other:b0other:c10843315443other:c10675156-Main-i:1a:0b:-10c:0-Other-i:33a:4b:0c:15-Main-i:33a:0b:-10c:8-Other-i:75a:6b:4c:15例變量的壽命與
24、可見性main()voidgx(),gy();externintx,y;printf(“1:x=%dty=%dn”,x,y);y=246;gx();gy();voidgx()externintx,y;x=135;printf(“2:x=%dty=%dn”,x,y);intx,y;voidgy()printf(“3:x=%dty=%dn”,x,y);例用extern擴展外部變量作用域運行結果:1:x=0y=02:x=135y=2463:x=135y=246例引用其它文件中的外部變量intglobal;externfloatx;main()intlocal;.externintglobal;sta
25、ticintnumber;func2().floatx;staticintnumber;func3()externintglobal;.file1.cfile2.cfile3.c例引用其它文件中的變量,輸出ab和a的m次方inta;main()intpower(intn);intb=3,c,d,m;printf(Enterthenumberaanditspower: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);externinta;intpower(in
26、tn)inti,y=1;for(i=1;i(y)?(x):(y) .main() int a,b,c,d,t; . t=MAX(a+b,c+d); 宏展開:t=(a+b)(c+d)?(a+b):(c+d);int max(int x,int y) return(xy?x:y);main() int a,b,c,d,t; . t=max(a+b,c+d); 例用宏定義和函數實現同樣的功能帶參宏函數處理過程不分配內存簡單的字符置換分配內存先求實參值,再代入形參處理時間編譯時程序運行時參數類型無類型問題定義實參,形參類型程序長度變長不變運行速度不占運行時間調用和返回占時間#include“file2
27、.c”file1.cfile2.cfile1.cfile2.cABA 直接按標準目錄搜索“” 先在當前目錄搜索,再搜索標準目錄可指定路徑宏定義數據結構定義函數說明等#include“file2.c”file1.cAfile3.cC#include“file3.c”file2.cBfile1.cAfile3.cfile2.c例文件包含舉例/*powers.h*/#definesqr(x)(x)*(x)#definecube(x)(x)*(x)*(x)#definequad(x)(x)*(x)*(x)*(x)/*ch8_10.c*/#include#included:fengyibkcpowers.h#defineMAX_POWER10voidmain()intn;printf(numbertexp2texp3texp4n);printf(-t-t-t-n);for(n=1;n=MAX_POWER;n+)printf(%2dt%3dt%4dt%5dn,n,sqr(n),cube(n),quad(n);功能:常量表達式為非時,程序段被編譯
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 大連科技學院《生物技術研究實踐》2023-2024學年第二學期期末試卷
- 腦震蕩外科護理要點解析
- 打掃衛生間操作規范課件
- 四川省涼山彝族自治州2025屆英語七年級第二學期期末學業質量監測試題含答案
- 浙江農業商貿職業學院《國際商務函電》2023-2024學年第二學期期末試卷
- 漢中職業技術學院《基礎法語視聽說4》2023-2024學年第二學期期末試卷
- 隴東學院《計算方法Ⅰ》2023-2024學年第二學期期末試卷
- 蘇州衛生職業技術學院《大學生安全教育》2023-2024學年第二學期期末試卷
- 樂山師范學院《工程力學》2023-2024學年第二學期期末試卷
- 無錫工藝職業技術學院《居住建筑設計》2023-2024學年第二學期期末試卷
- 2025年中國PCR儀市場全面調研及行業投資潛力預測報告
- 國際共產主義運動史知到智慧樹章節測試課后答案2024年秋聊城大學
- 2025年醫院信息科數據安全管理計劃
- 智能工廠整體解決方案
- 緊急情況的處理措施、預案以及抵抗風險的措施
- 2025中智集團招聘重要崗位高頻重點提升(共500題)附帶答案詳解
- 水暖維修培訓課件
- 臨床路徑變異分析
- 婦產科研究動態與學術前沿匯報
- 突破思維定勢課件
- 家具類項目安裝調試方案
評論
0/150
提交評論