章函數(shù)與宏定義次課_第1頁
章函數(shù)與宏定義次課_第2頁
章函數(shù)與宏定義次課_第3頁
章函數(shù)與宏定義次課_第4頁
章函數(shù)與宏定義次課_第5頁
已閱讀5頁,還剩48頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1第5章函數(shù)C

語言程序設計2#include“stdio.h”main(){inta,b,m;scanf("%d%d",&a,&b);m=max(a,b);printf("max=%d",m);}intmax(intn1,intn2)

{intt;if(n1>n2)t=n1;elset=n2;returnt;}3

庫函數(shù)函數(shù)的定義和返回值函數(shù)的調用函數(shù)的說明調用函數(shù)和被調用函數(shù)之間的數(shù)據(jù)傳遞函數(shù)的遞歸調用主要內容:4①程序結構清晰,可讀性好。②減少重復編碼的工作量。③可多人共同編制一個大程序,縮短程序設計周期,提高程序設計和調試的效率。使用函數(shù)的好處……C程序源程序文件n函數(shù)1函數(shù)m……源程序文件1函數(shù)1函數(shù)n函數(shù)概述5C語言提供了豐富的庫函數(shù),可直接調用這些函數(shù),不必重新自己編寫。調用庫函數(shù)時,要有include命令行如:#include“stdio.h”#include<math.h>(注意:命令行后無”;”)對庫函數(shù)的一般調用形式:函數(shù)名(參數(shù)表)

5.1庫函數(shù)6調用庫函數(shù)的兩種形式:出現(xiàn)在表達式中:作為獨立的語句:例:求y=x5+1.3,可以調用pow函數(shù)來實現(xiàn)y=pow(x,5)+1.3printf(”******\n”);使用庫函數(shù)應注意:1、函數(shù)功能2、函數(shù)參數(shù)的數(shù)目和順序,及各參數(shù)意義和類型3、函數(shù)返回值意義和類型4、需要使用的包含文件7簡單數(shù)學函數(shù)

TurboC庫定義了一些數(shù)學函數(shù),這些函數(shù)大致可以分成以下幾個種類:·三角函數(shù)·雙曲函數(shù)·指數(shù)與對數(shù)函數(shù)·其它函數(shù)所有這些數(shù)學函數(shù)的原型都包含在頭文件math.h當中,因此用到這些數(shù)學庫函數(shù)的程序都應包含這個頭文件。絕大部分數(shù)學庫函數(shù)的返回值都是雙精度(double)類型的,這樣可以保證數(shù)學運算的精度。這里只介紹其中幾個簡單的函數(shù)。

返回目錄81.sin()、cos()及tan()函數(shù)

調用方式:doublesin(doublearg)doublecos(doublearg)doubletan(doublearg)返回目錄92.exp()和pow()函數(shù)

調用方式:doubleexp(doublea)doublepow(doubleb,doublec)功能:exp()函數(shù)返回以自然數(shù)e為底,函數(shù)參數(shù)a為冪的指數(shù)值e;pow()函數(shù)則是返回b的c次冪值b。

返回目錄103.log()和log10()函數(shù)調用方式:doublelog(doublex)doublelog10(doublex)功能:函數(shù)log()返回函數(shù)參數(shù)x的自然對數(shù)值;

函數(shù)log10()則返回以10為底的x的對數(shù)值。

返回目錄114.sqrt()函數(shù)

調用方式:doublesqrt(doublenum)功能:該函數(shù)返回函數(shù)參數(shù)num的平方根。例如sqrt(9.0)等于3.0,sqrt(2.0)等于1.41421。

返回目錄125.fabs()和abs()、labs()函數(shù)

調用方式:doublefabs(doublenum)intabs(intnum)longlabs(longnum)功能:這些函數(shù)均返回函數(shù)參數(shù)num的絕對值,fabs()、abs()和labs()分別適用于浮點型(雙精度型)、整型和長整型數(shù)的絕對值計算。例如fabs(-9.0)等于9.0,abs(9)等于9;labs(-99999)等于99999。

返回目錄136.fmod()函數(shù)

調用方式:doublefmod(doublex,doubley)功能:該函數(shù)返回函數(shù)參數(shù)之商x/y的余數(shù)。比較fmod()函數(shù)與取模運算符(%),

取模運算表達式x%y的值也是x/y的余數(shù),但參與運算的x和y必須是整型量。

返回目錄14函數(shù)返回值的類型名

