高級語言程序設(shè)計(jì)基礎(chǔ)(C C++):函數(shù):程序的最基本單位_第1頁
高級語言程序設(shè)計(jì)基礎(chǔ)(C C++):函數(shù):程序的最基本單位_第2頁
高級語言程序設(shè)計(jì)基礎(chǔ)(C C++):函數(shù):程序的最基本單位_第3頁
高級語言程序設(shè)計(jì)基礎(chǔ)(C C++):函數(shù):程序的最基本單位_第4頁
高級語言程序設(shè)計(jì)基礎(chǔ)(C C++):函數(shù):程序的最基本單位_第5頁
已閱讀5頁,還剩97頁未讀, 繼續(xù)免費(fèi)閱讀

付費(fèi)下載

下載本文檔

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

文檔簡介

1函數(shù):程序的最基本單位21

C&C++程序結(jié)構(gòu)2函數(shù)定義3函數(shù)調(diào)用與返回4在函數(shù)之間傳遞數(shù)據(jù)5變量的存儲屬性6函數(shù)的遞歸調(diào)用7庫函數(shù)簡介函數(shù)與變量31C&C++程序結(jié)構(gòu)

模塊化程序結(jié)構(gòu)程序模塊相對獨(dú)立,簡化設(shè)計(jì),限制錯(cuò)誤;集體開發(fā),縮短開發(fā)周期;積木式組裝,共享模塊,減少重復(fù);易于維護(hù)、裁剪、移植和擴(kuò)充。模塊1主模塊模塊11模塊2模塊21模塊22

模塊化程序特點(diǎn)一、程序的模塊化41C&C++程序結(jié)構(gòu)(續(xù))

模塊化是結(jié)構(gòu)化程序設(shè)計(jì)的基礎(chǔ)。采用模塊化程序設(shè)計(jì)有很多優(yōu)越性:控制程序設(shè)計(jì)的復(fù)雜性,提高軟件的可靠性,提高軟件開發(fā)的效率,提高軟件的可維護(hù)性,提高程序的重用性。5C&C++程序是函數(shù)的集合體,每個(gè)函數(shù)是一個(gè)獨(dú)立的程序模塊,函數(shù)是C&C++程序的最小單元;有一個(gè)主函數(shù),若干個(gè)子函數(shù),程序總是從主函數(shù)開始執(zhí)行;函數(shù)可集中或分散存放在一個(gè)或多個(gè)源程序文件中;所有子函數(shù)地位平等,可互相調(diào)用、自我調(diào)用。函數(shù)F1()main()F11()F2()F21()F22()1C&C++程序結(jié)構(gòu)(續(xù))二、C&C++程序的結(jié)構(gòu)6數(shù)學(xué)函數(shù)math.h字符和字符串函數(shù)ctype.h,string.hI/O函數(shù)stdio.h動(dòng)態(tài)存儲分配函數(shù)形式無參函數(shù)有參函數(shù)空函數(shù)庫函數(shù)用戶定義函數(shù)1C&C++程序結(jié)構(gòu)(續(xù))三、C&C++函數(shù)的種類7main(){printf(“ThisisCprogram\n”);}函數(shù)main調(diào)用了函數(shù)printfprintf是一個(gè)庫函數(shù)例1為了完成一個(gè)特定的任務(wù),在程序開發(fā)中一般要定義若干函數(shù)。用戶定義函數(shù)1C&C++程序結(jié)構(gòu)(續(xù))8#include<math.h>floatfunc(x,y)floatx,y;{return(pow(x,y));}/*調(diào)用pow庫函數(shù)*/voidmain(){floata,b,c,d;c=func(a,b);/*第一次調(diào)用用戶函數(shù)*/d=func(c,b);/*第二次調(diào)用用戶函數(shù)*/printf(“%f,%f\n”,c,d);}/*調(diào)用格式輸出庫函數(shù)*/例2/*用戶定義函數(shù)*/1C&C++程序結(jié)構(gòu)(完)/*用戶定義函數(shù)*/94.{}括起來的部分是函數(shù)體。{}不可省略一、函數(shù)定義的一般形式2函數(shù)定義

函數(shù)返回值類型

函數(shù)名

(

形式參數(shù)說明表

)

{說明語句執(zhí)行語句}1.函數(shù)返回值類型是說明函數(shù)中return語句返回的值的類型,稱這個(gè)類型為該函數(shù)的類型。2.函數(shù)名是標(biāo)識符,是函數(shù)定義中不可省略。3.形式參數(shù)說明表是用逗號分隔開的一組變量類型和變量名。()不可省略。形式參數(shù)表中的參數(shù)簡稱為形參。10二、無參函數(shù)的定義2函數(shù)定義(續(xù))

函數(shù)名

()

{說明語句執(zhí)行語句}三、有參函數(shù)的定義遵守函數(shù)定義的一般形式四、空函數(shù)的定義

函數(shù)名

()

{}112函數(shù)定義(續(xù))

五、函數(shù)定義實(shí)例voiddummy()

/*函數(shù)名:dummy*/

{}一個(gè)最簡單的函數(shù):空函數(shù)

沒有數(shù)據(jù)類型說明、形參和形參說明

函數(shù)體為空12

long

facto

(

x

)

int

x;

{longy;for(y=1;x>0;--x)y*=x;

return(y);

}函數(shù)名形式參數(shù)列表函數(shù)類型形式參數(shù)說明函數(shù)體函數(shù)返回2函數(shù)定義(續(xù))

求階乘函數(shù)facto的定義13

voidmain(){inta,b,c;printf(”Entera,b\n”);scanf(”%d,%d”,&a,&b);c=max(a,b);printf(”Max=&d”,c);}int

max(

x,y)

intx,y;{

intz;z=x>y?x:y;return(z);}形式參數(shù)列表:是用‘,’分開的一組變量,用來接收調(diào)用時(shí)傳入的數(shù)據(jù)形式參數(shù)說明:在{}

外面對形式參數(shù)的類型進(jìn)行說明函數(shù)調(diào)用2函數(shù)定義(續(xù))

