第5章函數PPT課件_第1頁
第5章函數PPT課件_第2頁
第5章函數PPT課件_第3頁
第5章函數PPT課件_第4頁
第5章函數PPT課件_第5頁
已閱讀5頁,還剩55頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

1、C是模塊化程序設計語言源程序文件1預編譯命令說明部分執行部分函數1函數n源程序文件i源程序文件nC程序C程序結構&C是函數式語言&必須有且只能有一個名為main的主函數&C程序的執行總是從main函數開始,在main中結束&函數不能嵌套定義,可以嵌套調用第1頁/共60頁 函數分類 從用戶角度 標準函數(庫函數):由系統提供。如printf、scanf等 用戶自定義函數:先聲明后調用 從函數形式 無參函數 有參函數使用庫函數應注意:1、函數功能2、函數參數的數目和順序,及各參數意義和類型3、函數返回值意義和類型4、需要使用的包含文件第2頁/共60頁 5.2 函數的

2、定義 一般格式合法標識符函數返回值類型缺省int、char型無返回值void函數體函數類型 函數名(形參類型說明表)說明部分語句部分現代風格:例 有參函數(現代風格) int max(int x,int y) int z; z=xy?x:y; return(z); 例 有參函數(現代風格) int max(int x, y) int z; z=xy?x:y; return(z); 例 空函數 dummy( ) 函數體為空例 無參函數 printstar( ) printf(“*n”); 或 printstar(void ) printf(“*n”); 第3頁/共60頁函數類型 函數名(形參表)

3、形參類型說明說明部分語句部分傳統風格:例 有參函數(傳統風格) int max(x,y) int x,y; int z; z=xy?x:y; return(z); 第4頁/共60頁 5.3 函數的返回值 返回語句 形式: return (表達式); 或 return 表達式/常數; 或 return; 功能:使程序控制從被調用函數返回到調用函數中,同時把返回值帶給調用函數 說明: 函數中可有多個return語句,遇到的第一個return語句起作用。各個return語句的返回情況要保持一致。 若無return語句,遇時,自動返回調用函數 若函數類型與return語句中表達式值的類型不一致,按前者

4、為準,自動轉換-函數調用轉換 void型函數例 無返回值函數 void swap(int x,int y ) int temp; temp=x; x=y; y=temp; 第5頁/共60頁printstar() printf(*);main() int a; a=printstar(); printf(%d,a);例5.1 函數帶回不確定值編譯無錯void printstar() printf(*);main() int a; a=printstar(); printf(%d,a);編譯錯誤!第6頁/共60頁例5.2 函數返回值類型轉換float max(float x, float y) f

5、loat z; z=xy?x:y; return(z);void main() float a,b; int c; scanf(%f,%f,&a,&b); c=max(a,b); printf(Max is %dn,c);第7頁/共60頁 5.4 函數的調用 調用形式 函數名(實參表);說明: 實參與形參個數相等,類型一致,按順序一一對應 實參表求值順序,因系統而定(一般自右向左)第8頁/共60頁int f(int a, int b) int c; if(ab) c=1; else if(a=b) c=0; else c=-1; return(c);main() int i=2

