第七章 庫函數(shù)函數(shù)的定義與返回值_第1頁
第七章 庫函數(shù)函數(shù)的定義與返回值_第2頁
第七章 庫函數(shù)函數(shù)的定義與返回值_第3頁
第七章 庫函數(shù)函數(shù)的定義與返回值_第4頁
第七章 庫函數(shù)函數(shù)的定義與返回值_第5頁
已閱讀5頁,還剩56頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第七章庫函數(shù)函數(shù)的定義與返回值第1頁,課件共61頁,創(chuàng)作于2023年2月第七章函數(shù)在解決一個比較復(fù)雜的實際問題時,不可能把所有要完成的任務(wù)全都寫在main函數(shù)中。這時,程序往往由一個main函數(shù)和若干個其它函數(shù)組成,每個函數(shù)各自完成相對獨立的部分功能。在前面的章節(jié)中,我們編寫的程序都是由一個main函數(shù)來組成,在main函數(shù)中調(diào)用過scanf、printf等系統(tǒng)函數(shù)。模塊化的程序設(shè)計方法第2頁,課件共61頁,創(chuàng)作于2023年2月函數(shù)間相互調(diào)用的示意

main()f1()f11(){{{┇┇┇f1();f11();}┇┇

f12()f2();f12();

{┇┇

┇}}

}f2()f21(){{┇┇f21();}┇}第3頁,課件共61頁,創(chuàng)作于2023年2月函數(shù)的分類從函數(shù)形式無參函數(shù)有參函數(shù)

?我們學(xué)習(xí)過哪些無參函數(shù)和有參函數(shù)?從用戶角度標(biāo)準(zhǔn)函數(shù)(庫函數(shù)):由系統(tǒng)提供用戶自定義函數(shù)第4頁,課件共61頁,創(chuàng)作于2023年2月庫函數(shù)由系統(tǒng)提供,用戶只要按照要求的格式正確調(diào)用即可。不同的C編譯系統(tǒng)提供的庫函數(shù)有些不同。

§7.1庫函數(shù)使用庫函數(shù)應(yīng)注意的問題:1、調(diào)用庫函數(shù)時要用#include命令將相關(guān)的頭文件包含進(jìn)來。如:調(diào)用數(shù)學(xué)函數(shù),用#include"math.h"

|<math.h>調(diào)用輸入輸出函數(shù),用#include"stdio.h"

|<stdio.h>

調(diào)用字符函數(shù),用#include"

ctype.h"

|<ctype.h>

2、庫函數(shù)調(diào)用的一般形式:

函數(shù)名(參數(shù)表)要注意函數(shù)的功能、參數(shù)的個數(shù)與類型、函數(shù)值的類型。如:求平方根的函數(shù)sqrt的形式是:doublesqrt(doublex)第5頁,課件共61頁,創(chuàng)作于2023年2月3、庫函數(shù)調(diào)用以兩種方式出現(xiàn)。其一:出現(xiàn)在表達(dá)式中,即作為表達(dá)式的一部分參與運算。如:計算y=x2.5+1.3,則通過以下語句調(diào)用來實現(xiàn)。

y=pow(x,2.5)+1.3;其二:獨立的語句,即調(diào)用函數(shù)后加一分號。 如:printf("*****\n");4、調(diào)用庫函數(shù)時,要注意參數(shù)的一些特殊要求。如三角函數(shù)要求自變量參數(shù)用弧度表示,開平方函數(shù)要求自變量參數(shù)的值大于或等于0。使用庫函數(shù)應(yīng)注意的問題(續(xù))第6頁,課件共61頁,創(chuàng)作于2023年2月函數(shù)返回值的類型缺省int型無返回值:void函數(shù)體函數(shù)類型函數(shù)名(形參類型說明表)

{說明部分執(zhí)行部分

}§7.2函數(shù)的定義和返回值1.函數(shù)定義的一般格式現(xiàn)代風(fēng)格:多個形參說明之間要用逗號隔開沒有形參時,這一對括號不能省略合法標(biāo)識符如果函數(shù)的類型不是void,函數(shù)體最后要用return語句去返回一個值.第7頁,課件共61頁,創(chuàng)作于2023年2月例1有參函數(shù)(現(xiàn)代風(fēng)格)intmax(intx,inty){intz;z=x>y?x:y;return(z);}例2有參函數(shù)(現(xiàn)代風(fēng)格)intmax(intx,y){intz;z=x>y?x:y;return(z);}例3無參函數(shù)

