C語言第6章函數(shù)市公開課金獎(jiǎng)市賽課一等獎(jiǎng)?wù)n件_第1頁
C語言第6章函數(shù)市公開課金獎(jiǎng)市賽課一等獎(jiǎng)?wù)n件_第2頁
C語言第6章函數(shù)市公開課金獎(jiǎng)市賽課一等獎(jiǎng)?wù)n件_第3頁
C語言第6章函數(shù)市公開課金獎(jiǎng)市賽課一等獎(jiǎng)?wù)n件_第4頁
C語言第6章函數(shù)市公開課金獎(jiǎng)市賽課一等獎(jiǎng)?wù)n件_第5頁
已閱讀5頁,還剩79頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、第六章 函 數(shù) 10/10/1第1頁函數(shù)是C語言基本構(gòu)件,是C程序必不可少基本元素。在前面幾章中,已經(jīng)使用了如printf()、scanf()、getchar()、putchar()等標(biāo)準(zhǔn)C庫函數(shù);還有 strlen(string),strcmp(string1,string2)等字符串函數(shù)。10/10/2第2頁程序員在設(shè)計(jì)一個(gè)復(fù)雜應(yīng)用時(shí),往往也是把整個(gè)程序劃分為若干個(gè)功效較為單一程序模塊,然后分別給予實(shí)現(xiàn),最終再把全部程序模塊象搭積木一樣裝配起來。這種在程序設(shè)計(jì)中分而治之策略,被稱為模塊化程序設(shè)計(jì)方法。C語言程序整體由一個(gè)或多個(gè)函數(shù)組成。每個(gè)函數(shù)都含有各自獨(dú)立功效和顯著界面。6.1 函數(shù)概述

2、10/10/3第3頁 編寫一個(gè)簡單函數(shù)程序一:main() printf(*n);printf( Hello world!n);printf(*n);程序二:#include main()void print_star();void print_text();print_star(); print_text(); print_star(); void print_line() printf(*n);void print_text() printf( Hello world!n);運(yùn)行結(jié)果:*Hello World!*10/10/4第4頁若要出現(xiàn)以下結(jié)果,應(yīng)該怎樣修改程序?*Hello Worl

3、d!*Hello World!*#Hello World!#Hello World!#10/10/5第5頁修改程序一:main() printf(*n);printf( Hello world!n);printf(*n);printf(*n);printf( Hello world!n);printf(*n);程序二:main() print_line();print_text();print_line();print_line();print_text();print_line();print_line()printf(*n);print_text() printf( Hello world

4、!n);*Hello World!*Hello World!*10/10/6第6頁修改程序一:main() printf( # n);printf( Hello world!n);printf( # n);printf( # n);printf( Hello world!n);printf( # n);修改程序二:main() print_line();print_text();print_line();print_line();print_text();print_line();print_line()printf( # n);print_text() printf( Hello world

5、!n);#Hello World!#Hello World!#修改程序一:main() printf(*n);printf( Hello world!n);printf(*n);printf(*n);printf( Hello world!n);printf(*n);函數(shù)調(diào)用函數(shù)定義10/10/7第7頁說明:(1)函數(shù)是按要求格式書寫能完成特定功效一段程序。(2)C語言是以源文件為單位進(jìn)行編譯,一個(gè)源程序由一個(gè)或多個(gè)函數(shù)組成。(3)不論main函數(shù)放在程序任何位置,C語言中程序總是從main函數(shù)開始執(zhí)行,調(diào)用其它函數(shù)后,最終在main函數(shù)中結(jié)束。(4)全部函數(shù)都是平行,在定義時(shí)相互獨(dú)立,一個(gè)函