求兩個(gè)變量的最大值142函數(shù)定義(續(xù))

六、函數(shù)定義注意事項(xiàng)1.形式參數(shù)表中給出的形式參數(shù)名和數(shù)量要與形式參數(shù)說明中的參數(shù)名和數(shù)量相同。

要求形式參數(shù)表中的形參與形式參數(shù)說明中的參數(shù)應(yīng)一一對應(yīng)。但對于兩者的排列順序沒有要求。2.形式參數(shù)表中說明的形式參數(shù)只要在形式參數(shù)說明中說明一次即可,在函數(shù)體中不需再說明,可直接使用。152函數(shù)定義(完)

六、函數(shù)定義注意事項(xiàng)3.函數(shù)體內(nèi)部的變量說明與形參說明的含義不一樣。前者說明一個(gè)局部于函數(shù)體的一般變量,后者說明一個(gè)用于函數(shù)間傳送數(shù)據(jù)的形式變量。在概念上截然不同,在函數(shù)中的作用完全不同。在函數(shù)體內(nèi)部一般變量與形參的使用方法完全一樣。163函數(shù)的調(diào)用與返回一、函數(shù)的調(diào)用形式函數(shù)名(實(shí)際參數(shù)表);

實(shí)參的數(shù)量、類型和排列順序必須與函數(shù)定義時(shí)形式參數(shù)表中形參的數(shù)量、類型和排列順序一致,不允許任意改變。173函數(shù)的調(diào)用與返回在一個(gè)函數(shù)中調(diào)用另一個(gè)函數(shù)時(shí),程序?qū)⒖刂茝恼{(diào)用函數(shù)處轉(zhuǎn)移到被調(diào)用函數(shù),并且執(zhí)行被調(diào)用函數(shù)。在執(zhí)行完被調(diào)用函數(shù)的所有語句或者遇到return語句時(shí),程序的控制要返回到調(diào)用函數(shù)中原來調(diào)用函數(shù)的地方繼續(xù)執(zhí)行。二、函數(shù)調(diào)用的過程18三、函數(shù)聲明3函數(shù)的調(diào)用與返回(續(xù))在調(diào)用函數(shù)之前,要先進(jìn)行函數(shù)聲明“聲明”與“定義”的區(qū)別:“聲明”就是聲明函數(shù)返回值的類型?!岸x”是給出函數(shù)的程序體。19

函數(shù)聲明與函數(shù)定義的首部唯一區(qū)別:函數(shù)聲明語句的()之后必須有分號,而函數(shù)定義頭部的()之后沒有分號。3函數(shù)的調(diào)用與返回(續(xù))函數(shù)聲明的一般形式函數(shù)類型

函數(shù)名(形參類型1形參名1,形參類型2形參名2…);函數(shù)類型必須與函數(shù)定義時(shí)的函數(shù)類型一致203函數(shù)的調(diào)用與返回(續(xù))例:調(diào)用max函數(shù)的程序#include”stdio.h”voidmain(){inta,b,c;intmax(inta,intb);scanf("%d,%d",&a,&b);

c=max(a,b);printf("max=%d\n",c);}

函數(shù)聲明21四、函數(shù)原型3函數(shù)的調(diào)用與返回(續(xù))函數(shù)聲明的簡化形式:函數(shù)原型函數(shù)類型

函數(shù)名(形參類型1,形參類型2…);

通常將一個(gè)文件中需調(diào)用的所有函數(shù)原型寫在文件的開始。22五、函數(shù)的返回3函數(shù)的調(diào)用與返回(續(xù))從函數(shù)返回的兩種方法用return語句從被調(diào)函數(shù)中退出,返回調(diào)用它的程序中(也稱為主調(diào)函數(shù));被調(diào)函數(shù)如果沒有return語句,被調(diào)函數(shù)執(zhí)行結(jié)束遇到最外面的

},返回主調(diào)函數(shù)。23控制程序從當(dāng)前函數(shù)(被調(diào)用函數(shù))中退出,返回到調(diào)用函數(shù)中繼續(xù)執(zhí)行;從被調(diào)用函數(shù)向主調(diào)函數(shù)返回一個(gè)值(稱為返回值)。五、函數(shù)的返回3函數(shù)的調(diào)用與返回(續(xù))

return的兩重作用:24返回值規(guī)定

函數(shù)除void類型之外,均有一個(gè)返回值,返回值的類型就是在定義函數(shù)時(shí)的函數(shù)類型。例:當(dāng)返回值類型為整型int時(shí)int

max(

x,y)

intx,y;

{

intz;z=x>y?x:y;return(z);

}3函數(shù)的調(diào)用與返回(續(xù))

25在程序中調(diào)用函數(shù)的時(shí)候,必須先明確地說明被調(diào)用函數(shù)的數(shù)據(jù)類型,然后再使用(調(diào)用)。返回語句

格式1:return;功能:

將控制從被調(diào)函數(shù)返回到主調(diào)函數(shù)。格式2:return(表達(dá)式);

或:

return表達(dá)式

;功能:在被調(diào)函數(shù)中計(jì)算表達(dá)式的值,將計(jì)算結(jié)果按照函數(shù)說明的函數(shù)類型返回到主調(diào)函數(shù),并將控制返回主調(diào)函數(shù)。3函數(shù)的調(diào)用與返回(續(xù))263函數(shù)的調(diào)用與返回(續(xù))

void類型概念又稱為無值類型(或空類型)。void類型的函數(shù)在調(diào)用之后沒有返回值。(void類型的函數(shù)不是調(diào)用函數(shù)之后不返回)

void類型的用途表示一個(gè)函數(shù)沒有返回值;用來指明一個(gè)通用型的指針。27void類型的說明void類型的函數(shù)與有返回值類型的函數(shù)在定義過程中沒有區(qū)別;有返回值的函數(shù)可將函數(shù)調(diào)用放在表達(dá)式的中間,將返回值用于計(jì)算;void類型的函數(shù)不能將函數(shù)調(diào)用放在表達(dá)式之中,只能以單獨(dú)語句形式調(diào)用。3函數(shù)的調(diào)用與返回(續(xù))