voidprintstar(){printf("**********\n");}或

voidprintstar(void){printf("**********\n");}函數(shù)的定義示例例4空函數(shù)

voiddummy(void){

}函數(shù)體為空(留待以后補充)第8頁,課件共61頁,創(chuàng)作于2023年2月intmax2(intx,inty)/*現(xiàn)代風(fēng)格*/{intmax;if(x>y)max=x;elsemax=y;printf("max(max2)=%d\n",max);return(max);}voidmain(){inta,b,max;scanf("%d,%d",&a,&b);

max=max2(a,b)+100;printf("max(main)=%d\n",max);}例函數(shù)的定義

形參和函數(shù)體中定義的變量只在函數(shù)被調(diào)用時才臨時分配存儲單元,當(dāng)退出函數(shù)時,這些存儲單元全部被釋放(稱為局部性,因而與其它函數(shù)中的變量同名不會引起混淆)。

main()時,main函數(shù)是什么類型的?可改寫為max=x>y?x:y;形參實參第9頁,課件共61頁,創(chuàng)作于2023年2月函數(shù)與函數(shù)之間是平等的voidmain(){intmax2(intx,inty){intz;if(x>y)z=x;elsez=y;return(z);}inta,b,max;scanf("%d,%d",&a,&b);max=max2(a,b);printf("max=%d\n",max);}