6、數(shù)不屬于另一個(gè)函數(shù)。函數(shù)不能夠嵌套定義,但能夠相互調(diào)用,main函數(shù)能夠調(diào)用任何函數(shù),一個(gè)函數(shù)能夠?qū)掖伪徽{(diào)用,而其它函數(shù)不能調(diào)用main函數(shù)。 10/10/8第8頁庫函數(shù)是由編譯系統(tǒng)提供已設(shè)計(jì)好函數(shù),用戶只需調(diào)用而無須去實(shí)現(xiàn)它6.1.2庫函數(shù)用過了哪些庫函數(shù)?printf() scanf() getchar() 等,包含在 “stdio.h”strlen(str) strcmp(str1,str2) 等,包含在“string.h”pow() sqrt() 等,包含在“math.h”10/10/9第9頁使用庫函數(shù)應(yīng)注意以下幾個(gè)問題:1、函數(shù)功效;2、函數(shù)參數(shù)數(shù)目和次序,以及每個(gè)參數(shù)意義及類型;3

7、、函數(shù)返回值意義及類型;4、需要使用包含文件。#include #include int main(void)double x = 2.0, y = 3.0; printf(%lf raised to %lf is %lfn, x, y, pow(x, y); 運(yùn)行結(jié)果:2.000000 raised to 3.000000 is 8.000000Press any key to continue10/10/10第10頁 int getchar( ); stdio.h標(biāo)準(zhǔn)輸入一個(gè)字符 int getch( ); conio.h不回顯從鍵盤直接讀入一個(gè)字符 int putch( int ch )

8、; conio.h向屏幕直接輸出一個(gè)字符 char *gets( char * ); stdio.h標(biāo)準(zhǔn)輸入一行文字 int puts( char * ); stdio.h標(biāo)準(zhǔn)輸出一行文字(自動(dòng)加換行) double sin( double ); math.h正弦函數(shù)sin(x) double pow(double x,double y); math.h xy double exp( double x ); math.h ex double log( double x ); double log10( double x ); math.h lnx log10 x void exit( int

9、status ); tdlib.h強(qiáng)制結(jié)束程序 慣用庫函數(shù)10/10/11第11頁庫函數(shù)普通只能提供一些底層服務(wù)功效,而用戶自定義函數(shù)則能針對(duì)詳細(xì)應(yīng)用實(shí)現(xiàn)一些特殊功效。用戶自定義函數(shù)就是由程序員自己定義和設(shè)計(jì)函數(shù),需要程序員來編寫函數(shù)功效實(shí)當(dāng)代碼。定義函數(shù)時(shí)是相互獨(dú)立,一個(gè)函數(shù)并不隸屬于另一個(gè)函數(shù),即函數(shù)不能嵌套定義,但能夠相互調(diào)用,但不能調(diào)用main函數(shù)。6.2用戶自定義函數(shù)10/10/12第12頁6.2.1函數(shù)定義格式1.無參函數(shù)定義格式類型說明符 函數(shù)名 ()函數(shù)體其中,方括號(hào)括起來內(nèi)容是可選項(xiàng)。 2.有參函數(shù)定義格式類型說明符 函數(shù)名(形式參數(shù)申明)函數(shù)體 比如:print_line(

10、void) printf( # n); int max ( int x, int y )int z ;z= xy? x: y;return(z);10/10/13第13頁3.空函數(shù)C語言中能夠有“空函數(shù)”,它形式為:類型說明符 函數(shù)名() 比如:echoline() 6.2.1函數(shù)定義格式#include sum() int main() int s=0;s=sum();printf(%d,s); 10/10/14第14頁6.2.2形式參數(shù)和實(shí)際參數(shù)在定義函數(shù)時(shí)函數(shù)名后面圓括號(hào)內(nèi)變量名稱為“形式參數(shù)”(簡稱“形參”),把它作被調(diào)函數(shù)使用時(shí),用于接收主調(diào)函數(shù)傳來數(shù)據(jù)。在調(diào)用函數(shù)時(shí),主調(diào)函數(shù)函數(shù)調(diào)

11、用語句函數(shù)名后面圓括號(hào)中參數(shù)稱為“實(shí)際參數(shù)”(簡稱“實(shí)參”)。實(shí)際參數(shù)能夠是常量、變量或表示式。 10/10/15第15頁#include main() int x,y,z;printf(“Please enter two integer numbers:”);scanf(%d,%d,&x,&y);z=min(x,y);/函數(shù)調(diào)用printf(min is %dn,z); int min(int a,int b) /函數(shù)定義 int c;c=ab?a:b;return (c); 6.2.2形式參數(shù)和實(shí)際參數(shù)函數(shù)形參a,b函數(shù)實(shí)參x,y實(shí)參x和y值按次序?qū)?yīng)傳遞給被調(diào)函數(shù)min(a,b)中形參a

12、和b,x傳給a,y傳給b。在執(zhí)行被調(diào)函數(shù)min后,其返回值c作為函數(shù)返回值返回給主調(diào)函數(shù),作為min(x,y)值,賦給變量z。 10/10/16第16頁例6-3 編寫函數(shù)求兩個(gè)實(shí)數(shù)平均值。 #include float average(float x,float y)float av;av=(x+y)/2.0;return av; main()float a=1.8,b=2.6,c;c=average(a,b);/第一次調(diào)用函數(shù)average()a=1.0;b=2.0;printf(The avergae of %5.2f and %5.2f is %5.2fn,a,b,average(a,b

13、);/第二次調(diào)用函數(shù)average()c=average(a,a+b);/第三次調(diào)用函數(shù)average()printf(The avergae of %5.2f and %5.2f is %5.2fn,a,a+b,c); c=average(2.0,4.0);/第四次調(diào)用函數(shù)average() printf(The avergae is %5.2fn,c); printf語句中調(diào)用,xy接收a,b值形式參數(shù)x、y接收實(shí)參變量a、b值 表示式a+b作為實(shí)參之一 常量作為實(shí)參10/10/17第17頁關(guān)于形參和實(shí)參說明以下:(1)函數(shù)中指定形參變量,在未出現(xiàn)函數(shù)調(diào)用時(shí),并不占用內(nèi)存中單元。在發(fā)生函數(shù)

14、調(diào)用時(shí),被調(diào)函數(shù)形參被暫時(shí)分配內(nèi)存單元,調(diào)用結(jié)束后,形參所占內(nèi)存單元被自動(dòng)釋放。(2)函數(shù)一旦被定義,就可屢次調(diào)用,但必須確保形參和實(shí)參數(shù)據(jù)類型一致。假如實(shí)參為int型而形參為float型,這是正當(dāng);假如實(shí)參為float型而形參為int型 ,則按不一樣類型數(shù)值賦值規(guī)則進(jìn)行轉(zhuǎn)換。比如實(shí)參a為float型變量,其值為3.5,而形參x為int型,則在傳遞時(shí)先將實(shí)數(shù)3.5轉(zhuǎn)換成整數(shù)3,然后送到形參x。字符型與整型能夠相互通用。(3)實(shí)參能夠是常量、變量或表示式,但要求它們有確定值。在調(diào)用時(shí)將實(shí)參值賦給形參。(4)在被定義函數(shù)中,必須指定形參類型。(5)C語言要求,實(shí)參對(duì)形參變量數(shù)據(jù)傳遞是“值傳遞”,即

15、單向傳遞,只由實(shí)參傳給形參,而不能由形參傳回給實(shí)參。 10/10/18第18頁函數(shù)執(zhí)行最終一個(gè)操作是返回。返回意義是:(1) 使流程返回主調(diào)函數(shù),宣告函數(shù)一次執(zhí)行結(jié)束,在調(diào)用期間所分配變量單元被撤消。(2) 送函數(shù)值到調(diào)用表示式中。有些函數(shù)有返回值,有些函數(shù)沒有返回值。return語句使用格式是: return;或者 return (表示式);或者 return 表示式;6.2.3函數(shù)返回值10/10/19第19頁說明:(1)return語句有雙重作用:它使函數(shù)從被調(diào)函數(shù)中退出,返回到調(diào)用它代碼處,并向調(diào)用函數(shù)返回一個(gè)確定值。(2)一個(gè)函數(shù)中能夠有多個(gè)return語句,執(zhí)行到哪一個(gè)return

16、語句,哪一個(gè)語句就起作用。(3)在定義函數(shù)時(shí)應(yīng)該指定函數(shù)值類型,而且函數(shù)類型普通應(yīng)與return語句中表示式類型相一致,當(dāng)二者不一致時(shí),應(yīng)以函數(shù)類型為準(zhǔn),即函數(shù)類型決定返回值類型。對(duì)于數(shù)值型數(shù)據(jù),能夠自動(dòng)進(jìn)行類型轉(zhuǎn)換。 10/10/20第20頁#include int sum(int n)int i,s=0;for(i=0;i=m;i+) s=s+i;return s;int main() int s;s=sum(50);printf(%d,s); 用自定義函數(shù),實(shí)現(xiàn)1+2+3+50程序分析:自定義函數(shù)int sum(int n);return s;定義變量;int s=0;int i;10/

17、10/21第21頁提議函數(shù)無返回值時(shí)用void標(biāo)識(shí)函數(shù)類型,則系統(tǒng)可確保函數(shù)不帶回任何值,即禁止在調(diào)用函數(shù)中使用被調(diào)用函數(shù)返回值。return語句其它規(guī)則: return只能返回一個(gè)值,而不能返回多個(gè)值。假如函數(shù)中沒有return語句,并不代表函數(shù)沒有返回值,只能說明函數(shù)返回值是一個(gè)不確定數(shù)。10/10/22第22頁void類型函數(shù)有時(shí)調(diào)用一個(gè)函數(shù)并不是為了得到它返回值,而是要它產(chǎn)生一些作用。這類確實(shí)沒有返回值函數(shù),我們通常將它定義為空類型(void)函數(shù)。 一旦將一個(gè)函數(shù)定義為空類型函數(shù),那么該函數(shù)中return語句僅僅起到結(jié)束函數(shù)運(yùn)行功效,它是不返回任何值給主調(diào)函數(shù)。返回語句只能寫成以下形

18、式: return;10/10/23第23頁6.3函數(shù)調(diào)用所謂函數(shù)調(diào)用,是指一個(gè)函數(shù)(調(diào)用函數(shù))暫時(shí)中止本函數(shù)運(yùn)行,轉(zhuǎn)去執(zhí)行另一個(gè)函數(shù)(被調(diào)函數(shù))過程。被調(diào)函數(shù)執(zhí)行完后,返回到調(diào)用函數(shù)中止處繼續(xù)調(diào)用函數(shù)運(yùn)行,這是一個(gè)返回過程。函數(shù)一次調(diào)用必定伴伴隨一個(gè)返回過程。在調(diào)用和返回兩個(gè)過程中,兩個(gè)函數(shù)之間發(fā)生信息交換。 函數(shù)調(diào)用普通形式為:函數(shù)名(實(shí)際參數(shù)表列); 調(diào)用無參函數(shù),則“實(shí)際參數(shù)表列”能夠沒有,但括號(hào)不能省略。 實(shí)際參數(shù)表列中實(shí)參類型及個(gè)數(shù)必須與形參相同,而且次序一致,當(dāng)有多個(gè)實(shí)參時(shí),參數(shù)之間用逗號(hào)隔開。 實(shí)參能夠是常量,有確定值變量或表示式及函數(shù)調(diào)用 10/10/24第24頁(1) 實(shí)參

19、個(gè)數(shù)、次序與類型要與形參一一對(duì)應(yīng);(2) 變量作形參時(shí), 對(duì)應(yīng)實(shí)參能夠是常數(shù), 變量或表示式;(3) 調(diào)用函數(shù)有兩種: 標(biāo)準(zhǔn)函數(shù)(庫函數(shù))和用戶自定義函數(shù)。 * 調(diào)用標(biāo)準(zhǔn)函數(shù)(庫函數(shù)) , 需在程序前使用包含命令:例:#include ”stdio.h” 或 #include 等 * 調(diào)用用戶自定義函數(shù), 普通應(yīng)在調(diào)用前“申明”被調(diào)用函數(shù)“類型”。 函數(shù)調(diào)用標(biāo)準(zhǔn) 除非1) 被調(diào)函數(shù)是整型或字符型函數(shù);2) 被調(diào)函數(shù)定義出現(xiàn)在這個(gè)函數(shù)調(diào)用之前;3) 在文件開頭已對(duì)被調(diào)函數(shù)類型作了說明.10/10/25第25頁6.3.2函數(shù)調(diào)用方式按被調(diào)用函數(shù)在主調(diào)函數(shù)中出現(xiàn)位置和完成功效劃分,函數(shù)調(diào)用有以下三種

20、方式:(1)把函數(shù)調(diào)用作為一個(gè)語句。如例6-1中“print_star();”,這時(shí)不要求函數(shù)帶回值,只要求函數(shù)完成一定操作。(2)在表示式中調(diào)用函數(shù),這種表示式稱為函數(shù)表示式。這時(shí)要求函數(shù)帶回一個(gè)確定值以參加表示式運(yùn)算。比如:c=average(a,b);d=5* average(a,b);(3)將函數(shù)調(diào)用作為另一個(gè)函數(shù)調(diào)用實(shí)參。比如:printf(The avergae of %5.2f and %5.2f is %5.2fn,a,b,average(a,b);此處把a(bǔ)verage(a,b)作為printf函數(shù)一個(gè)參數(shù)。 10/10/26第26頁函數(shù)調(diào)用普通形式 函數(shù)名(實(shí)際參數(shù)表);其中

21、,實(shí)際參數(shù)能夠是常量或變量,也能夠是各種表示式;參數(shù)個(gè)數(shù)和類型應(yīng)該與函數(shù)要求形式參數(shù)個(gè)數(shù)和類型一致;參數(shù)間用逗號(hào)隔開。假如調(diào)用無參函數(shù),則實(shí)參表能夠沒有,但括號(hào)不能省略。函數(shù)調(diào)用普通形式10 #include stdio.h20 main()30 40 void function (int n); 50 function(5); 60 70 void function(int n) 80 90 printf(%dn,n); 100 函數(shù)說明函數(shù)調(diào)用函數(shù)定義形參實(shí)參10/10/27第27頁main( ) int a, b, c, d, max(int x, int y) ;void star(

22、) ;printf(nInput a,b,c = ?n);scanf(%d, %d, %d, &a, &b, &c);d = max(a, max(b,c) ) ;printf(max is %d , d);star(); max(int x,int y) int z;z= xy? x: y;return(z);void star( )printf(n*); abc( ) 被調(diào)函數(shù)申明自定義函數(shù)調(diào)用函數(shù)定義可寫成:int max( x, y)int x, y;C程序執(zhí)行時(shí)從主函數(shù)開始,可調(diào)用其它函數(shù), 最終返回主函數(shù)并結(jié)束運(yùn)行。比如 找出 a,b,c 中最大值.函數(shù)應(yīng)用舉例10/10/28第2

23、8頁6.3.3函數(shù)原型申明函數(shù)申明普通形式為:類型說明符 函數(shù)名(形參表); 比如:float average(float x,float y);也能夠?qū)憺椋篺loat average(float,float) ; 實(shí)際上就是函數(shù)定義時(shí)函數(shù)頭,最終加分號(hào)組成一條申明語句。與函數(shù)頭區(qū)分是,函數(shù)申明中形參表中能夠只寫類型名,而不寫形參名。 10/10/29第29頁例6-5編寫函數(shù)求兩個(gè)實(shí)數(shù)平均值。#include main() float a=1.8,b=2.6,c; float average(float x,float y);/函數(shù)申明 c=average(a,b); /函數(shù)調(diào)用 printf

