《C語言程序設(shè)計(jì)教程(第4版)》第9章函數(shù)_第1頁
《C語言程序設(shè)計(jì)教程(第4版)》第9章函數(shù)_第2頁
《C語言程序設(shè)計(jì)教程(第4版)》第9章函數(shù)_第3頁
《C語言程序設(shè)計(jì)教程(第4版)》第9章函數(shù)_第4頁
《C語言程序設(shè)計(jì)教程(第4版)》第9章函數(shù)_第5頁
已閱讀5頁,還剩57頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第9章函數(shù)

用戶自定義函數(shù)函數(shù)間的數(shù)據(jù)傳遞函數(shù)的嵌套調(diào)用和遞歸調(diào)用變量的存儲(chǔ)類別本章要點(diǎn)**

一個(gè)C語言源程序通常由一個(gè)主函數(shù)和若干個(gè)子函數(shù)組成,各子函數(shù)之間的關(guān)系是平行的,因此不能嵌套定義,但能相互調(diào)用。一個(gè)C語言源程序無論包含了多少個(gè)函數(shù),程序的執(zhí)行總是從主函數(shù)main()開始,并終止于主函數(shù)main()。**通常將一個(gè)C語言源程序分解成一個(gè)或多個(gè)文件,這些文件可分別編寫、編譯、最后連接為一個(gè).EXE

文件。**從用戶使用的角度將函數(shù)分為兩種:標(biāo)準(zhǔn)函數(shù)(庫函數(shù))和用戶自定義函數(shù)。

9.1用戶自定義函數(shù)9.1.1用戶自定義函數(shù)的定義

[類型標(biāo)識(shí)符]函數(shù)名([形式參數(shù)表])

{[函數(shù)體]}函數(shù)名:由用戶命名,命名規(guī)則與標(biāo)識(shí)符命名規(guī)則相同。類型標(biāo)識(shí)符:

定義了函數(shù)返回值的數(shù)據(jù)類型。當(dāng)函數(shù)的返回值是整形或字符型,可省略類型標(biāo)識(shí)符。當(dāng)函數(shù)無返回值時(shí),則類型標(biāo)識(shí)符用void關(guān)鍵字。

形式參數(shù)表的一般形式為:類型標(biāo)識(shí)符形參1,類型標(biāo)識(shí)符形參2,···若省略形式參數(shù)表,則稱為無參函數(shù)。否則稱為有參函數(shù)。函數(shù)體:包含了說明語句和執(zhí)行語句。當(dāng)函數(shù)無函數(shù)體時(shí),則為空函數(shù)。例9.1:編寫一個(gè)求n!的函數(shù)(n為整數(shù))

longfac(intn){longk=1;inti; /*定義一個(gè)累乘器*/for(i=1;i<=n;i++)k*=i;return(k);}例9.2編寫一個(gè)打印30個(gè)*號(hào)的函數(shù)

voidprintstar() {intj;for(j=1;j<=30;j++)printf(“*”);}所定義的函數(shù)有返回值、返回值的類型為長整型,有一個(gè)形參,參數(shù)類型為整型所定義的函數(shù)無返回值,無形式參數(shù)9.1.2用戶自定義函數(shù)的返回值函數(shù)的返回值是通過return語句實(shí)現(xiàn)的。格式:return(表達(dá)式);或return表達(dá)式;語義:當(dāng)函數(shù)執(zhí)行到return語句時(shí),程序的流程立即返回到調(diào)用該函數(shù)的地方(通常稱為退出調(diào)用函數(shù)),并通過return語句返回函數(shù)值。return語句中表達(dá)式的值就是函數(shù)值。如果return語句不包含表達(dá)式,則返回一個(gè)不確定的函數(shù)值。longfac(intn){inti;longk;

for(i=1,k=1;i<=n;i++)k=k*i;

return(k);}

如果函數(shù)有返回值,這個(gè)值就應(yīng)該有一個(gè)確定的數(shù)據(jù)類型,所以在定義函數(shù)首部時(shí)應(yīng)指定函數(shù)值的類型。說明:在同一個(gè)函數(shù)內(nèi)可根據(jù)需要在多處設(shè)置return語句,函數(shù)執(zhí)行過程中遇到任何一個(gè)return語句時(shí),都將立即返回到調(diào)用該函數(shù)的地方。如果需要從被調(diào)函數(shù)中帶回一個(gè)確定的值,被調(diào)函數(shù)中必須包含return