函數(shù)的定義是平行的,不能在一個函數(shù)的內(nèi)部再定義其它函數(shù)。即每個函數(shù)都是一個相對獨立的模塊,不能在寫某一個函數(shù)時又包含了另一個函數(shù)的定義(main函數(shù)的執(zhí)行時有一點點小的特權(quán)?。?。

第10頁,課件共61頁,創(chuàng)作于2023年2月返回語句形式return(表達(dá)式);或return表達(dá)式;或return;功能:使程序控制從被調(diào)用函數(shù)返回到調(diào)用函數(shù)中,同時把返值帶給調(diào)用函數(shù)說明:函數(shù)中可以有多個return語句,但只有其中的一個return語句能夠得到執(zhí)行若函數(shù)中沒有return語句,或者是一個不帶表達(dá)式的return語句,則該函數(shù)結(jié)束時自動返回調(diào)用函數(shù)一個不確定的值若函數(shù)類型與return語句中表達(dá)式值的類型不一致,按前者為準(zhǔn),自動轉(zhuǎn)換------函數(shù)調(diào)用轉(zhuǎn)換void型函數(shù):明確說明函數(shù)沒有返回值2.函數(shù)的返回值第11頁,課件共61頁,創(chuàng)作于2023年2月intmax(floatx,floaty){floatz;z=x>y?x:y;

return(z);}main(){floata,b;scanf("%f,%f",&a,&b);printf("Maxis%d\n",max(a,b));}例函數(shù)返回值類型轉(zhuǎn)換第12頁,課件共61頁,創(chuàng)作于2023年2月main(){inta,b,max;scanf("%d,%d",&a,&b);max=max2(a,b);printf("max=%d\n",max);}intmax2(intx,inty){intz;if(x>y)

returnx;else

returny;}例函數(shù)可以有多個return語句注意:在C語言中,函數(shù)名不能被賦值,只能通過return語句返回一個值。

intmax2(intx,inty){max2=x>y?x:y;}第13頁,課件共61頁,創(chuàng)作于2023年2月printstar(){printf("*********\n");}main(){inta;a=printstar();printf("a=%d\n",a);}輸出:a=10例函數(shù)帶回不確定值printstar()是什么類型?第14頁,課件共61頁,創(chuàng)作于2023年2月void型函數(shù):明確說明函數(shù)沒有返回值#include<stdio.h>/*void*/printstar(){printf("*****@@@##****\n");}main(){inta;a=printstar(); a=printstar();printf("a=%d\n",a);}第15頁,課件共61頁,創(chuàng)作于2023年2月voidprintstar(){printf("*********\n");}main(){inta;a=printstar();printf("a=%d",a);}編譯錯誤?。╒C++)errorC2120:'void'illegalwithalltypes第16頁,課件共61頁,創(chuàng)作于2023年2月第17頁,課件共61頁,創(chuàng)作于2023年2月說明:(1)調(diào)用函數(shù)時,其名字必須與定義的名字相同。

(2)函數(shù)調(diào)用時的實參只寫名字不需要在名字前再帶實參類型。

如上面main函數(shù)中對max2函數(shù)的調(diào)用不能寫成:max=max2(inta,intb);

§

7.3函數(shù)的調(diào)用

1.函數(shù)調(diào)用的一般形式:函數(shù)名(實參表);第18頁,課件共61頁,創(chuàng)作于2023年2月說明:(3)實參與形參,個數(shù)應(yīng)一致。若實參少,則必有形參未得到值(不確定值),影響結(jié)果。若實參多,則多余的無效(TC)。如:c=max2(3);則c的值為:761(隨機值)若:c=max2(3,5,8);則c的值為:5(4)實參與形參的類型應(yīng)一一對應(yīng)相匹配。若不匹配,程序仍能運行,但得不出正確結(jié)果(TC)。如:c=max(3.0,5.0);則c的值為:0若:c=max(3L,5L);則c的值為:3第19頁,課件共61頁,創(chuàng)作于2023年2月函數(shù)調(diào)用說明(續(xù))(5)函數(shù)必須先定義,后調(diào)用。將要被調(diào)用的函數(shù)定義在前,調(diào)用在后。返回值類型為int或char的函數(shù)可例外。(6)函數(shù)可直接或間接地自己調(diào)用自己(遞歸調(diào)用,在7.6節(jié)介紹)第20頁,課件共61頁,創(chuàng)作于2023年2月函數(shù)調(diào)用說明(續(xù))(7)實參表求值順序,因系統(tǒng)而定(TurboC自右向左)#include"stdio.h"voidmain(){intp=2;printf("%d,%d,%d\n",p,++p,p);}/*TC:3,3,2VC:3,3,2*/#include"stdio.h"voidmain(){intp=2;printf("%d,%d,%d\n",p,p++,p);}/*TC:3,2,2VC:2,2,2*/P19第21頁,課件共61頁,創(chuàng)作于2023年2月2.函數(shù)調(diào)用的方式1.函數(shù)表達(dá)式:例m=max(a,b)*2;2.函數(shù)語句:

例printstar();printf("Hello,World!\n");3.函數(shù)參數(shù):例printf("%d",max(a,b));m=max(a,max(b,c));第22頁,課件共61頁,創(chuàng)作于2023年2月§

7.4函數(shù)的說明

在C語言中,除了主函數(shù)外,對于用戶定義的函數(shù)要遵循“先定義,后使用”的規(guī)則。凡是未在調(diào)用之前定義的函數(shù),C編譯程序默認(rèn)函數(shù)的返回值為int類型。對于返回值為其它類型的函數(shù),若把函數(shù)的定義放在調(diào)用之后,應(yīng)該在調(diào)用之前對函數(shù)進(jìn)行說明(或稱為函數(shù)原型說明)。第23頁,課件共61頁,創(chuàng)作于2023年2月C語言對被調(diào)用函數(shù)要求:必須是已存在的函數(shù)庫函數(shù):#include<*.h>用戶自定義函數(shù):函數(shù)類型說明第24頁,課件共61頁,創(chuàng)作于2023年2月1.函數(shù)說明一般形式

函數(shù)類型函數(shù)名(形參類型[形參名],…..);函數(shù)類型函數(shù)名();或main(){floata,b,c;

floatmax2(floatx,floaty);/*函數(shù)的說明*/scanf("%f%f",&a,&b); c=max2(a,b);

/*函數(shù)的調(diào)用*/

printf("%f\n",c);}floatmax2(floatx,floaty)/*以下為函數(shù)的定義*/{floatz;if(x>y)z=x; else z=y;return(y);}例如:函數(shù)說明語句作用:告訴編譯系統(tǒng)max2函數(shù)是float類型的、有2個float類型的參數(shù)??蛇x在VC中不允許第25頁,課件共61頁,創(chuàng)作于2023年2月說明(1)函數(shù)說明可以是一個獨立的語句;如上面例子中就是采用獨立語句的形式。(2)函數(shù)說明中的形參名是一種虛設(shè),它們可以是任意的用戶標(biāo)識符,既不必與函數(shù)首部中的形參名一致,又可以與程序中的任意用戶標(biāo)識符同名。因此,參數(shù)名也可以省略。如上面的例子中函數(shù)說明可寫成:floatmax2(float,float);

第26頁,課件共61頁,創(chuàng)作于2023年2月(3)注意函數(shù)定義與函數(shù)說明是不同的,定義是寫出函數(shù)的完整形式,而說明是告訴系統(tǒng)此函數(shù)的返回值類型、參數(shù)的個數(shù)與類型,便于編譯時進(jìn)行有效的類型檢查。第27頁,課件共61頁,創(chuàng)作于2023年2月(4)若函數(shù)的返回值類型為int或char,則可以不進(jìn)行函數(shù)說明(系統(tǒng)默認(rèn))。但是使用這種方法時,系統(tǒng)無法對參數(shù)的類型做檢查。若調(diào)用函數(shù)時參數(shù)使用不當(dāng),在編譯時也不會報錯。因此,為了程序清晰和安全,建議都進(jìn)行說明為好。

第28頁,課件共61頁,創(chuàng)作于2023年2月(5)若被調(diào)函數(shù)的定義出現(xiàn)在主調(diào)函數(shù)之前,也可以不進(jìn)行函數(shù)說明。(6)有些系統(tǒng)(如BorlandC++、VC++等)要求一定要用函數(shù)說明指出函數(shù)類型和形參類型,并且對void和int型函數(shù)也要進(jìn)行函數(shù)說明。第29頁,課件共61頁,創(chuàng)作于2023年2月main(){inta,b,c;

scanf(“%f%f”,&a,&b); c=max2(a,b);

/*函數(shù)的調(diào)用*/

printf(“%f\n”,c);}intmax2(intx,inty)/*以下為函數(shù)的定義*/{intz;if(x>y)z=x; else z=y;return(z);/*書錯為return(y)*/}int型函數(shù)可不作函數(shù)說明(BorlandC++不行)floatmax2(floatx,floaty)/*以下為函數(shù)的定義*/{floatz;if(x>y)z=x; else z=y;return(z);/*書錯為return(y)*/}main(){floata,b,c;

scanf(“%f%f”,&a,&b); c=max2(a,b);

/*函數(shù)的調(diào)用*/

printf(“%f\n”,c);}被調(diào)函數(shù)出現(xiàn)在主調(diào)函數(shù)之前,不必函數(shù)說明main(){floatadd(float,float);/*functiondeclaration*/floata,b,c;scanf("%f,%f",&a,&b);c=add(a,b);printf("sumis%f",c);}floatadd(floatx,floaty){floatz;z=x+y;return(z);}也可寫成:floatadd();例函數(shù)說明舉例第30頁,課件共61頁,創(chuàng)作于2023年2月2.函數(shù)說明的位置

(1)放在調(diào)用函數(shù)的說明部分(只有此調(diào)用函數(shù)能識別被調(diào)用函數(shù))。可以是獨立語句,也可與其它變量的定義放在同一個語句中。如上面的用法也可以如下形式的語句:floata,b,c,max2(float,float);(2)放在所有函數(shù)的外部,被調(diào)用之前。(此時函數(shù)說明的后面所有位置上都可對該函數(shù)進(jìn)行調(diào)用)。第31頁,課件共61頁,創(chuàng)作于2023年2月floatmax2(float,float);main(){floata,b,c;scanf(“%f%f”,&a,&b);c=max2(a,b);printf(“%f”,c);}floatmax2(floatx,floaty){……}函數(shù)說明放在所有函數(shù)的外部例函數(shù)說明舉例(3)調(diào)用庫函數(shù)時,要在程序的開頭使用命令:#include<*.h>

來包含相關(guān)的頭文件,就是因為頭文件中包含了這些庫函數(shù)的原型說明。第32頁,課件共61頁,創(chuàng)作于2023年2月形參與實參的概念形式參數(shù):定義函數(shù)時函數(shù)名后面括號中的變量名實際參數(shù):調(diào)用函數(shù)時函數(shù)名后面括號中的表達(dá)式§7.5調(diào)用函數(shù)和被調(diào)用函數(shù)之間的數(shù)據(jù)傳遞

intmax2(intx,inty){intz;z=(x>y)?x,y;return(z);}main(){inta,b,c;

a=30,b=58; c=max2(a,b);c=max2(a+5,100);printf(“%f\n”,c);}例如:形參:x,y形參必須指定類型;實參:a,b實參:

a+5,100第33頁,課件共61頁,創(chuàng)作于2023年2月(1)實參表達(dá)式也可以是變量或常量,但必須有確定的值;(2)要求形參與實參類型一致,個數(shù)相同(多:略/少:隨機值);(4)形參在函數(shù)被調(diào)用前不占內(nèi)存;函數(shù)調(diào)用時為形參分配內(nèi)存;調(diào)用結(jié)束,內(nèi)存釋放;(5)C語言的參數(shù)傳遞方式

值傳遞方式:函數(shù)調(diào)用時,系統(tǒng)臨時為被調(diào)函數(shù)的形參分配存貯單元,并將實參的值復(fù)制到形參中;當(dāng)被調(diào)函數(shù)結(jié)束時,形參單元被釋放,實參單元仍保留并維持原值。特點:單向的值傳遞(數(shù)值或地址值)。有關(guān)參數(shù)傳遞的幾點說明第34頁,課件共61頁,創(chuàng)作于2023年2月xaproduct××××1.21.21.7281.變量作為參數(shù)(單向的數(shù)值傳遞)#include<stdio.h>floatcube(floatx){return(x*x*x);}voidmain(){floata,product;printf("Pleaseinputvalueofa:");scanf("%f",&a);product=cube(a);printf(”Cubeof%.4fis%.4f\n",a,product);}例計算x的立方Cube[kju:b]n.立方體,立方第35頁,課件共61頁,創(chuàng)作于2023年2月main(){voidswap(int,int);intx=10,y=20;printf(“(1)x=%dy=%d\n”,x,y);swap(x,y);printf(“(4)x=%dy=%d\n”,x,y);}voidswap(inta,intb){intt;printf(“(2)a=%db=%d\n”,a,b);t=a;a=b;b=t;printf(“(3)a=%db=%d\n”,a,b);}例7.1函數(shù)參數(shù)之間的單向傳遞1020x:y:調(diào)用前:調(diào)用結(jié)束:1020x:y:調(diào)用:1020a:b:1020x:y:swap:1020x:y:2010a:b:t:程序運行結(jié)果為:(1)x=10y=20(2)a=10b=20(3)a=20b=10(4)x=10y=20第36頁,課件共61頁,創(chuàng)作于2023年2月main(){voidex(intz,inty,intx);intx=10,y=20,z=30;printf(“(1)x=%dy=%dz=%d\n”,x,y,z);ex(y,z,x);}voidex(intx,inty,intz){printf(“(2)x=%dy=%dz=%d\n”,x,y,z);}例7.2實參向形參按位置傳遞數(shù)據(jù)程序運行結(jié)果為:(1)x=10y=20z=30(2)x=20y=30z=10實參:3010y:z:3010z:x:形參:20x:20y:函數(shù)說明語句形參名是一種虛設(shè)函數(shù)調(diào)用語句確定實參順序函數(shù)定義確定形參順序?qū)崊⑾蛐螀次恢脗鬟f數(shù)據(jù)第37頁,課件共61頁,創(chuàng)作于2023年2月#include<stdio.h>

longsum(inta,intb);longfactorial(intn);voidmain(){intn1,n2;longa;scanf("%d,%d",&n1,&n2);a=sum(n1,n2);printf("a=%1d",a);}longsum(inta,intb){longc1,c2;c1=factorial(a);c2=factorial(b);

return(c1+c2);}longfactorial(intn){longrtn=1;inti;for(i=1;i<=n;i++)rtn*=i;

return(rtn);}文件包含編譯預(yù)處理命令函數(shù)說明函數(shù)調(diào)用函數(shù)調(diào)用函數(shù)返回值補充例題longsum(inta,intb);longfactorial(intn);形參實參函數(shù)定義第38頁,課件共61頁,創(chuàng)作于2023年2月

當(dāng)數(shù)組名作為函數(shù)參數(shù)時,要求實參和形參都用數(shù)組名(或指針變量,第十章作介紹)。由于數(shù)組名的值就是數(shù)組在內(nèi)存中分配的存儲空間的首地址,這種方法稱之為“傳址調(diào)用”方式。當(dāng)把實參數(shù)組名的值(首地址)傳給形參數(shù)組名后,由于形參數(shù)組名也代表首地址,這樣實參數(shù)組和形參數(shù)組的首地址相同,即實參數(shù)組和形參數(shù)組占用相同的存儲空間。在被調(diào)函數(shù)中,形參數(shù)組中各元素的值如果發(fā)生變化,就會使實參數(shù)組元素的值同時也發(fā)生變化。在函數(shù)調(diào)用結(jié)束后,雖然形參數(shù)組已不復(fù)存在,但實參數(shù)組元素的值已發(fā)生變化,可以在主調(diào)函數(shù)中進(jìn)行使用。2.數(shù)組名作為參數(shù)

(單向的地址值傳遞)第39頁,課件共61頁,創(chuàng)作于2023年2月例7.3選擇法排序?qū)個數(shù)排序的算法步驟如下:(1)在N個數(shù)中尋找最小值,然后把這個最小值與最前面的那個數(shù)交換位置。i=0;/*最前面的那個數(shù)下標(biāo)*/k=i;/*k為當(dāng)前最小值的下標(biāo)*/for(j=i+1;j<N;j++)if(a[j]<a[k])k=j;t=a[k];a[k]=a[i];a[i]=t;