28例:調(diào)用max函數(shù)的程序voidmain(){inta,b,c;int

max(int,int);scanf("%d,%d",&a,&b);

c=max(a,b);printf("max=%d\n",c);}

函數(shù)調(diào)用int

max(x,y)intx,y;{intz;if(x>y)z=x;elsez=y;return(z);}實(shí)際參數(shù)形式參數(shù)返回函數(shù)值接收返回值程序執(zhí)行順序?/*1*//*2*//*3*//*4*//*5*//*11*//*12*//*13*//*14*//*15*//*16*/函數(shù)調(diào)用與返回實(shí)例3函數(shù)的調(diào)用與返回(續(xù))

29/*1*//*2*//*3*//*4*//*5*//*11*//*12*//*13*//*14*//*15*//*16*/voidmain(){inta,b,c;scanf("%d,%d",&a,&b);c=max(a,b);printf(”max=%d\n",c);}intmax(x,y)intx,y;{intz;if(x>y)z=x;elsez=y;return(z);}斷點(diǎn)保護(hù)斷點(diǎn)和現(xiàn)場,轉(zhuǎn)向11入口虛實(shí)結(jié)合a-x,b-y返回?cái)帱c(diǎn)恢復(fù)現(xiàn)場帶回函數(shù)值3函數(shù)的調(diào)用與返回(續(xù))30intmax(x,y)intx,y;{intz;if(x>y)z=x;elsez=y;

return(z);}返回整型函數(shù)值intmax(x,y)intx,y;{intz;if(x>y)z=x;elsez=y;

return;}返回不確定的函數(shù)值

intmax(x,y)intx,y;{intz;if(x>y)z=x;elsez=y;}無返回語句在此返回3函數(shù)的調(diào)用與返回(續(xù))

31例:用函數(shù)facto計(jì)算m階乘。voidmain(){intm;longmm;

long

facto(int);scanf("%d",&m);mm

=facto(m

);printf("%d!=%ld.\n",m,mm);}long

facto

(x

)

int

x;{

longy;for(y=1;x>0;--x)y*=x;

return(y);}

/*函數(shù)定義*//*形式參數(shù)說明*//*

以下為函數(shù)體

*/

/*返回并帶回返回值*//*函數(shù)聲明*/

/*m是實(shí)參數(shù),調(diào)用函數(shù)facto,

返回值送入變量mm中*/函數(shù)執(zhí)行過程

main(){mm=facto(m);}facto(x){

return(y);}調(diào)用返回3函數(shù)的調(diào)用與返回—函數(shù)調(diào)用的執(zhí)行過程32§9-6函數(shù)的嵌套調(diào)用3函數(shù)的調(diào)用與返回—函數(shù)的嵌套調(diào)用函數(shù)的嵌套調(diào)用main函數(shù){……

……調(diào)用函數(shù)A;

……}函數(shù)A{……

……

調(diào)用函數(shù)B;

……}函數(shù)B{……

……

……}調(diào)用調(diào)用返回返回334在函數(shù)間的傳遞數(shù)據(jù)在不同的函數(shù)之間傳遞數(shù)據(jù),可以使用的方法:參數(shù):通過形式參數(shù)和實(shí)際參數(shù)返回值:用return語句返回計(jì)算結(jié)果全局變量:外部變量一、函數(shù)間數(shù)據(jù)傳遞方式344在函數(shù)間的傳遞數(shù)據(jù)值傳遞:在調(diào)用函數(shù)時(shí),將實(shí)參變量的值取出來,復(fù)制給形參變量,使形參變量在數(shù)值上與實(shí)參相等。在函數(shù)內(nèi)部使用從實(shí)參中復(fù)制來的值進(jìn)行處理。C中的實(shí)參可以是一個(gè)表達(dá)式,調(diào)用時(shí)先計(jì)算表達(dá)式的值,再將結(jié)果(值)復(fù)制到形參變量中。二、函數(shù)參數(shù)的值傳遞35例4用函數(shù)實(shí)現(xiàn)交換兩個(gè)變量的值。

voidmain(){inta=5,b=10;/*說明兩個(gè)變量并賦初值*/voidswap(int,int);printf("beforeswapa=%d,b=%d\n",a,b);

swap(a,b);/*用變量a和b作為實(shí)際參數(shù)調(diào)用函數(shù)*/

printf("afterswapa=%d,b=%d\n",a,b);}voidswap(x,y)intx,y;{inttemp;/*借助臨時(shí)變量交換兩個(gè)形參變量的值*/

temp=x;x=y;y=temp;printf("inswapx=%d,y=%d\n",x,y);}36main函數(shù){a=5;b

=10;swap(a,

b);}swap(x,y)函數(shù){temp

=x; 語句①

x=y; 語句②

y

=temp;}

語句③510實(shí)參變量a實(shí)參變量b510形參變量x形參變量

y變量

temp復(fù)制復(fù)制①temp

=x②x=y③y

=temp105

5swap函數(shù)的執(zhí)行過程和各個(gè)變量的變化過程

調(diào)用swap函數(shù)調(diào)用swap函數(shù)調(diào)用swap函數(shù)執(zhí)行swap函數(shù)執(zhí)行swap函數(shù)執(zhí)行swap函數(shù)4在函數(shù)間的傳遞數(shù)據(jù)(續(xù))

37main函數(shù){a=5;b

=10;swap(a,

b);}swap(x,y

)函數(shù){temp

=x; 語句①

x=y; 語句②

y

=temp;}

語句③swap函數(shù)的執(zhí)行過程和各個(gè)變量的變化過程main函數(shù)swap函數(shù)510變量a變量b形參x形參y105變量temp5105swap(a,b);main函數(shù)變量a5變量b10temp=x;x=y;y=temp;函數(shù)執(zhí)行結(jié)束返回4在函數(shù)間的傳遞數(shù)據(jù)(續(xù))38值傳遞方式的特點(diǎn)

值傳遞方式也稱數(shù)據(jù)復(fù)制方式。 函數(shù)間形參變量與實(shí)參變量的值的傳遞過程類似于日常生活中的“復(fù)印”操作。

值傳遞的優(yōu)點(diǎn)

被調(diào)用的函數(shù)不可能改變調(diào)用函數(shù)中變量的值,而只能改變它的局部的臨時(shí)副本。這樣就可以避免被調(diào)用函數(shù)的操作對調(diào)用函數(shù)中的變量可能產(chǎn)生的副作用。

值傳遞的缺點(diǎn)

在值傳遞方式下,每個(gè)形式參數(shù)僅能傳遞一個(gè)數(shù)據(jù),當(dāng)需要在函數(shù)之間傳遞大量數(shù)據(jù)時(shí),值傳遞方式顯然不適用。4在函數(shù)間的傳遞數(shù)據(jù)(續(xù))

39變量的三個(gè)屬性變量的名稱:編寫程序時(shí)使用變量名。變量的值:程序運(yùn)行時(shí)使用變量的值參加運(yùn)算。變量的地址:

程序運(yùn)行時(shí),要將變量的值保存在計(jì)算機(jī)的存儲單元中,每個(gè)存儲單元都有唯一的內(nèi)存地址。變量在內(nèi)存中占據(jù)的存儲單元的地址就是變量的地址。 通過變量名存取變量的值,稱為直接訪問。 通過變量地址存取變量的值,稱為間接訪問。三、在函數(shù)間傳遞變量的地址40在函數(shù)之間傳遞變量的地址在函數(shù)間通過一般的變量可以傳遞變量的值要在函數(shù)間傳遞變量地址必須通過指針變量 即要在函數(shù)之間傳遞指向變量的指針。在函數(shù)間傳遞變量地址時(shí),變量的地址在調(diào)用函數(shù)時(shí)要作為實(shí)際參數(shù),被調(diào)用函數(shù)使用指針變量作為形式參數(shù)接收傳遞的地址。 注意:實(shí)參的數(shù)據(jù)類型要與作為形參的指針?biāo)傅膶ο蟮臄?shù)據(jù)類型一致。41指針及其引用