24、(The avergae of %5.2f and %5.2f is %5.2fn,a,b,c);float average(float x,float y)float av;av=(x+y)/2.0;return av; 函數(shù)定義10/10/30第30頁在以下情況下能夠缺省函數(shù)申明:(1) 調(diào)用是在定義有效區(qū)域,即在同一文件中位于定義之后調(diào)用。也就是函數(shù)定義寫在前面,主調(diào)函數(shù)寫在后面。省略函數(shù)說明10 float max(float x,float y)20 30 return(xy)?x:y);40 50 main()60 70 float x=5.5,y=9.7,z;80 z=max(x

25、,y);90 printf(The max is %f,z);100 例:10/10/31第31頁(2) 返回值為int或char類型。省略函數(shù)說明10 main()20 30 int x=5,y=9,z;40 z=max(x,y);50 printf(The max is %d,z);60 70 max(int x, int y)80 90 return(xy)?x:y);100 提議:為了便于閱讀和了解,應(yīng)該養(yǎng)成在調(diào)用之前都做顯式申明格調(diào)。當(dāng)一個(gè)函數(shù)要被一個(gè)文件中多個(gè)函數(shù)調(diào)用時(shí),能夠?qū)⒃摵瘮?shù)申明寫在全部函數(shù)之前。例:10/10/32第32頁在主調(diào)函數(shù)內(nèi)部進(jìn)行說明在調(diào)用函數(shù)前,能夠在主調(diào)函數(shù)