語句。如果函數(shù)中沒有return語句,程序的流程一直執(zhí)行到函數(shù)末尾的右花括號(hào)“}”處,然后返回到調(diào)用該函數(shù)的地方并返回一個(gè)不確定的、無用的函數(shù)值。為了明確表示“不返回值”,可以用“void”定義“無類型”(或稱“空類型”)函數(shù)。max(intx,inty){if(x>y)returnx;elsereturny;}printf(“***”);9.1.3用戶自定義函數(shù)的調(diào)用1、函數(shù)的調(diào)用函數(shù)調(diào)用的一般形式:函數(shù)名([實(shí)參表])

實(shí)參表:可以是常量、變量或表達(dá)式。其類型、順序和個(gè)數(shù)必須與函數(shù)定義時(shí)形參表的一致。對于無參函數(shù),則省略實(shí)參,但括號(hào)不能省略。函數(shù)的調(diào)用過程:程序控制從主調(diào)函數(shù)轉(zhuǎn)移到被調(diào)函數(shù);將實(shí)參的值按位置一一對應(yīng)傳遞給形參;從被調(diào)函數(shù)的第一條語句開始執(zhí)行該函數(shù)各個(gè)語句;在執(zhí)行完所有語句或遇到return語句時(shí),返回到主調(diào)函數(shù)中原來的調(diào)用處繼續(xù)執(zhí)行主調(diào)函數(shù)。

主函數(shù)fun1

fun2{...

{...

{...fun1();

fun2()

...

...

...

......

...

...}RETURN}RETURN}

9.1.4用戶自定義函數(shù)的聲明

在一個(gè)函數(shù)中調(diào)用另一函數(shù)(即被調(diào)函數(shù))必須具備以下三個(gè)條件:被調(diào)函數(shù)必須是已經(jīng)存在的函數(shù)(標(biāo)準(zhǔn)函數(shù)或用戶自定義函數(shù))。如果調(diào)用的是標(biāo)準(zhǔn)函數(shù),一般還應(yīng)該在源程序的開始處用預(yù)處理命令

#include

將該函數(shù)對應(yīng)的頭文件包含進(jìn)來。如果調(diào)用用戶自定義函數(shù),而且該函數(shù)與調(diào)用它的函數(shù)(即主調(diào)函數(shù))在同一個(gè)文件中,一般還應(yīng)該在主調(diào)函數(shù)中對被調(diào)用函數(shù)返回值的類型以及形參的個(gè)數(shù)和類型作聲明。#include"stdio.h"main(){intm,n;longcmn;longfac(int);

printf("inputm,n:");scanf("%d%d",&m,&n);

cmn=fac(m)/fac(n)/fac(m-n);printf("%ld\n",cmn);}例9.3:試編寫一個(gè)C程序按下列公式求排列組合問題longfac(intn){inti;longk=1;for(i=1;i<=n;i++)k*=i;return(k);}Cmn=m!/(n!*(m-n)!)函數(shù)聲明的一般形式:類型標(biāo)識(shí)符被調(diào)函數(shù)的函數(shù)名([形式參數(shù)表]);這種包含參數(shù)和返回值類型的函數(shù)聲明稱為函數(shù)原型。注意:主調(diào)函數(shù)中的函數(shù)聲明只是聲明了要調(diào)用的函數(shù)返回值的類型以及形參的個(gè)數(shù)和類型,不是定義一個(gè)函數(shù)。函數(shù)聲明時(shí)指定的函數(shù)返回值類型必須與該函數(shù)定義時(shí)所指定的類型一致。在同一個(gè)文件中,如果被調(diào)函數(shù)位于主調(diào)函數(shù)之前,或者被調(diào)函數(shù)的返回值是int

型或char型時(shí),則對被調(diào)函數(shù)的聲明可以省略。用戶自定義函數(shù)的調(diào)用和函數(shù)的聲明例:

#include“stdio.h” main(){inta,b,c;

int