C&C++提供了另一種方式,將變量k的地址存放在另一個(gè)變量處(假定為pk),通過訪問pk,可以間接地訪問變量k,這種方式稱為間接訪問。變量intk;變量pk中存放k在內(nèi)存中的地址

變量pk就是一個(gè)指針變量,指向變量k,存放k的地址。100intk=100&k&kint*pk因此:指針就是地址。421指針及其引用(續(xù))一、指針變量的說明

格式:其中:類型說明符,是指針?biāo)傅淖兞康念愋?為指針說明符,說明后面的變量為指針變量(也叫間接訪問符)例如:inta,*pa;

pa=&a;將變量a的地址賦給指針paprintf(“%d”,*pa);通過間接訪問符可以訪問變量a類型說明符*變量名;43指針及其引用(續(xù))一、指針變量的說明

說明:(1)一個(gè)指針指向類型說明符所說明的變量類型

(2)*和&在C中有兩個(gè)作用:*:乘號(雙目)和指針說明符(單目)&:取址符(單目14)和位操作中的“與”441指針的及其引用(續(xù))二、指針變量的初始化

指針變量使用前必須有值

指針變量的初值必須是地址值

方法:intk,*pk;pk=&k;(2)intk;int*pk=&k;

可以為指針賦空值(NULL),此時(shí)指針不指向任何變量pk=NULL;45指針及其引用(續(xù))三、指針變量的引用

定義指針后,對變量的訪問就可以有兩種方法:

間接訪問:通過指針

*pk=0;與k=0;*pk+=1;與k+=1;(*pk)++與k++;

區(qū)別:定義指針時(shí)的*pk

和引用指針時(shí)的*pk

直接訪問:通過變量名例:intk

,

*pk;

pk=&k;printf(“%d”,k);與printf(“%d”,*pk);完全等價(jià)46例:使用函數(shù)plus求兩個(gè)數(shù)的和。

#include<stdio.h>

main(){

int

a,b,c;printf("EnterAandB");scanf("%d%d",&a,&b);c=plus(&a,

&b);/*實(shí)參為變量a和b的地址*/

printf("A+B=%d",c);}plus(px,py)int*px,*py;/*形式參數(shù)為指向整型的指針*/

{return(

*px

+

*py

);/*返回兩個(gè)整數(shù)的和*/}4在函數(shù)間的傳遞數(shù)據(jù)(續(xù))47例:用函數(shù)交換兩個(gè)變量的值。#include<stdio.h>voidmain(){inta,b;a=5;b=10;printf("brfortswapa=%d,b=%d\n",a,b);swap(&a,&b);/*實(shí)參為變量a和b的地址*/

printf("afterswapa=%d,b=%d\n",a,b);}swap(px,py)

int*px,*py;/*形參為指向整型的指針*/{inttemp;/*說明函數(shù)內(nèi)部使用的臨時(shí)變量*/

temp=*px;/*將指針變量px的內(nèi)容賦給變量temp*/

*px=*py;/*將指針py的內(nèi)容賦給指針px的內(nèi)容*/

*py=temp;/*將變量temp的值賦給指針py的內(nèi)容*/

printf("inswapx=%d,y=%d\n",*px,*py);}4在函數(shù)間的傳遞數(shù)據(jù)(續(xù))

48main函數(shù){a

=5;b

=10;swap(&a,&b);

}swap(*px,*py)函數(shù){temp=*px; 語句①*px

=*py;語句②*py

=temp; }語句③swap函數(shù)的執(zhí)行過程和各個(gè)變量的變化過程510變量a變量b&a&b形參變量px形參變量py&a&b

變量

temp調(diào)用swap函數(shù)調(diào)用swap函數(shù)調(diào)用swap函數(shù)執(zhí)行swap函數(shù)執(zhí)行swap函數(shù)執(zhí)行swap函數(shù)①

temp=*px②*px=

*py③*py=temp10554數(shù)據(jù)在函數(shù)間的傳遞(續(xù))

49◆向函數(shù)傳遞數(shù)組元素的值:

實(shí)參為數(shù)組元素(a[k]),

