Visual-C--程序的設(shè)計第5章-PPT精選課件_第1頁
Visual-C--程序的設(shè)計第5章-PPT精選課件_第2頁
Visual-C--程序的設(shè)計第5章-PPT精選課件_第3頁
Visual-C--程序的設(shè)計第5章-PPT精選課件_第4頁
Visual-C--程序的設(shè)計第5章-PPT精選課件_第5頁
已閱讀5頁,還剩61頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、第5章 函數(shù)5.1 函數(shù)概述5.2 函數(shù)的定義、調(diào)用與說明5.3 函數(shù)間參數(shù)傳遞5.4 內(nèi)聯(lián)函數(shù)5.5 遞歸函數(shù)5.6 函數(shù)重載5.7 函數(shù)模板5.8 作用域與存儲類別5.9 應(yīng)用舉例5.1 函數(shù)概述xyz5.1.1 引例 已知五邊形的各條邊的長度,計算其面積 。計算多邊形面積,可將多邊形分解成若干個三角形。計算三角形面積的公式如下:用前面所學(xué)的知識實(shí)現(xiàn):#include math.h#include iostream.hvoid main()float a,b,c,d,e,f,g,p1,p2,p3,s1,s2,s3,s; cinabcdefg; p1=(a+b+c)/2; s1=sqrt(p

2、1*(p1-a)*(p1-b)*(p1-c); p2=(c+d+e)/2; s2=sqrt(p2*(p2-c)*(p2-d)*(p2-e); p3=(e+f+g)/2; s3=sqrt(p3*(p3-e)*(p3-f)*(p3-g); s=s1+s2+s3; coutsabcdefg; s=area(a,b,c)+area(c,d,e) +area(e,f,g); coutsy) z=x; else z=y; return z; /將大的數(shù)返回void main() int a,b,c,m; cinabc; m=max(a,b); m=max(c,m); coutmendl; 【例5.2】編一

3、程序,輸出如右圖形。 #include #include void pic(int n) for(int i=0;in;i+) coutsetw(10-i); /cout.width(10-i);控制每行輸出的起始位 for(int j=0;j2*i+1;j+)cout*; coutendl; void main() pic(4); pic(6);將n行構(gòu)成的三角形獨(dú)立出來編一函數(shù): 說明:函數(shù)類型指函數(shù)返回值的數(shù)據(jù)類型對沒有返回值的函數(shù),函數(shù)類型定為void型(無類型或空類型)。形式參數(shù)可以為空,但圓括號不能省略。函數(shù)體由語句和其它分程序組成。函數(shù)體中不允許再嵌套定義函數(shù)非void型函數(shù)函數(shù)

4、體中必須有return語句,形式為: return 表達(dá)式 ; 或 return (表達(dá)式) ; 用于返回函數(shù)值。表達(dá)式值的類型與函數(shù)類型最好一致。void型函數(shù)函數(shù)體中return語句可以不出現(xiàn)。若出現(xiàn), 則不能帶表達(dá)式。5.2.2 函數(shù)調(diào)用注意: 實(shí)參與形參的個數(shù)、位置與類型必須一致。它可以是同類型的常量、變量或表達(dá)式。 調(diào)用的形式可以是表達(dá)式,也可以是語句。 函數(shù)定義中的形參只有當(dāng)發(fā)生函數(shù)調(diào)用時,才被分配內(nèi)存單元。形式:函數(shù)名(實(shí)在參數(shù)表)函數(shù)調(diào)用的過程: #include iostream.h#include iomanip.hvoid main() pic(4); /以語句形式調(diào)用

5、pic(6);void pic(int n) for(int i=0;in;i+) coutsetw(10-i); for(int j=0;j2*i+1;j+) cout*; coutmn;coutgcd(m,n)endl;coutsct(m,n)ab; c=max(a,b); coutcy?x:y ; 【例5.4】函數(shù)說明示例 可省略參數(shù)名注意:函數(shù)調(diào)用在前,定義在后,則必須對函數(shù)進(jìn)行說明,函數(shù)說明可以放在函數(shù)調(diào)用之前所在的函數(shù)內(nèi),也可以放在源文件開頭、函數(shù)的外部。 函數(shù)說明和函數(shù)定義在返回類型、函數(shù)名和參數(shù)表上必須要完全一致。5.2.3 函數(shù)說明(函數(shù)原型)float *fun(float

6、 x,float y);char *strcat(char *strDest,const char *strSource); 在說明或定義返回值為指針的函數(shù)時,只須在函數(shù)名前加一指針類型說明符即可。 即函數(shù)的返回值可以是變量的地址、數(shù)組名或指針變量等。如:5.2.4 函數(shù)返回值為指針【例5.11】拼接兩個字符串s1和s2,將拼接后的字符串存于s1中返回。 char *strcat1(char *s1,const char *s2) char *p=s1; while(*p+); -p; while(*p+=*s2+) ; return(s1); 思考:若不定義為返回指針值的函數(shù),則程序應(yīng)如何修

7、改?void main()char *p1,*p2; p1=new char20; p2=new char5; cinp1p2; coutstrcat1(p1,p2)endl;注意:不能返回一個局部變量(在函數(shù)內(nèi)定義的變量)的地址#include iostream.hint *fun(int x) int y=x*x; return &y;void main() int a=5, *p; p=fun(a); coutxy;swap(x,y);cout“x=x y=yab; swap(&a,&b); coutabendl;void swap(int *x,int *y)int temp=*x;

8、*x=*y; *y=temp; 【例5.9】隨機(jī)生成10個1100之間的數(shù)放在一維數(shù)組中,求其平均值及最大的元素值 。#include iostream.h#include stdlib.hconst int N=10;void fun(float *p,float *p1,int *p2) float sum,max1; sum=max1=*p+; for(int i=1;iN;i+) if (max1*p) max1=*p; sum=sum+*p;p+; *p1=sum/N; *p2=max1;void main() float a10,aver,max,x; for(int i=0;i1

9、0;i+) x=rand()%100+1; ai=x; fun(a,&aver,&max);/注意實(shí)參的寫法 coutavermaxendl;【例5.10】字符串的復(fù)制#include iostream.hvoid copy_string(char *from, char *to) while(*from!=0) *to+=*from+; *to=0; void main() char a=I am a teacher., b=You are a student.; coutaendlbendl; copy_string(a,b); coutaendlbab; copy_string(a,b)