函數(shù)名(形參類型說明表){ 說明部分 語句部分}5.2.1函數(shù)定義一般格式:合法標識符函數(shù)體例有參函數(shù)

intmax(intx,inty){intz;z=x>y?x:y;return(z);}例有參函數(shù)

intmax(intx,y){intz;z=x>y?x:y;return(z);}例空函數(shù)

dummy(){}函數(shù)體為空例無參函數(shù)

printstar(){printf(“**********\n”);}或

printstar(void){printf(“**********\n”);}5.2函數(shù)的定義與返回值缺省int型無返回值void類型名形式參數(shù)1,類型名形式參數(shù)2……15注意:函數(shù)名和形式參數(shù)都是用戶命名的標識符。在同一程序中,函數(shù)名必須唯一。同一函數(shù)中,形式參數(shù)名必須唯一,但可以和其他函數(shù)的變量同名。不能在函數(shù)的內部定義函數(shù)函數(shù)沒有返回值時函數(shù)為void類型,不寫返回類型時默認為int型。定義的函數(shù)可以沒有形參,函數(shù)體也可以沒有任何操作,但函數(shù)名后的()不能省16函數(shù)的返回值是通過return語句返回的功能:終止函數(shù)的運行,返回調用該函數(shù)的地方,若有返回值,將返回值帶回。return語句格式:return表達式;

return(表達式);

return;5.2.2函數(shù)的返回值17main(){intmax(float,float);floata,b;intc;scanf("%f%f",&a,&b);c=max(a,b);printf("Maxis%d\n",c);}max(floatx,floaty){floatz;z=x>y?x:y;

return(z);}【例2】函數(shù)返回值類型轉換

運行情況如下:輸入:1.8,2.9

輸出結果:Maxis2floatc;%f運行情況如下:輸入:1.8,2.9

輸出結果:Maxis2.000000floatfloat18return語句中的表達式類型一般應和函數(shù)的類型一致,如不一致,系統(tǒng)自動將表達式類型轉換。return語句中不含表達式時,作用只是返回到調用函數(shù)函數(shù)可以沒有return語句,程序一直進行到最后的“}”然后返回到調用函數(shù)。一個函數(shù)內,可以在多處出現(xiàn)return語句,在函數(shù)體的不同部位退出函數(shù),但無論有多少,return只能執(zhí)行一次說明:19

printstar(){printf(“**********\n”);}main(){inta;a=printstar();printf("%d",a);}輸出:**********11voidprintstar(){printf("**********");}main(){inta;a=printstar();printf("%d",a);}編譯錯誤!【例1】函數(shù)體無return將帶回不確定值.inta;a=1;輸出:-85899346020函數(shù)名(實在參數(shù)表)5.3函數(shù)的調用函數(shù)調用的一般形式:調用方式函數(shù)語句:例printstar();函數(shù)表達式:例m=add(3.0,4.0);if(y=0,i=1;i<=5;i++)y=add(y,i);if(add(x,y)>0)……函數(shù)參數(shù):例printf(“%d”,max(a,b));m=max(a,max(b,c));21形式參數(shù):定義函數(shù)時函數(shù)名后面括號中的變量名實際參數(shù):調用函數(shù)時函數(shù)名后面括號中的表達式c=max(a,b);

(main函數(shù))

max(intx,inty){intz;z=x>y?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=x>y?x:y;return(z);}形參實參函數(shù)的形式參數(shù)與實際參數(shù)【例】比較兩個數(shù) 并輸出大者22關于形參和實參的說明:

①當函數(shù)被調用時才給形參分配內存單元。調用結束,所占內存被釋放。所以這種變量只在函數(shù)體內部起作用②實參可以是常量、變量或表達式,但要求它們有確定的值。③實參與形參類型要一致,字符型與整型可以兼容若形參與實參類型不一致,自動按賦值兼容的規(guī)則轉換④實參與形參的個數(shù)必須相等。在函數(shù)調用時,實參的值賦給與之相對應的形參。23關于函數(shù)調用的要求:調用函數(shù)時,函數(shù)名必須與所調用的函數(shù)名字完全一致。函數(shù)必須先定義后調用(函數(shù)的返回值類型為int或char時除外):如

