函數(shù)講義市公開課獲獎?wù)n件_第1頁
函數(shù)講義市公開課獲獎?wù)n件_第2頁
函數(shù)講義市公開課獲獎?wù)n件_第3頁
函數(shù)講義市公開課獲獎?wù)n件_第4頁
函數(shù)講義市公開課獲獎?wù)n件_第5頁
已閱讀5頁,還剩42頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、第四章 函 數(shù)第1頁第1頁本章主要內(nèi)容函數(shù)概述應(yīng)用函數(shù)編程(函數(shù)之間數(shù)據(jù)傳遞)值傳遞地址傳遞變量作用域與變量存儲類型auto變量、static 變量局部變量、全局變量第2頁第2頁C程序是由函數(shù)構(gòu)成(能夠多個) 有且只有一個main()其它函數(shù) 庫函數(shù)自定義函數(shù)函數(shù)是結(jié)構(gòu)化程序設(shè)計基本模塊。含有某種功效代碼段通用性強(qiáng),能夠被重復(fù)使用。易于維護(hù),能夠獨(dú)立設(shè)計,單獨(dú)調(diào)試。劃分函數(shù)時,考慮功效單一完整。4.1 函數(shù)概述第3頁第3頁結(jié)構(gòu)化程序設(shè)計思想復(fù)雜問題main()abca1a2b1b2c1c2結(jié)構(gòu)化程序設(shè)計:也稱為,自頂向下、逐步細(xì)化。將復(fù)雜系統(tǒng)劃分為功效相對獨(dú)立子系統(tǒng)組合,對各子系統(tǒng)再進(jìn)行如此劃

2、分每個模塊,在C語言中表現(xiàn)為函數(shù)。第4頁第4頁C中函數(shù)分類: 用戶角度分:系統(tǒng)函數(shù)和用戶函數(shù);參數(shù)角度分:有參函數(shù)和無參函數(shù);返回值角度分:有返回值函數(shù)和無返回值函數(shù)。原則庫函數(shù)調(diào)用 Turbo C中提供了300多條原則庫函數(shù),都放在函數(shù)庫(.lib)中,函數(shù)闡明按功效分類放在標(biāo)題文獻(xiàn)(.h,也稱頭文獻(xiàn))中。 添加一行:#include “頭文獻(xiàn)名稱” 或者 #include 第5頁第5頁函數(shù)例子:#include void PrintStar()printf(*n);void main() PrintStar ();printf(Hello Everybody!n);PrintStar ()

3、; 使用函數(shù)組裝程序好處: 代碼重用 程序模塊化 維護(hù)以便第6頁第6頁4.2 函數(shù)定義與調(diào)用 4.2.1 函數(shù)定義#include void main(void ) int a,b,c; scanf ( “%d,%d” , &a, &b) ; c=max( a , b); printf (“%d” c) ;int max(int x ,int y) int z ; z=x=y? x : y ; return ( z) ;主函數(shù)函數(shù)體函數(shù)類型,返回值類型。 函數(shù)名形式參數(shù)闡明表。定義!調(diào)用!函數(shù)頭第7頁第7頁函數(shù)定義格式: 返回值類型 函數(shù)名(形式參數(shù)列表) 申明部分 功效語句 返回語句 /*函