6、,p; p=f(i,+i); printf(%d,p);例5.3 參數求值順序int f(int a, int b) int c; if(ab) c=1; else if(a=b) c=0; else c=-1; return(c);main() int i=2,p; p=f(i, i+); printf(%d,p);運行結果:0運行結果:1第9頁/共60頁 調用方式 函數語句: 例 printstar(); printf(“Hello,World!n”); 函數表達式: 例 m=max(a,b)*2; 函數參數: 例 printf(“%d”,max(a,b); m=max(a,max(b,c

7、);第10頁/共60頁 函數說明 對被調用函數要求: 必須是已存在的函數 庫函數: #include 用戶自定義函數: 函數類型說明 函數說明 一般形式: 函數類型 函數名(形參類型 形參名,. ); 或 函數類型 函數名(); 作用:告訴編譯系統函數類型、參數個數及類型,以便檢驗 函數定義與函數說明格式不同 函數說明位置:程序的數據說明部分(函數內或外) 下列情況下,可不作函數說明 被調用函數定義出現在主調函數之前 若函數返值是char或int型,系統自動按int型處理 有些系統(如Borland C+)要求函數說明指出函數返值類型和形參類型,并且對void 和 int 型函數也要進行函數說

8、明第11頁/共60頁例5.4 函數說明舉例main() float a,b; int c; scanf(%f,%f,&a,&b); c=max(a,b); printf(Max is %dn,c);max(float x, float y) float z; z=xy?x:y; return(z);int型函數可不作函數說明(Borland C+不行)float add(float x, float y) float z; z=x+y; return(z);main() float a,b,c; scanf(%f,%f,&a,&b); c=add(a,b); p

9、rintf(sum is %f,c);被調函數出現在主調函數之前,不必函數說明main() float add(float,float); /*function declaration*/ float a,b,c; scanf(%f,%f,&a,&b); c=add(a,b); printf(sum is %f,c);float add(float x, float y) float z; z=x+y; return(z);float add();第12頁/共60頁 5.5 函數的參數及傳遞方式 形參與實參 形式參數:定義函數時函數名后面括號中的變量名 實際參數:調用函數時函數

10、名后面括號中的表達式c=max(a,b);(main 函數)(max 函數)max(int x, int y) int z; z=xy?x:y; return(z); 例5.5 比較兩個數并輸出大者main() int a,b,c; scanf(%d,%d,&a,&b); c=max(a,b); printf(Max is %d,c);int max(int x, int y) int z; z=xy?x:y; return(z);形參實參第13頁/共60頁v說明:l實參必須有確定的值l形參必須指定類型l形參與實參類型一致,個數相同l若形參與實參類型不一致,自動按形參類型轉換函

11、數調用轉換l形參在函數被調用前不占內存;函數調用時為形參分配內存;調用結束,內存釋放第14頁/共60頁例5.6 計算x的立方#include float cube(float x) return(x*x*x);main() float a, product; printf(Please input value of a:); scanf(%f,&a); product=cube(a); printf(”Cube of %.4f is %.4fn,a,product);xaproduct1.21.21.728第15頁/共60頁參數傳遞方式 值傳遞方式 方式:函數調用時,為形參分配單元,并

12、將實參的值復制到形參中;調用結束,形參單元被釋放,實參單元仍保留并維持原值 特點: 形參與實參占用不同的內存單元 單向傳遞第16頁/共60頁711x:y:調用前:調用結束:711x:y:例5.7 交換兩個數void swap(int a, int b) int temp; temp=a; a=b; b=temp;#include main() int x=7,y=11; printf(x=%d,ty=%dn,x,y); printf(swapped:n); swap(x,y); printf(x=%d,ty=%dn,x,y);調用:711a:b:711x:y:swap:711x:y:117a:

13、b:temp第17頁/共60頁地址傳遞方式:函數調用時,將數據的存儲地址作為參數傳遞給形參特點:形參與實參占用同樣的存儲單元“雙向”傳遞實參和形參必須是地址常量或變 量第18頁/共60頁void swap(int *p1, int *p2) int p; p=*p1; *p1=*p2; *p2=p;main() int a,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);例5.8 交換兩個數a59

14、b調前:a59b調swap:p1&a&bp2a95b交換:p1&a&bp2a95b返回:第19頁/共60頁#include long sum(int a, int b); long factorial(int n);main() int n1,n2; long a; scanf(%d,%d,&n1,&n2); a=sum(n1,n2); printf(a=%1d,a); long sum(int a,int b) long c1,c2; c1=factorial(a); c2=factorial(b); return(c1+c2); long f

15、actorial(int n) long rtn=1; int i; for(i=1;i=n;i+) rtn*=i; return(rtn); 文件包含編譯預處理命令函數類型說明函數定義函數調用函數調用函數返回值形參實參long sum(int a, int b);long factorial(int n);第20頁/共60頁 5.6 函數的嵌套調用與遞歸調用 嵌套調用C規定:函數定義不可嵌套,但可以嵌套調用函數main( )調用函數a結束a函數b函數調用函數b第21頁/共60頁例5.9 求三個數中最大數和最小數的差值#include int dif(int x,int y,int z); i

16、nt max(int x,int y,int z); int min(int x,int y,int z);void main() int a,b,c,d; scanf(%d%d%d,&a,&b,&c); d=dif(a,b,c); printf(Max-Min=%dn,d); int dif(int x,int y,int z) return max(x,y,z)-min(x,y,z); int max(int x,int y,int z) int r; r=xy?x:y; return(rz?r:z); int min(int x,int y,int z) int

17、r; r=xy?x:y; return(rz?r:z); main( )調用函數dif輸出結束dif函數max函數調用函數max調用函數minmin函數第22頁/共60頁遞歸調用v定義:函數直接或間接的調用自身叫函數的遞歸調用f( )調f調f2調f1f1( )f2( )v說明l C編譯系統對遞歸函數的自調用次數沒有限制l 每調用函數一次,在內存堆棧區分配空間,用于存放函數變量、返回值等信息,所以遞歸次數過多,可能引起堆棧溢出int f(int x) int y,z; z=f(y); . return(2*z);int f1(int x) int y,z; z=f2(y); . return(2

18、*z);int f2(int t) int a,c; c=f1(a); . return(3+c);第23頁/共60頁例 求n的階乘) 1()!1() 1 , 0(1!nnnnn#include int fac(int n) int f; if(n0) printf(n0,data error!); else if(n=0|n=1) f=1; else f=fac(n-1)*n; return(f);main() int n, y; printf(Input a integer number:); scanf(%d,&n); y=fac(n); printf(%d! =%15d,n,y

19、);第24頁/共60頁 5.7 變量的作用域和存儲類型 概述 變量是對程序中數據的存儲空間的抽象內存.main() int a; a=10; printf(“%d”,a);編譯或函數調用時為其分配內存單元1020002001程序中使用變量名對內存操作第25頁/共60頁v變量的屬性l 數據類型:變量所持有的數據的性質(操作屬性)l 存儲屬性u存儲器類型:寄存器、靜態存儲區、動態存儲區u生存期:變量在某一時刻存在-靜態變量與動態變量u作用域:變量在某區域內有效-局部變量與全局變量v變量的存儲類型l auto -自動型l register-寄存器型l static -靜態型l extern -外部型