26、內(nèi)部對(duì)被調(diào)函數(shù)進(jìn)行說明。假如使用這種說明方式,則此次函數(shù)說明只在主調(diào)函數(shù)內(nèi)部有效,也就是說,假如其它函數(shù)中也需要調(diào)用該被調(diào)函數(shù),在那些函數(shù)中對(duì)被調(diào)函數(shù)依然需要進(jìn)行說明。10 #include 20 main( )30 40 int x=1;50 void f1( ), f2( );60 f1( );70 f2(x); 80 printf(%dn, x);90 100 void f1(void)110 120 void f2();130 int x=3; 140 f2(x);150 printf(%d , x);160 f2(x);170 180 void f2(int x )190 200 p

27、rintf(%d , +x); 210 例:函數(shù)說明函數(shù)說明10/10/33第33頁在主調(diào)函數(shù)外部進(jìn)行說明#include 20void f1( ), f2( ); 30 main( )40 50 int x=1;60 f1( );70 f2(x); 80 printf(%dn, x);90 100 void f1(void)110 120 int x=3; 130 f2(x);140 printf(%d , x);150 f2(x);160 170 void f2(int x )180 190 printf(%d , +x); 200 例:函數(shù)說明假如已經(jīng)在文件開頭(或在函數(shù)前)對(duì)某函數(shù)進(jìn)行

28、了說明,則從說明處開始,在本文件中對(duì)說明函數(shù)調(diào)用不需要再次進(jìn)行說明。比如:10/10/34第34頁6.3.4函數(shù)參數(shù)傳遞在C語言中進(jìn)行函數(shù)調(diào)用時(shí),有兩種不一樣參數(shù)傳遞方式,即值傳遞方式和地址傳遞方式。 1.值傳遞在函數(shù)調(diào)用時(shí),實(shí)參將其值傳遞給形參,這種傳遞方式即為值傳遞。 C語言要求,實(shí)參對(duì)形參數(shù)據(jù)傳遞是“值傳遞”,即單向傳遞,只能由實(shí)參傳遞給形參,而不能由形參傳回來給實(shí)參。 所以,在執(zhí)行一個(gè)被調(diào)用函數(shù)時(shí),形參值假如發(fā)生改變,并不會(huì)改變調(diào)用函數(shù)中實(shí)參值。 10/10/35第35頁10 #include stdio.h20 float average(float x, float y, floa