max(intx,inty);/*函數(shù)說明*/ scanf(“%d%d”,&a,&b);

c=max(a,b);/*函數(shù)調(diào)用*/ printf(“%d\n”,c);}

intmax(intx,inty)/*函數(shù)定義*/ {return(x>y?x:y);}9.1.5指針函數(shù)的定義和調(diào)用一個(gè)函數(shù)可以返回一個(gè)int型、float型、char型的數(shù)據(jù),也可以返回一個(gè)指針類型的數(shù)據(jù)。返回指針值的函數(shù)稱為指針函數(shù)。定義指針函數(shù)的一般形式為: 類型標(biāo)識(shí)符*函數(shù)名(參數(shù)表)例如:

int*pfun(floatx,floaty)【例9.5】下列程序是通過指針函數(shù),輸入一個(gè)1~7之間的整數(shù),輸出對應(yīng)的星期名。#include"stdio.h"main(){inti;char*day_name(intn);/*指針函數(shù)的聲明*/printf("inputDayNo:");scanf("%d",&i);if(i<0)exit(1);printf("DayNo:%2d-->%s\n",i,day_name(i));}char*day_name(intn)/*指針函數(shù)的定義*/{char*name[]={"Illegalday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"};return((n<1||n>7)?name[0]:name[n]);}函數(shù)的參數(shù)形參:形參出現(xiàn)在函數(shù)的定義中,在整個(gè)函數(shù)體內(nèi)可以使用,離開該函數(shù)則不能使用;形參必須是變量,在函數(shù)定義時(shí)必須進(jìn)行類型說明;函數(shù)調(diào)用時(shí),形參被臨時(shí)分配存儲(chǔ)單元,調(diào)用結(jié)束后,形參所占單元被釋放。實(shí)參:實(shí)參出現(xiàn)在主調(diào)函數(shù)中,在函數(shù)調(diào)用時(shí),把實(shí)參的值傳遞給形參,從而實(shí)現(xiàn)主調(diào)函數(shù)向被調(diào)函數(shù)的數(shù)據(jù)傳遞。實(shí)參可以是常量和有確定值的變量、數(shù)組元素或表達(dá)式9.2函數(shù)間的數(shù)據(jù)傳遞注意:在函數(shù)調(diào)用期間,實(shí)參和形參對應(yīng)不同的內(nèi)存單元,所以在被調(diào)函數(shù)中形參的改變不會(huì)影響到主調(diào)函數(shù)的實(shí)參,這是一種“單向傳值”調(diào)用。main(){inta,b,c;intmax(intx,inty);scanf(“%d%d”,&a,&b);c=max(a,b);printf(“%d\n”,c);}intmax(intx,inty){return(x>y?x:y);}在被定義的函數(shù)中,必須指定形參的類型。實(shí)參與形參應(yīng)在位置、個(gè)數(shù)、類型上保持一致。如果實(shí)參為整型而形參為實(shí)型,或者相反,則發(fā)生“類型不匹配”的錯(cuò)誤。但字符型與整型可以互相通用。C語言規(guī)定,實(shí)參變量對形參變量的數(shù)據(jù)傳遞是“單向值傳遞”。即數(shù)據(jù)只能由實(shí)參傳給形參,而不能由形參傳回給實(shí)參。關(guān)于單向傳值調(diào)用歸納如下:9.2.1簡單變量作函數(shù)實(shí)參如果主調(diào)函數(shù)的實(shí)參是數(shù)組元素,則對應(yīng)被調(diào)函數(shù)的形參應(yīng)是同類型的變量名,當(dāng)發(fā)生函數(shù)調(diào)用時(shí)將數(shù)組元素的值傳遞給相應(yīng)的形參變量main(){intx,y,m;intfun(inta,intb);

scanf("%d,%d",&x,&y);

min=fun(x

,y);

printf("min=%d\n",min);}intfun(inta,intb){intc;

if(a<b)c=a;elsec=b;

return(c);}x[2]x[0]x[1]x[0]x[1]函數(shù)的參數(shù)不僅可以是整型、實(shí)型、字符型等數(shù)據(jù),還可以是指針類型數(shù)據(jù)。【例9.7】交換兩個(gè)指針變量所指向的變量的值