4、數(shù)頭*/ /*函數(shù)體*/(1)函數(shù)頭 返回值類型 函數(shù)名 形參列表:0個或多個,逗號分隔,給出參數(shù)名稱及類型。(2)函數(shù)體 代碼段,實(shí)現(xiàn)功效。一對 括起來。 返回語句return :有返回值:return (表示式);或return 表示式;返回?zé)o返回值:可無return語句,末尾右“”作為函數(shù)返回。第8頁第8頁4.2.2函數(shù)調(diào)用1、函數(shù)調(diào)用形式: 函數(shù)名(實(shí)參列表) ;單獨(dú)語句形式: max (a ,b );printf(“fdsa”);表示式形式: c= max (a ,b );作為函數(shù)參數(shù): printf (“%d” , max (a ,b ) ;1、函數(shù)調(diào)用形式: 函數(shù)名(實(shí)參列表)

5、;2、函數(shù)返回值:被調(diào)函數(shù)執(zhí)行后返給主調(diào)函數(shù)值。return(表示式);或 return 表示式;可有多條return語句,碰到一條return時,程序即返回。函數(shù)沒有返回值,能夠沒有return語句,利用 “” 返回。3、函數(shù)申明:調(diào)用之前,對被調(diào)函數(shù)要進(jìn)行申明。如:int max (int x ,int y );第9頁第9頁#include long Multiply(int , int );void main() int num1,num2; long result; scanf(“%d%d”, &num1,&num2); printf(%ldn, Multiply(num1, num2

6、); result= 2*Multiply(2*num1,2* num2); printf(%ldn, result);long Multiply(int x, int y) long z; z=x*y; return z;【例4-2】 第10頁第10頁4.3 函數(shù)間數(shù)據(jù)傳遞函數(shù)在調(diào)用時,主調(diào)函數(shù)和被調(diào)函數(shù)之間普通存在著數(shù)據(jù)傳遞。傳遞有兩種方式:值傳遞和地址傳遞將值或地址傳遞給被調(diào)函數(shù);將被調(diào)函數(shù)結(jié)果返回給調(diào)用函數(shù)。主調(diào)函數(shù)被調(diào)函數(shù)向被調(diào)函數(shù)傳遞數(shù)據(jù)(值或地址)。將結(jié)果返回給主調(diào)用函數(shù)。第11頁第11頁傳值調(diào)用方式:形參是普通變量-值參(1)形參是普通變量:必須傳同類型數(shù)值 形參及被調(diào)函數(shù)內(nèi)變

7、量只有在被調(diào)用時才分派內(nèi)存單元, 此時將實(shí)參值初始化給相應(yīng)形參。 形參與實(shí)參完全脫離了關(guān)系,形參值不影響實(shí)參。 調(diào)用結(jié)束時,形參所占據(jù)內(nèi)存單元被釋放。(2)實(shí)參必須有擬定值,以便把這些值傳遞給形參。(3)實(shí)參與形參在數(shù)量、位序和類型上必須一致。【例4-5】觀測程序運(yùn)營結(jié)果。#include void swap (int , int ) ;void main (void ) int a,b ; a=10;b=20 ; printf ( “調(diào)用前:na= %d,b=%d n ”,a,b ) ; swap (a,b); printf ( “調(diào)用后:na= %d,b=%d n ”,a,b ) ;voi

8、d swap (int x ,int y ) int z ; z=x; x=y; y=z ;第12頁第12頁指針變量作形參,必須傳同類型地址(指針)數(shù)據(jù)。 此時在主調(diào)函數(shù)和被調(diào)函數(shù)之間能夠?qū)崿F(xiàn)信息“雙向傳遞”。4.3.2 傳地址調(diào)用方式例4-6 /*函數(shù)參數(shù)為指針變量*/void swap (int *x, int *y) ;void main ( ) int a,b ; a=10;b=20 ; printf ( “調(diào)用前:na= %d,b=%d n ”,a,b ) ; swap (&a,&b); printf ( “調(diào)用后:na= %d,b=%d n ”,a,b ) ;void swap (

9、int *x ,int *y ) int z ; z=*x; *x=*y; *y=z ; 第13頁第13頁2. 形參為數(shù)組類型,實(shí)參為數(shù)組名#include void fun(int b );main ( )int a10,i; for(i=0;i10;i+) scanf(“%d”,&ai); fun(a); for(i=0;i10;i+) printf(“%d”,ai); void fun( int b ) int max,k,i ; max=b0; k=0; for(i=1;imax) max=bi;k=i; max=b0;b0=bk;bk=max;例: 編寫函數(shù),將數(shù)組中最大值與第一個數(shù)

10、互換。要求在main()中進(jìn)行數(shù)據(jù)輸入輸出,第14頁第14頁【例4-7】輸入5個數(shù)到數(shù)組中,求這5個數(shù)平均值。求平均值編寫函數(shù)實(shí)現(xiàn),并將該值作為返回值。 #include #define N 5float aver( int data, int) ;void main (void) int i, arrayN, av; for(i=0;iN;i+) scanf(%d, &arrayi); av= aver(array,N) ; printf( av=%f n ,av) ; float aver( int data , int n ) int i ; float avg=0 ; for (i=0

11、 ; in ; i+) avg+= datai; avg/=n ; return (avg ) ; 第15頁第15頁【例4-8】輸入10個數(shù)到數(shù)組中,再輸入一實(shí)數(shù),判斷該數(shù)在數(shù)組中是否存在?假如存在,輸出該數(shù)在數(shù)組中下標(biāo);假如不存在,輸出-1。查找編寫函數(shù)實(shí)現(xiàn)。#include int search(float a,float x);void main( )int i,position;float a10,x;printf(輸入10個實(shí)數(shù):n); for(i=0;i10;i+) scanf(%f,&ai);printf(輸入要找實(shí)數(shù):n);scanf(%f,&x);position=searc