29、t av)30 40 av = (x+y)/2.0;50 printf(function:x=%f, y=%f, av=%fn, x, y, av);60 return av;70 80 main()90 100 float a=1.4, b=2.6, c=3;110 average(a,b,c);120 printf(main:a=%f, b=%f, c=%fn, a, b, c);130 單向傳遞程序運(yùn)行結(jié)果是:function:x=1.400000, y=2.600000, av=2.000000main:a=1.400000, b=2.600000, c=3.00000010/10/3

30、6第36頁運(yùn)行位置main函數(shù)變量average函數(shù)變量說明abCxyav1001.42.63不存在不存在不存在程序開始運(yùn)行1101.42.631.42.63分配形參存放空間,實(shí)參向形參傳遞數(shù)值601.42.631.42.62運(yùn)算1201.42.63不存在不存在不存在函數(shù)調(diào)用結(jié)束,返回主調(diào)函數(shù)程序運(yùn)行過程和參數(shù)傳遞情況 單向傳遞10/10/37第37頁實(shí)參向形參傳遞數(shù)值過程: 單向傳遞一次實(shí)參向形參傳遞數(shù)值過程,只是在發(fā)生函數(shù)調(diào)用時(shí)候執(zhí)行一次。假如實(shí)參是表示式或函數(shù)形式,那么一定要先完成表示式運(yùn)算,將該運(yùn)算結(jié)果傳遞給形參。單向只能是實(shí)參把數(shù)值傳遞給形參,而形參是不可能把數(shù)值傳遞給實(shí)參。10/1

31、0/38第38頁單向傳遞int swamp(int i,int j)int t;t=i;i=j;j=t;printf(In function i=%d,j=%dn,i,j);main()int i=2,j=3;swamp(i,j);printf(Out function i=%d,j=%d,i,j);程序運(yùn)行結(jié)果是:In function i=3,j=2Out function i=2,j=3讀程序?qū)懡Y(jié)果10/10/39第39頁float abc(float x, float y) float av ; x=x*x; y=y*y; av = (x+y)/2.0 ; printf(“nfunct

32、ion x=%3.2f y=%3.2f av=%-5.2fn, x, y, av); return (av); 變量作參數(shù) 單向傳遞實(shí)參 形參已知 x,y計(jì)算 av=? #include main() float a=1, b=2, c ; c=abc(a, b); printf(“main a=%3.2f b=%3.2f c=%3.2fn , a, b, c );運(yùn)行結(jié)果:function x=1.00 y=4.00 av=2.50main a=1.00 b=2.00 c=2.50傳值調(diào)用舉例10/10/40第40頁float abc(int a, int b) float av; a=3*

33、a; b=4*b; av = (a+b)/2.0 ; printf(“nfunction a=%2d b=%d av= %-5.2fn, a, b, av); return(av);main()int a=1, b=2 , c;c = abc( a, b ); printf(main a=%2d b=%2d c=%-8dn, a, b, c );* 數(shù)據(jù)只能由實(shí)參傳給形參;* 使用 return 返回一個(gè)計(jì)算結(jié)果;* 返回值類型要與函數(shù)值一致。* 實(shí)參個(gè)數(shù)、次序與類型要與 形參一一對(duì)應(yīng),如 形參 a, b 與 實(shí)參 a, b function x=3 y=8 av=5.50main a=1 b

34、=2 c=5傳值調(diào)用舉例10/10/41第41頁2.地址傳遞地址傳遞指是調(diào)用函數(shù)時(shí),實(shí)參將一些量(如變量、字符串、數(shù)組等)地址傳遞給形參。這么實(shí)參和形參指向同一個(gè)內(nèi)存空間,在執(zhí)行被調(diào)用函數(shù)過程中,對(duì)形參所指向空間中內(nèi)容改變,能夠直接影響到調(diào)用函數(shù)中對(duì)應(yīng)量。在地址傳遞方式下,形參和實(shí)參能夠是指針變量(見第8章)或數(shù)組名,其中,實(shí)參還能夠是變量地址。 10/10/42第42頁例:int max(int a1, int a2, int a3);max(int a1, int a2, int a3);char GetName(char surname, char name);GetName(char

35、surname, char name);例:double func(x, y, z);func(double x, int y, float z);double func(int y, float z, double x);沒有說明形參類型。沒有說明函數(shù)類型。形參次序錯(cuò)誤。例(函數(shù)說明):double func(double x, int y, float z);double func(double, int, float);正確完整函數(shù)模型定義。形參名字是不主要,主要是類型標(biāo)識(shí)符。函數(shù)說明能夠不寫形參名函數(shù)返回值為int或char時(shí),函數(shù)類型標(biāo)識(shí)符才能夠省略。當(dāng)然,申明也可省略判斷以下對(duì)函數(shù)

36、定義是否正確1、定義一個(gè)返回值為double類型函數(shù),并有三個(gè)參數(shù),參數(shù)類型分別為double,int,float型。2、定義一個(gè)返回值為int或char類型函數(shù)。10/10/43第43頁例:int func3() int i, j, k; i = 2; j = i*i; k = j*j;printf(“%d,%d,%d”, j, j, k); 非空類型函數(shù),必須在函數(shù)返回前使用return語句返回一個(gè)數(shù)據(jù)類型與函數(shù)類型相同值。 在本例中,應(yīng)該返回一個(gè)整型值。例:float func2(float a, float b) float a, b, c; c = a+b; return c;形參變

37、量數(shù)據(jù)類型已經(jīng)在形參表中說明,在函數(shù)體中不應(yīng)該對(duì)形參變量數(shù)據(jù)類型再行說明。例:void func1(a, b, c) printf(“%d,%d,%dn”, a, b, c); 函數(shù)形式參數(shù)表中形參變量數(shù)據(jù)類型應(yīng)該被說明。正確形式:void func1(int a, int b, int c) printf(“%d,%d,%dn”, a, b, c); 10/10/44第44頁6.4函數(shù)嵌套調(diào)用和遞歸調(diào)用C語言中函數(shù)定義是相互平行,在定義函數(shù)時(shí),一個(gè)函數(shù)不能包含另一個(gè)函數(shù),不過,一個(gè)函數(shù)在被調(diào)用過程中能夠調(diào)用其它函數(shù),這就是函數(shù)嵌套調(diào)用。 6.4.1函數(shù)嵌套調(diào)用10/10/45第45頁計(jì)算 s