#include"stdio.h"voidtest(int*p1,int*p2)/*形參為指針變量*/{intp;

p=*p1;*p1=*p2;*p2=p;

}main(){inta1=10,a2=20;

int*pa1,*pa2;

pa1=&a1;pa2=&a2;

test(pa1,pa2);/*指針變量作為函數(shù)的實(shí)參*/printf("%d,%d\n",a1,a2);}9.2.2指針變量作為函數(shù)參數(shù)voidtest(int*p1,int*p2)/*形參為指針變量*/{int*t;

t=p1;p1=p2;p2=t;

}main(){inta1=10,a2=20;

int*pa1,*pa2;

pa1=&a1;pa2=&a2;

test(pa1,pa2);/*指針變量作為函數(shù)的實(shí)參*/printf("%d,%d\n",a1,a2);}沒有改變主調(diào)函數(shù)中變量的值【例】交換兩個(gè)指針變量所指向的變量的值

voidtest(int*p1,int*p2)/*形參為指針變量*/{intp;

p=*p1;*p1=*p2;*p2=p;

}main(){inta1=10,a2=20;

int*pa1,*pa2;

pa1=&a1;pa2=&a2;

test(pa1,pa2);/*指針變量作為函數(shù)的實(shí)參*/printf("%d,%d\n",a1,a2);}inta[2]={10,20};test(a);voidtest(int*p){intt;t=*p;*p=*(p+1);*(p+1)=t;}9.2.3數(shù)組名和數(shù)組指針變量作函數(shù)參數(shù)對于數(shù)組來說,數(shù)組名、數(shù)組指針變量以及數(shù)組元素的指針均為指針類型數(shù)據(jù),當(dāng)它們作為函數(shù)的實(shí)參時(shí),相應(yīng)的形參應(yīng)為同類型的指針變量。main(){inta[20];

func(a,20);

}func(int*b,intn){

}main(){inta[20],*pa=a;

func(pa,20);

}func(int*b,intn){

}intb[]【例9.8】利用選擇法將數(shù)組中的n個(gè)整數(shù)由小到大排序。#include"stdio.h"main(){int[6]={10,4,12,34,2,56};inti;voidsort(int*b,intn);sort(a,6); for(i=0;i<6;i++) printf("%4d",a[i]);printf("\n");}voidsort(int*b,intn) {inti,j,k,t;for(i=0;i<n-1;i++){k=i;for(j=i+1;j<n;j++)

if(*(b+j)<*(b+k))k=j;

t=*(b+i);*(b+i)=*(b+k);*(b+k)=t;

}}

歸納起來,如果有一個(gè)實(shí)參數(shù)組,想通過函數(shù)調(diào)用改變此數(shù)組元素的值,實(shí)參與形參的對應(yīng)關(guān)系有以下4種等價(jià)形式:

形參和實(shí)參都用數(shù)組名;

實(shí)參用數(shù)組名,形參用數(shù)組指針變量;

實(shí)參形參都用數(shù)組指針變量;

實(shí)參為數(shù)組指針變量,形參為數(shù)組名。【例9.9】已知某班4位學(xué)生5門課的成績,計(jì)算總平均分?jǐn)?shù),并輸出某個(gè)學(xué)生各門課的成績。

二維數(shù)組的指針作函數(shù)實(shí)參時(shí),有列指針和行指針兩種形式。相應(yīng)的,用來接受實(shí)參數(shù)組指針的形參,必須使用相應(yīng)形式的指針變量,如下所示:(1)實(shí)參用列指針,形參用(列)指針變量。(2)實(shí)參用行指針,形參用行指針變量。9.2.4行數(shù)組指針變量作函數(shù)參數(shù)#include"stdio.h"main(){voidaverage(float*ap,intn,intk); /*函數(shù)的聲明*/voidsearch(float(*p)[6],intn,intm); /*函數(shù)的聲明*/floatcj[4][6]={{3,65,67,70,60,55},{6,80,87,90,81,94},{7,90,96,100,98,92},{9,77,69,73,80,90}};average(&cj[0][0],4,5);/*求4個(gè)學(xué)生5門課程的平均成績*/search(cj,4,7); /*查找學(xué)號(hào)為7的學(xué)生成績*/}voidaverage(float*ap,intn,intk)/*函數(shù)的定義,形參ap為列指針變量*/{inti;floatsum=0,ave;for(i=0;i<n*(k+1);i++,ap++)if(i%(k+1))/*跳過學(xué)號(hào)*/sum=sum+(*ap);ave=sum/(n*k);printf("average=%6.2f\n",ave);}voidsearch(float(*p)[6],intn,intm) /*函數(shù)的定義,形參p為行指針變量*/{inti,j;for(i=0;i<n;i++)if(**(p+i)==m){printf("ThescoresofNo%dstudentare:\n",m);for(j=1;j<6;j++)printf("%6.1f",*(*(p+i)+j));}printf("\n");}