10、; couta bendl; delete a; delete b;若該二語句刪除,程序運(yùn)行時將異常終止。 #include iostream.h int f(const int * p) int a=100; a=*p; return a;void main() int x=5; coutf(&x); *p=a; return *p;錯誤,不能修改const對象 為了防止被調(diào)函數(shù)對實(shí)參所指對象的修改,可將形參設(shè)為常指針。 若實(shí)參是常對象的地址,則形參必須定義為常指針。#include iostream.hint f(const int *p)int a=100; a=*p; return a

11、;void main() const int x=5; coutf(&x);形參不能定義為int *p(2) 數(shù)組名作參數(shù) 形參:數(shù)組名 實(shí)參:數(shù)組名或指針變量 特點(diǎn):在被調(diào)函數(shù)中對形參數(shù)組的任何改變均會影響實(shí)參所指地址里的內(nèi)容 ?!纠?.12】對含有n個元素的整型數(shù)組a,從大到小進(jìn)行排序。 調(diào)用:sort(a,10);void sort(int x,int n) int i,j,k,w; for(i=0;in-1;i+) k=i; for(j=i+1;jn;j+)if(xkxj)k=j; if(i!=k)w=xi;xi=xk;xk=w; 數(shù)值型數(shù)組的元素個數(shù)一般須傳給形參【例5.13】 求字