doubleadd(doublea,doubleb){……}main(){doubley,p,q;……y=add(p,q);……}245.4函數(shù)的說明當把函數(shù)(返回值是非int和char類型)的定義放在調用之后時,要在調用之前對函數(shù)進行說明(函數(shù)原型說明)。函數(shù)說明的一般形式函數(shù)類型函數(shù)名(參數(shù)類型1,參數(shù)類型2,…)函數(shù)類型函數(shù)名(參數(shù)類型1

參數(shù)名1,…)如:doubleadd(double,double)doubleadd(doublep,doubleq)25說明:函數(shù)說明可以是一條獨立的說明語句,也可以在普通變量的說明中,如:doubleadd(double,double);doublex,y,add(double,double);說明時的參數(shù)名是虛設的,可以是任何的用戶標識符,可以和程序中的任意用戶標識符同名,也不必與函數(shù)的形參名一致。26函數(shù)類型必須與函數(shù)返回值相同函數(shù)說明與函數(shù)定義不同,函數(shù)說明是告訴編譯系統(tǒng)函數(shù)類型、參數(shù)個數(shù)及類型,以便進行有效的類型檢驗說明:(續(xù))27下列情況下,可不作函數(shù)說明若函數(shù)返值是char或int型,系統(tǒng)自動按int型處理被調用函數(shù)定義出現(xiàn)在主調函數(shù)之前5.4函數(shù)的說明函數(shù)說明的位置1.在函數(shù)內部:只能在本函數(shù)內調用函數(shù)2.在函數(shù)外部:從說明開始后所有的位置都可調用函數(shù)28思考:以下哪種情況需要在主調函數(shù)中對被調函數(shù)聲明被調函數(shù)定義在前,主調函數(shù)定義在后。主調函數(shù)定義在前,被調函數(shù)定義在后,且被調函數(shù)的類型不是整型的。被調函數(shù)定義在后,但被調函數(shù)的類型是整型。?5.4函數(shù)的說明29main(){floata,b;intc;scanf("%f,%f",&a,&b);c=max(a,b);printf("Maxis%d\n",c);}max(floatx,floaty){floatz;z=x>y?x:y;return(z);}int型函數(shù)可不作函數(shù)說明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);}被調函數(shù)出現(xiàn)在主調函數(shù)之前,不必函數(shù)說明

#include<stdio.h>main(){floatadd(float,float);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);}floatadd();?【例】函數(shù)說明舉例

#include<stdio.h>floatadd(float,float);fdd(intx,inty){……add(c,d);……}main(){……c=add(a,b);

……}floatadd(floatx,floaty){……}函數(shù)說明在函數(shù)體外,一直到函數(shù)定義處都可用305.5調用函數(shù)和被調用函數(shù)之間的數(shù)據(jù)傳遞三種方式:

1.實參形參2.return語句把函數(shù)值返回調用函數(shù)。

3.通過全局變量(不提倡使用)31【例5.2】判斷執(zhí)行結果#include<stdio.h>voidtry(int,int,int);

main(){intx=2,y=3,z=0;printf(“(1)x=%dy=%dz=%d\n”,x,y,z);

try(x,y,z);printf(“(4)x=%dy=%dz=%d\n”,x,y,z);}voidtry(intx,inty,intz){printf(“(2)x=%dy=%dz=%d\n”,x,y,z);z=x+y;x=x*x;y=y*y;printf(“(3)x=%dy=%dz=%d\n”,x,y,z);}程序的運行結果:(1)x=2y=3z=0(2)x=2y=3z=0(3)x=4y=9z=5(4)x=2y=3z=032上例中數(shù)據(jù)傳遞的過程:

mainxyztryx

y

ztryxyz

230495230調用時調用中調用后mainxyz230調用前33【例5.3】判斷執(zhí)行結果#include<stdio.h>voidswap(int,int);

main(){intx=10,y=20;printf(“(1)x=%dy=%d\n”,x,y);

swap(x,y);printf(“(4)x=%dy=%d\n”,x,y);}voidswap(inta,intb){intt;printf(“(2)a=%db=%d\n”,a,b);t=a;a=b;b=t;printf(“(3)a=%db=%d\n”,a,b);}程序的運行結果:(1)x=10y=20(2)a=10b=20(3)a=20b=10(4)x=10y=20347.6程序舉例【例7.4】編寫函數(shù)isprime(inta),用來判斷a是否為素數(shù),若是素數(shù),函數(shù)返回整數(shù)1,否則返回0#include<stdio.h>intisprime(int);