將一個(gè)字符串從一個(gè)函數(shù)傳遞到另一個(gè)函數(shù),只需要傳遞字符串的首地址。這時(shí)實(shí)參為字符串首地址,對應(yīng)的形參應(yīng)為字符型指針變量(也可以寫成字符型數(shù)組的定義形式)。9.2.5字符型指針變量作函數(shù)參數(shù)【例9.10】編寫程序通過調(diào)用字符串拷貝函數(shù)來實(shí)現(xiàn)字符串的復(fù)制。(1)形參用字符數(shù)組作參數(shù)#include"stdio.h“main(){voidscopy(chara[],charb[]);chars1[]="IloveChina.";chars2[]="IloveBeijing.";printf("s1:%s\ns2:%s\n",s1,s2);scopy(s1,s2);printf("s1:%s\ns2:%s\n",s1,s2);}voidscopy(chara[],charb[]){inti;for(i=0;a[i]!='\0';i++)b[i]=a[i];b[i]='\0';}【例9.10】編寫程序通過調(diào)用字符串拷貝函數(shù)來實(shí)現(xiàn)字符串的復(fù)制。(2)形參用字符指針變量voidscopy(char*p1,char*p2){inti;

for(;*p1!='\0';p1++,p2++)*p2=*p1;

*p2='\0';}歸納起來,作為函數(shù)參數(shù),有以下幾種情況:(1)形參和實(shí)參都用數(shù)組名。(2)實(shí)參用數(shù)組名,形參用字符指針變量。(3)實(shí)參形參都用字符指針變量。(4)實(shí)參用字符指針變量,形參為數(shù)組名。9.2.5字符型指針變量作函數(shù)參數(shù)

定義指向函數(shù)的指針變量的一般形式為: 類型標(biāo)識(shí)符(*指針變量名)();“類型標(biāo)識(shí)符”是指函數(shù)返回值的類型。例如:

int(*pf)();注意,(*pf)兩側(cè)的括弧是必需的。函數(shù)名代表該函數(shù)的入口地址。因此,可用函數(shù)名給指向函數(shù)的指針變量賦值。格式為:

指向函數(shù)的指針變量=函數(shù)名;

例如: pf=fun;9.2.6指向函數(shù)的指針變量作為函數(shù)參數(shù)1.指向函數(shù)指針變量的定義和賦值給函數(shù)指針賦值后,就可以引用它了。函數(shù)的調(diào)用可以通過函數(shù)名調(diào)用,也可以通過指向函數(shù)的指針變量調(diào)用。

用函數(shù)名調(diào)用的一般形式為: 函數(shù)名(實(shí)參表);用指向函數(shù)的指針變量調(diào)用的一般形式為:

(*指針變量名)(實(shí)參表);9.2.6指向函數(shù)指針變量的定義和賦值【例9.11】使用指向函數(shù)的指針變量調(diào)用函數(shù)。#include"stdio.h"main(){intadd(inta,intb),(*pf)();

intx,y,z;

pf=add;/*pf指向函數(shù)add*/printf("Inputx,y:");

scanf("%d,%d",&x,&y);

z=(*pf)(x,y);/*調(diào)用函數(shù)add*/printf("x=%d,y=%d,sum=%d\n",x,y,z);}intadd(inta,intb){return(a+b);}