12、符串長度,并調(diào)用之。 int len(char s) int i=0; while(si!=0)i+; return i; 調(diào)用: coutxy; swap(x,y); cout x=xy=10&flag) /判斷是否降序數(shù) if(x/10%10=x%10) x/=10; else flag=0; return flag;函數(shù)在定義時預(yù)先給定一個缺省的形參值,調(diào)用時給出的優(yōu)先。5.3.2 函數(shù)參數(shù)缺省 #include iostream.h#include math.hdouble s(double x , double eps=1e-6) int n=1; double w=0.0, t=1

13、.0 ; while(fabs(t)=eps) w+=t; t=t*x/(n+); return w; void main() couts1=s(2.0); couts2=s(3.0); couts3=y?x:y;void main() coutmyMax(3,6)endl; 關(guān)鍵字inline將函數(shù)myMax說明成內(nèi)聯(lián)函數(shù)。其使用方式和一般函數(shù)一樣,只不過在程序執(zhí)行時并不產(chǎn)生函數(shù)調(diào)用,而是在函數(shù)調(diào)用處將函數(shù)代碼展開執(zhí)行。內(nèi)聯(lián)函數(shù)的定義必須出現(xiàn)在內(nèi)聯(lián)函數(shù)第一次被調(diào)用之前。 當(dāng)然,內(nèi)聯(lián)函數(shù)也有一定的局限性,就是函數(shù)中的代碼不能太多,函數(shù)體內(nèi)不能有循環(huán)語句和switch語句,結(jié)構(gòu)也不能太復(fù)雜。 C