形參為一般變量(x)◆向函數(shù)傳遞數(shù)組元素的地址(指針)

實(shí)參為數(shù)組元素的地址 形參為指針變量4數(shù)據(jù)在函數(shù)間的傳遞——數(shù)組作函數(shù)參數(shù)一、數(shù)組與函數(shù)的關(guān)系

在函數(shù)之間傳遞數(shù)組中的單個(gè)元素在函數(shù)之間傳遞整個(gè)數(shù)組二、在函數(shù)之間傳遞數(shù)組中的元素50123456789數(shù)組a數(shù)組元素a[5]6變量x傳遞數(shù)組中的元素123456789數(shù)組a數(shù)組元素a[0]的地址20AFH指針變量p傳遞整個(gè)數(shù)組20AFH4數(shù)據(jù)在函數(shù)間的傳遞——數(shù)組作函數(shù)參數(shù)51例5分析程序的執(zhí)行過程。#include”stdio.h”

voidmain(){inta[10],b,i;

/*在主調(diào)函數(shù)內(nèi)定義數(shù)組*/

for(i=0;i<10;i++)

scanf(“%d”,&a[i]);/*為數(shù)組元素賦值*/

b=0;

for(i=0;i<10;i++)

b=max(b,a[i]);

/*循環(huán)調(diào)用函數(shù),依次使用數(shù)組的每一個(gè)元素做實(shí)參*/

printf(“%d”,b);}4數(shù)據(jù)在函數(shù)間的傳遞——數(shù)組作函數(shù)參數(shù)1.向函數(shù)傳遞數(shù)組元素的值52

2.在函數(shù)之間傳遞整個(gè)數(shù)組4數(shù)據(jù)在函數(shù)間的傳遞——數(shù)組作函數(shù)參數(shù)

格式:函數(shù)名(數(shù)組名);

數(shù)組名表示數(shù)組在內(nèi)存中的起始地址。

例:數(shù)組

a,printf(“%d”,a);顯示地址量。

數(shù)組元素

a[0]、a[1]……,表示內(nèi)存中該單元存放的數(shù)據(jù)(數(shù)組元素的值)。53實(shí)參是數(shù)組名,形參是一個(gè)能接收實(shí)參數(shù)組首地址的變量名。

注意:形參本身不是重新建立一個(gè)數(shù)組,實(shí)際是接受了實(shí)參傳給的地址。

聲明形參的格式是在數(shù)組名后加一對方括弧[]。4數(shù)據(jù)在函數(shù)間的傳遞——數(shù)組作函數(shù)參數(shù)544數(shù)據(jù)在函數(shù)間的傳遞——數(shù)組作函數(shù)參數(shù)#include"stdio.h"#defineN5main(){inti,j,a[N];

voidsort(int,int);for(i=0;i<N;i++)/*讀數(shù)組*/{printf("\nEnterNo.%d:",i+1);scanf("%d",&a[i]);}

sort(a,N);

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

for(i=0;i<N;i++)printf("%d",a[i]);}sort(b,m)/*定義函數(shù)*/intm,b[];/*形參的說明*/{inti,j,t;/*排序*/

for(i=0;i<N-1;i++)for(j=0;j<N-1-i;j++)if(b[j]>b[j+1]){t=b[j];b[j]=b[j+1];b[j+1]=t;}}形參是數(shù)組55運(yùn)行結(jié)果

在調(diào)用函數(shù)過程中改變了原數(shù)組的值,即:實(shí)參數(shù)組與形參數(shù)組共享一組存儲空間。a數(shù)組b數(shù)組地址傳遞4數(shù)據(jù)在函數(shù)間的傳遞——數(shù)組作函數(shù)參數(shù)56main函數(shù)sort函數(shù)

a[0]a[1]a[2]a[3]a[4]a[5]2000數(shù)組名就是首元素的地址2000a2000b形參b實(shí)質(zhì)是一個(gè)變量,內(nèi)容是數(shù)組a的起始地址對數(shù)組名作為參數(shù)的解釋4數(shù)據(jù)在函數(shù)間的傳遞——數(shù)組作函數(shù)參數(shù)57三、多維數(shù)組作函數(shù)的參數(shù)多維數(shù)組元素作函數(shù)參數(shù)時(shí),與一維數(shù)組元素作函數(shù)實(shí)參相同;二維數(shù)組名作函數(shù)參數(shù):類型說明符形參名[][常量表達(dá)式M]4數(shù)據(jù)在函數(shù)間的傳遞——數(shù)組作函數(shù)參數(shù)584數(shù)組做函數(shù)參數(shù)——多維數(shù)組作函數(shù)的參數(shù)例6給定日期,將其轉(zhuǎn)換成該年的第幾天并輸出。voidmain() {staticintday_tab[2][13]={{0,31,28,31,30,31,30,31,31,30,31,30,31},{0,31,29,31,30,31,30,31,31,30,31,30,31}};inty,m,d;intday_of_year(intoday_tab[2][12],year,month,day);scanf("%d%d%d",&y,&m,&d);printf("%d\n",day_of_year(day_tab,y,m,d));}int

day_of_year(day_tab,year,month,day)intday_tab[][13];/*形參是二維數(shù)組形式*/

intyear,month,day;{inti,j;i=(year%4==0&&year%100!=0)||year%400==0;/*判定為閏年還是平年,i=0為平年,i=1為閏年*/

for(j=1;j<month;j++)day+=day_tab[i][j];return(day);}數(shù)組名在函數(shù)之間傳遞多維數(shù)組59一、變量的數(shù)據(jù)類型

char型

int型

float型

double型總結(jié):數(shù)據(jù)類型決定為變量分配的內(nèi)存單元的長度,數(shù)據(jù)的存放

形式。(從程序設(shè)計(jì)角度,決定了可以表示的數(shù)的范圍)問題:1.何時(shí)為變量分配內(nèi)存單元?

2.變量位于內(nèi)存的什么位置?