38、 = 1!+2!+3!+ + 150! = ? 設(shè)計(jì)1: 一個(gè)主函數(shù),嵌套循環(huán)#define N 150 /* =170 */main() int i, j;long float t, s=0;for (i=1; i= N; +i)t= 1;for (j=1; j=i; +j) t *= j ;s += t;printf(s= %-12.5 len, s); 函數(shù)嵌套調(diào)用舉例10/10/46第46頁設(shè)計(jì)2: 一個(gè)主函數(shù)和兩個(gè)子函數(shù), 嵌套調(diào)用#define N 150main() long float sum() ;printf(ns=%-12.5le, sum(N) );long float

39、 sum(int n) long float fa() , s=0;int i;for (i=1; i=n; +i) s=s+ fa(i) ;return s;long float fa(int k) int i; long float t;t= 1;for (i=1; i=k; +i) t*=i ;return t;注意函數(shù)申明 函數(shù)嵌套調(diào)用舉例10/10/47第47頁在調(diào)用一個(gè)函數(shù)過程中又直接或間接地調(diào)用該函數(shù)本身,稱為函數(shù)遞歸調(diào)用。函數(shù)遞歸調(diào)用是C語言主要特點(diǎn)之一。 6.4.2函數(shù)遞歸調(diào)用直接遞歸間接遞歸10/10/48第48頁#include long rfact(int n)if(n

40、0)printf(Negative argument to fact!n);exit(-1); else if(n=1) return(1); else return(n*rfact(n-1);/自己調(diào)用自己 main()int n;long f;printf(Please input an integral number:);scanf(%d,&n);f=rfact(n); printf(%d!=%ldn,n,f); 運(yùn)行結(jié)果:Please input an integral number:55!=120 10/10/49第49頁4 * rfact(3)3 * rfact(2)2* rfac

41、t(1)1 計(jì)算 rfact(4) 2*1(3* 2*1)(4* 3* 2*1)輸出 (4* 3* 2*1)回推遞推 函數(shù)遞歸調(diào)用過程10/10/50第50頁數(shù)組元素能夠作為函數(shù)實(shí)參,其使用方法與變量相同,是單向傳遞,即“值傳遞”方式;但不能作形參!數(shù)組名既能夠作為實(shí)參也可做形參,傳遞是整個(gè)數(shù)組。數(shù)組名作函數(shù)參數(shù)時(shí),不是“值傳送”,而是把實(shí)參數(shù)組起始地址傳遞給形參數(shù)組,這么兩個(gè)數(shù)組就共占有同一段內(nèi)存單元。這種傳遞方式叫“地址傳送”。6.5數(shù)組作為函數(shù)參數(shù)數(shù)組作為函數(shù)參數(shù)有兩種形式:數(shù)組元素作為函數(shù)參數(shù)和數(shù)組名作為函數(shù)參數(shù) 10/10/51第51頁 數(shù)組元素作為函數(shù)參數(shù)10 #include s

42、tdio.h20 int function(int a)30 40 return a%2; 50 60 main()70 80 int s8=1,3,5,2,4,6,i,d=0;90 for (i=0; function (si);i+)100 d+=si;110 printf(%dn,d);120 程序運(yùn)行結(jié)果:9在采取數(shù)值傳遞方式向形參傳遞數(shù)組元素?cái)?shù)值時(shí),只能把需要數(shù)組元素?cái)?shù)值傳遞給形參,不允許把數(shù)組作為一個(gè)整體傳遞給形參。傳值調(diào)用10/10/52第52頁用數(shù)組名作函數(shù)參數(shù),應(yīng)該在主調(diào)函數(shù)和被調(diào)用函數(shù)分別定義數(shù)組,不能只在一方定義。實(shí)參數(shù)組與形參數(shù)組類型應(yīng)一致。 數(shù)組名作為函數(shù)參數(shù)10 f

43、loat average();20 main()30 40 float avg;50 float x10=1.2,3.6,4.5,5.1,6.9,7,8,9,10.5,11.3;60 avg=average(x);70 printf(The average is %5.2f,avg);80 90 float average(float a10)100 110 int i;float sum=0;120 for (i=0;i10;i+)130 sum=sum+ai;140 return (sum/10);150 傳址調(diào)用10/10/53第53頁main()void swap(int x2);in

44、t a2 = 4, 9;printf(“%d, %dn”, a0, a1);swap(a);printf(“%d, %dn”, a0, a1);void swap(int x2)int t;t = x0;x0 = x1;x1 = t;運(yùn)行4,99,4思索:若不用數(shù)組,用兩個(gè)變量名來做是否能夠? 數(shù)組名作為函數(shù)參數(shù)舉例10/10/54第54頁int swap(int i,int j)int t;t=i;i=j;j=t;printf(In function i=%d,j=%dn,i,j);main()int i=4,j=9;swap(i,j);printf(Out function i=%d,j=

45、%d,i,j);main()void swap(int x2);int a2 = 4, 9;printf(“%d, %dn”, a0, a1);swap(a);printf(“%d, %dn”, a0, a1);void swap(int x2)int t;t = x0;x0 = x1;x1 = t;比較兩程序輸出結(jié)果,說明結(jié)果不相同原因傳值調(diào)用數(shù)組名作為函數(shù)參數(shù),傳址調(diào)用10/10/55第55頁 數(shù)組名作為函數(shù)參數(shù)舉例有一個(gè)數(shù)組score,內(nèi)放10個(gè)學(xué)生成績,求平均成績。#include float average(float array )int i; float aver,sum=0;