12、h(a, x); if(position=-1)printf(“沒找到。n);elseprintf(“找到了。下標(biāo)是 %d,position);int search(float a,float x)intxpos=-1,i;for(i=0;i10;i+) if(ai=x) xpos=i;return xpos; 第16頁第16頁4.4 函數(shù)嵌套調(diào)用和遞歸調(diào)用 C中不允許作嵌套函數(shù)定義,各函數(shù)之間都是平等和獨(dú)立。C允許在一個函數(shù)定義中出現(xiàn)對另一個函數(shù)調(diào)用。【例4-9】函數(shù)嵌套調(diào)用例子。#include float fun2(float x);float fun1(float x);void ma

13、in() float a; scanf(%f,&a); printf(%f,myfun1(a);float fun1(float x) return 2*fun2(x); float fun2(float x) return x0?x:-x; 第17頁第17頁【例4-10】使用函數(shù)嵌套調(diào)用編程,計算S。void main( ) int N,K; scanf(%d%d,&N,&K); printf(n%.0fn,fsum(N,K); 分析(1)求累加和編一函數(shù)fsum(); (2)累加每一項(xiàng),再編一函數(shù)fexp() (3)循環(huán)中,進(jìn)行累加時,調(diào)用fexp()求出該項(xiàng)double fsum(int

14、 n,int k) double sum=0; int i; for(i=0;in;i+)sum+=fexp(i,k); return sum;double fexp(int n,int k) double power=1; int i; for(i=0;ik;i+)power*=n; return power; 第18頁第18頁4.4.2 函數(shù)遞歸調(diào)用含義:一個函數(shù)在它函數(shù)體內(nèi)直接或間接地調(diào)用它本身稱為遞歸調(diào)用。用遞歸法處理問題,應(yīng)當(dāng)符合下列2個條件:邊界問題(也稱基本問題)有直接解。 原問題能夠轉(zhuǎn)化成一個規(guī)模較小新問題,新問題求解辦法與原問題相同。 第19頁第19頁【例4-11】計算n!

15、。使用遞歸函數(shù)實(shí)現(xiàn)。 long fac(int n) if(n=1) return(1); else return n*fun(n-1);void main() int n; scanf(“%d”,&n); printf(“%d”,fac(n);第20頁第20頁【例5- 】漢諾塔問題(Hanoi) 問題提出:相傳是在古印度圣廟中一個游戲。 在一塊銅板裝置上,有三根桿A、B、C,在A桿自下而上、由大到。小放置64個金盤。游戲目的:把A桿上金盤所有移到C桿上,并仍保持原有順序疊好。操作規(guī)則:每次只能移動一個盤子; 移動過程中三根桿上始終保持大盤在下,小盤在上,操作過程中盤子能夠置于A、B、C任一桿

16、上。第21頁第21頁4.5 變量作用域與存儲類型C程序中變量使用規(guī)則是:先定義后使用。定義形式中: 類型: 表明變量占用內(nèi)存空間大小; 位置(函數(shù)內(nèi)與外): 表明變量在程序中作用域。 普通,還要說明其存放類型,說明變量存放方式。 不同存放方式影響變量在內(nèi)存中存在時間。 第22頁第22頁4.5.1局部變量與全局變量 局部變量:在函數(shù)內(nèi)部或復(fù)合語句內(nèi)部定義變量(包含函數(shù)形參)。不同函數(shù)內(nèi)局部變量之間沒相關(guān)系,同名也互不影響。局部變量同名時,當(dāng)前局部變量有效。 第23頁第23頁【例4-12】函數(shù)局部變量應(yīng)用舉例。 void func1(int a, int b) int x; printf(“fun

17、c1 x :%x”,&x); void func2() int x; printf(“func2 x :%x”,&x);void main()int x, y;func1(3,4);func2();printf(“main x DS:%x”,&x);第24頁第24頁【例4-13】復(fù)合語句中局部變量舉例。void main() int i,j; i=2; j=3; int i; i=5; printf(Inter i = %d,j=%dn,i,j); printf(Outer i = %d,j=%dn,i,j);第25頁第25頁2. 全局變量在函數(shù)體外部定義變量稱為全局變量。局部變量屬于所在函數(shù)

18、,而全局變量屬于所有函數(shù),能夠被當(dāng)前文獻(xiàn)其它函數(shù)使用。 全局變量和局部變量同名時,當(dāng)前局部變量有效,全局變量被屏蔽。普通來說,在較大程序中要避免出現(xiàn)全局變量和局部變量同名情況。 第26頁第26頁【例4-14】全局變量應(yīng)用舉例。int qNum=10; void main() printf(%dn, qNum); func1(); printf(%dn, qNum); func2();printf(%dn, qNum);void func1() qNum =1; void func2() qNum =2; 第27頁第27頁全局變量闡明:extern 數(shù)據(jù)類型 全局變量名;#include voi

19、d func1() extern int sum; /申明 sum=1;int sum=0;void main() func1(); printf(%dn,sum); 第28頁第28頁全局變量優(yōu)缺點(diǎn): 使用全局變量長處 減少實(shí)參和形參數(shù)據(jù)傳遞帶來時間消耗。 使用全局變量缺點(diǎn): 全局變量保留在靜態(tài)存貯區(qū),編譯時為其分派空間,整個程序結(jié)束才釋放該空間。因此全局變量生存期比較長,過多全局變量占用較多內(nèi)存單元。 全局變量破壞了函數(shù)封裝性能。 全局變量使函數(shù)代碼可讀性減少。 第29頁第29頁4.5.2變量存儲類型 動態(tài)存貯區(qū)和靜態(tài)存貯區(qū) 程序運(yùn)營后,內(nèi)存中可供程序使用存貯空間分為三個部分。代碼區(qū)存儲:程

20、序二進(jìn)制代碼。靜態(tài)存貯區(qū)和動態(tài)存貯區(qū):存儲程序相關(guān)數(shù)據(jù)。 靜態(tài)存貯區(qū)里:全局變量、靜態(tài)變量。動態(tài)存貯區(qū)里:函數(shù)內(nèi)定義變量、形參。特點(diǎn):調(diào)用時,為變量動態(tài)分派內(nèi)存空間;調(diào)用結(jié)束,釋放該變量內(nèi)存空間。變量存貯類別有三種:auto、static、register。第30頁第30頁 auto存儲類型(關(guān)鍵字能夠省略)在默認(rèn)情況下,所有局部變量(包括形參)都是auto變量 #include void main(void) auto int a,b; scanf(“%d,%d”,&a,&b); if(ba) int t; t=a; a=b; b=t; printf(“Max=%d”,a);ab作用域t作用

21、域。生存期:變量都擁有自己內(nèi)存空間。 從申請-被釋放,這段時間稱為變量生存期。 register存儲類型 其作用域、生存期與auto相同,差別在于,假如CPU內(nèi)部存儲器空閑,則使用存儲器作為變量存儲單元,以提升速度。主要是循環(huán)變量,整形和字符型。第31頁第31頁 static(靜態(tài))存儲類型 作用域:函數(shù)內(nèi)定義局部靜態(tài)變量,在該函數(shù)之外不可見。 生存期:從編譯-整個程序結(jié)束。 位于靜態(tài)存貯區(qū),在函數(shù)調(diào)用結(jié)束后,值仍然存在, 并影響到下一次調(diào)用過程。void row ( ) ;void main ( ) int i ; for (i=1 ; i=9 ; i+ ) row ( ) ;void ro

22、w ( ) static int a=1 ; int i ; for (i=1 ; i=9 ; i+) printf ( “%5d” , a*i ) ; printf ( “ n ”) ; a+ ;a作用域生存期從編譯開始到程序結(jié)束。第32頁第32頁【例4-15】 static局部變量應(yīng)用舉例。#include int f( int x) int a=10; static int stc=1; stc = stc +x+a; return stc;void main() printf(%dn,f(1); printf(%dn, f(1); 第33頁第33頁關(guān)于static局部變量提出幾點(diǎn)注意:

23、存放在靜態(tài)區(qū),生存期比較長,從編譯開始它就存在, 整個程序結(jié)束后才被釋放。從作用域來看,它是一個局部變量,屬于當(dāng)前函數(shù); 即,當(dāng)前函數(shù)內(nèi)可見,其它函數(shù) 不可見。對初值處理不同。auto變量定義時假如沒有初始化,那么它是一個隨機(jī)值;static局部變量假如沒有初始化,編譯器自動將其初始化為 值 0 或 空字符。在程序中盡也許不用或少用static局部變量。原因主要有: static局部變量生存期長,比較浪費(fèi)內(nèi)存; 使用static局部變量會造成函數(shù)多次調(diào)用之間發(fā)生聯(lián)絡(luò),使代碼可讀性降低。 第34頁第34頁4. static 型全局變量 C程序能夠由多個源文獻(xiàn)構(gòu)成。一個文獻(xiàn)中定義全局變量,其它文獻(xiàn)

24、中能夠使用(用extern方式申明后)。假如限制本文獻(xiàn)中全局變量不能被其它文獻(xiàn)使用,能夠在全局變量定義前加關(guān)鍵字static。static型全局變量作用域:本文獻(xiàn)內(nèi)。 第35頁第35頁 【舉例】static全局變量應(yīng)用。/文獻(xiàn)f1.c里代碼下列:#include#includestatic int gs=0;void func(intx);void main() func (3); printf(%d, gs);/文獻(xiàn)f2.c里代碼下列:extern int gs;void func (int x) gs+=x; 第36頁第36頁4.6 外部函數(shù)和內(nèi)部函數(shù) 當(dāng)一個程序由多個源文獻(xiàn)構(gòu)成時,能夠指

25、定一個文獻(xiàn)中函數(shù)能被其它文獻(xiàn)調(diào)用;也能夠指定該函數(shù)只能被本文獻(xiàn)使用;從這個意義上,函數(shù)能夠分為外部函數(shù)和內(nèi)部函數(shù)。 第37頁第37頁4.6.1 外 部 函 數(shù) 一個函數(shù)假如能夠被其它源文獻(xiàn)調(diào)用,稱為外部函數(shù)。 定義外部函數(shù)時,在函數(shù)頭最左面加關(guān)鍵字extern, 表明該函數(shù)是一個外部函數(shù) 省略extern關(guān)鍵字,則系統(tǒng)默認(rèn)為外部函數(shù) extern int max(int a,int b) return ab?a:b; 文獻(xiàn)f1.c里代碼下列:extern void printstar(); /* extern 能夠省略不寫*/void main() printstar ();文獻(xiàn)f2.c里代碼

26、下列:void printstar () printf(*n);這里f1.cmain函數(shù)調(diào)用了f2.c外部函數(shù)printstar。 第38頁第38頁4.6.2 內(nèi)部函數(shù)假如一個函數(shù)只能被本文獻(xiàn)中函數(shù)調(diào)用,該函數(shù)就稱為內(nèi)部函數(shù),定義內(nèi)部函數(shù)時,在函數(shù)最左面加關(guān)鍵字static static int max(int a,int b) return ab?a:b;第39頁第39頁文獻(xiàn)f1.c 里代碼:void func(); static void printstar ()printf(printstar in f1.c.n);void main()printstar ();func(); 文獻(xiàn)f2

27、.c里代碼:static void printstar ()printf(printstar in f2.c.n);void func()printstar (); 第40頁第40頁4.7.2 在VC+下多文獻(xiàn)程序運(yùn)營在VC+環(huán)境下,編譯和運(yùn)營由多個源文獻(xiàn)構(gòu)成程序操作下列: 辦法一,新建一個工程,向其中添加已有源文獻(xiàn)。辦法二,新建一個工程,在其中創(chuàng)建多個源文獻(xiàn) 。 第41頁第41頁補(bǔ)充 編譯預(yù)處理 C 語言尚有一類編譯預(yù)處理語句。 作用是在編譯時對程序作一定處理,滿足特定處理要求。編譯預(yù)處理語句語法形式:#關(guān)鍵詞 參數(shù)表 宏定義預(yù)處理1.1不帶參數(shù)宏定義作用:定義常量名,提升程序可讀性,便于修

28、改。格式: #define 宏名 字符串#define PI 3.1415926void main(void) float r; scanf(“%f ”,&r) printf(“%fn”,PI*r*r);編譯時用字符串替換宏名。3.1415926第42頁第42頁闡明:宏名普通用大寫;編譯時用字符串無條件替換宏名;#define PI 3.1415926;PI*r*r3.1415926*r*r; 宏名有效范圍,從定義到程序尾。也能夠通過#undef修改定義范圍。#define G 9.8void main(void ) #undef GG范圍能夠在宏定義字符串中使用已定義宏名?!?”字符串中宏名不替換。#define R 3.0#define PI 3.141

溫馨提示

  • 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

提交評論