版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第七章函數(shù)
Function
7.5函數(shù)調(diào)用時(shí)參數(shù)間的傳遍
7.1模塊化程序設(shè)計(jì)的概念
在C語(yǔ)言中,函數(shù)分為主函數(shù)、
庫(kù)函數(shù)和用戶自定義函數(shù)3種。程序
的執(zhí)行由主函數(shù)開始,然后調(diào)用其他
函數(shù),最終返回主函數(shù)并結(jié)束。
main函數(shù)
函數(shù)調(diào)用示意圖
7.2埠函教
C語(yǔ)言提供了豐富的標(biāo)準(zhǔn)函數(shù),即
庫(kù)函數(shù)。這類函數(shù)是由系統(tǒng)提供并定義
好的,不必用戶再去編寫。用戶只需要
了解函數(shù)的功能,并學(xué)會(huì)正確地調(diào)用標(biāo)
準(zhǔn)函數(shù)即可。
7.2.1C語(yǔ)言常用庫(kù)的數(shù)
對(duì)每一類庫(kù)函數(shù),在調(diào)用該類庫(kù)函
數(shù)時(shí),用戶在源程序的include命令中
應(yīng)包含該類庫(kù)函數(shù)的頭文件名。
#include"math.h
#include"stdio.h"
7.2.2標(biāo)準(zhǔn)庫(kù)函數(shù)的調(diào)用
incIude命令的格式為
#include<頭文件名>或
#include”頭文件名”
說明:
(1)include命令必須以#號(hào)開頭,
系統(tǒng)提供的頭文件名都以.h作為后綴,
頭文件名用一對(duì)雙引號(hào)(“")或一
對(duì)尖括號(hào)(<〉)括起來。
(2)在C語(yǔ)言中,調(diào)用庫(kù)函數(shù)時(shí)不能
缺少庫(kù)函數(shù)的頭文件,include命令
不是語(yǔ)句,不能在最后加分號(hào)。
(3)兩種格式的區(qū)別是:
使用尖括號(hào)時(shí),系統(tǒng)到存放C庫(kù)
函數(shù)頭文件所在的目錄中尋找要包含
的文件,即標(biāo)準(zhǔn)方式;使用雙引號(hào)時(shí),
系統(tǒng)先在用戶當(dāng)前目錄中尋找要包含
的文件,若找不到,再按標(biāo)準(zhǔn)方式查
找。
小例子
#include<string.h>/*調(diào)用strlen函數(shù)需要
包含的頭文牌*/
#include<stdio.h>/*調(diào)用printf函數(shù)需要
包含的頭文件*/
main()
{charstr[]=nabcden;
inti;
i=strlen(str);
printf(n%dn,i);
7.3函數(shù)的定義和調(diào)用
由用戶編寫的函數(shù)稱為自定義函
數(shù)。函數(shù)必須先定義后使用。
7.3.1曲教的定義
函數(shù)定義的一般格式如下:
類型說明符函數(shù)名(類型名形式參數(shù)1,類型名
形式參數(shù)2,…)
函數(shù)體;
}
說明:
(1)函數(shù)名是由用戶命名的、唯一
標(biāo)識(shí)一個(gè)函數(shù)的名字。
(2)各個(gè)函數(shù)必須單獨(dú)定義,不能
嵌套定義,即不能在一個(gè)函數(shù)內(nèi)部再
定義函數(shù)。
(3)形式參數(shù)用于在調(diào)用函數(shù)和被
調(diào)用函數(shù)之進(jìn)行數(shù)據(jù)傳遞,兩者之間
的數(shù)據(jù)類型應(yīng)一致。
(4)若在函數(shù)首部省略類型名,則
默認(rèn)函數(shù)返回值的數(shù)據(jù)類型為int類
型。
(5)在函數(shù)體中,除形參外,用到
的其他變量必須在說明部分進(jìn)行定義,
這些變量(包括形參),只在函數(shù)調(diào)
用時(shí)才臨時(shí)開辟存儲(chǔ)單元,當(dāng)退出函
數(shù)時(shí),這些臨時(shí)開辟的存儲(chǔ)單元全被
釋放掉。因此,這種變量只在函數(shù)體
內(nèi)部起作用,與其他函數(shù)體中的變量
互不相關(guān),它們可以和其他函數(shù)中的
變量同名。
例:求兩實(shí)教之和
main()
{floatadd(floatx,floaty);
floata,b,c;
scanf&a,&b);
c=add(a,b);
',,,
printf(%f/c);
)
floatadd(floatx,floaty)
{floatz;
z=x+;
returnz;
}
說明:
(1)add是函數(shù)名,該函數(shù)返回值為
float型。
(2)形式參數(shù)為實(shí)型變量x和y,該
參數(shù)接受調(diào)用本函數(shù)時(shí)實(shí)參數(shù)據(jù)的傳
遞。
(3)函數(shù)體內(nèi)的返回值是z。
自定義函數(shù)add的作用是求兩實(shí)
數(shù)之和,其返回值也是float型,由于
定義add函數(shù)出現(xiàn)在調(diào)用該函數(shù)的賦
,,
值語(yǔ)句c=add(a/b);〃后,因此必須
在調(diào)用函數(shù)中對(duì)add函數(shù)的返回值做
類型說明,即
floatadd(floatx,floaty)
7.3.2曲教的調(diào)用
1.善教惆用的一般形式
函數(shù)調(diào)用的一般形式為
畫數(shù)名([實(shí)參表]);add(a,b);
實(shí)參與形參的個(gè)數(shù)應(yīng)相等,類型應(yīng)一致。
實(shí)參與形參按順序?qū)?yīng),一一傳遞數(shù)據(jù)。
2.備熬惆用的方式
按函數(shù)在程序中出現(xiàn)的位置來分,
有如下3種函數(shù)調(diào)用方式。
(1)函數(shù)語(yǔ)句
(2)函數(shù)表達(dá)式
(3)函數(shù)參數(shù)
(1)函數(shù)語(yǔ)句。
函數(shù)語(yǔ)句的調(diào)用,是指把被調(diào)函
數(shù)作為一個(gè)獨(dú)立的語(yǔ)句直接出現(xiàn)在主
調(diào)函數(shù)中。
例如:
printf("%d
max(azb);/*調(diào)用有參函數(shù)max*/
printsiT。;/*調(diào)用無參函數(shù)printsir*/
這3個(gè)語(yǔ)句都是函數(shù)調(diào)用語(yǔ)句,簡(jiǎn)稱
函數(shù)語(yǔ)句。由函數(shù)語(yǔ)句直接調(diào)用的函數(shù),
一般不需要返回值,只要求函數(shù)完成某操
作。
(2)函數(shù)表達(dá)式。
必須有一個(gè)函數(shù)返回值,例如:
c=5*max(a,b);
(3)函數(shù)參數(shù)。
例如:
main()
{
printf(“%d”,max(a,b));
}
3.稠用房熬時(shí)的談意*項(xiàng)
(1)被調(diào)函數(shù)必須是已存在的函數(shù)。
(2)在主調(diào)函數(shù)中,要對(duì)被調(diào)函數(shù)先
做聲明。如果被調(diào)函數(shù)在主調(diào)函數(shù)之
前出現(xiàn),則在主調(diào)函數(shù)中對(duì)被調(diào)函數(shù)
可以不做聲明。
(3)如果被調(diào)函數(shù)的返回值為int類
型,不需要在主調(diào)函數(shù)中說明。
(4)如果被調(diào)用函數(shù)的聲明放在源
文件的開頭,則該聲明對(duì)整個(gè)源文件
都有效。
(5)如果被調(diào)用函數(shù)的聲明是在調(diào)
用函數(shù)定義的內(nèi)部,則該聲明僅對(duì)該
調(diào)用函數(shù)有效。
(6)函數(shù)調(diào)用應(yīng)該注意以下幾點(diǎn)。
①實(shí)參應(yīng)在個(gè)數(shù)、類型和順序上與形
參相一致。
②實(shí)參可以是常量、變量名、數(shù)組名、
數(shù)組元素或表達(dá)式,即必須具有確定的值。
③為了保證函數(shù)調(diào)用的正確性,在調(diào)
用之前應(yīng)該先弄清被調(diào)用函數(shù)的功能、輸
入?yún)?shù)、返回值等,然后再進(jìn)行調(diào)用。
【例7?5】編制程序,求兩教的乘積。
main()
{floatmul();/*進(jìn)行兩數(shù)相乘的函數(shù)*/
floatx,y,z;/*定義主函數(shù)內(nèi)部的局部函數(shù)*/
scanf(n%f%f\&x,&y);
/*輸入要進(jìn)行相乘的兩個(gè)數(shù)*/
z=mul(x,y);/*調(diào)用函數(shù),進(jìn)行兩數(shù)的相乘*/
printf(nTheproductis%f",z);/*輸出結(jié)果*/
floatmul(floatx,floaty)/*函數(shù)及形
參類型定義*/
floatz;/*定義浮點(diǎn)變量*/
z=x*y;/*兩數(shù)相乘*/
return(z);/*返回結(jié)果*/
7.4函數(shù)的返回值及其類型
一個(gè)函數(shù)有其特定的功能,也有其功
能所實(shí)現(xiàn)的結(jié)果。這一結(jié)果可以通過函數(shù)
的返回值表現(xiàn)出來。函數(shù)的返回值通過函
數(shù)體內(nèi)的return語(yǔ)句實(shí)現(xiàn)。
return語(yǔ)句的格式為
return表達(dá)式;
或
return(表達(dá)式);
如果沒有返回值,寫為return;
用〃void〃定義無返回值函數(shù),只需在
定義函數(shù)時(shí),在函數(shù)名前加上void即可。
例如:
voidprintstr();
/*定義prits什為無返回值函數(shù)*/
}
函數(shù)類型決定返回值的類型。類型不
一致時(shí),對(duì)于數(shù)值型數(shù)據(jù)可以自動(dòng)進(jìn)行類
型轉(zhuǎn)換。
如果函數(shù)有返回值,則在函數(shù)定義和
函數(shù)調(diào)用時(shí),一般都應(yīng)該指明返回值的類
型。
例如:
floatcount(intn)
{floats;
return(s);
}
在以下情況中,可以不在調(diào)用函數(shù)內(nèi)對(duì)被調(diào)
用函數(shù)進(jìn)行類型說明:
(1)當(dāng)被調(diào)用函數(shù)的定義位于調(diào)用函數(shù)
之前時(shí),可以不必進(jìn)行類型說明
(2)函數(shù)沒有返回值或返回值的類型為
整型或字符型。
(3)C語(yǔ)言允許在所有函數(shù)的外面、文件
的開頭對(duì)函數(shù)的類型進(jìn)行說明,這樣在調(diào)
用函數(shù)時(shí)就可以不對(duì)被調(diào)用函數(shù)的類型進(jìn)
行說明。
【例7-6】編一函數(shù),求x的n次方的值,
其中n是整數(shù)。
止匕程序可以將x和n作為函數(shù)參數(shù),所
求結(jié)果通過return語(yǔ)句返回調(diào)用程序。
doublepower(floatx,intn)
{inti;
doublepw;
pw=l;
for(i=l;i<=n;i++)
pw*=x;
return(pw);
}
7.5的教調(diào)用時(shí)參數(shù)間的傳遺
7.5.1變量、常量、數(shù)組元素
作為國(guó)數(shù)參數(shù)
形參和實(shí)參分別占用不同的存儲(chǔ)單
元,這種傳遞方式稱為“值傳遞”O(jiān)
實(shí)參一一〉形參(單向)
閱讀下列程序,觀察程序的運(yùn)行結(jié)果。
main()
{inta=2,b=3,c=O;
printfC(l)a=%drb=%d,c=%d
\n"fafbfc);
try(a,b,c);
printfC1(4)a=%d,b=%d,c=%d
\n”,a,b,c);
}
try(intx,inty,intz)
{printf("(2)x=%dfy=%d,z=%d\n'\
X,y,z);
z=x+y;
x=x*x;
y=y*y;
printf("(3)x=%dfy=%d,z=%d\n"/
X,y,z);
)
運(yùn)行結(jié)果為
(1)a=2,b=3c=0
(2)x=2,y=3z=0
(3)x=4,y=9z=5
(4)a=2,b=3c=0
由以上輸出結(jié)果可看出:
(1)是在主函數(shù)中未調(diào)用十ry函數(shù)前
執(zhí)行printf函數(shù)的結(jié)果;
(2)是try函數(shù)中形參值未發(fā)生變化
時(shí)的結(jié)果;
(3)是什y函數(shù)中形參值發(fā)生變化后
的結(jié)果;
(4)是try函數(shù)調(diào)用結(jié)束后返回調(diào)用
函數(shù)后的結(jié)果??梢钥闯?,形參的變
化未曾影響主函數(shù)中的實(shí)參,所以輸
出結(jié)果(1)和(4)是完全相同的。
7.5.2數(shù)組名作為函數(shù)參數(shù)
作為實(shí)參的數(shù)組名將數(shù)組元素首地址
傳遞給形參所表示的數(shù)組名,即實(shí)參傳給
形參的是地址。
【例7-10]編寫程序,由主函數(shù)輸入
字符串,調(diào)用一函數(shù)使輸入的字符串按反
序排列,并在主函數(shù)中輸出字符串。
main()
{voidfun();/*函數(shù)聲明*/
charstr[50];
printfC'inputstrplease:");
scanf("%s",str);
fun(str);
printf("反序后字符串:%s\心
str);
}
voidfun(charstrl[])
{charc;
inti,j;
j=strlen(strl);
for(i=0;i<j/2;i++/j—)
{c=s1rl[i];
strl[i]=strl[j-l];
strl[j-l]=c;}
}
運(yùn)行結(jié)果為
輸入:ABCDEF
輸出:FEDCBA
程序說明:
(1)在主調(diào)函數(shù)main中,定義了數(shù)
組str,并調(diào)用fun函數(shù),數(shù)組名str
作為實(shí)參。
(2)被調(diào)國(guó)數(shù)fun中,s什1為形參數(shù)
組名,它與實(shí)參數(shù)組名類型必須一致。
(3)調(diào)用fun函數(shù)時(shí),只是將實(shí)參數(shù)
組的首地址傳遞給形參數(shù)組,故實(shí)參
數(shù)組與形參數(shù)組的長(zhǎng)度可以不一致,
其大小由實(shí)參數(shù)組決定。例如形參數(shù)
組的定義為fun(charstrl[])o
7.6的數(shù)的嵌套調(diào)用
函數(shù)的嵌套調(diào)用:在某函數(shù)體中調(diào)用
了另一個(gè)函數(shù),則在該函數(shù)被調(diào)用的過程
中將發(fā)生另一次函數(shù)調(diào)用。
4n"X)/*定義函數(shù)fl*/
intf2()/*定義函數(shù)f2*/
fl();}/*f2中調(diào)用函數(shù)fl*/
voidmain()
{…
f2();〃主函數(shù)中調(diào)用函數(shù)f2*/
}
main函數(shù)
圖7-3函數(shù)嵌套調(diào)用過程
7.7的教的遺歸調(diào)用
遞歸調(diào)用:一個(gè)函數(shù)自己調(diào)用自己。
【例7?12】用遞歸算法計(jì)算n!
根據(jù)數(shù)學(xué)知識(shí),負(fù)數(shù)沒有階乘,0的階乘
為1,正整數(shù)n的階乘為
nx(n-1)x(n-2)x...x2x1
可以用下列式子表示:
由以上表達(dá)式可以看出:當(dāng)n>0時(shí),
求n!可以轉(zhuǎn)化為求解nx(n-l)!的新問題,
而求解(n-1)!與原來求n!的方法完全相
同,只是所處理的對(duì)象在遞減1,由n變成
了(n-1)o依此類推,求(n-1)!的問
題又可轉(zhuǎn)化為(n-l)(n-2)!的問題,直至
所處理對(duì)象的值減至0(即n=0)時(shí),階乘
的值為I,遞歸結(jié)束,不再進(jìn)行下去。至此,
求n!的這個(gè)遞歸算法結(jié)束。
總之,上面的公式說明了每一循環(huán)的
結(jié)果都有賴于上一循環(huán)的結(jié)果,遞歸總有
一個(gè)“結(jié)束條件",例如n!的結(jié)束條件為
n=0o
floatfac(intn)
{intt;
if(n==0||n==1)t=l;
elset=fac(n-l)*n;
returnt;
}
main()
{intn,t;
printf("entern:H);
scanfC%d“,An);
if(n<0)
,,11
printf(n<0,dataerrorlXn);
else
t=fac(n);
',,,
printf(\n%d!=%d/n,t);
運(yùn)行結(jié)果為
輸入:5/
輸出:5!=120
7.8局部變量和全局變量
一個(gè)函數(shù)中的語(yǔ)句和數(shù)據(jù)都有自己的
作用域。根據(jù)作用域的不同,變量可以分
為局部變量和全局變量。
7.8.1局部變量
在一個(gè)函數(shù)內(nèi)部定義的變量稱做局部
變量,也稱內(nèi)部變量。
作用域:本函數(shù)內(nèi)部,不能在其他函
數(shù)中使用。
形參a,b和變量i,k有效
intfl(inta,intb)
在fl函數(shù)內(nèi)部
inti,k;;形參a,b和變
量i,k有效
}
7.8.2全局變量
c程序中可以在函數(shù)的外部定義變量。
在函數(shù)外部定義的變量是全局變量,也稱
做外部變量。作用域:從定義變量的位置
開始到本源文件末尾結(jié)束。全局變量可以
被本文件中的多個(gè)函數(shù)共同使用。
intp=1,q=5;/*夕卜部變量*/
fl(inta)"定義函數(shù)*/
{intb,c;
…}
charcl,c2;"外部變量大/全局變
f2(inta,intb)〃定義函數(shù)*/
全局變量p,q
的作用
量cl,
范圍
c2的作
用范圍
)
main()
{intm,n
)j
7.9靜態(tài)存儲(chǔ)變量和動(dòng)態(tài)存儲(chǔ)變量
變量值存在的時(shí)間(即時(shí)域,亦稱生
存期)角度來分,分為靜態(tài)存儲(chǔ)變量和動(dòng)
態(tài)存儲(chǔ)變量。
7.9.1靜態(tài)存儲(chǔ)變量
靜態(tài)存儲(chǔ)變量:指在程序運(yùn)行期間分
配固定的存儲(chǔ)空間的變量。
格式為
static數(shù)據(jù)類型名
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 診斷用單克隆抗體市場(chǎng)需求與消費(fèi)特點(diǎn)分析
- 禮品燈具產(chǎn)品原材料供應(yīng)與需求分析
- 非線饒電感器市場(chǎng)發(fā)展預(yù)測(cè)和趨勢(shì)分析
- 諧波減速設(shè)備產(chǎn)品市場(chǎng)需求分析報(bào)告
- 稀土金屬產(chǎn)品市場(chǎng)需求分析報(bào)告
- 阻氧管產(chǎn)品市場(chǎng)環(huán)境與對(duì)策分析
- 釣具商業(yè)機(jī)會(huì)挖掘與戰(zhàn)略布局策略研究報(bào)告
- 移動(dòng)電視媒體產(chǎn)品市場(chǎng)需求分析報(bào)告
- 蛋糕粉產(chǎn)品市場(chǎng)需求分析報(bào)告
- 高低壓成套開關(guān)柜產(chǎn)品市場(chǎng)環(huán)境與對(duì)策分析
- 電影《長(zhǎng)安三萬里》全文團(tuán)課PPT
- 大班主題《上海話兒歌:比尾巴》教案設(shè)計(jì)
- 跨境電子商務(wù)實(shí)務(wù)PPT完整全套教學(xué)課件
- 2023年小學(xué)美術(shù)教師招聘考試試題及答案
- 東莞職業(yè)技術(shù)學(xué)院工作人員招聘考試真題2022
- 紅色藝術(shù)欣賞詩(shī)詞《七絕 贈(zèng)父詩(shī)》
- 財(cái)政支農(nóng)政策培訓(xùn)
- 粵港澳大灣區(qū)規(guī)劃綱要解讀課件
- 德州市新能源汽車產(chǎn)業(yè)發(fā)展的調(diào)研報(bào)告
- 微型消防站設(shè)施月度檢查表
- 9.1 認(rèn)識(shí)總體國(guó)家安全觀(教學(xué)設(shè)計(jì))八年級(jí)道德與法治上冊(cè)同步備課系列(部編版)
評(píng)論
0/150
提交評(píng)論