20、v變量定義格式: 存儲類型 數據類型 變量表;5.8 變量的存儲屬性概述v變量是對程序中數據的存儲空間的抽象如: int sum; auto int a,b,c; register int i; static float x,y;第26頁/共60頁 局部變量與全局變量 局部變量-內部變量 定義:在函數內定義,只在本函數內有效 說明: main中定義的變量只在main中有效 不同函數中同名變量,占不同內存單元 形參屬于局部變量 可定義在復合語句中有效的變量 局部變量可用存儲類型:auto register static (默認為auto)float f1(int a) int b,c; .cha

21、r f2(int x,int y) int i,j; main() int m,n; .a,b,c有效x,y,i,j有效m,n有效例5.10 不同函數中同名變量main() int a,b; a=3; b=4; printf(main:a=%d,b=%dn,a,b); sub(); printf(main:a=%d,b=%dn,a,b);sub() int a,b; a=6; b=7; printf(sub:a=%d,b=%dn,a,b);運行結果:main:a=3,b=4sub:a=6,b=7main:a=3,b=4運行結果:5例 復合語句中變量main() int a=5; int a;a

22、=4; printf(%d ,a);第27頁/共60頁 全局變量-外部變量 定義:在函數外定義,可為本文件所有函數共用 有效范圍:從定義變量的位置開始到本源文件結束,及有extern說明的其它源文件 應盡量少使用全局變量,因為:Y全局變量在程序全部執行過程中占用存儲單元Y降低了函數的通用性、可靠性,可移植性Y降低程序清晰性,容易出錯 定義 說明u次數: 只能1次 可說明多次u位置: 所有函數之外 函數內或函數外u分配內存: 分配內存,可初始化 不分配內存,不可初始化l 外部變量說明: extern 數據類型 變量表;l 外部變量定義與外部變量說明不同l 若外部變量與局部變量同名,則外部變量被屏