程序為:

(2)排除最前面的那個數(shù)(i=i+1),在余下的N-1個數(shù)中尋找最小值,然后把這個最小值與最前面的那個數(shù)交換位置。

……如此循環(huán),直到最后只剩一個數(shù)(i=N-1)時結(jié)束。第40頁,課件共61頁,創(chuàng)作于2023年2月對10個數(shù)排序的算法步驟演示如下:28478352738615668下標(biāo):0123456789第一步:i=0,k=5:a[0]a[5]24783528738615668第二步:i=1,k=1:a[1]a[1]?24783528738615668第三步:i=2,k=6:a[2]a[6]24788287335615668第四步:i=3,k=5:a[3]a[5]22888477335615668第五步:i=4,k=6:a[4]a[6]22888473573615668第六步:i=5,k=5:不交換!第七步:i=6,k=7:a[6]a[7]22888473556617368第41頁,課件共61頁,創(chuàng)作于2023年2月對10個數(shù)排序的算法步驟演示如下:28478352738615668下標(biāo):0123456789第七步:i=6,k=7:a[6]a[7]22888473556617368總結(jié):10個數(shù)排序,需要進(jìn)行九次的上述操作。若有N個數(shù)需要排序,則需要進(jìn)行N-1次的上述操作。第九步:i=8,k=9:a[8]a[9]22888473556686173第八步:i=7,k=8:a[7]a[8]22888473556736168第42頁,課件共61頁,創(chuàng)作于2023年2月10個數(shù)排序的完整程序如下:voidsort(inta[10]){inti,j,k,t;for(i=0;i<9;i++)

{k=i;for(j=i+1;j<10;j++)if(a[j]<a[k])

k=j;t=a[k];a[k]=a[i];a[i]=t;

}}main(){inti,x[10]={5,7,4,2,8,6,1,9,0,3};printf("theoriginalarray:\n");for(i=0;i<10;i++)printf("%d",a[i]);printf("\n");

sort(x);printf("thesortedarray:\n");for(i=0;i<10;i++)printf("%d",a[i]);printf("\n");}程序運行結(jié)果為:theoriginalarray:5742861903thesortedarray:0123456789voidsort(inta[],intn)for(i=0;i<n-1;i++)sort(x,10);N個數(shù)排序的完整程序如下:n第43頁,課件共61頁,創(chuàng)作于2023年2月例7.4將一個數(shù)組中的n個數(shù)據(jù)按顛倒的順序重新存放解題思路為:借助于一個臨時變量,將a[0]與a[n-1]對換,再將a[1]與a[n-2]對換,……,直到將a[(n-1)/2-1]與a[n-int((n-1)/2)-1]對換。程序采用循環(huán)來實現(xiàn),設(shè)二個“位置指針變量”i和j,i的初值為0,j的初值為n-1,將a[i]與a[j]交換,然后使i的值加1,j的值減1,再將a[i]與a[j]交換,直到i=m為止。m=(n-1)/2為“中間位置”。見圖7.2所示。102030405060708090100i=0j=n-1100203040506070809010i=1j=n-2m=(n-1)/2第44頁,課件共61頁,創(chuàng)作于2023年2月數(shù)組逆序程序voidinv(intx[],intn){intt,i,j,m=(n-1)/2;for(i=0;i<=m;i++){j=n-1-i;t=x[i];x[i]=x[j];x[j]=t;}}main(){inti,a[10]={10,20,~,90,100};printf("Theoriginalarray:\n");for(i=0;i<10;i++)printf("%d",a[i]);printf("\n");

inv(a,10);printf("Thearrayhasbeeninverted:\n");for(i=0;i<10;i++)printf("%d",a[i]);printf("\n");}程序運行結(jié)果為:Theoriginalarray:102030405060708090100Thearrayhasbeeninverted:100908070605040302010voidinv(intx[],intn){intt,i,j=n-1;for(i=0;i<j;i++,j--){t=x[i];x[i]=x[j];x[j]=t;}}第45頁,課件共61頁,創(chuàng)作于2023年2月例7.5求二維數(shù)組每行元素的平均值

