C語言-第七章-函數課件_第1頁
C語言-第七章-函數課件_第2頁
C語言-第七章-函數課件_第3頁
C語言-第七章-函數課件_第4頁
C語言-第七章-函數課件_第5頁
已閱讀5頁,還剩48頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第七章函數武漢理工大學計算機學院8/4/20231第七章函數武漢理工大學計算機學院7/31/20231第七章函數7.1函數的概念7.2函數的定義7.3函數的調用和函數的返回值7.4函數應用實例7.5嵌套調用和遞歸調用7.6變量的作用域和存儲類別7.7內部函數和外部函數(*)7.8編譯預處理8/4/20232第七章函數7.1函數的概念7/31/202327.1

念#include"stdio.h"voidstars(intn);voidprint_message();main(){stars(20);print_message();stars(20);}voidstars(intn){inti;for(i=1;i<=n;i++)putchar('*');putchar('\n');}voidprint_message(){printf("Howdoyoudo!\n");}函數stars()、print_message()的聲明/*main函數的定義*/stars()、print_message()函數調用定義stars()函數定義print_message()函數程序運行后輸出結果為:8/4/202337.1

念#include"stdio.C程序結構8/4/20234C程序結構7/31/20234說明:C是函數式語言一個C程序有且只能有一個名為main的主函數。所有的函數都是互相獨立的,除main函數不能調用外,其它函數可以互相調用。函數庫函數(標準函數)自定義函數有參函數無參函數或8/4/20235說明:C是函數式語言有參函數或7/31/202357.2函數的定義[類型說明符]函數名([形參說明表]){ [說明部分][語句部分]}說明函數返回值的數據類型;若缺省,則為int類型;若函數無值,則定義為void類型。由用戶自己命名,合法的標識符說明參數的個數和類型說明函數中用到的除形參以外的其它變量等為了完成函數特定的功能而設計的一個或多個語句