14、+中之所以引入內(nèi)聯(lián)函數(shù),這與宏函數(shù)固有缺陷有關(guān)。5.5 遞歸函數(shù) 用自身的結(jié)構(gòu)來描述自身就稱為遞歸(直接、間接)。最典型的例子是對階乘運(yùn)算: n!=n(n-1)! (n-1)!=(n-1)(n-2)! 1!=1 特點(diǎn):原始問題可轉(zhuǎn)化為解決方法相同的新問題;新問題的規(guī)模比原始問題??;新問題又可轉(zhuǎn)化為解決方法相同的規(guī)模更小的新問題,直至終結(jié)條件為止。fac(2)=2*fac(1)fac(1)=1fac(4)=4*6fac(3)=3*2fac(2)=2*1fac(3)=3*fac(2)fac(4)=4*fac(3)【例5.15】編fac(n)=n! 的遞歸函數(shù)long fac(int n) if(n

15、=1) return(1); return (n*fac(n-1);遞推過程:每調(diào)用自身,當(dāng)前參數(shù)壓棧,直到達(dá)到遞歸結(jié)束條件?;貧w過程:不斷從棧中彈出當(dāng)前的參數(shù),直到???。思考:若fac函數(shù)中沒有語句 if(n=1) return(1);程序運(yùn)行結(jié)果將如何?遞推回歸【例5.16】用遞歸函數(shù)實(shí)現(xiàn)將一個十進(jìn)制整數(shù)轉(zhuǎn)換成二至十六任意進(jìn)制的字符 void convert(int m,int r) char b17=0123456789ABCDEF; if(m!=0) convert(m/r,r);cout0)px(x,n) =x n=1x*(1-px(x,n-1) n1#include iostrea

16、m.hdouble px(double x,int n) if (n=1) return (x); else return(x* (1-px(x,n-1);void main()double x; int n; coutxn; coutpx=px(x,n)endl;【例5.18】輸入一個正整數(shù),要求用遞歸方法實(shí)現(xiàn)以相反的順序輸出該數(shù)。#include iostream.hvoid printn(int n)if (0=n & n=9) coutn; else coutn%10; printn(n/10); void main() int num; coutnum; printn(num); c

17、outendl;5.6 函數(shù)重載引例:求不同類型數(shù)據(jù)的絕對值不足:易出錯、難記憶函數(shù)重載:一組參數(shù)(個數(shù)或類型)不同的函數(shù)共用一個函數(shù)名。不同名函數(shù)實(shí)現(xiàn)同一類的操作#include #include void main()int x1=-1; double x2=2.5; long x3=3L; coutabs(x1)endl; coutfabs(x2)endl; coutlabs(x3)endl; 【例5.20】#include int abs(int x)return x0?x:-x; double abs(double x)return x0?x:-x; long abs(long x)

18、return x0?x:-x; void main()int x1=1; double x2=2.5; long x3=3L; coutabs(x1)endl; coutabs(x2)endl; coutabs(x3)endl; 1. 參數(shù)類型不同的重載函數(shù)編譯器會根據(jù)函數(shù)參數(shù)的類型來確定應(yīng)該調(diào)用哪個函數(shù)2. 參數(shù)個數(shù)不同的重載函數(shù)可見:重載使得函數(shù)的使用更加靈活、方便。 它體現(xiàn)了C+對多態(tài)性的支持一個名字,多個入口 。 【例5.21】#include int min(int a,int b) return ab?a:b; int min(int a,int b,int c)int t=min

19、(a,b); return min(t,c);int min(int a,int b,int c,int d)int t1=min(a,b); int t2=min(c,d); return min(t1,t2);void main() coutmin(13,5,4,9)endl; coutmin(-2,8,0)*、:、?: 這五個運(yùn)算符外,其他運(yùn)算符都可以重載。由于很多符號是一元運(yùn)算符和二元運(yùn)算符公用的(如*既可以用于間接訪問也可用于兩數(shù)相乘),為了避免含混,不得為重載的運(yùn)算符函數(shù)設(shè)置默認(rèn)值,調(diào)用時也就不得省略實(shí)參。4)除了new和delete這兩個較為特殊的運(yùn)算符以外,任何運(yùn)算符如果作為成

20、員函數(shù)時不得重載為靜態(tài)函數(shù)。=、()、- 以及所有的類型轉(zhuǎn)換運(yùn)算符只能作為成員函數(shù)重載,而且是不能針對枚舉類型操作數(shù)的重載。class與typename等價5.7 函數(shù)模板 函數(shù)模板用來定義一個通用函數(shù),可以對不同類型的數(shù)據(jù)進(jìn)行相同的處理,其作用與函數(shù)重載相似,但代碼要簡單許多。而使用函數(shù)重載則需編寫多個函數(shù)。 利用函數(shù)模板定義的函數(shù)稱為模板函數(shù),形式:template 類型 函數(shù)名( 參數(shù)表)【例5.22】#include template T min(T a,T b)return ab?a:b; void main() coutmin(3,5)endl; coutmin(8.5,5.6)e

21、ndl;1)定義一個數(shù)據(jù)類型T2)使用模板函數(shù)時,模板中的類型參數(shù)T用實(shí)參的類型替換分析以下幾種模板函數(shù):template T fun1(T a,int b) /可含有模板參數(shù)表中未給出的數(shù)據(jù)類型 template /模板中可帶有多個參數(shù) void fun1(T1 a,T2 b,T3 c) template void fun1(int a,int b) /必須至少有一個參數(shù)的類型為模板的 /類型參數(shù),即使函數(shù)體中出現(xiàn)也不可template void fun1(int a,int b) T i,j; 【例5.23】定義一個通用的函數(shù),對n個數(shù)按遞增排序。 #include iostream.h

22、template void sort(TEM x,int n) int i,j,k; TEM w; for(i=0;in-1;i+) k=i; for(j=i+1;jxj)k=j; if(i!=k) w=xi;xi=xk;xk=w; void main()int i,a6=6,9,2,4,1,0; float b4=5.5,8.0,3.3,0; sort(a,6); sort(b,4); for(i=0;i6;i+) coutaiendl; for(i=0;i4;i+) coutbix; cout digit(x)endl;全局變量(外部變量):在函數(shù)外部定義的變量局部變量(內(nèi)部變量):在函數(shù)