voidlineave(intx[][4],floaty[],intn){inti,j,s;for(i=0;i<n;i++){s=0;for(j=0;j<4;j++)s=s+x[i][j];

y[i]=s/4.0;/*書印錯:b[i]=s/4.0*/}}main(){inta[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};inti,j;floatb[3];lineave(a,b,3);for(i=0;i<3;i++){for(j=0;j<4;j++)printf(“%4d”,a[i][j]);printf(“ave:%6.2d\n”,b[i]);}}程序運行結(jié)果為:1234ave:2.505678ave:6.509101112ave:10.50第46頁,課件共61頁,創(chuàng)作于2023年2月main()調(diào)用函數(shù)a結(jié)束a函數(shù)b函數(shù)調(diào)用函數(shù)b

1.嵌套調(diào)用C規(guī)定:函數(shù)定義不可嵌套,但可以嵌套調(diào)用函數(shù)7.6函數(shù)的嵌套與遞歸調(diào)用第47頁,課件共61頁,創(chuàng)作于2023年2月#include<stdio.h>

intdif(intx,inty,intz);intmax(intx,inty,intz);intmin(intx,inty,intz);voidmain(){inta,b,c,d;scanf("%d%d%d",&a,&b,&c);

d=dif(a,b,c);printf("Max-Min=%d\n",d);}intdif(intx,inty,intz){returnmax(x,y,z)-min(x,y,z);}intmax(intx,inty,intz){intr;r=x>y?x:y;return(r>z?r:z);}intmin(intx,inty,intz){intr;r=x<y?x:y;return(r<z?r:z);}main()調(diào)用函數(shù)dif輸出結(jié)束dif函數(shù)max函數(shù)調(diào)用函數(shù)max調(diào)用函數(shù)minmin函數(shù)例求三個數(shù)中最大數(shù)和最小數(shù)的差值第48頁,課件共61頁,創(chuàng)作于2023年2月例用弦截法求方程根xyf(x)0x1x2xf(x1)f(x2)第49頁,課件共61頁,創(chuàng)作于2023年2月求兩點連線與x軸的交點x輸入x1,x2,求f(x1),f(x2)直到f(x1)與f(x2)異號y=f(x),y1=f(x1)y與y1同號真假x1=xy1=yx2=x直到|y|<