46、for(i=0;i10;i+) sum=sum+arrayi; aver=sum/10; return(aver); main()float score10,aver;int i; printf(input 10 scores:n);for(i=0;i10;i+)scanf(%f,&scorei);aver=average(score);printf(average score is %5.2f,aver); 運(yùn)行結(jié)果:input 10 scores:45 100 90 89 78 67 75 55 86 98average score is 78.30 10/10/56第56頁輸入10個(gè)學(xué)生

47、成績,求平均成績,并將低于平均成績分?jǐn)?shù)打印出來。要求:1、用數(shù)組fScore存放10個(gè)學(xué)生成績。2、分別編寫三個(gè)函數(shù):readdata, aver和print,用來輸入學(xué)生成績,求平均分和打印低于平均成績分?jǐn)?shù)。10/10/57第57頁在一個(gè)函數(shù)內(nèi)部定義變量是內(nèi)部變量(局部變量),它作用范圍是從定義處開始到本函數(shù)結(jié)束為止. 注意:1、在主函數(shù)main中定義變量只在主函數(shù)中有效。主函數(shù)也不能使用其它函數(shù)中定義變量。2、不一樣函數(shù)中能夠使用名字相同變量。3、形參是局部變量。4、在復(fù)合語句中定義變量是局部變量,它們只在本復(fù)合語句中有效,離開該復(fù)合語句就無效。6.6 局部變量和全局變量 局部變量10/1

48、0/58第58頁 局部變量#include main()int x=10; int x=20; printf(%d,,x); printf(%dn,x); 分析以下程序運(yùn)行結(jié)果。運(yùn)行結(jié)果:20,10 輸出復(fù)合語句中x,20輸出main函數(shù)中x,1010/10/59第59頁在函數(shù)之外定義變量稱為外部變量,外部變量是全局變量。全局變量可認(rèn)為本文件中其它函數(shù)所共有。它有效范圍:從定義變量位置開始到根源程序文件結(jié)束。在一個(gè)函數(shù)中既可以使用本函數(shù)中局部變量,又可以使用有效全局變量。 注意:1、全局變量作用:增加了函數(shù)間數(shù)據(jù)聯(lián)絡(luò)渠道。2、在同一個(gè)源文件中,全局變量與局部變量同名,則在局部變量作用范圍內(nèi),全

49、局變量不起作用。 全局變量10/10/60第60頁傳值調(diào)用,主函數(shù)中a值未發(fā)生改變10 int d=1;20 fun(int p)30 40 int d=5;50 d+=p+;60 printf(%d,d);70 80 main()90 100 int a=3;110 fun(a);120 d+=a+;130 printf(d=%d,a=%dn,d,a); 140 程序運(yùn)行結(jié)果:d=8,p=4d=4,a=4 全局變量局部變量局部變量d為全局變量a為局部變量10/10/61第61頁1.全局變量提供了另外函數(shù)間進(jìn)行數(shù)據(jù)聯(lián)絡(luò)渠道,這種方式有效地處理了函數(shù)只能經(jīng)過return語句帶給主調(diào)函數(shù)一個(gè)運(yùn)算結(jié)

50、果情況。 2. 經(jīng)過全局變量在不一樣函數(shù)間傳遞數(shù)據(jù),能夠有效地降低形參個(gè)數(shù),使函數(shù)書寫愈加簡練。3.因?yàn)槿肿兞吭陂_始運(yùn)行程序時(shí)就已經(jīng)分配了存放空間,而且在程序運(yùn)行過程中并不釋放這些存放單元,所以經(jīng)過全局變量傳遞數(shù)據(jù)時(shí)在函數(shù)調(diào)用過程中沒有分配和釋放形參存放單元過程,能夠降低參數(shù)傳遞是時(shí)間開銷。 使用全局變量好處10/10/62第62頁 使用全局變量弊端內(nèi)存開銷大和局部變量“用之則建,用完即撤”方式不一樣,全局變量從程序開始運(yùn)行時(shí)候就占據(jù)了內(nèi)存單元,直到程序運(yùn)行結(jié)束才會(huì)釋放這些存放空間。通用性差全局變量使用使不一樣函數(shù)之間“耦合性”增強(qiáng),每個(gè)函數(shù)“獨(dú)立性”降低??勺x性差在不一樣函數(shù)中碰到全局變量

51、時(shí)難以判斷當(dāng)前該變量取值,因?yàn)楦鱾€(gè)函數(shù)執(zhí)行時(shí)都可能改變?nèi)肿兞繑?shù)值,這給程序調(diào)試帶來麻煩。 提議:編程時(shí)盡可能不用全局變量10/10/63第63頁6.7 變量存放類別變量存放期是該變量在內(nèi)存中存在期。一些變量存在是短暫,有些變量會(huì)被重復(fù)地建立和撤消,而另外一些變量存在于程序整個(gè)執(zhí)行期間。依據(jù)變量存在期不一樣,能夠?qū)⒆兞看娣欧绞椒譃殪o態(tài)存放方式和動(dòng)態(tài)存放方式。C語言中能夠用以下4個(gè)關(guān)鍵字來表示存放類別:auto(自動(dòng))static(靜態(tài))register(存放器)extern(外部)10/10/64第64頁 存放期屬性用戶區(qū)存放auto變量、 register變量、 函數(shù)返回值、被調(diào)用函數(shù)形參、

52、保留調(diào)用現(xiàn)場(chǎng)數(shù)據(jù)。存放 static變量、 extern變量存放執(zhí)行程序代碼 程序區(qū) 靜態(tài)存放區(qū) 動(dòng)態(tài)存放區(qū) C語言程序運(yùn)行時(shí)所用存放空間,普通包含三部分:程序運(yùn)行過程中使用變量分別存放在靜態(tài)存放區(qū)和動(dòng)態(tài)存放區(qū)中。10/10/65第65頁 存放期屬性靜態(tài)存放區(qū)中存放了在整個(gè)程序執(zhí)行過程中都存在變量,比如全局變量。這類變量在程序開始運(yùn)行時(shí)就取得了存放空間,直到程序運(yùn)行結(jié)束才釋放存放空間,在程序運(yùn)行過程中,這類變量都占有固定存放單元,而不是動(dòng)態(tài)地進(jìn)行分配和釋放。動(dòng)態(tài)存放區(qū)中存放變量是依據(jù)程序運(yùn)行需要而建立和釋放。通常情況下,存放在動(dòng)態(tài)存放區(qū)中變量包含:函數(shù)形式參數(shù)、返回值;自動(dòng)變量、存放器變量;函

