版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
關(guān)于函數(shù)及其應(yīng)用1第一頁,共七十二頁,2022年,8月28日
10.1函數(shù)的基本概念一個較大的程序一般由若干個程序模塊(子程序)組成,每一個模塊(子程序)來完成一定的功能。在C語言中,子程序的作用是由函數(shù)來實(shí)現(xiàn)的。
一個C程序可由一個主函數(shù)和若干個函數(shù)構(gòu)成,由主函數(shù)調(diào)用其它函數(shù),其它函數(shù)也可互相調(diào)用。同一個函數(shù)可以被一個或多個函數(shù)調(diào)用任意多次。下圖是一個程序中函數(shù)調(diào)用的示意圖:第二頁,共七十二頁,2022年,8月28日main()A()B()C()D()E()F()G()E()H()H()H()G()函數(shù)調(diào)用示意圖:調(diào)用第三頁,共七十二頁,2022年,8月28日
(1).
一個源程序文件由一個或多個函數(shù)組成.一個源程序
文件是一個編譯單位,而不是以函數(shù)為單位進(jìn)行編譯.說明:(2).一個C程序可由一個或多個源程序文件組成.
這樣可以分別進(jìn)行編寫,編譯,調(diào)試.一個源文件可以為
多個C程序公用.(3).所有函數(shù)是平行的,一個函數(shù)并不從屬于另一個函
數(shù),函數(shù)可以相互調(diào)用,但不能調(diào)用main()函數(shù).第四頁,共七十二頁,2022年,8月28日(4).從使用角度來分,函數(shù)可分為:數(shù)學(xué)函數(shù)(#include"math.h")
字符函數(shù)(#include"ctype.h")
庫函數(shù)字符串函數(shù)(#include"string.h")
輸入輸出函數(shù)(#include"stdio.h")
動態(tài)存儲分配函數(shù)(#include"stdlib.h")
…..
自定義函數(shù):第五頁,共七十二頁,2022年,8月28日從函數(shù)的形式來分;
無參函數(shù):主調(diào)函數(shù)沒有數(shù)據(jù)傳給被調(diào)函數(shù)
有參函數(shù):主調(diào)函數(shù)可以將數(shù)據(jù)傳給被調(diào)函數(shù)空函數(shù):什么也不干,先占位置,以后擴(kuò)展功能第六頁,共七十二頁,2022年,8月28日一.函數(shù)定義的一般形式:(自定義函數(shù))
(1).無參函數(shù)的定義形式:
類型標(biāo)識符函數(shù)名(){函數(shù)體}
函數(shù)定義一律
不能加分號(;)!說明:
類型標(biāo)識符是指函數(shù)返回值的類型.
如果函數(shù)不要返回值,可寫上void.第七頁,共七十二頁,2022年,8月28日(2).有參函數(shù)定義:類型標(biāo)識符函數(shù)名(形式參數(shù)表列){聲明部分語句}形式參數(shù)例:intadd(intx,inty){intz;z=x+y;returnz;}注:
返回值z的類型(int)
應(yīng)與類型標(biāo)識符統(tǒng)一。第八頁,共七十二頁,2022年,8月28日1、函數(shù)參數(shù)與函數(shù)值;(1)形參與實(shí)參:例:main(){inta,b,c;
scanf(“%d,%d”,&a,&b);
c=max(a,b);printf(“maxis%d”,c);}intmax(intx,inty)
/*定義有參函數(shù)max*/{intz;z=x>y?x:y;return(z);}x,y為形參a,b為實(shí)參10.2函數(shù)的參數(shù)第九頁,共七十二頁,2022年,8月28日b.實(shí)參可以是常量、變量、或表達(dá)式,但要求有確定值.
如:
max(3,a+b);c.實(shí)參與形參的類型應(yīng)一致,一一對應(yīng)。說明:a.形參變量(上例中的x,y),在未調(diào)用時,并不占用存儲單元,當(dāng)進(jìn)行函數(shù)調(diào)用時,形參才分配內(nèi)存單元,調(diào)用結(jié)束后,形參就釋放掉。第十頁,共七十二頁,2022年,8月28日d.實(shí)參對形參的數(shù)據(jù)傳遞是單向傳值,只能是由實(shí)參傳給形參,而不能相反進(jìn)行。
實(shí)參、形參在內(nèi)存中,占據(jù)不同單元。
2
a
b32
x
3
y
即使形參單元中的值發(fā)生變化,也不會影響實(shí)參單元的值.
函數(shù)調(diào)用后,形參單元釋放掉,實(shí)參單元仍保留。第十一頁,共七十二頁,2022年,8月28日例10.9閱讀一下程序,寫出程序運(yùn)行結(jié)果#include<stdio.h>intswap(intx,inty){ inttemp; temp=x; x=y; y=temp; return0;}intmain(){ inta,b; scanf("%d%d",&a,&b);
swap(a,b); printf("%d,%d\n",a,b); return0;}Ch10_10_9.c
即使形參單元中的值發(fā)生變化,也不會影響實(shí)參單元的值.
兩變量進(jìn)行交換.第十二頁,共七十二頁,2022年,8月28日2.函數(shù)的返回值與return語句:
執(zhí)行C語言程序就是調(diào)用一個個函數(shù),函數(shù)被調(diào)用時,可以返回某一個值作為該函數(shù)的值(供主函數(shù)使用)。需要返回值時,在函數(shù)中返回的地方使用return語句:
return(表達(dá)式);
這里表達(dá)式的值就是函數(shù)的返回值。第十三頁,共七十二頁,2022年,8月28日說明:
a.return語句后面的括號可省去:
如:return(z);returnz;return后面可以是一個表達(dá)式.
第十四頁,共七十二頁,2022年,8月28日
b.當(dāng)函數(shù)不需要帶回返回值,C語言有二種方法處理:
①.使用不帶表達(dá)式的return語句,如:return;②.連return也不用,這是因?yàn)楹瘮?shù)末尾,隱含一個return
語句,當(dāng)遇到后面的大括號“}”,就把控制權(quán)交給主調(diào)
函數(shù)。第十五頁,共七十二頁,2022年,8月28日為了明確表示不帶回值,可用“void“定義。如:voidprintstar();這樣可以保證函數(shù)不帶回任何值.c.若函數(shù)不指定帶值返回,并不是不返回什么值,可能返回一個不定值。
因?yàn)椴豢紤]使用,即使返回是不定值,也無多大關(guān)系。
第十六頁,共七十二頁,2022年,8月28日#include<stdio.h>intadd(intx,inty){ intz; z=x+y; returnz;}intmain(){ inta,b,c; scanf("%d%d",&a,&b); c=add(a,b); printf("c=%d\n",c); return0;}例:10.1函數(shù)值傳遞的例子.(P149)函數(shù)在被調(diào)用前必須先定義或說明!Ch10_10_1.c第十七頁,共七十二頁,2022年,8月28日例:10.2
函數(shù)地址傳遞的例子.(P150)
輸入一個由數(shù)字組成的字符串,轉(zhuǎn)換成一個整數(shù).#include<stdio.h>intctoi(char*p){intsum=0;while(*p){sum=sum*10;sum=sum+(*p-'0');p++;
}returnsum;}intmain(){charstr[5];intx;
printf(“stringis:\n");scanf("%s",str);x=ctoi(str);
printf(“integeris%d\n",x);return0;}數(shù)組名作為函數(shù)的參數(shù)
Ch10_10_2.c*p-’0’
把一個字符數(shù)字轉(zhuǎn)成數(shù)字.第十八頁,共七十二頁,2022年,8月28日3、函數(shù)的調(diào)用:(1).函數(shù)調(diào)用的方式:有以下三種函數(shù)調(diào)用方式:a.函數(shù)語句:函數(shù)作為一條語句,不要求函數(shù)帶回值,完成一定的功能、操作。如:
printstar();b.函數(shù)表達(dá)式:函數(shù)調(diào)用出現(xiàn)在一個表達(dá)式中。如:
c=z*max(a,b);這時要求函數(shù)帶回一個確定的值,以參加運(yùn)算。第十九頁,共七十二頁,2022年,8月28日c.函數(shù)參數(shù):
如:printf(“%d”,max(a,b));max(a,b)作為printf函數(shù)的一個參數(shù)。
第二十頁,共七十二頁,2022年,8月28日10.3系統(tǒng)函數(shù)的應(yīng)用C語言提供了十分豐富的庫函數(shù).這些函數(shù)可分為:
1.數(shù)學(xué)函數(shù),如:
sin(),sqrt()函數(shù)等.它們的包含文件是:“math.h”.
2.字符串函數(shù),如:gets(),strcmp()函數(shù)等.它們的包含文件是:“string.h”.
3.輸入輸出函數(shù),它們的包含文件是:“stdio.h”.
第二十一頁,共七十二頁,2022年,8月28日10.3.1數(shù)學(xué)函數(shù)常用的數(shù)學(xué)函數(shù)有:
(1).sqrt():doublesqrt(doublex);計算;x應(yīng)>=0
(2).fabs():doublefabs(doublex);計算x的絕對值
x(3).pow():
doublepow(doublex,doubley);計算xy
的值
(4).exp():doubleexp(doublex);計算ex
的值第二十二頁,共七十二頁,2022年,8月28日例10.3
求z=xy+c
的值,在C語言中xy可調(diào)用系統(tǒng)函數(shù)
pow()函數(shù)來求得。#include<stdio.h>#include<math.h> //必須加入數(shù)學(xué)庫頭文件intmain(){ doublex,y,z,c; printf("Pleaseinputxyc\n");
scanf("%lf%lf%lf",&x,&y,&c);
z=pow(x,y)+c; printf("z=%lf\n",z); return0;}C++另一注解方法第二十三頁,共七十二頁,2022年,8月28日例10.4
利用循環(huán)的方法產(chǎn)生1~100間的10個隨機(jī)數(shù),并在屏幕上顯示.關(guān)于rand()隨機(jī)函數(shù):
rand()會返回一隨機(jī)數(shù)值,范圍在0至RAND_MAX間.
第二十四頁,共七十二頁,2022年,8月28日#include<stdio.h>#include<stdlib.h>voidmain(){printf("RAND_MAX=%ld\n",RAND_MAX);}說明:
RAND_MAX是一宏定義值.是系統(tǒng)最大的被rand()返回的值.
其值可用下列程序輸出:視系統(tǒng)不同而不同(32767).第二十五頁,共七十二頁,2022年,8月28日2.srand(seed)函數(shù):
srand()用來設(shè)置rand()產(chǎn)生隨機(jī)數(shù)時的隨機(jī)數(shù)種子。參數(shù)seed必須是個整數(shù),通??梢岳胻ime(0)的返回值來當(dāng)做seed.
如果每次seed都設(shè)相同值,rand()所產(chǎn)生的隨機(jī)數(shù)值每次就會一樣。
3.time()函數(shù)返回從1970年開始經(jīng)歷時間的秒數(shù)。第二十六頁,共七十二頁,2022年,8月28日例10.4
利用系統(tǒng)函數(shù)rand(),此函數(shù)產(chǎn)生1~100間的10個隨機(jī)數(shù),此函數(shù)在頭件stdlib.h進(jìn)行了聲明.#include<time.h>#include<stdio.h>#include<stdlib.h>intmain(){
inti,j;
srand(time(0));
for(i=0;i<10;i++) {
j=1+(int)(100.0*rand()/(RAND_MAX+1.0));
printf("%4d",j); }printf("\n"); return0;}初始化隨機(jī)數(shù)發(fā)生器ch10_4_1.c第二十七頁,共七十二頁,2022年,8月28日
在C語言提供的庫函數(shù)中,有豐富的關(guān)于字符串操作的函數(shù)。它們的頭文件有的是stdio.h,有的是string.h.
1.puts(字符數(shù)組名)(頭文件是stdio.h)
功能:將一個字符串輸出到終端。如:charstr[]=“China”;puts(str);
10.3.2字符串處理函數(shù)將輸出:China
注:只能輸出一個字符串,不能寫作:puts(str1,str2);第二十八頁,共七十二頁,2022年,8月28日2.gets(字符數(shù)組名):(頭文件為Stdio.h)
功能:從終端輸入一串字符到字符數(shù)組。如:charstr[10];gets(str);——輸入一串字符
gets()函數(shù)以回車結(jié)束輸入。3.其它常用的字符串操作函數(shù)有:
a.strcpy(s1,s2)功能:拷貝字符串s2到s1,s1必須寫成數(shù)組名形式,s2可以是
數(shù)組名,也可是字符串常量。第二十九頁,共七十二頁,2022年,8月28日
b.strcat(S1,S2)功能:
把字符串S2接到S1的結(jié)尾。自動去掉S1結(jié)尾的‘\0’,只在新字符串結(jié)尾保留‘\0’。
c.strlen(S1)功能;函數(shù)返回S1的實(shí)際長度(不包括‘\0’).
如:charstr[10]=“China”;
printf(“%d”,strlen(str));
輸出不是10,也不是6,而是5.
第三十頁,共七十二頁,2022年,8月28日d.strcmp(S1,S2)功能;
對兩個字符串自左到右逐個字符進(jìn)行比較,按
ASCII的值比較。直到出現(xiàn)不同字符或遇到‘\0’為止。
S1==S2
……函數(shù)返回值為0
S1>S2
……函數(shù)返回值為>0
S1
<S2
……函數(shù)返回值<0第三十一頁,共七十二頁,2022年,8月28日例10.5
從鍵盤輸入兩個字符串,把兩個字符串連接后輸出到屏幕#include<stdio.h>#include<string.h>intmain(){ chars1[80],s2[80];
gets(s1); gets(s2);
strcat(s1,s2); puts(s1); return0;}gets()以回車結(jié)束輸入.ch10_5.c第三十二頁,共七十二頁,2022年,8月28日例10.6從鍵盤輸入一個字符串,求這一字符串長度#include<stdio.h>#include<string.h>intmain(){ intx; charstr[80]; gets(str);
x=strlen(str); printf("該字符串長度:%d\n",x); return0;}ch10_6.c第三十三頁,共七十二頁,2022年,8月28日10.3.3字符操作函數(shù)與轉(zhuǎn)換函數(shù)1.isalnum():函數(shù)原型:
intisalnum(intch);檢查ch是否為字母或數(shù)字.是字母或數(shù)字返回1,否則返回0.2.isalpha():
函數(shù)原型:
intisalpha(intch);檢查ch是否為字母.是字母返回1,否則返回0.第三十四頁,共七十二頁,2022年,8月28日3.islower():函數(shù)原型:
intislower(intch);檢查ch是否為小寫字母(a~z).是返回1,否則返回0.4.isxdigit():函數(shù)原型:
intisxdigit(intch);檢查ch是否為一個十六進(jìn)制字符(0~9或a~f或A~F).是返回1,否則返回0.第三十五頁,共七十二頁,2022年,8月28日5.atoi()
函數(shù)原型:
intatoi(char*str)
函數(shù)功能:
將(一含有數(shù)字內(nèi)容的)字符串轉(zhuǎn)換成一個整數(shù)數(shù)值.
頭文件:
<stdlib.h>
#include<stdlib.h>#include<stdio.h>
intmain(){
intn;
charstr[
]="12345.78";
n=atoi(str);
printf("string=%s
integer=%d\n",str,n);
return0;}第三十六頁,共七十二頁,2022年,8月28日例10.7
從鍵盤輸入一些字符,輸出其中的大寫字符與十六進(jìn)制字符,當(dāng)輸入字符@結(jié)束字符#include<stdio.h>#include<string.h>intmain(){ charch; while((ch=getchar())!='@') {
if(isupper(ch)||isxdigit(ch)) printf("%3c",ch); } printf("\n"); return0;}ch10_7.c第三十七頁,共七十二頁,2022年,8月28日10.4自定義函數(shù)C語言允許用戶自定義函數(shù).例如:下面是一個自定義函數(shù),功能是求兩個整數(shù)之和.
intadd(intx,inty){intz;z=x+y;returnz;}第三十八頁,共七十二頁,2022年,8月28日
關(guān)于對被調(diào)用函數(shù)的聲明和函數(shù)原型:
在一個函數(shù)中調(diào)用另一個函數(shù)(即被調(diào)函數(shù))需要具備哪些條件?
a.函數(shù)要存在(庫函數(shù)或自定義函數(shù)).
此外還要:
b.如果是庫函數(shù),一般應(yīng)在文件開頭用#include命令把
相關(guān)函數(shù)的一些信息包括進(jìn)去.
第三十九頁,共七十二頁,2022年,8月28日如果用戶自己定義了一個函數(shù),同時主調(diào)函數(shù)與被調(diào)函數(shù)在同一源文件中:一般情況下,主調(diào)函數(shù)中要對被調(diào)用函數(shù)的作一聲明.
函數(shù)聲明即向編譯系統(tǒng)聲明將要調(diào)用此函數(shù),并將有關(guān)信息通知編譯系統(tǒng).第四十頁,共七十二頁,2022年,8月28日例:main(){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);}
對被調(diào)函數(shù)的聲明floatadd(floatx,floaty);
函數(shù)聲明是一語句,
要加分號;自定義add函數(shù).
C語言在進(jìn)行編譯時是從上到下逐行進(jìn)行的,如果沒有對函數(shù)進(jìn)行聲明,如上例,當(dāng)編譯到“c=add(a,b);”時,
并不知道add是不是函數(shù)名,也無法判斷實(shí)參(a和b)的類型與個數(shù)正確與否?第四十一頁,共七十二頁,2022年,8月28日
(1).“定義”與“聲明”不是一回事.“定義”:是指對函數(shù)功能的確定,包括指定函數(shù)名,函數(shù)值類型,
形參及其類型,函數(shù)體等.它是一個完整的,獨(dú)立的函數(shù)
單位.
說明:而“聲明”的作用:則是把函數(shù)的名字,函數(shù)的類型,以及形參的類型,個
數(shù)和順序通知編譯系統(tǒng),以便在調(diào)用該函數(shù)時系統(tǒng)按此
檢查.第四十二頁,共七十二頁,2022年,8月28日(2).其實(shí),在函數(shù)聲明中也可以不寫形參名,而只寫形參的
類型.如:floatadd
(float,
float);
(3).在C語言中,以上的函數(shù)聲明稱為函數(shù)原型.
使用函數(shù)原型的主要作用是:利用它在程序的編譯階
段,對被調(diào)函數(shù)的合法性進(jìn)行全面檢查.第四十三頁,共七十二頁,2022年,8月28日
函數(shù)原型的一般形式:(a).函數(shù)類型函數(shù)名(參數(shù)類型1,參數(shù)類型2,…..)(b).函數(shù)類型函數(shù)名(參數(shù)類型1參數(shù)名1,
參數(shù)類型2參數(shù)名2,…..)函數(shù)原型第一種是基本的形式,為了便于閱讀,也允許加上參數(shù)名.但編譯系統(tǒng)并不檢查參數(shù)名,因此參數(shù)名是什么都無所謂.第四十四頁,共七十二頁,2022年,8月28日(4).對被調(diào)函數(shù)聲明,在下列三種情況下可省略:說明:(a).如果函數(shù)的返回值是整型,或字符型可以省去(以
前我們遇到的大多是這種情況)。系統(tǒng)自動按整型處理,建議加以說明為好。(b).被調(diào)用函數(shù)的定義位置出現(xiàn)在主調(diào)函數(shù)之前,可省
去聲明,這時編譯系統(tǒng)已知道了已定義的函數(shù)類型,
會自動處理.
如下例:第四十五頁,共七十二頁,2022年,8月28日
floatadd(floatx,floaty)
/*定義add函數(shù)*/
{floatz;z=x+y;return(z);}
main(){floatadd(floatx,floaty);
floata,b,c;scanf(“”%f,%f”,&a,&b);c=add(a,b);printf(“sumis%f”,c)}
此處不必對
add()作聲明(c).此外,在文件開頭(所有函數(shù)定義之前),對函數(shù)進(jìn)
行了函數(shù)的統(tǒng)一聲明,可省去在主調(diào)函數(shù)中的聲明。第四十六頁,共七十二頁,2022年,8月28日如:
charletter(char,char);/*這三行處于所有函數(shù)之前,
floatf1(float,float);且在函數(shù)外部.*/
inti2(float,float);
main(){…}/*main內(nèi)不必說明所調(diào)用函數(shù)類型*/
charletter(charc1,charc2)/*定義letter()函數(shù)*/{...}
floatf1(floatx,floaty)/*定義f1()函數(shù)*/{...}
inti2(floatj,floatk)/*定義i2()函數(shù)*/{...}第四十七頁,共七十二頁,2022年,8月28日#include<stdio.h>intfun(intn){ ints=1,i; if(n==0) s=1; else for(i=1;i<=n;i++) s=s*i; returns;}intmain(){ inta,b; scanf("%d",&a); b=fun(a); printf("%d的階乘為%d\n",a,b); return0;}例10.8從鍵盤輸入一個整數(shù)(0-16),求此數(shù)的階乘。Ch10_10_8.c第四十八頁,共七十二頁,2022年,8月28日例10.10
輸入二個整數(shù),進(jìn)行函數(shù)調(diào)用,問能否實(shí)現(xiàn)實(shí)參a,b的交換。#include<stdio.h>intswap(int*p3,int*p4){intm;m=*p3;*p3=*p4;*p4=m;return0;}intmain(){inta,b;int*p1,*p2;printf("Pleaseinputa,b:");scanf("%d,%d",&a,&b);p1=&a;p2=&b;
swap(p1,p2);printf("a=%d,b=%d\n",a,b);return0;}
8P1
a運(yùn)行:8,3(回車)輸出:3,83P2
8P33P4Ch10_10_10.c指針為參數(shù)第四十九頁,共七十二頁,2022年,8月28日10.5函數(shù)的應(yīng)用例10.11
在main函數(shù)中定義了一個整型數(shù)組并初始化,通過調(diào)用自定義函數(shù)sum把數(shù)組中-1前的所有元素值相加.#include<stdio.h>intsum(intb[]){ints=0,i=0;while(b[i]!=-1)s+=b[i++];returns;}intmain(){staticinta[]={1,2,3,4,5,6,7,8,9,-1,6};printf("Total=%d\n",sum(a));return0;}Ch10_10_11.c數(shù)組名作為函數(shù)的參數(shù)進(jìn)行調(diào)用.第五十頁,共七十二頁,2022年,8月28日例10.14輸入一行英文字符,統(tǒng)計其中有多少單詞,單詞之間以空格為分隔#include<stdio.h>intmain(){ charstring[81]; intnum; gets(string); num=numword(string); printf("Thereare%dwords\n",num); return0;}第五十一頁,共七十二頁,2022年,8月28日intnumword(char*str){ inti,num=0,word=0; charch; for(i=0;(ch=str[i])!='\0';i++)
if(ch==‘')word=0; elseif(word==0) {word=1; num++;} returnnum;}
num統(tǒng)計單詞個數(shù),word用來判斷是否單詞的標(biāo)志.(1).當(dāng)前字符為空格:
未出現(xiàn)新單詞,word=0,
num不累加。(2).當(dāng)前字符為非空格(分兩種情況):
a.前一字符為空格(word=0),新詞出
現(xiàn),word=1,
num加1.
b.前一字符為非空格(word=1),未出
現(xiàn)新單詞,num不加1.Youarestudents.第五十二頁,共七十二頁,2022年,8月28日
(1).函數(shù)的嵌套調(diào)用:
C語言中的函數(shù)是平行的,不允許嵌套定義。
所有函數(shù)的作用域都處于同一嵌套深度,即不允許在函數(shù)體中又定義另一個函數(shù).但允許嵌套調(diào)用函數(shù),即在調(diào)用一個函數(shù)的過程中,又調(diào)用另一個函數(shù)。10.6函數(shù)的嵌套與遞歸調(diào)用第五十三頁,共七十二頁,2022年,8月28日
main()a()函數(shù)b()函數(shù){{{
調(diào)用函數(shù)a()調(diào)用函數(shù)b()….
結(jié)束returnreturn}}}如:第五十四頁,共七十二頁,2022年,8月28日例求三角形面積area2=s(s-a)(s-b)(s-c)s=(a+b+c)/2smainarea#include<stdio.h>#include<math.h>voidmain(){floata,b,c;floatarea(floata,floatb,floatc);floats(floata,floatb,floatc);scanf("%f%f%f",&a,&b,&c);printf("%f\n",area(a,b,c));}floatarea(floata,floatb,floatc){floatss;ss=s(a,b,c);returnsqrt(ss*(ss-a)*(ss-b)*(ss-c));}
floats(floata,floatb,floatc){return(a+b+c)/2;}對被調(diào)函數(shù)的聲明第五十五頁,共七十二頁,2022年,8月28日開始調(diào)用(2).函數(shù)的遞歸調(diào)用(recursive)調(diào)用一個函數(shù)的過程中,出現(xiàn)了直接或間接地調(diào)用
該函數(shù)本身,稱之為函數(shù)的遞歸調(diào)用。
C語言的特點(diǎn)之一是允許函數(shù)的遞歸調(diào)用。遞歸調(diào)用可以簡明,高效的解決問題(問題的一方面)。a.直接遞歸調(diào)用;
intf(intx){inty,z;….z=f(y);return(z*z);}第五十六頁,共七十二頁,2022年,8月28日b.間接遞歸調(diào)用:
intf1(intx){inty,z;z=f2(y);return(z*z);}
intf2(inta){intc;c=f1(a);return(3+c);}
兩種調(diào)用都是無休至的自我調(diào)用??梢杂胕f語句來控制這種情況.
第五十七頁,共七十二頁,2022年,8月28日
通常用求一個數(shù)的階乘為例來說明遞歸函數(shù)。
1(n=0,1)n!=
n*(n-1)!(n>1)例:10.18第五十八頁,共七十二頁,2022年,8月28日floatfac(intn){floatf;if(n<0){printf(“n<0,dataerror!”);exit(0);
}elseif(n==0||n==1)f=1;elsef=fac(n-1)*n;return(f);}intmain(){intn;floaty;printf(“inputaintegernumber:”);scanf(“%d”,&n);y=fac(n);printf(“%d!=%f”,n,y);}
n
n-1
下面設(shè)n=3,進(jìn)行調(diào)用:ch10_10_18.c第五十九頁,共七十二頁,2022年,8月28日fac(intn){…elseif(n==1||n==0)f=1;elsef=fac(n-1)*3;return(f);}main()
{….(n==3
)
y=fac(n);
…..}
fac(intn)
{…..(n==2)elseif(n==1||n==0)f=1;elsef=fac(n-1)*2;return(f);}fac(intn)
{…..(n==1)elseif(n==1||n==0)f=1;
elsef=fac(n-1)*n;return(f);}
11*2第六十頁,共七十二頁,2022年,8月28日
調(diào)用fac函數(shù)計算3的階乘時的情況:
f=fac(2)*3
1.這時函數(shù)將調(diào)用自己,因此仍然要理解為調(diào)用一個單
獨(dú)的函數(shù)。
2.每一次當(dāng)C語言中的任意函數(shù)被調(diào)用(不管是否遞歸),函數(shù)都將獲得自己的一套局部變量和形式參數(shù)。
3.函數(shù)遞歸時,必須有個if語句,迫使函數(shù)返回,進(jìn)而結(jié)
束遞歸.第六十一頁,共七十二頁,2022年,8月28日1.數(shù)組名作函數(shù)參數(shù):
如:main(){intarray[10];…
f1(array,10);…}
f1(intarr[],intn){…}…….array[0],arr[0]array[],arr[]函數(shù)的應(yīng)用第六十二頁,共七十二頁,2022年,8月28日
實(shí)際上,實(shí)參數(shù)組與形參數(shù)組共同占用一段內(nèi)存空間.
在函數(shù)調(diào)用過程中,如果形參數(shù)組arr的元素值發(fā)生變化,相應(yīng)實(shí)參數(shù)組的元素也發(fā)生同樣變化.
…….array[0],arr[0]array[],arr[]第六十三頁,共七十二頁,2022年,8月28日2.用多維數(shù)組名作函數(shù)參數(shù):
在被調(diào)用函數(shù)中對形參數(shù)組的定義時,可以指定每一維的大小,也可以省略第一維的大小說明:如
intarray[3][10];
或:intarray[][10];第六十四頁,共七十二頁,2022年,8月28日例:有一個3*4的數(shù)組,求所有元素中的最大值.ch10_10_18_1.c#include<stdio.h>
intmax_value(intarray[][4]){inti,j,max;max=array[0][0];
for(i=0;i<3;i++)for(j=0;j<4;j++)if(array[i][j]>max)max=array[i][j];return(max);}intmain(){inta[3][4]={{1,3,5,7},{2,4,6,8},{15,17,34,12}};print
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 教研成果成果轉(zhuǎn)化
- 裝修設(shè)計師的工作總結(jié)
- 房地產(chǎn)行業(yè)設(shè)計師工作總結(jié)
- 2024年爬山安全教案
- 2024年計算機(jī)應(yīng)屆生簡歷
- 農(nóng)田租賃協(xié)議書(2篇)
- 2024年苯噻草胺項目營銷方案
- 《贛州市國家稅務(wù)局》課件
- 烏魯木齊市實(shí)驗(yàn)學(xué)校2023-2024學(xué)年高三上學(xué)期1月月考政治試題(解析版)
- 甘肅省部分學(xué)校2025屆高三上學(xué)期第一次聯(lián)考(期末)歷史試卷(含答案解析)
- 麻醉醫(yī)學(xué)知識培訓(xùn)培訓(xùn)課件
- 人教版四年級上冊數(shù)學(xué) 第五單元《平行四邊形和梯形》單元專項訓(xùn)練 作圖題(含答案)
- 物業(yè)品質(zhì)督導(dǎo)述職報告
- 2024年山東濟(jì)南軌道交通集團(tuán)有限公司招聘筆試參考題庫含答案解析
- 療愈行業(yè)現(xiàn)狀分析
- 北京海淀區(qū)2023-2024學(xué)年六年級上學(xué)期期末數(shù)學(xué)數(shù)學(xué)試卷
- 2023年安全總監(jiān)年終工作總結(jié)
- 浙江省杭州拱墅區(qū)2023-2024學(xué)年六年級上學(xué)期期末語文試題
- 以消費(fèi)者為中心:提升營銷效果的技巧
- 部編版四年級道德與法治上冊期末復(fù)習(xí)計劃
- 獸用疫苗管理制度
評論
0/150
提交評論