root=x輸出rootroot函數(shù)運行情況:Inputx1,x2:2,6

Arootofequationis5.0000main()調(diào)用函數(shù)root輸出根x結(jié)束root函數(shù)xpoint函數(shù)調(diào)用函數(shù)xpoint調(diào)用函數(shù)ff函數(shù)函數(shù)的嵌套舉例第50頁,課件共61頁,創(chuàng)作于2023年2月2.遞歸調(diào)用定義:函數(shù)直接或間接的調(diào)用自身叫函數(shù)的遞歸調(diào)用f()調(diào)f調(diào)f2調(diào)f1f1()f2()說明C編譯系統(tǒng)對遞歸函數(shù)的自調(diào)用次數(shù)沒有限制每調(diào)用函數(shù)一次,在內(nèi)存堆棧區(qū)分配空間,用于存放函數(shù)變量、返回值等信息,所以遞歸次數(shù)過多,可能引起堆棧溢出intf(intx){inty,z;……

z=f(y);…….return(2*z);}intf1(intx){inty,z;……

z=f2(y);…….return(2*z);}intf2(intt){inta,c;……

c=f1(a);…….return(3+c);}第51頁,課件共61頁,創(chuàng)作于2023年2月#include<stdio.h>intfac(intn){intf;if(n==0||n==1)f=1;elsef=fac(n-1)*n;return(f);}main(){intn,y;printf("Inputaintegernumber:");scanf("%d",&n);