53、數(shù)調(diào)用時(shí)現(xiàn)場(chǎng)保護(hù)和返回地址等。10/10/66第66頁自動(dòng)變量是C程序中使用最多一個(gè)變量。因?yàn)榻⒑统废@些變量,都是由系統(tǒng)自動(dòng)進(jìn)行,所以稱自動(dòng)變量。自動(dòng)變量在使用之前先按以下形式進(jìn)行說明: auto 數(shù)據(jù)類型 變量名 = 初始表示式,.;auto是自動(dòng)變量存放類別標(biāo)識(shí)符??墒÷浴W詣?dòng)變量是局部變量未進(jìn)行初始化時(shí),自動(dòng)變量值是不定。函數(shù)形參也是一個(gè)自動(dòng)變量,不過在說明時(shí)不加存放類型標(biāo)識(shí)符“auto”。對(duì)同一函數(shù)兩次調(diào)用之間,自動(dòng)變量值是不保留。因?yàn)槠渌诖娣艈卧驯会尫帕恕?自動(dòng)變量10/10/67第67頁 局部靜態(tài)變量假如希望在函數(shù)調(diào)用結(jié)束后依然保留其中定義局部變量值,則能夠?qū)⒕植孔兞慷x為

54、局部靜態(tài)變量。申明局部靜態(tài)變量普通形式為:static 類型說明符 變量名 說明:(1)局部靜態(tài)變量是在靜態(tài)存放區(qū)分配存放單元。一個(gè)變量被申明為靜態(tài),在編譯時(shí)即分配存放空間,在整個(gè)程序運(yùn)行期間都不釋放。所以,函數(shù)調(diào)用結(jié)束后,它值并不消失,其值能夠保持連續(xù)性。(2)局部靜態(tài)變量是在編譯過程中賦初值,且只賦一次初值,在程序運(yùn)行時(shí)其初值已定,以后每次調(diào)用函數(shù)時(shí),都不再賦初值,而是保留上一次函數(shù)調(diào)用結(jié)束時(shí)結(jié)果。(3)局部靜態(tài)變量在未顯式初始化時(shí),編譯系統(tǒng)把它們初始化為0(整型變量)、0.0(實(shí)型變量)或空字符(字符型變量)。 10/10/68第68頁#include main()int i,j=2;f

55、or(i=0;i3;i+)printf(%4d,function(j);printf(n);函數(shù)調(diào)用開始時(shí)函數(shù)調(diào)用結(jié)束時(shí)bcbc第一次調(diào)用0011第二次調(diào)用0112第三次調(diào)用0213int function(int a)int b=0; static int c; b+; c+;return (a+b+c); 運(yùn)行結(jié)果為: 4 5 6 10/10/69第69頁10 main()20 30 int j=2,i;40 for(i=0;i3;i+)50 printf(%4d, function (j);60 70 function(int a)80 90 int b=0;100 static int

56、 c=3;110 b+;120 c+;130 return(a+b+c);140 例 讀程序, 寫出程序運(yùn)行結(jié)果。程序運(yùn)行結(jié)果: 7 8 9靜態(tài)變量,存放空間不釋放靜態(tài)變量若未賦初值,則默認(rèn)初值為0見例6-2510/10/70第70頁#includemain() int k4;m1,p; pfunc(k,m); printf(“%d”,p); pfunc(k,m); printf(“%dn”,p);func(int a,int b) static int m,i2; i+m+1; mi+a+b; return(m);自動(dòng)類型變量靜態(tài)類型變量,默認(rèn)初值為0程序運(yùn)行結(jié)果: 817i 2+1=3 m

57、 3+1+4=8i 3+8+1=12 m 12+1+4=1710/10/71第71頁存放器變量含有與自動(dòng)變量完全相同性質(zhì)。當(dāng)把一個(gè)變量指定為存放器存放類別時(shí),系統(tǒng)就將它存放在CPU中一個(gè)存放器中。通常把使用頻率較高變量(如循環(huán)次數(shù)較多循環(huán)變量)定義為register類別。 存放器變量(1)只有局部自動(dòng)變量和形參能夠作為存放器變量,其它(如全局變量、局部靜態(tài)變量)則不行。 (2)只有int、char和指針類型變量可定義為存放器型 (3)可用于變量空間分配存放器個(gè)數(shù)依賴于詳細(xì)機(jī)器。 10/10/72第72頁#include void m_table(void)register int i,j;/定

58、義存放器變量for(i=1;i=9;i+)for(j=1;j=i;j+)printf(%d*%d=%d ,j,i,j*i);printf(n); 存放器變量應(yīng)用 main()void m_table(void);m_table(); 因?yàn)轭l繁使用變量i、j,故將它們放在存放器中。 10/10/73第73頁在多個(gè)源程序文件情況下,假如在一個(gè)文件中要引用其它文件中定義全局變量,則應(yīng)該在需要引用此變量文件中,用extern進(jìn)行說明。在一個(gè)文件中,定義在函數(shù)之外變量稱為外部變量。外部變量作用域是“全程”(全局),即從定義位置開始到本文件結(jié)束。假如在一個(gè)函數(shù)中改變了外部變量值,那么其后引用該變量時(shí),得到是已被改變值。外部變量也能夠不出現(xiàn)在文件開頭,而出現(xiàn)在兩個(gè)函數(shù)之間。 外部全局變量6.7.2全局變量存放類別10/10/74第74頁#include 10

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論