函數(shù)的計(jì)算機(jī)編程 _第1頁(yè)
函數(shù)的計(jì)算機(jī)編程 _第2頁(yè)
函數(shù)的計(jì)算機(jī)編程 _第3頁(yè)
函數(shù)的計(jì)算機(jī)編程 _第4頁(yè)
函數(shù)的計(jì)算機(jī)編程 _第5頁(yè)
已閱讀5頁(yè),還剩71頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論