空函數:Function(){}8/4/202367.2函數的定義[類型說明符]函數名([形參說明表函數定義實例打印一行n個‘*’

voidstars(intn){inti;for(i=1;i<=n;i++)putchar('*');putchar('\n');}求整數x的n次冪(n>0)longpower(intx,intn){inti;longmul=1;for(i=1;i<=n;i++)mul=mul*x;return(mul);}傳統(tǒng)的定義風格8/4/20237函數定義實例打印一行n個‘*’求整數x的n次冪(n>0傳統(tǒng)的函數定義形式longpower(x,n)intx,n;{inti;longmul=1;for(i=1;i<=n;i++)mul=mul*x;return(mul);}8/4/20238傳統(tǒng)的函數定義形式longpower(x,n)7/317.3函數的調用和函數的返回值7.3.1函數的參數7.3.2函數的返回值7.3.3函數的聲明7.3.4函數的調用8/4/202397.3函數的調用和函數的返回值7.3.1函數的參數77.3.1函數的參數形式參數:函數定義時所使用的參數稱為形式參數。形參可以是:變量或數組名。實際參數:函數調用時所使用的參數稱為實際參數。實參可以是:具有確切值的常量、變量、表達式或數組名。8/4/2023107.3.1函數的參數形式參數:7/31/202310intmax(intx,inty);voidmain(){inta,b,c;scanf("%d%d",&a,&b);c=max(a,b);printf("Max=%d.\n",c);}intmax(intx,inty){intz;z=x>y?x:y;return(z);}形參只能是變量或數組名intmax(intx,inty)c=max(a,b)實參可以是常量、變量、表達式或數組名,但要求它們有確定的值如:c=max(10,(a+b)/2);實參與形參之間:個數一致,類型一致或賦值兼容,順序一致。形參:變量常量變量實參表達式值8/4/202311intmax(intx,inty);形參只能是變量或7.3.2函數的返回值返回語句(return語句):格式:return(表達式);或return表達式;或return;功能:將流程及表達式的值從被調用函數返回到函數的調用處。說明:

intmax(intx,inty){intz;z=(x>y)?x:y;return(z);}若return后面帶表達式,首先計算表達式的值,表達式的值就是所求的函數值。returnz;return((x>y)?x:y);8/4/2023127.3.2函數的返回值返回語句(return語句):in說明(續(xù))一個函數體內可以有多個或沒有return語句;intmax(intx,inty){intz;if(x>y)return(x);elsereturn(y);}voidoutput(intm){printf(”%d”,m);return;}

若return后面沒有表達式,或沒有return語句,則可能會返回不定值。output(intm){printf(”%d”,m);return;}/*默認為int類型函數*/void:空類型8/4/202313說明(續(xù))一個函數體內可以有多個或沒有return語句;in7.3.3函數的聲明#include"stdio.h"voidstars(intn);voidprint_message();main(){stars(20);print_message();stars(20);}voidstars(intn){inti;for(i=1;i<=n;i++)putchar('*');putchar('\n');}voidprint_message(){printf("Howdoyoudo!\n");}8/4/2023147.3.3函數的聲明#include"stdio.h"函數聲明的一般形式:函數類型函數名(類型名形參1,類型名形參2,……)包含參數和返回值類型的函數聲明稱為函數原型。函數類型函數名(類型名,類型名,……)若有函數:

floatfun(doublea,intb,floatc){……}則可有函數聲明:⒈floatfun(doublea,intb,floatc);⒉floatfun(doublex,inty,floatz);⒊floatfun(double,int,float);說明:8/4/202315函數聲明的一般形式:說明:7/31/202315說明(續(xù)):如果函數的值是int或char型,可以不必進行聲明,系統(tǒng)自動按int型聲明。如果被調用函數出現在主調函數之前,可以不必進行聲明。#include<stdio.h>main(){inta,b,c;scanf("%d%d",&a,&b);c=max(a,b);printf("Max=%d\n",c);}intmax(intx,inty){intz;z=x>y?x:y;return(z);}8/4/202316說明(續(xù)):如果函數的值是int或char型,可以不說明(續(xù)):如果已在所有函數定義之前,在函數的外部已作了函數聲明,則在各個主調函數中不必對所調用的函數再做聲明。#include<stdio.h>doublemysqrt(floatx);main(){floata,c;scanf(”%f”,&a);c=mysqrt(a);printf(”sqrt(%f)=%f\n”,a,c);}doublemysqrt(floatx){doubley;y=sqrt(x);return(y);}8/4/202317說明(續(xù)):如果已在所有函數定義之前,在函數的外部已作了函數7.3.4函數的調用調用的一般形式:函數名(實參1,實參2,……)說明:若調用無參函數,則無實參表列,但括弧不能省略;如果實參表列包含多個實參,則各參數間用逗號隔開;實參與形參的個數應相等,類型應一致或賦值相容;實參與形參按順序一一對應傳遞數據;8/4/2023187.3.4函數的調用調用的一般形式:7/31/20231調用方式函數語句:由函數調用加上分號構成,在主調函數中可作為一個獨立的語句。如:

stars(20);或printf(”Cprogram”);函數表達式:函數調用作為一個運算對象出現在表達式中,此時要求函數帶回一個確定的值以參加表達式的運算。如:c=mysqrt(a);函數參數:函數調用作為另一個函數的實參,其值作為一個實際參數傳給被調函數的形參進行處理;此時也要求函數帶回一個確定值。如:m=max(a,max(b,c));printf("%d",max(a,b));8/4/202319調用方式7/31/202319調用過程floatadd();main(){floata,b,c;scanf(”%f,%f”,&a,&b);c=add(a,b);printf(”sumis%f”,c);}floatadd(floata,floatb){return(a+b);}調用,流程從主調函數轉移到被調用函數,且實參將值傳給對應的形參;執(zhí)行被調用函數;流程從被調用函數返回到主調函數,并返回函數值。abc615a6b15218/4/202320調用過程調用,流程從主調函數轉移到被調用函數,且實參將值傳給調用過程floatadd();main(){floata,b,c;scanf(”%f,%f”,&a,&b);c=add(10,b+2);printf(”sumis%f”,c);}floatadd(floata,floatb){floatc;c=a+b;a++;b++;return(a+b);}abc615a10b1717c2711182929形參:變量實參:常量變量表達式值108/4/202321調用過程abc615a10b1717c2711182929形7.4函數應用實例例7.1求累加和sum=1+2!+…+10!分析:可以編寫一個求階乘的函數fac(n)計算n!實現:longfac(intn);main(){inti;longsum=0;for(i=1;i<=10;i++)sum+=fac(i);printf(”\nsum=%ld”,sum);}longfac(intn){inti;longx=1L;for(i=1;i<=n;i++)x*=i;return(x);}8/4/2023227.4函數應用實例例7.1求累加和sum=1+例7.2由鍵盤輸入x、y及z的值,計算函數

sin(x)sin(y)sin(z)

func(x,y,z)=————+————+————

sin(x-y)sin(x-z)sin(y-z)sin(y-x)sin(z-x)sin(z-y)分析:可以定義一個函數part(x,y,z)求每加項的值另外定義一個度與弧度之間的轉換函數change(x)主函數中以度為單位輸入x、y及z的值,并轉換為弧度;多次調用part()函數求出func的值輸出func的值8/4/202323例7.2由鍵盤輸入x、y及z的值,計算函數

sin(x)sin(y)sin(z)

func(x,y,z)=————+————+————

sin(x-y)sin(x-z)sin(y-z)sin(y-x)sin(z-x)sin(z-y)#include<math.h>doublechange(floatx);doublepart(floatx,floaty,floatz);main(){floatx,y,z,sum;scanf(”%f%f%f”,&x,&y,&z);x=change(x);y=change(y);z=change(z);sum=part(x,y,z)+part(y,z,x)+part(z,x,y);printf(”\nfunc=%f”,sum);}8/4/202324sin(x)

sin(x)sin(y)sin(z)

func(x,y,z)=————+————+————

sin(x-y)sin(x-z)sin(y-z)sin(y-x)sin(z-x)sin(z-y)doublechange(floatx){return(x*3.14159/180);}doublepart(floatx,floaty,floatz);{floattmp;tmp=sin(x)/sin(x-y)/sin(x-z);return(tmp);}8/4/202325sin(x)7.5函數的嵌套調用和遞歸調用7.5.1函數的嵌套調用7.5.2函數的遞歸調用8/4/2023267.5函數的嵌套調用和遞歸調用7.5.1函數的嵌套7.5.1函數的嵌套調用C語言的函數定義都是互相平行的、獨立的,即不允許嵌套定義函數;但是,可以嵌套調用函數,即程序在調用一個函數的過程中,該被調函數又可以調用其它函數。如:main函數調用a函數a函數調用b函數b函數結束main函數調用a函數a函數調用b函數b函數結束main函數調用a函數a函數調用b函數結束8/4/2023277.5.1函數的嵌套調用C語言的函數定義都是互相平行的、

nm!

例7.1求組合數C=————

mn!*(m-n)!longcmn(intm,intn);longfac(intn);main(){intm,n;longc;printf(”\n輸入兩整數:”);scanf(”%d%d”,&m,&n);c=cmn(m,n);printf(”\n組合數值=%ld”,c);}longcmn(intm,intn){longx;x=fac(m)/fac(n)/fac(m-n);return(x);}

longfac(intn){longx=1L;while(n>=1)x*=nreturn(x);}8/4/202328n調

程main函數調用cmn函數cmn(m,n)調用fac函數fac(m)調用fac函數fac(n)調用fac函數fac(m-n)結束main函數調用cmn函數cmn(m,n)調用fac函數fac(m)調用fac函數fac(n)調用fac函數fac(m-n)結束8/4/202329調

程main函數調用cmn函數cmn(m,n)調用7.5.2函數的遞歸調用概念:定義一個函數時,在函數體內直接或間接地調用了自身,則稱為函數的遞歸調用。intf1(intx){inty,z;……z=f2(y);……return(z);}intf2(intt){intb,c;……c=f1(c);……return(3+c);}intf(intx){inty,z;……z=f(y);……return(z*z);}直接遞歸間接遞歸8/4/2023307.5.2函數的遞歸調用概念:定義一個函數時,在函數體遞歸的兩個方面:遞歸的一般形式

遞歸的結束條件如:n!遞推形式:n!=1×2×…×n遞歸形式:longf(intn){longy;if(n==0)y=1;elsey=f(n-1)*n;return(y);}main(){intn;printf("\ninputn(n>0):");scanf("%d",&n);if(n<0)printf("Dataerror!\n");elseprintf("%d!=%ld\n",n,f(n));}運行過程演示8/4/202331遞歸的兩個方面:遞歸的一般形式

main(){……n=5;print(f(5));}longf(5){longy;……y=5*f(4);

}longf(4){longy;……y=4*f(3);

}longf(3){longy;……y=3*f(2);

}longf(3){longy;……y=3*f(2);

}longf(2){longy;……y=2*f(1);

}longf(1){longy;……y=1*f(0);}return(1);return(2);return(6);return(6);return(24);return(120);longf(0){longy;……y=1;}return(1);調用過程8/4/202332main()longf(5)longf(4)long7.6變量的作用域和存儲類別7.6.1變量的作用域7.6.2變量的存儲類別7.6.3小結8/4/2023337.6變量的作用域和存儲類別7.6.1變量的作用域77.6.1變量的作用域變量的作用域:是指在程序中不同位置所定義的變量,其變量起作用的區(qū)域。根據變量起作用的范圍,變量可分為:局部變量:在函數內部或復合語句中定義的變量,也稱為內部變量。其作用域僅在所定義的函數或復合語句中。全局變量:在所有函數外部定義的變量,也稱為外部變量。其作用域從定義位置開始到其所在的源文件結束。8/4/2023347.6.1變量的作用域變量的作用域:是指在程序中不同位置1.局部變量main(){intj,x,c;……{intc;

c=j%2;……}……}intf1(inta){intv1,x;……}intf2(){intv2,x,y;……}jxcca,v1,xv2,x,y8/4/2023351.局部變量main()intf1(inta)jc例voidf(){inta=1;printf("\n1.a=%d",a);}main(){inta=10,i;f();for(i=1;i<=2;i++){inta=50;a++;printf("\n2.%d:a=%d",i,a);}printf("\n3.a=%d",a);}程序運行結果為:11233321.a=12.1:a=512.2:a=513.a=108/4/202336例voidf()程序運行結果為:11233321.a=程序運行結果為:1.a=12.1:a=512.2:a=513.a=10a210511.a=12.1:a=512.2:a=513.a=10a210a350a3508/4/202337程序運行結果為:a210511.a=1a210a350a352.

量#include<stdio.h>intp=1,q=5;main(){intm,n;……}floatf1(inta){intb,c;……}charc1,c2;charf2(intx,inty){inti,j;.……}p,q的作用范圍c1,c2的作用范圍8/4/2023382.

量#include<stdio.h>p說明全局變量增加了函數間的數據聯系盡量少使用全局變量(除非在必要時)intk;voidshow(){printf("\n2.k=%d",k);k=9;}main(){k=2;show();printf("\n1.k=%d",k);}運行結果:2.k=21.k=98/4/202339說明全局變量增加了函數間的數據聯系intk;運行結果:說明(續(xù))若全局變量與局部變量同名,則在局部變量的作用范圍內,全局變量不起作用inta=3,b=5;intmax(inta,intb){intc;c=a>b?a:b;return(c);}main(){inta=10;printf("%d",max(a,b));}形參a、b的作用域全局變量a、b不起作用局部變量a的作用域全局變量a不起作用運行結果為:108/4/202340說明(續(xù))若全局變量與局部變量同名,則在局部變量的作用范圍內說明(續(xù))可以用extern作外部變量聲明,擴大全局變量的作用域voidf1(){externintc;……}externintb;

voidf2(){……}main(){externinta;

……}inta=8,b=-2,c=15;abc注意:externintb=1;

×ac8/4/202341說明(續(xù))可以用extern作外部變量聲明,擴大全局變量的作7.6.2變量的存儲類別存儲空間的劃分程序區(qū)靜態(tài)數據區(qū)動態(tài)數據區(qū)程序區(qū):用于存放程序編譯后形成的可執(zhí)行代碼(執(zhí)行時裝入)靜態(tài)存儲區(qū):用于存放程序中的靜態(tài)數據,如全局變量等動態(tài)存儲區(qū):用于存放程序中的動態(tài)數據,如函數形參、局部變量、函數調用時的現場保護和返回地址等靜態(tài)數據:說明時在靜態(tài)存儲區(qū)中分配存儲單元并在程序執(zhí)行過程中始終占用該單元,直到程序結束才釋放;動態(tài)數據:在函數開始執(zhí)行時分配動態(tài)存儲空間,函數結束時釋放這些空間。C的存儲類別有四種:auto、static、register和extern。8/4/2023427.6.2變量的存儲類別存儲空間的劃分程序區(qū)程序區(qū):用于局部變量的存儲屬性自動的(auto)、靜態(tài)的(static)、寄存器的(register)voidf(intc);main(){registerinti;/*i:局部寄存器變量*/for(i=1;i<=3;i++)f(i);}voidf(intc){autointa=0;/*a:局部自動變量,inta=0;*/staticintb;/*b:局部靜態(tài)變量,staticintb=0;*/a++;b++;printf("%d:a=%d,b=%d\n",c,a,b);}存放在動態(tài)存儲區(qū)存放在靜態(tài)存儲區(qū)存放在寄存器中,無地址8/4/202343局部變量的存儲屬性自動的(auto)、靜態(tài)的(static)寄存器變量說明為了減少從內存中存取變量值的時間,C語言允許將局部變量的值放在寄存器中;用關鍵字register聲明。

intfac(intn){registerinti,f=1;for(i=1;i<=n;i++)f=f*i;return(f);}不能定義太多的寄存器變量,因為寄存器數量有限,太多無效(將自動按自動變量處理)寄存器無地址,因此:&i×&f×返回8/4/202344寄存器變量說明為了減少從內存中存取變量值的時間,C語言允許將自動變量和靜態(tài)局部變量區(qū)別voidf(intn){inta=0;

staticintb=0;a++;b++;printf("\n%d:a=%d,b=%d",n,a,b);}main(){registerinti;for(i=1;i<=3;i++)f(i);}i1n1a0b0111:a=1,b=1

22233:a=1,b=32:a=1,b=20130134程序結束返回8/4/202345自動變量和靜態(tài)局部變量區(qū)別voidf(intn)i1局部靜態(tài)變量說明函數編譯時在靜態(tài)存儲區(qū)分配存儲單元,函數調用結束后不釋放存儲單元,即在整個程序的運行中不釋放存儲單元。用static聲明該變量為“局部靜態(tài)變量”若對變量賦初值,對于靜態(tài)變量,只執(zhí)行一次,再次調用函數時不再賦初值而保留上次函數調用結束時的值;而對于自動變量,每次調用都要重新分配內存單元并賦初值若不對變量賦初值,對于靜態(tài)變量系統(tǒng)自動賦缺省值;而對于自動變量,只分配存儲單元,其值不確定雖然靜態(tài)局部變量在函數調用結束后仍占存儲單元,但由于是局部變量,其它函數不能引用它8/4/202346局部靜態(tài)變量說明函數編譯時在靜態(tài)存儲區(qū)分配存儲單元,函數調全局變量的存儲方式全局變量是在函數外部定義的,存放在靜態(tài)存儲區(qū),在程序的整個運行過程中占用存儲單元,生存期為整個程序的運行期間8/4/202347全局變量的存儲方式全局變量是在函數外部定義的,存放在靜態(tài)存儲intc;voidf(intn){inta=0;a++;c++;printf("\n%d:a=%d,c=%d",n,a,c);}main(){inti;for(i=1;i<=3;i++){f(i);c++;}printf("\nc=%d",c);}c0i1n1a0111:a=1,c=1

2220132:a=1,c=34330153:a=1,c=56c=64程序結束8/4/202348intc;c0i1n1a0111:a=1,c=12227.6.3存儲類別小結1、數據的兩種屬性:數據類型存儲類別autofloata;static

溫馨提示

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

最新文檔

評論

0/150

提交評論