23、蔽l 外部變量可用存儲類型:缺省 或 static第28頁/共60頁float max,min;float average(float array, int n) int i; float sum=array0; max=min=array0; for(i=1;imax) max=arrayi; else if(arrayiy?x:y; return(z);main() extern int a,b; printf(max=%d,max(a,b);int a=13,b=-8;運行結果:max=13extern int a,b;int max() int z; z=ab?a:b; return(

24、z);main() printf(max=%d,max();int a=13,b=-8;第31頁/共60頁int a=3,b=5;int max(int a, int b) int c; c=ab?a:b; return(c);main() int a=8; printf(max=%d,max(a,b);例5.12 外部變量與局部變量運行結果:max=8第32頁/共60頁int i;main() void prt(); for(i=0;i5;i+) prt();void prt() for(i=0;i5;i+) printf(“%c”,*); printf(“n”);例5.13 外部變量副作用

25、運行結果:*第33頁/共60頁外部變量可以被不同的文件共享 file1.c file2.c int a ; extern int a ;文件1定義的外部變量 文件2通過說明使用文件1的外部變量。如果只希望在本文件中使用,可以加static說明。 static第34頁/共60頁 動態變量與靜態變量 存儲方式 靜態存儲:程序運行期間分配固定存儲空間 動態存儲:程序運行期間根據需要動態分配存儲空間 內存用戶區程序區靜態存儲區動態存儲區全局變量、局部靜態變量形參變量局部動態變量(auto register)函數調用現場保護和返回地址等v生存期l 靜態變量:從程序開始執行到程序結束l 動態變量:從包含該

26、變量定義的函數開始執行至函數執行結束第35頁/共60頁 變量存儲類型靜態動態存儲方式程序整個運行期間函數調用開始至結束生存期編譯時賦初值,只賦一次每次函數調用時賦初值自動賦初值0或空字符不確定未賦初值靜態存儲區動態區存儲區寄存器局部變量外部變量作用域定義變量的函數或復合語句內本文件其它文件u局部變量默認為auto型uregister型變量個數受限,且不能為long, double, float型u局部static變量具有全局壽命和局部可見性u局部static變量具有可繼承性uextern不是變量定義,可擴展外部變量作用域register局部staticauto外部static外部存儲類別第36

27、頁/共60頁例 文件file1.cint a;main( ) . . f2; . f1; .f1( ) auto int b; f2; .f2( ) static int c; C作用域b作用域a作用域mainf2f1mainf1f2maina生存期:b生存期:c生存期:第37頁/共60頁例5.14 auto 變量的作用域main() int x=1; void prt(void); int x=3; prt(); printf(“2nd x=%dn”,x); printf(“1st x=%dn”,x);void prt(void) int x=5; printf(“3th x=%dn”,x)

28、;運行結果:3th x=52nd x=31st x=1x=1作用域x=1作用域x=3作用域x=5作用域第38頁/共60頁main() void increment(void); increment(); increment(); increment();void increment(void) int x=0; x+; printf(“%dn”,x);例5.15 局部靜態變量值具有可繼承性運行結果:1 1 1main() void increment(void); increment(); increment(); increment();void increment(void) static

29、 int x=0; x+; printf(“%dn”,x);運行結果:1 2 3第39頁/共60頁例5.16 變量的壽命與可見性#include int i=1;main() static int a; register int b=-10; int c=0; printf(-MAIN-n); printf(i:%d a:%d b:%d c:%dn,i,a,b,c); c=c+8; other(); printf(-MAIN-n); printf(i:%d a:%d b:%d c:%dn,i,a,b,c); i=i+10; other();other() static int a=2; sta

30、tic int b; int c=10; a=a+2; i=i+32; c=c+5; printf(-OTHER-n); printf(i:%d a:%d b:%d c:%dn,i,a,b,c); b=a;-Main-i:1 a:0 b:-10 c:0 -Other-i:33 a:4 b:0 c:15 -Main-i:33 a:0 b:-10 c:8-Other-i:75 a:6 b:4 c:15全局i1main: a0b:-10registermain:c0靜態存儲區動態存儲區other: a2other: b0other: c10843315443other: c10675156第40頁/

31、共60頁main() void gx(),gy(); extern int x,y; printf(“1: x=%dty=%dn”,x,y); y=246; gx(); gy();void gx() extern int x,y; x=135; printf(“2: x=%dty=%dn”,x,y);static int x,y;void gy() printf(“3: x=%dty=%dn”,x,y);例5.17 用extern擴展外部變量作用域運行結果:1: x=0 y=02: x=135 y=2463: x=135 y=246第41頁/共60頁例 引用其它文件中的外部變量int glob

32、al;extern float x;main() int local;.extern int global;static int number;func2().float x;static int number;func3() extern int global;.file1.cfile2.cfile3.c第42頁/共60頁例 引用其它文件中的變量,輸出ab和a的m次方int a;main() int power(int n); int b=3,c,d,m; printf(Enter the number a and its power:n); scanf(%d,%d,&a,&

33、m); c=a*b; printf(%d*%d=%dn,a,b,c); d=power(m); printf(%d*%d=%d,a,m,d);extern int a;int power(int n) int i,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); 例 用宏定義和函數實現同樣的功能第48頁/

34、共60頁 帶參的宏與函數區別帶參宏函數處理過程不分配內存簡單的字符置換分配內存先求實參值,再代入形參處理時間編譯時程序運行時參數類型無類型問題定義實參,形參類型程序長度變長不變運行速度不占運行時間調用和返回占時間第49頁/共60頁 書寫#define 命令行時還應該注意: 宏名一般用大寫字母表示 宏名與宏體之間應以空格相隔,因此宏名中不能含有空格 宏名不能用引號括起來 較長的定義在一行中寫不下時,可在本行末尾使用反斜杠表示續行。如:#define PRX printf(“I am a teacher”)第50頁/共60頁二、文件包含 功能:一個源文件可將另一個源文件的內容全部包含進來 一般形式: #include “文件名” 或 #include #include “file2.c”file1.cfile2.cfile1.cfile2.cABA處理過程:預編譯時,用被包含文件的內容取代該預處理命令,再對“包含”后的文件作一個源文件編譯

溫馨提示

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

評論

0/150

提交評論