3.變量的有效作用范圍?5變量的存儲屬性605變量的存儲屬性一個(gè)函數(shù)一個(gè)文件一個(gè)程序變量的作用域是指變量的有效使用范圍靜態(tài)存儲:整個(gè)程序運(yùn)行期間動(dòng)態(tài)存儲:函數(shù)調(diào)用期間變量的生存期是指變量值的保留期限61變量存貯說明的一般形式:

存貯類型說明符類型說明符變量名稱;5變量的存儲屬性(續(xù))變量存貯類型有四種:自動(dòng)變量(auto)靜態(tài)變量(static)外部變量(extern)寄存器變量(register)

auto、static、extern和register為存貯類型說明符。625變量的存儲屬性(續(xù))二、自動(dòng)變量auto1最常見的一種變量:autointa;

autofloatpi;

“auto”可以省略。以前所使用的全部變量都是自動(dòng)變量。2說明

說明自動(dòng)變量必須在一個(gè)函數(shù)體的內(nèi)部。

函數(shù)的形參也是自動(dòng)變量。635變量的存儲屬性(續(xù))3

作用域自動(dòng)變量的作用域是在所說明的函數(shù)內(nèi)部。只有在函數(shù)被調(diào)用時(shí)才存在,從函數(shù)中返回時(shí)即消失。

值也僅限于說明它的函數(shù),在其它的函數(shù)中不能存取。

在兩個(gè)不同的函數(shù)中可以分別使用同名的變量而互不影響。64例7分析程序運(yùn)行結(jié)果。#include<stdio.h>voidmain(){intx

=1;/*函數(shù)main中的自動(dòng)變量x*/voidf1(),f2(int);f1(); f2(x);/*分別調(diào)用函數(shù)f1和f2*/printf("x=%d\n",x);}voidf1(){intx=3;/*函數(shù)f1中的自動(dòng)變量x*/printf("x=%d\t",x);}

voidf2(x)intx;/*函數(shù)f2中的形參x也是自動(dòng)變量*/{printf("x=%d\t",++x);/*x加1*/}5變量的存儲屬性(續(xù))

程序中有三個(gè)x分別在三個(gè)不同的函數(shù)中,這三個(gè)“x”都是自動(dòng)變量,所以三個(gè)“x”分別局部于三不同的函數(shù),在三個(gè)函數(shù)中對“x”的操作互不影響。655變量的存儲屬性(續(xù))三、外部變量extern

定義在所有函數(shù)之外,故稱外部變量??杀凰械暮瘮?shù)訪問。函數(shù)之間可通過外部變量傳遞數(shù)據(jù)。

外部變量如果沒有明確的初值,則初值為0;自動(dòng)變量沒有明確賦初值,則值不定。外部變量與自動(dòng)變量的區(qū)別:

外部變量在編譯時(shí)由系統(tǒng)分配永久性的存儲空間;自動(dòng)變量則是在函數(shù)被調(diào)用時(shí)才分配臨時(shí)性的存儲空間。extern類型說明符變量名;66例8分析程序運(yùn)行結(jié)果。intx

=0;/*說明外部變量x*/voidmain(){voidaddone(),subone();

x=1;/*為外部變量x賦值*/

printf("xbeginsis%d\n",x);addone();subone();subone();addone();addone();printf("xwindsupas%d\n",x);}voidaddone(){x

++;/*使用外部變量x*/printf("add1tomake%d\n",x);}voidsubone(){x--;/*使用外部變量x*/printf("substract1tomake%d\n",x);}5變量的存儲屬性(續(xù))67自動(dòng)變量x

的輸出不定;外部變量x

的輸出為

0。

#include<stdio.h> voidmain() {intx;

/*自動(dòng)變量*/

printf(”x=%d”,x): }#include<stdio.h> intx;

/*外部變量*/

voidmain() {printf(”x=%d”,x): }

5變量的存儲屬性(續(xù))68如果外部變量的說明與使用在同一個(gè)文件中,則該文件中的函數(shù)在使用外部變量時(shí),不需要再進(jìn)行說明,可直接使用。在不同的文件中使用外部變量

當(dāng)外部變量的說明與使用在不同的文件,要使用在其它文件中說明的外部變量,就必須在使用該外部變量之前,使用“extern”存儲類型說明符進(jìn)行變量“外部”說明。5變量的存儲屬性(續(xù))69在不同的文件中使用外部變量

extern僅僅是說明變量是“外部的”,以及它的類型,并不真正分配存儲空間。在將若干個(gè)文件連接生成一個(gè)完整的可運(yùn)行程序時(shí),系統(tǒng)會將不同文件中使用的同一外部變量連在一起,使用同一個(gè)系統(tǒng)分配的存儲單元。5變量的存儲屬性(續(xù))70例9下列程序由兩個(gè)文件組成,請分析運(yùn)行結(jié)果。/*文件一*/

intx=10;/*定義外部變量x和y*/inty=10;voidadd(){y=10+x;x*=2;}voidmain(){externvoidsub();/*說明sub是void型的外部函數(shù)*/

x+=5;add();sub();/*分別調(diào)用函數(shù)*/

printf("x=%d;y=%d\n",x,y);}/*文件二*/

void

sub

()

/*函數(shù)sub定義在另一個(gè)文件中*/

{

extern

int

x;/*說明在另一個(gè)文件中的外部變量x*/

x

-=5;}5變量的存儲屬性(續(xù))71例10分析運(yùn)行結(jié)果。/*文件一*/intx=10;/*說明外部變量x和y*/inty

=10;externvoidsub();/*在函數(shù)外說明外部函數(shù)sub,則在每個(gè)調(diào)用外部函數(shù)sub的函數(shù)中,不再需要進(jìn)行外部函數(shù)說明*/voidadd(){inty=5;/*說明自動(dòng)變量y*/y=10+x;x*=2;printf("add:y=%d;",y);}5變量的存儲屬性(續(xù))72voidmain(){x+=5;add();sub();printf("main:x=%d;main:y=%d\n",x,y);}/*文件二*/externint

x;