指向函數(shù)的指針變量也可以作為函數(shù)的參數(shù);即將函數(shù)的入口地址傳遞給函數(shù),也就是將函數(shù)名傳給形參,從而實(shí)現(xiàn)利用相同的函數(shù)調(diào)用語句調(diào)用不同函數(shù)的目的?!纠?.12】用函數(shù)指針變量實(shí)現(xiàn)四則運(yùn)算。2.指向函數(shù)指針變量作函數(shù)參數(shù)#include"stdio.h"doubleadd(doublex,doubley){return(x+y);}doublesub(doublex,doubley){return(x-y);}doublemult(doublex,doubley){return(x*y);}doubledivi(doublex,doubley){return(x/y);}doubleresult(doublex,doubley,double(*pf)(double,double)){doubles;s=(*pf)(x,y);return(s);}main(){doublea,b,s;charop;printf("pleaseselectyouroperation(input+,,*or/)\n");scanf("%c",&op);printf("pleaseinputthetwooperand\n");scanf("%lf,%lf",&a,&b);switch(op){ case'+':s=result(a,b,add);break; case'':s=result(a,b,sub);break; case'*':s=result(a,b,mult);break; case'/':s=result(a,b,divi);break;}printf("theoperationis:%lf%c%lf=%lf\n",a,op,b,s);}主函數(shù)的原形如下:main(intargc,char*argv[]){…

}

其中,argc和argv就是main()函數(shù)的形參。argc是整形變量,argv[]是一個(gè)字符型指針數(shù)組。main()函數(shù)是由操作系統(tǒng)調(diào)用的,它的參數(shù)由操作系統(tǒng)傳遞,所以運(yùn)行帶形參的主函數(shù)時(shí),必須在操作系統(tǒng)命令狀態(tài)下,輸入命令行:命令名參數(shù)1參數(shù)2…

參數(shù)n9.2.7main()函數(shù)的形參

當(dāng)操作系統(tǒng)調(diào)用main()函數(shù)時(shí),將命令行中的命令名和各個(gè)參數(shù)都看成為一個(gè)個(gè)字符串,將字符串的個(gè)數(shù)傳給argc,將各個(gè)字符串的首地址傳給argv字符數(shù)組的每個(gè)元素,即:

argv[0]指向“命令名”字符串

argv[1]指向“參數(shù)1”字符串

argv[2]指向“參數(shù)2”字符串

例如有一個(gè)C語言的程序,該程序的可執(zhí)行文件名為file1.exe,則命令行格式為:

file1.exehelloworld<Enter>由于它有兩個(gè)參數(shù),再加上命令名,故在程序運(yùn)行時(shí):argc的值為3;argv[0]、argv[1]、argv[2]分別指向字符串“file1.exe”、“hello”、“world”?!纠?.13】編寫程序輸出命令行中命令名和各參數(shù)。#include<stdio.h>main(intargc,char*argv[]){intk;

for(k=0;k<argc;k++)printf("arg%d:%s\n",k,argv[k]);}假設(shè)該程序的可執(zhí)行文件名為test.exe,輸入:test.exeBeijingShanghaiQingdao

Guangzhou<Enter>則運(yùn)行結(jié)果是:arg0:test.exearg1:Beijingarg2:Shanghaiarg3:Qingdaoarg4:Guangzhou9.3.1函數(shù)的嵌套調(diào)用

C語言函數(shù)的定義是平行的、獨(dú)立的,不能嵌套定義,但可以嵌套調(diào)用。也就是說,在調(diào)用一個(gè)函數(shù)的過程中,被調(diào)函數(shù)又可以調(diào)用另一個(gè)函數(shù)。9.3函數(shù)的嵌套調(diào)用和遞歸調(diào)用例:求組合,,,其中:

主函數(shù)fun1

fun2{...

{...

{...fun1();

fun2()

...

...

...

......

...

...}RETURN}RETURN}