main(){intx;printf(“Enteraintegernumber:”);scanf(“%d”,&x);if(isprime(x))printf(“%disprime\n”,x);elseprintf(“%disnotprime\n”,x);}intisprime(inta){inti;for(i=2;i<=a/2;i++) if(a%i==0)return0;

return1;}35【例5.5】驗證任意偶數(shù)為兩個素數(shù)之和,并輸出這兩個素數(shù)思路:將驗證的數(shù)放在x中,可依次從x中減去i,i從2變化到x/2算法:1.i←22.判斷i是否為素數(shù),若是執(zhí)行3,若不是,執(zhí)行53.判斷x-i是否為素數(shù),如是執(zhí)行4,若不是,執(zhí)行54.輸出結果,返回調用函數(shù)5.使i增16.重復執(zhí)行2,直到i>x/236#include<stdio.h>intisprime(int);

voideven(int);main(){inta;printf(“Enteraevennumber:”);scanf(“%d”,&a);if(a%2==0)even(a);elseprintf(“The%disn’tevennumber\n”,a);}viodeven(intx){inti;for(i=2;i<=x/2;i++)if(isprime(i))if(isprime(x-i)){printf(“%d=%d+%d\n”,x,i,x-i);return;}}intisprime(inta){……}37練習:求1+2+3+……100的和main(){inti,s;for(i=1;i<=100;i++)s+=i;printf(“s=%d”,s);}ints;s=sum(100);printf(“s=%d”s);intsum(inta){inti,s;for(i=1;i<=a;i++)s+=i;return(s);}38例5.6編寫函數(shù)sum(intn),用以求,和數(shù)作為函數(shù)值返回f(x)=x2+1#include<stdio.h>intsum(int);

intf(int);main(){inta,b;printf(“Enteraintegernumber:”);scanf(“%d”,&a);b=sum(a);printf(“a=%dsum=%d\n”,a,b);}intsum(intn){intx,s=0;for(x=0;x<=n;x++)s+=f(x);returns;}

intf(intx){returnx*x+1;}39【例5.9】編寫函數(shù)統(tǒng)計輸入字符的個數(shù),用@字符結束輸入,在主函數(shù)中調用此函數(shù),輸出結果#include<stdio.h>longcountch();

main(){longn,b;n=countch();printf(“n=%ld\n”,n);}longcountch(){longcn;for(cn=0;getchar()!=‘@’;cn++);returncn;}

405.5函數(shù)的嵌套調用

C規(guī)定:函數(shù)定義不可嵌套,但可以嵌套調用函數(shù)main函數(shù){

……

調用函數(shù)A;

……}函數(shù)A{……

調用函數(shù)B;

……}函數(shù)B{

……

……

……}41【例】函數(shù)的嵌套調用main(){intn=3;printf("%d\n",sub1(n));}sub1(intn){inti,a=0;for(i=n;i>0;i--)a+=sub2(i);returna;}sub2(intn){returnn+1;}程序輸出結果:9425.6函數(shù)的遞歸調用

遞歸調用:在函數(shù)的執(zhí)行過程中直接或者間接的調用函數(shù)本身。

F函數(shù)調用F函數(shù)F1函數(shù)調用F2函數(shù)F2函數(shù)調用F1函數(shù)直接遞歸間接遞歸43說明C編譯系統(tǒng)對遞歸函數(shù)的調用次數(shù)沒有限制注意防止出現(xiàn)無終止的遞歸調用,要有使程序趨向于結束的條件5.6函數(shù)的遞歸調用44【例】編一遞歸函數(shù)求n!。思路:以求4的階乘為例:4!=4*3!,3!=3*2!,2!=2*1!,1!=1,0!=1。遞歸結束條件:當n=0時,n!=1。遞歸公式:n!=1(n=0)n×(n-1)!(n>0)45程序如下:

#include<stdio.h>intfac(intn){intt;if(n==0||n==1)t=1;elset=fac(n-1)*n;return(t);}main(){intm,y;printf("Inputaintegernumber:");scanf("%d",&m);if(m<0)printf(“dataerror!");else

{y=fac(m);printf("%d!=%d",m,y);}}運行情況如下:Inputaintegernumber:4

4!=2446遞歸調用過程遞推main()fact(4)fact(3)fact(2)fact(1){{{{{……………

y=fact(4);f=4*fact(3);f=3*fact(2);f=2*fact(1);f=1;

……………return24return6return2return1}}}}}

回歸

47例:求年齡的問題

5個人坐在一起,問多大,第五個人說比第四個人大2歲,第四個人說比第三個人大2歲,第三個人又說

溫馨提示

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

評論

0/150

提交評論