y=fac(n);printf("%d!=%15d",n,y);}intfac(intn)/*更完善的階乘函數(shù)*/{intf;

if(n<0){printf("n<0,dataerror!");return(-1);}if(n==0||n==1)f=1;elsef=fac(n-1)*n;return(f);}遞歸方法的要點:1.

遞推公式

fn=fn-1*n2.

結(jié)束條件。

n==0||n==1例7.6用遞歸的方法求n的階乘第52頁,課件共61頁,創(chuàng)作于2023年2月#include<stdio.h>intfib(intn){intf;if(n==1||n==2)f=1;elsef=fib(n-2)+fib(n-1);return(f);}main(){intn,s;printf("Inputaintegernumber:");scanf("%d",&n);

s=fib(n);printf("fib(%d)=%15d",n,y);}遞歸方法的要點:1.

遞推公式

fn=fn-2+fn-12.

結(jié)束條件。

n==1||n==2例7.7用遞歸實現(xiàn)斐波那契數(shù)列

第53頁,課件共61頁,創(chuàng)作于2023年2月#include"math.h"intisprime(int);main(){intx;scanf("%d",&x);if(isprime(x))printf("%disprime\n",x);elseprintf("%disnotprime\n",x);}isprime(intn){inti;for(i=2;i<=sqrt(n);i++)if(n%i==0) return0;return1;}編寫函數(shù)isprime(intn)用來判斷自變量n是否為素數(shù),若是,函數(shù)返回1,否則返回0。isprime(intn){inti,flag=1;for(i=2;i<=sqrt(n);i++)if(n%i==0){flag=0;break;}return(flag);}isprime(intn){inti,flag=1;for(i=2;i<=sqrt(n)&&