/*說明另一文件中的外部變量x*/voidsub(){int

y

=5;

/*說明自動(dòng)變量y*/

x

-=

y;

printf("sub:y=%d;",y);}5變量的存儲屬性(續(xù))73靜態(tài)變量的說明是在變量說明前加static。靜態(tài)變量有兩種:外部靜態(tài)變量,內(nèi)部靜態(tài)變量。靜態(tài)變量與外部變量的相同點(diǎn):具有永久的存儲空間;由編譯器進(jìn)行初始化。外部靜態(tài)變量與外部變量的區(qū)別:外部靜態(tài)變量僅僅在定義它的一個(gè)文件中有效,而外部變量作用于整個(gè)程序。四、靜態(tài)變量static

5變量的存儲屬性(續(xù))74內(nèi)部靜態(tài)變量與外部靜態(tài)變量的區(qū)別:內(nèi)部靜態(tài)變量作用于定義它的當(dāng)前函數(shù)。外部靜態(tài)變量作用于定義它的當(dāng)前的文件。內(nèi)部靜態(tài)變量與自動(dòng)變量的區(qū)別:內(nèi)部靜態(tài)變量占用永久性的存儲單元,在每次調(diào)用的過程中能夠保持?jǐn)?shù)據(jù)的連續(xù)性;自動(dòng)變量不能。四、靜態(tài)變量static

5變量的存儲屬性(續(xù))75

例11分析下列程序的運(yùn)行結(jié)果。

/*文件一*/

staticintx=2;/*說明外部靜態(tài)變量x*/inty=3;/*說明外部變量y*/externvoidadd2();/*說明外部函數(shù)add2*/voidadd1();main(){add1();add2();add1();add2();printf("x=%d;y=%d\n",x,y);}voidadd1()/*定義函數(shù)add1*/{x+=2;y+=3;printf("inadd1x=%d\n",x);}5變量的存儲屬性(續(xù))76/*文件二*/

staticint

x=10;

/*說明外部靜態(tài)變量x*/

voidadd2();

/*定義函數(shù)add2*/

{externint

y;

/*說明另一個(gè)文件中的外部變量y*/

x

+=10;

y

+=2;

printf("inadd2x=%d\n",

x);}5變量的存儲屬性(續(xù))77例12分析下列程序的運(yùn)行結(jié)果。#include<stdio.h>voidmain(){voidinc1(),inc2();inc1();inc1();inc1();inc2();inc2();inc2();}voidinc1(){intx=0;/*說明自動(dòng)變量x并賦初值*/

x++;printf("ininc1x=%d\n",x);}voidinc2(){staticintx=0;/*說明內(nèi)部靜態(tài)變量x并初始化*/

x++;printf("ininc2x=%d\n",

x);}5變量的存儲屬性(續(xù))785變量的存儲屬性(續(xù))五、寄存器變量register寄存器變量是使用中央處理器(CPU)的通用寄存器存儲的變量。當(dāng)變量使用非常頻繁時(shí),將變量定義為寄存器變量可以提高程序運(yùn)行速度。795變量的存儲屬性(續(xù))五、寄存器變量register寄存器是與機(jī)器硬件密切相關(guān)的,不同的計(jì)算機(jī),寄存器的數(shù)目不一樣,通常為2到3個(gè),若在一個(gè)函數(shù)中說明多于2到3個(gè)寄存器變量,編譯程序會自動(dòng)地將它們變?yōu)樽詣?dòng)變量。寄存器變量只能是char、int或指針型。寄存器說明符只能用于說明函數(shù)中的變量和函數(shù)中的形式參數(shù),外部變量或靜態(tài)變量不能是register。80

變量的初始化工作是由編譯系統(tǒng)控制。在編譯程序時(shí),系統(tǒng)為外部變量和靜態(tài)變量分配永久性的存儲單元并進(jìn)行初始化。在運(yùn)行程序時(shí),外部變量和靜態(tài)變量的初值是一定的。六、變量初始化變量初始化與賦初值的區(qū)別

變量的初始化要在運(yùn)行時(shí),由賦值操作進(jìn)行。在剛進(jìn)入一個(gè)函數(shù)時(shí),函數(shù)中說明的自動(dòng)變量和寄存器變量的值是不定的。對于自動(dòng)變量和寄存器變量對于外部變量和靜態(tài)變量5變量的存儲屬性(續(xù))81在函數(shù)中說明外部變量或靜態(tài)變量時(shí),可使用這樣的語句:

intx1=2,x2;staticinty=3;main(){staticintz=10;......}

這時(shí)編譯程序會自動(dòng)為x1、x2、y和z進(jìn)行初始化。不需要程序在運(yùn)行時(shí)再做賦值操作了。

5變量的存儲屬性(續(xù))82

對于變量x2在說明時(shí)沒指定初值的外部變量或靜態(tài)變量,編譯系統(tǒng)自動(dòng)將初值置為0。 這點(diǎn)與自動(dòng)變量和寄存器變量是根本不同的。5變量的存儲屬性(續(xù))83

這不是給自動(dòng)變量或寄存器變量初始化,是在運(yùn)行時(shí)執(zhí)行賦值操作為自動(dòng)變量或寄存器變量賦初值。

在函數(shù)中說明自動(dòng)變量或寄存器變量時(shí),可使用這樣的語句:

main(){intx=3;registerinty=4;...}5變量的存儲屬性(續(xù))84

性能自動(dòng)變量外部變量外部靜態(tài)內(nèi)部靜態(tài)寄存器變量 記憶能力無有有有無 多個(gè)函數(shù)共享否可可否否 在不同文件共享性否可否否否 未顯示賦值的取值不定000不定 變量初始化程序控制編譯器編譯器編譯器程序控制 作用域當(dāng)前函數(shù)整個(gè)程序文件函數(shù)當(dāng)前函數(shù)

存儲類型小結(jié)5變量的存儲屬性(完)85

遞歸是一種常用的程序設(shè)計(jì)技術(shù),在一個(gè)程序中,若存在程序自己調(diào)用自己的現(xiàn)象就是構(gòu)成了遞歸。 如果函數(shù)funA在執(zhí)行過程又調(diào)用函數(shù)funA自己,則稱函數(shù)funA為直接遞歸。 如果函數(shù)funA在執(zhí)行過程中先調(diào)用函數(shù)funB,函數(shù)funB在執(zhí)行過程中又調(diào)用函數(shù)funA,則稱函數(shù)funA為間接遞歸。一、遞歸的概念6函數(shù)的遞歸調(diào)用86