23、內(nèi)部定義的變量,包括形式參數(shù)生存期:指變量的存在時間,是一個時間概念(在什么時間存在),由變量的存儲類別(自動和靜態(tài)的局部變量和全局變量)決定。初始化 :5.8.1 自動變量(auto)缺省的存儲類別作用域:從定義點(diǎn)開始到所在的分程序結(jié)束,作用域不可以擴(kuò)展 生存期:開始執(zhí)行分程序就生成,分程序執(zhí)行結(jié)束就消亡初始化:可以初始化,缺省值為隨機(jī)值?!纠?.23】自動變量示例。#include iostream.h int f(int x)x+; int y=5; /auto int k=5; y+; return x+y; void main()int k=2; coutf(k)endl; cout

24、f(k+1)endl; 注意:只有內(nèi)部變量存儲類別才能auto5.8.2 靜態(tài)局部變量(static)作用域:從定義點(diǎn)開始到所在的分程序結(jié)束。作用域不可以擴(kuò)展。生存期:在程序執(zhí)行過程中始終存在,直到整個程序運(yùn)行結(jié)束。初始化:在開始執(zhí)行程序時初始化,缺省值為0或0 。只初始化一次。 一個函數(shù)可能被調(diào)用多次,前一次調(diào)用的結(jié)果帶到下一次去。#include iostream.hint fac(int n) static int f=1; f=f*n; return(f);void main() auto int i; for(i=1;i=5;i+) couti!=fac(i);【例5.25】計算15

25、的階乘。5.8.3 全局變量 全局變量又稱外部變量,是在函數(shù)外定義的變量。作用域:從定義點(diǎn)開始到所在的文件結(jié)束生存期:程序的整個執(zhí)行周期初始化:可以初始化,缺省值為0或0 。作用域可以擴(kuò)展: 向上擴(kuò)展 橫向擴(kuò)展,擴(kuò)展到另一個文件注意:擴(kuò)展的地方不能初始化#include iostream.hint m=10; void f1(int n) n=2*n;m=m/3; int n; void f2() n=5;m+;n+; void main() int n=2; f1(n); f2(); coutmnendl; 【例5.26】外部變量示例注意:外部變量的作用域只限于定義處到文件結(jié)束,定義點(diǎn)之前的

26、函數(shù)或其它文件中的函數(shù)不可以引用該外部變量。 可以使用extern聲明符來擴(kuò)展外部變量的作用域 外部變量與局部變量同名,起作用的是局部變量1. 作用域向定義點(diǎn)之前的函數(shù)擴(kuò)展 #include extern int i;void fun() /extern int i; 錯誤 couti;void g()i+;int i=5;void main() int j=20; coutj; g(); fun();#include extern int i; /不能初始化void fun() / extern int i; couti;int i=5;void main() int j=20; coutj

27、; fun(); 2.作用域擴(kuò)展到另一個文件/file1.cpp#include iostream.hextern max,min;void main() void maxmin(int x,int n); int a10=11,2,3,-4,5,6,7,8,0,20; maxmin(a,10); coutmax minendl;/file2.cppint max,min; void maxmin(int x,int n) max=x0;min=x0; for(int i=0;imax)max=xi; if(xix; for(n=6;n=x;n+=2) for(a=3;a=n/2;a+=2)

28、if(isprime(a) & isprime(n-a) coutn=a+n-a0。但這樣處理的數(shù)據(jù)是從個位向前的,所以還要作反轉(zhuǎn)處理。程序: #include iostream.h #include string.h void main() void itoc(int,char ); int n;char s100; cinn; itoc(n,s); coutsendl; void itoc(int n,char s) void reverse(char ); int i=0; int sign; if(sign=n)0); if(sign0) si+=-; si=0; reverse(s); void reverse(char s) int c,i,j; j=strlen(s)-1; for(i=0;ij;i+,j-) c=si;si=sj;sj=c; si+j+1=0;【例5.30】用梯形法求積分:分析:n等分積分區(qū)間a,b,每一個小梯型的面積和即近似為f(x)在a,b的積分值。即將求積分轉(zhuǎn)化求和。#incl

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論