flag==1;i++)if(n%i==0)flag=0;return(flag);}7.7函數(shù)程序舉例例7.8

第54頁,課件共61頁,創(chuàng)作于2023年2月#include"math.h"intisprime(int);

voideven(int);main(){inta;printf("Enteraevennumber:");scanf("%d",&a);if(a%2==0)even(a);elseprintf("The%disn’tevennumber\n",a);}voideven(intx){inti;

for(i=2;i<=x/2;i++)if(isprime(i))if(isprime(x-i)) {printf("%d=%d+%d\n",x,i,x-i);return;}}isprime(intn){……}例7.9編寫函數(shù),驗證任意偶數(shù)為兩個素數(shù)之和并輸出這兩個素數(shù)。

程序運行結(jié)果為:Enteraevennumber:10<CR>10=3+7break;第55頁,課件共61頁,創(chuàng)作于2023年2月例7.10利用梯形法求定積分

xy0abf(a)f(b)a+hf(a+h)hh第56頁,課件共61頁,創(chuàng)作于2023年2月利用梯形法求定積分doubleinteg(doublea,doubleb){doubles,x,h,f(double);intn=100,i;h=fabs(b-a)/n;s=(f(a)+f(b))/2.0;for(i=1;i<=n-1;i++)

溫馨提示

  • 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

提交評論