版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、第6章 函數(shù),學(xué)習(xí)的意義,子模塊1,子模塊2,子模塊n,學(xué)習(xí)的意義,功能模塊1,功能模塊2,功能模塊n,……,……,……,……,軟件項(xiàng)目,C語言程序,C語言函數(shù),達(dá)積木,第6章 函數(shù),本章要求理解模塊化程序設(shè)計(jì)思想;掌握函數(shù)的定義與調(diào)用方法;掌握C語言的參數(shù)傳遞方式,尤其是數(shù)組參數(shù)的傳遞特點(diǎn);掌握變量的作用域和存儲(chǔ)方式。,本章重點(diǎn)函數(shù)的定義與調(diào)用參數(shù)傳遞變量的作用域和存儲(chǔ)方式,本章難點(diǎn)參數(shù)傳遞變量的作用域和存儲(chǔ)方式
2、,第6章 函數(shù),6.1 函數(shù)概述 6.2 函數(shù)的定義 6.3 函數(shù)調(diào)用與參數(shù)傳遞 6.4 函數(shù)與指針 6.5 main函數(shù)的參數(shù) 6.6 函數(shù)與變量的作用域 6.7 應(yīng)用程序舉例,模塊化程序設(shè)計(jì)方法:人們在求解某個(gè)復(fù)雜問題時(shí),通常采用逐步分解、分而治之的方法,也就是將一個(gè)大問題分解成若干個(gè)比較容易求解的小問題,然后分別求解。程序員在設(shè)計(jì)一個(gè)復(fù)雜的應(yīng)用程序時(shí),往往也是把整個(gè)程序劃分成若干個(gè)功能較為單一的程序模
3、塊,然后分別予以實(shí)現(xiàn),最后再把所有的程序模塊象達(dá)積木一樣裝配起來,這種在程序設(shè)計(jì)中分而治之的策略,被稱為模塊化程序設(shè)計(jì)方法。,6.1.1 程序化設(shè)計(jì)方法,6.1 函數(shù)概述,6.1 函數(shù)概述,例6-1 編寫一個(gè)顯示歡迎信息的程序,要求所有的信息均在一個(gè)星號組成的矩形框中顯示。,程序輸出如下:****************************Please input your name! ***********
4、******************Xiao Qiang *****************************Welcome to the C world! ****************************,程序代碼如下:#include #include #define USERNAME "XiaoQiang"voi
5、d message(char *s);//函數(shù)聲明void main() { char name[10]; message("Please input your name!");//函數(shù)調(diào)用 scanf("%s",name); if(strcmp(name,USERNAME)==0) message("Welcome to t
6、he C world!"); else message("Error Username");//函數(shù)調(diào)用 },void message(char *s) //函數(shù)定義{ int n,i; n=strlen(s);//求字符串S的長度 for(i=1;i<=n+4;i++) printf("%c",'*
7、'); printf("\n"); printf("* %s *\n",s); for(i=1;i<=n+4;i++) printf("%c",'*'); printf("\n");},6.1 函數(shù)概述,程序輸出如下:****************************P
8、lease input your name!****************************XiaoQiang****************************Welcome to the C world!****************************C程序的層次關(guān)系,C語言使用函數(shù)作為程序的組成單元的優(yōu)點(diǎn)是: 1)簡化程序設(shè)計(jì): 將常執(zhí)行的一些操作寫成函數(shù)后,可以像利用庫
9、函數(shù)一樣 調(diào)用。 2)便于調(diào)試和維護(hù): 龐大的程序分成若干功能獨(dú)立的小模塊,便于管理和調(diào)試。,6.1 函數(shù)概述,6.1 函數(shù)概述,6.1.2 C函數(shù)的分類從使用角度劃分 標(biāo)準(zhǔn)函數(shù),即庫函數(shù) (#include)自定義函數(shù) (為解決不同問題而編寫)從函數(shù)形式劃分 無參函數(shù) (函數(shù)定義時(shí)圓括號內(nèi)為空或者void)有參函數(shù) 從函數(shù)的結(jié)果劃分 無返回值函數(shù) (完成某項(xiàng)任務(wù)不向主函數(shù)返回函數(shù)值
10、)有返回值函數(shù) (返回結(jié)果)從函數(shù)的存儲(chǔ)類型劃分 外部函數(shù)(extern) (可以被其他文件中的函數(shù)調(diào)用)靜態(tài)函數(shù)(static) (只限于本文件中的函數(shù)用),6.2.1一般格式,合法標(biāo)識符,函數(shù)返回值類型缺省int型無返回值void,函數(shù)體,例 有參函數(shù) int max(int x,int y) { int z; z=x>y?x:y; return(z); },例 無
11、參函數(shù) printstar( ) { printf(“**********\n”); }或 printstar(void ) { printf(“**********\n”); },6.2 函數(shù)的定義,6.2 函數(shù)的定義,6.2.2 函數(shù)返回值C語言通過return語句獲得函數(shù)返回值的,其格式如下:return 表達(dá)式; 或 return(表達(dá)式);,說明: 表達(dá)式的值即函數(shù)返回值,它應(yīng)與所
12、定義的函數(shù)返回值的類型一致 一個(gè)函數(shù)可以有多條return語句,執(zhí)行到哪一條return語句,哪一條起作用 return語句的另一作用是終止執(zhí)行函數(shù) 為增加程序的可讀性,建議只在函數(shù)結(jié)尾處使用一次return語句,6.2 函數(shù)的定義,6.2.3 形式參數(shù)的設(shè)計(jì)設(shè)計(jì)形式參數(shù)應(yīng)從函數(shù)的功能分析入手,那個(gè)數(shù)據(jù)需要調(diào)用函數(shù)提供,這就應(yīng)定義一個(gè)形式參數(shù)接收該數(shù)據(jù) 。,例6-3 編寫一個(gè)函數(shù)求一個(gè)3位正整數(shù)的逆序數(shù),如123的逆序數(shù)是321
13、。 #include int fun(int n);//函數(shù)聲明void main(){ int x,y; do { printf(" Enter a number x=?:"); scanf("%d",&x); }while(x999); y=fun(x);//函數(shù)調(diào)用 printf(&qu
14、ot;Inverse number:%d\n",y);}int fun(int n)//函數(shù)定義{ int a,b,c,m;a=n%10;b=n/10%10;c=n/100; m=a*100+b*10+c; return(m);},6.2 函數(shù)的定義,6.2.4 函數(shù)原型 在使用自定義函數(shù)時(shí),除了進(jìn)行函數(shù)的定義外,還需要在調(diào)用該函數(shù)之前對其進(jìn)
15、行原型聲明 函數(shù)原型聲明和函數(shù)定義的區(qū)別函數(shù)原型聲明的作用是將函數(shù)類型告訴編譯系統(tǒng),使程序在編譯階段對調(diào)用函數(shù)的合法性進(jìn)行全面的檢查,避免函數(shù)調(diào)用時(shí)出現(xiàn)參數(shù)的個(gè)數(shù)或類型不一致的運(yùn)行錯(cuò)誤。函數(shù)定義部分則是函數(shù)的實(shí)際實(shí)現(xiàn)代碼 函數(shù)原型聲明的格式:類型符 函數(shù)名(形式參數(shù));,說明:(1)函數(shù)原型聲明語句最后的分號不能省略,其作用是表示該語句是進(jìn)行函數(shù)聲明而不是函數(shù)定義。(2)在原型聲明中,形式參數(shù)名可以省略。(3)如果被調(diào)用函
16、數(shù)的定義出現(xiàn)在調(diào)用函數(shù)之前,可以不對被調(diào)用函數(shù)進(jìn)行原型聲明。(4)如果被調(diào)用函數(shù)已在所有函數(shù)定義之前進(jìn)行了原型聲明,則在各個(gè)調(diào)用函數(shù)中不必再對該函數(shù)進(jìn)行原型聲明 。,例: 函數(shù)說明舉例,void main( ){ float add(float,float); //函數(shù)原型聲明 float a, b ,c; scanf ("%f,%f", &a, &b);
17、c = add (a, b); printf ("sum is %f", c);}float add (float x, float y){ float z; z = x + y; return (z);},6.3 函數(shù)調(diào)用與參數(shù)傳遞,6.3.1 函數(shù)的調(diào)用方式 有參函數(shù)調(diào)用的格式:函數(shù)名(實(shí)際參數(shù))無參函數(shù)的調(diào)用格式:函數(shù)名( ) 說明 函數(shù)總是在某個(gè)函數(shù)體
18、中被調(diào)用 函數(shù)調(diào)用可以在結(jié)尾處加上分號,單獨(dú)作為一條語句 對于有返回值的函數(shù),其調(diào)用也可以出現(xiàn)在某條語句中函數(shù)的調(diào)用過程,四類函數(shù)的詳細(xì)說明,1、無參數(shù)無返回值的函數(shù),定義格式,void 函數(shù)名 (void){ 變量聲明部分 執(zhí)行部分},空類型,表明函數(shù)無返回值,不可省!,表明無參數(shù),可缺??!,必須為合法的標(biāo)識符,函數(shù)用途,此類函數(shù)用于完成某項(xiàng)固定的處理任務(wù),執(zhí)行完成后不向調(diào)用者返回函數(shù)值。,函數(shù)的原型聲
19、明,void 函數(shù)名( void ); 或 void 函數(shù)名( );,C規(guī)定,對函數(shù)調(diào)用前必須對其原型加以聲明,否則會(huì)出現(xiàn)編錯(cuò)!,6.3 函數(shù)調(diào)用與參數(shù)傳遞,1、無參數(shù)無返回值的函數(shù),函數(shù)的調(diào)用,函數(shù)名( );,注意:不能將這種函數(shù)調(diào)用賦值給任何變量,因?yàn)樗鼪]有返回值。調(diào)用時(shí),( )中間不能有void。,實(shí)例,#include #include void showerror ( ); //聲明showerr
20、or函數(shù)的原型void main ( ){ int a; scanf ("%d", &a); while (a < 0) { showerror( ); scanf ("%d", &a); } printf ("sqrt(a) = %.2f\n", sqrt(a));}
21、void showerror( ) //函數(shù)的定義,無參數(shù)無返回值{ printf("input error!\n"); //函數(shù)體,沒有聲明變量},注意:對函數(shù)調(diào)用之前,必須要先聲明或先定義,否則編譯錯(cuò)!,編寫C程序的一般格式,文件包括(如include 等,用于標(biāo)準(zhǔn)庫庫函數(shù)原型聲明)常量定義(根據(jù)需要而定,如#define PI 3.1415等)變量定義(根據(jù)需要而定)用戶
22、自定義函數(shù)原型聲明main函數(shù)用戶自定義函數(shù),函數(shù)的返回,形式,① rerurn (表達(dá)式); //有返回值 ② rerutn 表達(dá)式; //有返回值 ③ return; //無返回值,使程序控制從被調(diào)用函數(shù)返回到調(diào)用函數(shù)中,如果有返回值,同時(shí)把返值帶給調(diào)用函數(shù)。,功能,說明,函數(shù)中可以有多個(gè)return語句。在無返回值的函數(shù)中,return語句的形式只能是第③種形式。
23、,例如:void showyes ( ){ char key; key = getchar ( ); if (strupr(key) != 'Y') return; printf ("YES! ");},函數(shù)showyes的功能是: 如果輸入的字符不是'Y'或'y',則什么都不輸出,直接返回,否則,輸出"YES!
24、",標(biāo)準(zhǔn)庫函數(shù),其功能是將小寫字符轉(zhuǎn)換成大寫字符,2、無參數(shù)有返回值的函數(shù),定義格式,返回值類型符 函數(shù)名 (void){ 變量聲明部分 執(zhí)行部分},可以為除數(shù)組類型外的任何類型,缺省時(shí),默認(rèn)為int型,表明無參數(shù),可缺??!,必須為合法的標(biāo)識符,函數(shù)用途,此類函數(shù)用于完成某項(xiàng)固定的處理任務(wù),執(zhí)行完成后向調(diào)用者返回函數(shù)值。,函數(shù)的原型聲明,返回值類型符 函數(shù)名( void ); 或 返回值類型符 函數(shù)
25、名( );,函數(shù)的調(diào)用,函數(shù)名( void ); 或 變量 = 函數(shù)名( );,2、無參數(shù)有返回值的函數(shù),函數(shù)的返回,表達(dá)式的值即是函數(shù)的返回值; 函數(shù)體中一般都包含return(表達(dá)式)語句, 如果沒有, 函數(shù)也會(huì)返回一個(gè)值。這個(gè)值是不可預(yù)知的, 將會(huì)使程序可能犯有邏輯錯(cuò); 一般情況下,表達(dá)式值的類型應(yīng)與函數(shù)返回值類型一致; 當(dāng)return(表達(dá)式)語句中的表達(dá)式的類型與函數(shù)的返回值類型不一致時(shí),編譯器將對表
26、達(dá)式進(jìn)行強(qiáng)制類型轉(zhuǎn)換, 將表達(dá)式的值強(qiáng)制轉(zhuǎn)換成函數(shù)返回值類型, 然后返回給調(diào)用者。,格式,rerurn (表達(dá)式); 或 rerutn 表達(dá)式;,說明,int func ( ){ float f = 5; f = f / 2; return ( f );},函數(shù)將返回2,而不是2.5,注意:如果不將函數(shù)調(diào)用賦值給任何變量,它的返回值將被丟棄!,3、有參數(shù)無返回值的函數(shù),定義格式,void 函數(shù)名 (類
27、型符1 形參名1, 類型符2 形參名2, … , 類型符n 形參名n ){ 變量聲明部分 執(zhí)行部分},函數(shù)用途,此類型的函數(shù)主要是根據(jù)形參的值來進(jìn)行某種事務(wù)的處理。靈活性上要比無形參的函數(shù)強(qiáng),它更能體現(xiàn)調(diào)用函數(shù)與被調(diào)函數(shù)之間的數(shù)據(jù)聯(lián)系。,函數(shù)的原型聲明,void 函數(shù)名(類型符1 形參名1, 類型符2 形參名2, … , 類型符n 形參名n ); 或 void 函數(shù)名(類型
28、符1 , 類型符2 , … , 類型符n );,至少要有一項(xiàng),形參之間要用逗號“,”分開,指明形參類型,不允許對形參賦初值,3、有參數(shù)無返回值的函數(shù),函數(shù)調(diào)用,函數(shù)名( 實(shí)參1,實(shí)參2,……,實(shí)參n );,實(shí)參可以是常量、變量、表達(dá)式、函數(shù)等,注意事項(xiàng): (1) 實(shí)參列表中的實(shí)參必須與函數(shù)定義時(shí)的形參數(shù)量相同、類型相符。 (2) 賦值對應(yīng)關(guān)系: 實(shí)參1 -> 形參1 實(shí)參2 -&g
29、t; 形參2 …… 實(shí)參n -> 形參n (3)實(shí)參表求值順序(即實(shí)參賦值給形參的順序) 因系統(tǒng)而定。TC、BC、VC均是自右向左,也就是說最右邊的實(shí)參最先賦值給最右邊的形參, 最左邊的實(shí)參最后賦值給最左邊的形參。但VC與TC、BC在具體賦值時(shí)稍有不同,注意它們之間的區(qū)別。,3、有參數(shù)無返回值的函數(shù),#include void compare (int a, int b);
30、 void main ( ){ int i = 2,j=3; compare ( i, j ); printf ("i = %d,j=%d\n", i,j);}void compare ( int a, int b ) { printf ("a = %d b = %d\n", a, b); if ( a >
31、; b) printf ("a > b\n"); else if (a == b) printf ("a = b\n"); else printf ("a < b\n");},i,j為實(shí)參,,,a、b為形參,,原型聲明,3,2,2,4、有參數(shù)有返回值的函數(shù),定義格式
32、,返回值類型符 函數(shù)名 (類型符1 形參名1, … … , 類型符n 形參名n ){ 變量聲明部分 執(zhí)行部分},函數(shù)用途,此類型的函數(shù)主要是根據(jù)形參的值來進(jìn)行某種事務(wù)的處理,同時(shí)可將處理后的結(jié)果值返回給調(diào)用函數(shù) 。它最能體現(xiàn)調(diào)用函數(shù)與被調(diào)函數(shù)之間的數(shù)據(jù)聯(lián)系。,函數(shù)的原型聲明,返回值類型符 函數(shù)名(類型符1 形參名1, …… , 類型符n 形參名n );
33、 或 返回值類型符 函數(shù)名(類型符1 , 類型符2 , …… , 類型符n );,4、有參數(shù)有返回值的函數(shù),函數(shù)調(diào)用,函數(shù)名( 實(shí)參1,實(shí)參2,……,實(shí)參n ); 或變量名 = 函數(shù)名( 實(shí)參1,實(shí)參2,……,實(shí)參n );,#include int max (in t a, int b); //函數(shù)的原型聲明void main ( ){ int a, b, c; scanf (&q
34、uot;%d%d", &a, &b); c = max (a, b); //函數(shù)調(diào)用(a、b為實(shí)參) printf ("the biggest number is : %d\n", c);}int max (int a, int b) //函數(shù)定義(a、b為形參){ return (a > b ? a : b);},運(yùn)行結(jié)果:5 9↙the big
35、gest number is 9,函數(shù)調(diào)用和函數(shù)說明小結(jié),函數(shù)調(diào)用,函數(shù)語句: 例:printstar ( ); printf (“Hello,World!\n”); 函數(shù)表達(dá)式: 例: m = max (a, b) * 2; 函數(shù)參數(shù): 例: printf (“%d”, max(a,b)); m = max (a, max(b,c));,6.3 函數(shù)調(diào)用與
36、參數(shù)傳遞,函數(shù)說明 對被調(diào)用函數(shù)要求:必須是已存在的函數(shù)庫函數(shù): #include 用戶自定義函數(shù): 函數(shù)類型說明 函數(shù)說明一般形式: 函數(shù)類型 函數(shù)名(形參類型 [形參名],….. ); 或 函數(shù)類型 函數(shù)名( );作用:告訴編譯系統(tǒng)函數(shù)類型、參數(shù)個(gè)數(shù)及類型,以便檢驗(yàn)函數(shù)定義與函數(shù)說明不同函數(shù)說明位置:程序的數(shù)據(jù)說明部分(函數(shù)內(nèi)或外)下列情況下,可
37、不作函數(shù)說明 若函數(shù)返值是char或int型,系統(tǒng)自動(dòng)按int型處理 被調(diào)用函數(shù)定義出現(xiàn)在主調(diào)函數(shù)之前有些系統(tǒng)(如BC、VC)要求函數(shù)說明指出函數(shù)返值類型和形參類型,并且對void 和 int 型函數(shù)也要進(jìn)行函數(shù)說明,6.3 函數(shù)調(diào)用與參數(shù)傳遞,6.3.2 參數(shù)傳遞 參數(shù)是函數(shù)調(diào)用進(jìn)行信息交互的載體,分形參和實(shí)參。形式參數(shù)又稱為形參或虛參:定義函數(shù)時(shí),寫入函數(shù)圓括號內(nèi)的參數(shù)。事實(shí)上,形參是一種局部變量,它在函數(shù)被調(diào)用前并沒有
38、被分配存儲(chǔ)空間,也沒有具體的值。形參僅僅是一個(gè)“符號”。 實(shí)際參數(shù)又稱為實(shí)參:調(diào)用函數(shù)時(shí),寫入函數(shù)圓括號內(nèi)的參數(shù),可以是常量、變量或表達(dá)式,它有具體的值。對于實(shí)參變量而言,它已經(jīng)被分配了相應(yīng)的存儲(chǔ)空間。,函數(shù)之間參數(shù)的傳遞:調(diào)用有參函數(shù),系統(tǒng)根據(jù)形參的類型為其分配存儲(chǔ)空間,其內(nèi)容為形參的值。調(diào)用時(shí)應(yīng)該提供與形參匹配的實(shí)參,匹配——個(gè)數(shù)和類型。,例: 交換兩個(gè)數(shù)(值傳遞方式),#include void swap (int a, i
39、nt b); void main ( ){ int x = 7, y = 11; printf ("before swapped: "); printf ("x=%d, y=%d\n", x, y); swap (x, y); printf ("after swapped: "); printf ("x
40、=%d, y=%d\n", x, y);}void swap (int a, int b){ int temp; temp = a; a = b; b = temp;},運(yùn)行結(jié)果:before swapped: x = 7, y = 11after swapped: x = 7, y = 11,,,7,,,11,,7,Why?,#include void swap
41、(int a, int b); void main ( ){ int x = 7, y = 11; printf ("before swapped: "); printf ("x=%d, y=%d\n", x, y); swap (&x, &y); printf ("after swapped: ");
42、 printf ("x=%d, y=%d\n", x, y);}void swap (int *a, int *b){ int temp; temp = *a; *a = *b; *b = temp;},運(yùn)行結(jié)果:before swapped: x = 7, y = 11after swapped: x = 11, y =7,6.3.3 指針變量作參
43、數(shù)(仍為值傳遞),,,,,③ swap,③ swap,③ swap,,③ swap,,,③ swap,6.3 函數(shù)調(diào)用與參數(shù)傳遞,注意:不能試圖通過調(diào)用以下函數(shù)來交換實(shí)參變量的值。程序代碼如下:void swap(int *a,int *b) { int *t; t=a; a=b; b=t; },1、值傳遞方式,方式: 函數(shù)調(diào)用時(shí),為形參分配單元,并將實(shí)參的值復(fù)制到形參中;調(diào)用結(jié)束,形參單元被
44、釋放,實(shí)參單元仍保留并維持原值。 特點(diǎn): ① 形參與實(shí)參占用不同的內(nèi)存單元 ② 單向傳遞 這種參數(shù)傳遞過程被形象的稱為“虛實(shí)結(jié)合”。,6.3 函數(shù)調(diào)用與參數(shù)傳遞,C語言中的參數(shù)傳遞是一種單向的“值傳遞”。,6.3 函數(shù)調(diào)用與參數(shù)傳遞,6.3.4 數(shù)組參數(shù) 當(dāng)程序中需要處理一批相關(guān)數(shù)據(jù)時(shí),往往用數(shù)組。若要實(shí)現(xiàn)函數(shù)功能時(shí)需要獲取一批相關(guān)數(shù)據(jù)作為原始信息,這個(gè)時(shí)候就可以考慮用數(shù)組參數(shù)。本節(jié)主要討論的是數(shù)組整體作為參數(shù)傳
45、遞。單個(gè)數(shù)組元素作為實(shí)參仍然為值傳遞,值傳遞,main( ){ float fun(float a,float b,float c); float a[3]={1,2,3}; float ave=0; ave=fun(a[0],a[1],a[2]); }float fun(float a,float b,float c){ float sum,aver; sum=a+b+c; av
46、er=sum/3.0; return(aver);},求三個(gè)數(shù)的平均值:,數(shù)組元素作為參數(shù),程序的運(yùn)行:,fun( ),,main( ),,,,,,②執(zhí)行函數(shù)體,③返回函數(shù)值釋放相應(yīng)空間,,,數(shù)組元素a[0] , a[1],a[2]作實(shí)參,,6.3 函數(shù)調(diào)用與參數(shù)傳遞,6.3 函數(shù)調(diào)用與參數(shù)傳遞,一維數(shù)組參數(shù)(與值傳遞方式不同) 例6-7 定義一個(gè)函數(shù)max_value用于返回一個(gè)10個(gè)元素組成的一維整型數(shù)組中的最大值。,
47、程序代碼如下:#include #include #include int max_value(int a[]);//函數(shù)原型聲明void main(){ int x[10],i; printf("Array:"); srand(time(NULL));//初始化隨機(jī)數(shù)發(fā)生器 for(i=0;it)t=a[i]; return(t); },6.3 函數(shù)
48、調(diào)用與參數(shù)傳遞,一維數(shù)組參數(shù)數(shù)組參數(shù)傳遞 傳遞數(shù)組的首地址 通常情況下,數(shù)組做函數(shù)參數(shù),需要再定義一個(gè)整型形參,用于傳遞數(shù)組元素個(gè)數(shù)的信息。,#include main( ){ float fun2(float x[3]); float a[3]={87.5,90,100}; float ave=0; ave=fun2(a); }float fun2(float x[3]){ float sum,aver;
49、 sum=x[0]+x[1]+x[2]; aver=sum/3.0; return(aver);},求三個(gè)數(shù)的平均值:,數(shù)組名作為函數(shù)參數(shù),程序的運(yùn)行:,fun2( ),,main( ),,,,②執(zhí)行函數(shù)體,③返回函數(shù)值釋放相應(yīng)空間,①傳地址,,,形參與實(shí)參共用地址空間,,x,,,地址傳遞,,地址傳遞,#include main( ){ void swap(int x[2]); int a[2]
50、={4,9}; swap(a); printf(“%d,%d\n”,a[0],a[1]); }void swap(int x[2]){ int t; t=x[0]; x[0]=x[1]; x[1]=t;},兩個(gè)數(shù)交換數(shù)值:,地址傳遞使形參與實(shí)參共用地址空間,形參值改變,則實(shí)參值也改變,,,②執(zhí)行函數(shù)體,③返回函數(shù)值釋放相應(yīng)空間,①傳地址,,程序的運(yùn)行:,swap( ),,main( ),,
51、,x,,,實(shí)參數(shù)組必須指定長度,形參數(shù)組則不必。 形參數(shù)組并沒有另外分配空間,而是共享實(shí)參數(shù)組的數(shù)據(jù)。 使用形參數(shù)組時(shí)不要超過實(shí)參數(shù)組的長度。,長度2可省,2、地址傳遞方式,定義形式:類型名 形參數(shù)組名[] 方式: 函數(shù)調(diào)用時(shí),將數(shù)據(jù)的存儲(chǔ)地址(同類型數(shù)組名稱)作為參數(shù)傳遞給形參 特點(diǎn): ① 形參與實(shí)參占用同樣的存儲(chǔ)單元 ② 雙向傳遞 ③ 實(shí)參和形參必須是地址常量或變量,用數(shù)組名作為函數(shù)參數(shù)時(shí)還應(yīng)注意
52、以下幾點(diǎn): 形參數(shù)組和實(shí)參數(shù)組的類型必須一致,否則將引起錯(cuò)誤。 形參數(shù)組和實(shí)參數(shù)組的長度可以不相同,因?yàn)樵谡{(diào)用時(shí),只傳送首地址而不檢查形參數(shù)組的長度。 多維數(shù)組也可以作為函數(shù)的參數(shù)。在函數(shù)定義時(shí)對形參數(shù)組可以指定每一維的長度,也可省去第一維的長度。,判斷以下定義形式哪些是正確的?int max(int x[3]) int max(int x[]) int max(x[3])
53、 int max(int x),6.3 函數(shù)調(diào)用與參數(shù)傳遞,例6-8編寫一個(gè)實(shí)現(xiàn)一維數(shù)組排序的函數(shù)。 程序代碼如下: #include #include #include void sort(int a[],int n);//函數(shù)原型聲明void main(){ int x[10],i; srand(time(NULL)); printf("Before sorti
54、ng:\n"); for(i=0;i<10;i++) { x[i]=rand()%90+10; printf("%3d",x[i]); } sort(x,10);//函數(shù)調(diào)用 printf("\nAfter sorting:\n"); for(i=0;i<10;i++) printf(
55、"%3d",x[i]);},6.3 函數(shù)調(diào)用與參數(shù)傳遞,void sort(int a[],int n)//排序函數(shù){ int i,j,k,t; for(i=0;ia[j])k=j; if(k!=i) { t=a[i]; a[i]=a[k]; a[k]=t; } }},6.3 函數(shù)調(diào)用與
56、參數(shù)傳遞,多維數(shù)組參數(shù) 多維形參數(shù)組的定義形式為:類型名 形參數(shù)組名[][數(shù)值]……[數(shù)值],即除了最左邊的方括號可能留空外,其余都要填寫數(shù)值。調(diào)用使用多維數(shù)組參數(shù)的函數(shù)時(shí),與形參數(shù)組對應(yīng)的實(shí)參是一個(gè)同類型的數(shù)組名,也不需要加上任何方括號。例6-10 編寫一個(gè)函數(shù)用于查找并返回3×4的矩陣中的最大元素。程序代碼如下:#include #include #include int max_value(int a[]
57、[4],int n, int *row, int *col);void main(){ int x[3][4]; int m,i,j,r,c; srand(time(NULL)); for(i=0;i<3;i++) { for(j=0;j<4;j++),6.3 函數(shù)調(diào)用與參數(shù)傳遞,{ x[i][j]=rand()%90+10; printf("
58、;%3d",x[i][j]); } printf("\n"); } m=max_value(x,3,&r,&c); printf("The max value is %d\n",m); printf("The position is %d row, %d column\n",r,c);}int m
59、ax_value(int a[][4],int n, int *row, int *col){ int max,i,j; max=a[0][0]; *row=0; *col=0; for(i=0;i<n;i++) for(j=0;j<4;j++) if(max<a[i][j]) { max=a[i][j]; *row=i; *col
60、=j; } return(max);},實(shí)參與形參的小結(jié),6.3.5 函數(shù)的嵌套與遞歸調(diào)用,C規(guī)定:函數(shù)定義不可嵌套,但可以嵌套調(diào)用函數(shù),1、函數(shù)的嵌套調(diào)用,嵌套調(diào)用:在調(diào)用一個(gè)函數(shù)的過程中又調(diào)用了另外一個(gè)函數(shù),叫作函數(shù)的嵌套調(diào)用。嵌套調(diào)用的執(zhí)行過程:從什么地方調(diào)用函數(shù),就返回到什么地方。,6.3 函數(shù)調(diào)用與參數(shù)傳遞,函數(shù)的嵌套調(diào)用,main( )函數(shù),. . .
61、 .調(diào)用函數(shù)a,a( )函數(shù),. . . .調(diào)用函數(shù)b,b( )函數(shù),結(jié)束,,,,,【例】計(jì)算三個(gè)數(shù)中最大數(shù)與最小數(shù)的差。,#include int dif (int x, int y, int z); int max (int x, int y, int z); int min (int x, int y, int z);void main ( ){
62、 int a, b, c, d; scanf ("%d%d%d", &a, &b, &c); d = dif (a, b, c); printf ("Max - Min = %d\n", d);},int dif (int x, int y, int z) { return (max(x, y, z) –
63、 min(x, y, z)); }int max (int x, int y, int z) { int r; r = x > y ? x : y; return (r > z ? r : z); }int min (int x, int y, int z) { int r; r = x < y ? x : y; return
64、 (r < z ? r : z); },main( ),調(diào)用函數(shù)dif,輸出結(jié)束,dif函數(shù),max函數(shù),調(diào)用函數(shù)max,,,,,,調(diào)用函數(shù)min,,,,,,,min函數(shù),,,6.3 函數(shù)調(diào)用與參數(shù)傳遞,例6-11 編寫一個(gè)小學(xué)四則運(yùn)算練習(xí)程序,程序可根據(jù)用戶的選擇隨機(jī)生成加、減、乘、除練習(xí)題目,并分析運(yùn)算結(jié)果是否正確。 程序代碼如下:#include #include #include void exam(in
65、t n);void add(void);void sub(void);void mul(void);void division(void);,6.3 函數(shù)調(diào)用與參數(shù)傳遞,void main(){ int n; while(1) { printf("********\n"); printf("*1-ADD *\n"); printf(
66、"*2-SUB *\n"); printf("*3-MUL *\n"); printf("*4-DIV *\n"); printf("*0-EXIT*\n"); printf("********\n"); printf("Please select
67、0-4:"); scanf("%d",&n); if(n4)printf("Invalid number!\n"); else if(n==0)break; else exam(n); }},6.3 函數(shù)調(diào)用與參數(shù)傳遞,void exam(int n){ switch(n) {
68、 case 1:add(); break; case 2:sub(); break; case 3:mul(); break; case 4:division(); }},6.3 函數(shù)調(diào)用與參數(shù)傳遞,void add(void)//求兩隨機(jī)整數(shù)之和{ int x,y,z,result; srand(time(NULL));//初始化系統(tǒng)隨機(jī)數(shù)發(fā)生器 x=
69、rand()%100;//產(chǎn)生0~99的隨機(jī)整數(shù) y=rand()%100; z=x+y; printf("%d+%d=",x,y); scanf("%d",&result); if(result==z)printf("OK\n"); else printf("Sorry\n%d+%d=%d\n"
70、,x,y,z);},6.3 函數(shù)調(diào)用與參數(shù)傳遞,void sub(void)//求兩隨機(jī)整數(shù)之差{ int x,y,z,result; srand(time(NULL)); x=rand()%100; y=rand()%100; z=x-y; printf("%d-%d=",x,y); scanf("%d",&result
71、); if(result==z)printf("OK\n"); else printf("Sorry\n%d-%d=%d\n",x,y,z);},6.3 函數(shù)調(diào)用與參數(shù)傳遞,void mul(void)//求兩隨機(jī)整數(shù)之乘積{ int x,y,z,result; srand(time(NULL)); x=rand()%100; y=ran
72、d()%100; z=x*y; printf("%d*%d=",x,y); scanf("%d",&result); if(result==z)printf("OK\n"); else printf("Sorry\n%d*%d=%d\n",x,y,z);},6.3 函數(shù)調(diào)用與參數(shù)傳遞,void divisio
73、n(void)//求兩隨機(jī)整數(shù)之商{ int x,y,z,result; srand(time(NULL)); do//產(chǎn)生兩隨機(jī)整數(shù)使得x能被y整除 { x=rand()%100; y=rand()%100; }while(x%y!=0||y==0); z=x/y; printf("%d/%d=",x,y); scan
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
評論
0/150
提交評論