例13用遞歸函數(shù)求n!。

已知:n階乘的遞歸定義為:

n!=1當(dāng)n=0時(shí)

n!=n*(n-1)!當(dāng)n>=1時(shí)

voidmain(){intn,p;printf("N=?");scanf("%d",&n);p=facto(n);printf("%d!=%d\n",n,p);}facto(n)intn;{intr;if(n==0)r=1;elser=n*facto(n-1);/*遞歸調(diào)用*/

return(r);}二、遞歸程序的執(zhí)行過程6函數(shù)的遞歸調(diào)用87主函數(shù)第一次調(diào)用第二次第三次第四次

n=3p=facto(3)

調(diào)用└─→n=3r=3*facto(2)

調(diào)用└─→n=2r=2*facto(1)

調(diào)用└─→n=1r=1*facto(0)└─→n=0,r=1return(1)┌←─────┘返回

r=1*1=1

return(1)┌←─────┘返回

r=2*1=2return(2)┌←─────┘返回

r=3*2=6return(6)┌←──────┘返回

p=6

打印6facto(n)intn;{intr;if(n==0)r=1;elser=n*facto(n-1);return(r);}遞歸返回過程遞歸調(diào)用過程6函數(shù)的遞歸調(diào)用88遞歸調(diào)用的執(zhí)行過程facto(n)intn;{intr;if(n==0)r=1;elser=n*facto(n-1);return(r);}facto

(intn

){intr;if(n==0

)r=1;else{r=facto

(n-1);r=n*r;}return(r);}等價(jià)于當(dāng)n=0時(shí)n!=1當(dāng)n>=1時(shí)n!=n*(n-1)!6函數(shù)的遞歸調(diào)用89facto(intn){intr;if(n==0)r=1;else{r=facto(n-1);r=n*r;}return(r);}facto(intn)intr;if(n==0)facto(intn){intr;if(n==0)r=1;else{r=facto(n-1);r=n*r;}return(r);}r=facto(n-1)facto(intn)intr;if(n==0)facto(intn){intr;if(n==0)r=1;else{r=facto(n-1);r=n*r;}return(r);}r=facto(n-1)facto(intn){intr;if(n==0)r=1;else{r=facto(n-1);r=n*r;}return(r);}facto(intn)facto(intn)intr;intr;if(n==0)if(n==0)r=facto(n-1)r=1return(1)r=n*r=1*1return(1)return(2)r=n*r=2*1r=n*r=3*2return(6)1調(diào)用234調(diào)用調(diào)用321返回返回返回N=3N=2N=1N=06函數(shù)的遞歸調(diào)用90

例:求自然數(shù)1到n之和。 建立問題的遞歸定義:

f(n)=1 當(dāng)n=1時(shí)

f(n)=n+f(n-1)當(dāng)n>1時(shí) 程序:int

add(n) intn;{if(n==1)return(1);/*遞歸結(jié)束條件*/

if(n>1)return(n+add(n-1));}遞歸結(jié)束條件遞歸算法三、數(shù)值型問題的遞歸求解一般方法

從數(shù)學(xué)公式入手:推導(dǎo)出問題的遞歸定義;確定問題的邊界條件;再得到問題的遞歸算法和遞歸結(jié)束條件。6函數(shù)的遞歸調(diào)用91七、非數(shù)值型問題的遞歸求解一般方法

將問題化簡:分析在最簡單情況下問題的求解方法。此時(shí),求解的方法一定是非遞歸的算法,而且十分簡單。

分解:將一般的問題分解為兩個(gè)(或多個(gè))小問題,且每個(gè)分解后的小問題與原來的問題仍然是相似的,具有相同的性質(zhì),只是在問題的規(guī)模上有所縮小。6函數(shù)的遞歸調(diào)用92由第1步可以產(chǎn)生遞歸結(jié)束條件,由第3步可以推出遞歸算法。

七、非數(shù)值型問題的遞歸求解一般方法

建立模型:假設(shè)分解后的小問題已經(jīng)全部可以解決,將每個(gè)小問題看作一個(gè)整體,不再對小問題進(jìn)行分解,建立用小問題解決一般問題的算法。6函數(shù)的遞歸調(diào)用93

1. 若n為1位整數(shù)(0≤n≤9):則可直接輸出。 2. 將任一個(gè)整數(shù)n(****+)(n>=10)分為兩部分: ◆個(gè)位(+) ◆除個(gè)位以外的其余部分(****) 3. 將分解后的兩部分分別看成整體,則解決原來問題的算法可以描述為: ①輸出n的個(gè)位(+) ②反序輸出

n的除個(gè)位以外的其余部分(****) 由1推出遞歸終止條件。 由3得到遞歸算法。例14反序輸出整數(shù)n(n>=0)。

例如:n=12345,輸出54321。問題分析:941

2

3

4551

2

3441

23312211遞歸算法描述: 若:整數(shù)n只有1位數(shù)字 則:輸出該整數(shù)n;

否則:輸出n的個(gè)位; 反序輸出n的除個(gè)位以外的其余部分。進(jìn)行遞歸n/10printn(n)6函數(shù)的遞歸調(diào)用95程序:voidprintn(intn){if(0<=n&&n<=9)

printf(”%d”,n);

else{

printf(”%d”,n%10);/*輸出個(gè)位*/

printn(n/10);/*遞歸*/

}}6函數(shù)的遞歸調(diào)用96例15漢諾塔問題據(jù)說在約十九世紀(jì)末歐洲的商店中出售一種智力玩具,在一塊銅板上有三根桿,最左邊的桿上自上而下、由小到大順序串著由64個(gè)圓盤構(gòu)成的塔。 游戲的目的是將最左邊A桿上的圓盤,借助最右邊的C桿,全部移到中間

溫馨提示

  • 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論