函數(shù)的嵌套調(diào)用和遞歸調(diào)用}{inti;longk=1;for(i=1;i<=n;i++)k*=i;returnk;}printf(“c(9,3)=%ld\n",cmn(9,3));main(){}doublecmn(intm,intn){doublec;c=fac(m)/fac(n)/fac(m-n);returnc;longfac(intn)doublecmn(intmintn);longfac(intn);printf(“c(8,2)=%ld\n",cmn(8,2));printf(“c(7,5)=%ld\n",cmn(7,5));9.3.2函數(shù)的遞歸

一個(gè)函數(shù)直接或間接地調(diào)用該函數(shù)本身,稱為函數(shù)的遞歸調(diào)用。一個(gè)問題要采用遞歸方法來解決時(shí),必須滿足以下三個(gè)條件:可以把要解決的問題轉(zhuǎn)化為一個(gè)新的問題,而這個(gè)新的問題的解法仍與原來的解法相同,只是所處理的對象有規(guī)律地遞增或遞減。可以應(yīng)用這個(gè)轉(zhuǎn)化過程使問題得到解決。必定要有一個(gè)明確的結(jié)束遞歸的條件。longfac(intn){longf;if(n==0||n==1)f=1;elsef=n*fac(n-1);return(f);}main(){longnf;nf=fac(3);printf(“3!=%ld\n”,nf);} 1n=0,1n!= n*(n-1)!n>1例:利用遞歸計(jì)算n!

1n=0,1fac(n)= n*fac(n-1)n>19.4變量的存儲(chǔ)類別C語言中的每個(gè)變量和函數(shù)都有兩個(gè)屬性:數(shù)據(jù)類型和數(shù)據(jù)的存儲(chǔ)類別。數(shù)據(jù)的存儲(chǔ)類別指的是數(shù)據(jù)在內(nèi)存中的存儲(chǔ)方法。分為:靜態(tài)存儲(chǔ)類和動(dòng)態(tài)存儲(chǔ)類。變量的存儲(chǔ)類別決定了變量的作用域和生存期。變量的數(shù)據(jù)類型決定了變量的取值范圍。變量的存儲(chǔ)類別作用域:變量能夠起作用的程序范圍。分局部變量和全局變量。生存期:變量占用內(nèi)存單元的時(shí)限。有的變量可能在整個(gè)程序運(yùn)行期間一直存在(占用內(nèi)存空間),此變量稱為靜態(tài)變量;也有的變量可能只在某個(gè)函數(shù)的執(zhí)行期間才存在,這種變量稱為是動(dòng)態(tài)變量。與存儲(chǔ)類別有關(guān)的說明符有四個(gè),即:auto,static,register,extern程序區(qū)靜態(tài)存儲(chǔ)區(qū)動(dòng)態(tài)存儲(chǔ)區(qū)1.局部變量

在函數(shù)內(nèi)(或復(fù)合語句中)定義的變量稱為局部變量。函數(shù)的形參屬于局部變量。局部變量的作用域:本函數(shù)(或復(fù)合語句)內(nèi)。

如:main(){inta,b;/*局部變量a,b在main中有效*/······

{intb,c;/*局部變量b,c在復(fù)合語句中有效*/······}······}floatf1(inta){intb,c; ……}9.4.1局部變量及其存儲(chǔ)類別2.局部變量的存儲(chǔ)類別有三種:

auto,static和register。

auto變量:

在函數(shù)體中定義的局部變量如果使用“auto”關(guān)鍵字或缺省該關(guān)鍵字,這種局部變量叫“自動(dòng)變量”。

如:autointa,b;或inta,b;

自動(dòng)變量的生存期:函數(shù)被調(diào)用期間自動(dòng)變量的值:存放在動(dòng)態(tài)存儲(chǔ)區(qū)中【例9.18】自動(dòng)變量示例。

#include"stdio.h"main(){intk;intf(intb);for(k=1;k<=4;k++)f(k);}intf(intb){inta=10;printf(“%d+%d=%d\n”,a,b,a+b);a+=10;}運(yùn)行結(jié)果:10+1=1110+2=1210+3=1310+4=14注意:

**

在函數(shù)中必須有賦值或賦初值的語句,否則變量的值不定,稱為“無定義”。

**

在同一函數(shù)的兩次調(diào)用之間,自動(dòng)變量的值不保留。(2)靜態(tài)局部變量

在函數(shù)體中定義的局部變量如果使用“static”關(guān)鍵字,稱為“靜態(tài)局部變量”。

如:staticinta=10;

靜態(tài)局部變量的生存期:整個(gè)程序運(yùn)行期間靜態(tài)局部變量的值:存放在靜態(tài)存儲(chǔ)區(qū)中

注意:

**

在整個(gè)程序的運(yùn)行期間,靜態(tài)局部變量占據(jù)的存儲(chǔ)單元一直保留而不釋放,直到程序運(yùn)行結(jié)束。

**

兩次函數(shù)調(diào)用期間變量的值保持連續(xù)?!纠?.19】局部靜態(tài)變量示例。

#include"stdio.h"main(){intk;intf(intb);for(k=1;k<=4;k++)f(k);}intf(intb){staticinta=10;printf(“%d+%d=%d\n”,a,b,a+b);a+=10;}運(yùn)行結(jié)果:10+1=1120+2=2230+3=3340+4=44說明:(1)靜態(tài)局部變量在編譯時(shí)賦初值,程序運(yùn)行時(shí),每次調(diào)用函數(shù),該變量保留上一次的值,而非初值。自動(dòng)變量在執(zhí)行時(shí)賦初值。(2)若定義時(shí)不賦初值,則局部靜態(tài)變量為0,自動(dòng)變量值不定。(3)函數(shù)調(diào)用結(jié)束后,雖然靜態(tài)局部變量有值,但其他函數(shù)不能使用它。(3)register變量

在函數(shù)體中定義的局部變量如果使用“register”字樣存儲(chǔ)類別關(guān)鍵字,這種局部變量叫“寄存器變量”。

如:registerinta,b;

寄存器變量的生存期:函數(shù)被調(diào)用期間寄存器變量的值:存放在CPU的寄存器中注意:

**CPU中寄存器的數(shù)目是有限的,因此只能說明少量的寄存器變量。

**

由于register

變量的值是放在寄存器內(nèi)而不是放在內(nèi)存中,所以

register

變量沒有地址,也就不能對他進(jìn)行求地址運(yùn)算。

**

register變量的說明應(yīng)盡量靠近其使用的地方,用完之后盡快釋放,以便提高寄存器的利用效率。9.4.2全局變量及其存儲(chǔ)類別

全局變量:在函數(shù)外部定義的變量稱為全局變量。

全局變量的作用域:從定義變量的位置開始到整個(gè)源文件結(jié)束止。注意:在一個(gè)函數(shù)內(nèi)部,既可以使用本函數(shù)定義的局部變量,也可以使用有效的全局變量(在此函數(shù)之前定義的全局變量)。規(guī)定:在同一個(gè)文件中,若全局變量與局部變量同名,則在局部變量的作用域內(nèi),全局變量不起作用。例:#include"stdio.h"intk=10;main(){intm,j=k;intk=20;m=k;printf(“%d,%d,%d\n”,k,j,m);}結(jié)果:20,10,202.全局變量的存儲(chǔ)類別:

外部的(extern)和靜態(tài)的(static)

(1)外部全局變量(extern)

在定義全局變量時(shí)缺省其存儲(chǔ)類別,則稱為“外部變量”。外部變量的生存期:整個(gè)程序的運(yùn)行期間

外部變量的值:存放在靜態(tài)存儲(chǔ)區(qū)例9.21:已知兩個(gè)實(shí)數(shù),編寫一函數(shù)求其和、差、積、商。floatsum=0,mul=0,sub=0;/*定義全局變量*/floatsdj(floatx,floaty){sum=x+y;

sub=x-y;

mul=x*y;

return(x/y);}main(){floatx,y,z;

scanf("%f,%f",&x,&y);

z=sdj(x,y);

printf("%f,%f,%f,%f\n",sum,sub,mul,z);}

程序運(yùn)行結(jié)果:8,20<Enter>28.000000,-12.000000,160.000000,0.400000floatf1(){externinta;……}floatf2(){……}intafloatf3(){……}/*文件1*/intx;main(){……}/*文件3*/externintx;f2(){……}/*文件2*/

externintx;f1(){……}注意:如果在外部變量的定義點(diǎn)之前需使用全局變量,應(yīng)在該函數(shù)中進(jìn)行外部變量的說明,格式為:

extern外部變量名表

用extern對全局變量加以聲明,就可將其作用域擴(kuò)充到整個(gè)源文件或其它源文件中?!纠?22】外部變量示例

#include"stdio.h"

intmax(intx

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論