《新編C語(yǔ)言程序設(shè)計(jì)教程》課件第7章_第1頁(yè)
《新編C語(yǔ)言程序設(shè)計(jì)教程》課件第7章_第2頁(yè)
《新編C語(yǔ)言程序設(shè)計(jì)教程》課件第7章_第3頁(yè)
《新編C語(yǔ)言程序設(shè)計(jì)教程》課件第7章_第4頁(yè)
《新編C語(yǔ)言程序設(shè)計(jì)教程》課件第7章_第5頁(yè)
已閱讀5頁(yè),還剩119頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第7章函數(shù)7.1函數(shù)的定義7.2函數(shù)的調(diào)用7.3數(shù)據(jù)傳遞方法7.4嵌套調(diào)用和遞歸調(diào)用7.5變量的作用域7.6變量的存儲(chǔ)類(lèi)別7.7結(jié)構(gòu)化程序設(shè)計(jì)方法7.1函數(shù)的定義7.1.1函數(shù)的結(jié)構(gòu)1.函數(shù)頭函數(shù)頭有經(jīng)典與現(xiàn)代兩種形式,現(xiàn)代形式稱為函數(shù)原型。經(jīng)典形式: 函數(shù)屬性函數(shù)類(lèi)型函數(shù)名(函數(shù)參數(shù)表)

參數(shù)說(shuō)明:例如:

static?float?f1(a,b,c)/*函數(shù)特征說(shuō)明*/ float?a,b,c;/*參數(shù)說(shuō)明*/

函數(shù)屬性為static,函數(shù)類(lèi)型為float,函數(shù)名為f1,函數(shù)參數(shù)表為“a,b,c”?,F(xiàn)代形式:函數(shù)屬性函數(shù)類(lèi)型函數(shù)名(參數(shù)說(shuō)明)

例如:

static?double?f2(floatx,floaty,floatz)

說(shuō)明:

(1)函數(shù)的屬性或稱函數(shù)的存儲(chǔ)屬性包括內(nèi)部函數(shù)與外部函數(shù)兩種。內(nèi)部函數(shù)用保留字static描述,又稱靜態(tài)函數(shù)。外部函數(shù)用保留字extern標(biāo)識(shí)。缺省函數(shù)的屬性默認(rèn)為外部函數(shù)。外部函數(shù)可以供構(gòu)成程序的所有文件中的函數(shù)調(diào)用,內(nèi)部函數(shù)只有同一程序文件中的函數(shù)才能調(diào)用。

(2)函數(shù)類(lèi)型給出函數(shù)返回值的數(shù)據(jù)類(lèi)型,缺省時(shí)默認(rèn)為int型。當(dāng)函數(shù)沒(méi)有返回值時(shí),函數(shù)為無(wú)類(lèi)型,標(biāo)準(zhǔn)C語(yǔ)言中用保留字void標(biāo)識(shí)無(wú)類(lèi)型(或稱空類(lèi)型)。此時(shí)函數(shù)相當(dāng)于其它高級(jí)語(yǔ)言中的過(guò)程子程序。(3)函數(shù)名可以是任何合法的標(biāo)識(shí)符,是程序設(shè)計(jì)人員為函數(shù)取的名字。函數(shù)的名字實(shí)際上表示的是函數(shù)被調(diào)用時(shí)的入口地址。

(4)函數(shù)中的參數(shù)稱為形式參數(shù)(簡(jiǎn)稱形參),參數(shù)的主要作用是在函數(shù)被調(diào)用時(shí)實(shí)現(xiàn)主調(diào)函數(shù)與被調(diào)函數(shù)之間的數(shù)據(jù)傳遞,同時(shí)參數(shù)在相應(yīng)函數(shù)體內(nèi)可同普通變量一樣使用。注意:在現(xiàn)代定義形式中,每個(gè)參數(shù)必須分別指明其數(shù)據(jù)類(lèi)型,即使是相同類(lèi)型的參數(shù)也必須分開(kāi)說(shuō)明。(5)函數(shù)可以無(wú)參數(shù),此時(shí)稱為無(wú)參函數(shù)。主函數(shù)也可以有參數(shù),這將在第10章中加以介紹。

(6)鼓勵(lì)讀者采用函數(shù)原型的現(xiàn)代形式。本書(shū)前兩部分還是采用傳統(tǒng)形式,第三部分采用現(xiàn)代形式。2.函數(shù)體函數(shù)體由服務(wù)于函數(shù)的數(shù)據(jù)說(shuō)明與執(zhí)行語(yǔ)句兩部分組成。函數(shù)的數(shù)據(jù)說(shuō)明包括數(shù)據(jù)定義和數(shù)據(jù)申明,用以完成數(shù)據(jù)描述。函數(shù)的執(zhí)行語(yǔ)句完成函數(shù)的操作描述。

TurboC中的數(shù)據(jù)說(shuō)明必須位于函數(shù)體或復(fù)合語(yǔ)句的開(kāi)始處,但在C++中可根據(jù)需要隨時(shí)描述數(shù)據(jù)。一個(gè)函數(shù)的函數(shù)體可以為空,此時(shí)的函數(shù)稱為空函數(shù)。空函數(shù)不產(chǎn)生任何操作,常用于程序調(diào)試??蘸瘮?shù)的形式為:

voidf(?){?}7.1.2返回語(yǔ)句

通過(guò)在函數(shù)中使用返回語(yǔ)句,返回一個(gè)值給函數(shù),同時(shí)終止函數(shù)的調(diào)用,返回主函數(shù)。格式:return(表達(dá)式);

或return表達(dá)式;

功能:(1)計(jì)算表達(dá)式的值,將表達(dá)式的值返回給函數(shù)。

(2)從被調(diào)用的函數(shù)返回主調(diào)函數(shù)。

說(shuō)明:

(1)返回值類(lèi)型應(yīng)和函數(shù)類(lèi)型一致,不一致時(shí)返回值將自動(dòng)轉(zhuǎn)換成函數(shù)類(lèi)型。

(2)函數(shù)中可以有多條返回語(yǔ)句,這時(shí)一般與if語(yǔ)句聯(lián)用,執(zhí)行到哪一條返回語(yǔ)句,哪一條返回語(yǔ)句就起作用。

(3)函數(shù)中無(wú)返回語(yǔ)句,則執(zhí)行至函數(shù)體結(jié)尾時(shí)返回。此時(shí)將返回一個(gè)不確定的值給函數(shù)。

(4)如果只需要從函數(shù)中返回,而不需帶回值,那么可使用不帶表達(dá)式的return語(yǔ)句和void類(lèi)型函數(shù)。7.1.3函數(shù)的定義(1)需定義函數(shù)的屬性。(2)需定義函數(shù)的類(lèi)型。(3)給函數(shù)取一個(gè)名字。(4)設(shè)計(jì)函數(shù)的參數(shù)。(5)對(duì)函數(shù)中使用的量進(jìn)行定義。(6)對(duì)函數(shù)的執(zhí)行部分進(jìn)行描述。例7–1

求兩個(gè)數(shù)的最大值函數(shù)。/*求兩個(gè)數(shù)的最大值函數(shù)*/floatmax(x,y)(1)函數(shù)值類(lèi)型floatfloatx,y;(2)函數(shù)名max{floatm;(3)函數(shù)參數(shù)x、y,類(lèi)型為floatif(x>y)m=x;elsem=y;return(m);/*返回最大值*/}說(shuō)明:

(1)函數(shù)頭可以采用現(xiàn)代形式:floatmax(floatx,floaty)(2)函數(shù)體也有多種等價(jià)形式:形式一:if(x>y)return(x);elsereturn(y);形式二:return(x>y?x:y);例7-2

判斷兩個(gè)數(shù)是否是相等函數(shù)。方法一:/*判斷兩個(gè)數(shù)是否是相等函數(shù)*/inteq(x,y)(1)函數(shù)值類(lèi)型int,可以缺省floatx,y;(2)函數(shù)名eq{floatt;(3)函數(shù)參數(shù)x、y,類(lèi)型為floatif(x==y)t=1;elset=0;return(t);/*相等返回1,不等返回0*/}方法二:

/*判斷兩個(gè)數(shù)是否是相等函數(shù)*/inteq(x,y)floatx,y;{if(x==y)return(1);elsereturn(0);}方法三:

/*判斷兩個(gè)數(shù)是否是相等函數(shù)*/inteq(x,y)floatx,y;{return(x==y);}例7-3

符號(hào)函數(shù)。

方法一:/*符號(hào)函數(shù)*/charsign(x) /*函數(shù)值類(lèi)型為char*/floatx; /*函數(shù)名為sign*/{chars;/*函數(shù)參數(shù)為x,類(lèi)型為float*/if(x>=0)s='+';

elses='?';

return(s);

}方法二:

/*符號(hào)函數(shù)*/ charsign(x) floatx;

{if(x>=0)return('+');

elsereturn('?');}例7-4

平方函數(shù)。

/*平方函數(shù)*/ floatsq(x) /*函數(shù)值類(lèi)型為float*/ float /*函數(shù)名為sq*/ {return(x*x); /*函數(shù)參數(shù)為x,類(lèi)型為float*/}例7-5

素?cái)?shù)判斷函數(shù)。/*素?cái)?shù)判斷函數(shù)*/intpn(n) /*函數(shù)值類(lèi)型為int*/intn /*函數(shù)名為pn*/{inti; /*函數(shù)參數(shù)為n,類(lèi)型為int*/intflag; /*素?cái)?shù)標(biāo)志*/flag=1;

for(i=2;i<=n/2;i++)if(n%i==0){flag=0;break;}return(flag);

}例7-6

階乘函數(shù)。

/*階乘函數(shù)*/ longintfn(n) /*函數(shù)值類(lèi)型為longint*/ intn; /*函數(shù)名為fn*/ {inti; /*函數(shù)參數(shù)為n,類(lèi)型為int*/ longintt;

t=1;

for(i=1;i<=n;i++)t*=i;

return(t);}例7-7

求三角形面積的函數(shù)。/*求三角形面積的函數(shù)*/floatsabc(a,b,c)/*函數(shù)值類(lèi)型為float*/floata,b,c;/*函數(shù)名為sabc*/{floathl;/*函數(shù)參數(shù)為a、b、c,類(lèi)型均為float*/hl=0.5*(a+b+c);

return(sqrt(hl*(hl?a)*(hl?b)*(hl?c)));

}

注意:C語(yǔ)言的函數(shù)是平等的并列的關(guān)系,C語(yǔ)言的函數(shù)體中不能包含函數(shù)的定義,即不允許函數(shù)嵌套定義。7.2函數(shù)的調(diào)用7.2.1函數(shù)調(diào)用的一般形式函數(shù)調(diào)用的一般形式為:

函數(shù)名(實(shí)參表);

說(shuō)明:(1)如果調(diào)用無(wú)參函數(shù),則無(wú)實(shí)參表,此時(shí)小括號(hào)不能省略。

(2)調(diào)用時(shí),實(shí)參與形參的個(gè)數(shù)應(yīng)相同,類(lèi)型應(yīng)一致。

(3)實(shí)參與形參按順序?qū)?yīng),一一傳遞數(shù)據(jù)。調(diào)用后,形參得到實(shí)參的值。

(4)實(shí)參可以是表達(dá)式。如是表達(dá)式實(shí)參,先計(jì)算表達(dá)式的值,再將值傳遞給形參。(5)在C語(yǔ)言中,實(shí)參與形參的結(jié)合順序有的系統(tǒng)按自左至右的常規(guī)順序,有的系統(tǒng)則按自右至左的特殊順序。大多數(shù)C(包括TurboC)語(yǔ)言采用自右而左的順序結(jié)合。例如:

inti=3;

printf?("%d,%d",i,++i);①實(shí)參與形參自左至右結(jié)合,輸出3,4。②實(shí)參與形參自右至左結(jié)合,輸出4,4。為了避免出現(xiàn)意外情況,應(yīng)盡可能將參數(shù)表達(dá)式的計(jì)算移至調(diào)用函數(shù)前進(jìn)行。7.2.2函數(shù)調(diào)用的方式

1.表達(dá)式方式

函數(shù)調(diào)用出現(xiàn)在一個(gè)表達(dá)式中,這種表達(dá)式稱為函數(shù)表達(dá)式。這時(shí)要求函數(shù)返回一個(gè)確定的值以參加表達(dá)式的運(yùn)算。例如:y=max(a,b)+max(c,d),兩次函數(shù)調(diào)用都是表達(dá)式的一部分,分別以返回a與b、c與d的最大值參與表達(dá)式運(yùn)算。2.語(yǔ)句方式把函數(shù)調(diào)用作為一個(gè)語(yǔ)句,常用于只要求函數(shù)完成一定的操作,不要求函數(shù)返回值的情況。這在scanf(?)函數(shù)及printf(?)函數(shù)的調(diào)用中已多次使用。在其它高級(jí)語(yǔ)言中,函數(shù)的調(diào)用只能以表達(dá)式方式進(jìn)行。C語(yǔ)言中的語(yǔ)句方式調(diào)用,實(shí)際上還是以表達(dá)式方式調(diào)用為基礎(chǔ),其實(shí)就是一種表達(dá)式語(yǔ)句調(diào)用。3.參數(shù)方式函數(shù)調(diào)用作為另一個(gè)函數(shù)的實(shí)參。例如:m=max(max(a,b),max(c,d)),max(a,b)與max(c,d)兩次函數(shù)調(diào)用作為另一次max()函數(shù)調(diào)用的實(shí)參,用來(lái)求出a、b、c、d的最大值。以參數(shù)方式調(diào)用實(shí)際上是表達(dá)式調(diào)用方式的一種特殊情況。例7-8

用調(diào)用函數(shù)的方式來(lái)求下面兩個(gè)三角形的面積。

算法提示:

(1)在主函數(shù)中進(jìn)行能不能構(gòu)成三角形的判斷。

(2)主函數(shù)通過(guò)兩次調(diào)用求三角形面積的函數(shù)分別求出兩個(gè)三角形的面積,并輸出。

(3)求三角形面積的函數(shù)參見(jiàn)例7-7。/*程序7-8,用調(diào)用函數(shù)的方式來(lái)求三角形的面積*/floatsf(a,b,c)/*求三角形面積的函數(shù)*/floata,b,c;{floathl;

hl=0.5(a+b+c);

return(sqrt(hl*(hl?a)*(hl?b)*(hl?c)));}main(?)/*主函數(shù)*/{floatx,y,z;

clrscr(?);/*求第一個(gè)三角形的面積*/x=3,y=4,z=5;if((x+y>z)&&(y+z>x)&&(z+x>y))printf("三邊為%5.2f,%5.2f,%5.2f的三角形面積等于%5.2f\n",sf(x,y,z));

elseprintf("不能構(gòu)成三角形!\n");

/*求第二個(gè)三角形的面積*/x=y=z=1;

if((x+y>z)&&(y+z>x)&&(z+x>y))printf("三邊為%5.2f,%5.2f,%5.2f的三角形面積等于%5.2f\n",sf(x,y,z));

elseprintf("不能構(gòu)成三角形!\n");}運(yùn)行結(jié)果:三邊為3.00,4.00,5.00f的三角形面積等于6.00

三邊為1.00,1.00,1.00f的三角形面積等于0.43

例7-9

調(diào)用函數(shù)求2~1000之間的所有素?cái)?shù)。算法提示:

(1)對(duì)2~1000之間的某個(gè)數(shù),調(diào)用素?cái)?shù)判斷函數(shù)來(lái)判斷這個(gè)數(shù)是否為素?cái)?shù)。

(2)對(duì)2~1000之間所有數(shù)的判斷處理,可用for循環(huán)999次調(diào)用素?cái)?shù)判斷函數(shù)來(lái)完成。

(3)素?cái)?shù)判斷函數(shù)參見(jiàn)例7-5。程序如下:/*程序7-9,調(diào)用函數(shù)求2~1000之間的所有素?cái)?shù)*/intpf(n)/*素?cái)?shù)判斷函數(shù)*/intn;{inti;intflag;flag=1;for(i=2;i<=n/2;i++)

if(n%i==0){flag=0;break;}return(flag);}main()/*主函數(shù)*/{inti;intcount=0;/*統(tǒng)計(jì)素?cái)?shù)個(gè)數(shù),用以控制輸出格式*/clrscr();printf(″2~1000之間的素?cái)?shù)如下:\n″);for(i=2;i<=1000;i++)

if(pf(i)==1)

{printf(″%6d″,i);count++;if(count%5==0)printf(″\n″);/*每行輸出5個(gè)素?cái)?shù)*/}}7.2.3被調(diào)函數(shù)說(shuō)明

用戶自定義函數(shù)一般需在調(diào)用前在主調(diào)函數(shù)中進(jìn)行說(shuō)明。函數(shù)說(shuō)明是一種申明,是告訴主調(diào)函數(shù)這里調(diào)用的是一個(gè)什么樣的函數(shù)。函數(shù)說(shuō)明的一般形式為:

被調(diào)函數(shù)類(lèi)型被調(diào)函數(shù)名();

注意,不是函數(shù)定義,其后有分號(hào)。例7-10

求2~n之間的所有素?cái)?shù)。main(){intn;inti;intcount=0;intpf();/*函數(shù)說(shuō)明*/clrscr();printf(″請(qǐng)輸入n:″);scanf(″%d″,&n);printf(″2~n之間的素?cái)?shù)如下:\n″);for(i=2;i<=n;i++)if(pf(i)==1)/*調(diào)用前申明的函數(shù)*/{printf(″%6d″,i);count++;if(count%5==0)printf(″\n″);}

}/*素?cái)?shù)判斷函數(shù)*/…

有下面一些情況,在調(diào)用函數(shù)前可不加說(shuō)明:(1)如果是整型函數(shù)或字符型函數(shù),可以不加說(shuō)明,系統(tǒng)自動(dòng)按整型函數(shù)處理。

(2)如果被調(diào)用函數(shù)的定義出現(xiàn)在主調(diào)函數(shù)之前,可以不加說(shuō)明。例7-8、7-9就屬于這種情況。

(3)如果已在所有函數(shù)定義之前,或在文件的開(kāi)頭,或在函數(shù)的外部已作說(shuō)明,可以不加說(shuō)明。除了上述情況,其它情況均必須對(duì)被調(diào)用的函數(shù)在調(diào)用前進(jìn)行說(shuō)明。

另請(qǐng)注意:(1)函數(shù)一般先定義,后使用。

(2)為清晰起見(jiàn),一般均對(duì)被調(diào)用的函數(shù)在調(diào)用前進(jìn)行說(shuō)明,以增加程序的可讀性。

(3)函數(shù)不能重復(fù)定義,但可以反復(fù)說(shuō)明。

(4)對(duì)于標(biāo)準(zhǔn)函數(shù),還應(yīng)在文件開(kāi)頭用文件包含指令#include指明調(diào)用有關(guān)庫(kù)函數(shù)時(shí)所需用到的信息。例如:#include″stdio.h″,stdio.h是一個(gè)頭文件,它包含了輸入輸出庫(kù)函數(shù)所用到的一些宏定義信息,7.3數(shù)據(jù)傳遞方法C語(yǔ)言程序由若干相對(duì)獨(dú)立的函數(shù)組成,在程序運(yùn)行期間,必然存在數(shù)據(jù)在函數(shù)中流動(dòng),流入或流出,這就是函數(shù)之間的數(shù)據(jù)傳遞,也是函數(shù)之間的接口。一般語(yǔ)言中,數(shù)據(jù)傳遞有參數(shù)傳遞和全局變量傳遞兩種方法,C語(yǔ)言也提供這兩種傳遞方法。參數(shù)傳遞是數(shù)據(jù)傳遞的主門(mén)(正門(mén)),全局變量傳遞是數(shù)據(jù)傳遞的輔門(mén)(后門(mén)),數(shù)據(jù)傳遞時(shí)一般宜用參數(shù)傳遞。例如,求三個(gè)數(shù)的最大值:①主調(diào)函數(shù):

m=max(a,b,c);abcmax ↓↓↓↑……m②被調(diào)函數(shù):floatmax(x,y,z)xyztfloatx,y,z;

{floatt;

t=x;

if(y>t)t=y;

if(z>t)t=z;

return(t);

}(2)傳地址方式將對(duì)應(yīng)實(shí)參地址傳遞給相應(yīng)形參,實(shí)參與形參共享存儲(chǔ)單元。這時(shí),一方面可完成批量數(shù)據(jù)的傳遞,另一方面形參的改變將引起對(duì)應(yīng)實(shí)參的改變,實(shí)現(xiàn)數(shù)據(jù)的雙向傳遞,并將多個(gè)數(shù)據(jù)帶回(這在PASCAL語(yǔ)言中用變參實(shí)現(xiàn))。傳地址方式增加了函數(shù)之間的聯(lián)系,有副作用,不利于將程序中的錯(cuò)誤隔離。7.4嵌套調(diào)用和遞歸調(diào)用7.4.1嵌套調(diào)用

例7-11

求2~n之間的完數(shù),利用函數(shù)的嵌套調(diào)用完成。算法提示:

(1)定義一個(gè)函數(shù),判斷某數(shù)是否為完數(shù)。

(2)定義另一個(gè)函數(shù),求2~n之間的完數(shù),調(diào)用完數(shù)判斷函數(shù)完成。程序如下:

main(?)/*請(qǐng)讀者給出*/ /*求2~n之間的完數(shù)的函數(shù),調(diào)用完數(shù)判斷函數(shù)完成*/ voidwsh(n) intn;

{inti;

intwf(?);/*函數(shù)說(shuō)明*/printf("2~%d之間的完數(shù)如下:\n",n);

for(i=2;i<=n;i++) if(wf(i)==1)printf("%6d",i);

}…/*判斷x是否為完數(shù)的函數(shù)*/intwf(x)intx;{inti,s=0;

intw;

for(i=1;i<x;i++)if(x%i==0)s+=i;

if(s==x)w=1;

elsew=0;

return(w);}函數(shù)調(diào)用過(guò)程:主函數(shù)→wsh(n)→wf(i)。例7-12

計(jì)算的值。

算法提示:

(1)定義求階乘函數(shù),在此基礎(chǔ)上定義求組合數(shù)函數(shù)。

(2)主函數(shù)調(diào)用求組合數(shù)函數(shù),求組合數(shù)函數(shù)三次調(diào)用求階乘函數(shù)。程序如下:main(?)/*請(qǐng)讀者給出*/

/*求階乘函數(shù)*/longintjf(n)intn;

{inti;…longintt=1;for(i=1;i<=n;i++)t*=i;return(t);}/*求組合數(shù)函數(shù)*/longintcmn(m,n)intm,n;

{return(jf(m)/(jf(n)*jf(m?n));?}階乘計(jì)算易產(chǎn)生溢出,宜采用double型進(jìn)行處理。函數(shù)調(diào)用過(guò)程:主函數(shù)→cmn(m,n)→jf(m),jf(n),jf(m?n)。7.4.2遞歸調(diào)用

包含有遞歸調(diào)用的函數(shù)稱為遞歸函數(shù)。遞歸算法具有兩個(gè)基本特征:(1)轉(zhuǎn)化。

(2)終止。例如:計(jì)算n!。①轉(zhuǎn)化:n!→(n?1)!→(n?2)!→…→2!→1!→0!。轉(zhuǎn)化的規(guī)則是:n!=n*(n?1)!。②終止:n=0,0!=1。相應(yīng)的遞歸函數(shù)為:

longintjf(n) /*求階乘的遞歸函數(shù)*/ intn;

{longintj;

if(n>0)j=n*jf(n?1); /*遞歸調(diào)用*/ elsej=1; /*遞歸終止*/ return(j);}

我們也可先判斷是否為遞歸調(diào)用終止條件,如不是,按轉(zhuǎn)化規(guī)則轉(zhuǎn)化來(lái)寫(xiě)遞歸函數(shù)。longintjf(n)I /*求階乘的遞歸函數(shù)二*/intn;{longintj;if(n==0)j=1;/*遞歸終止*/elsej=n*jf(n-1);/*遞歸調(diào)用*/return(j);}如下是計(jì)算4!的過(guò)程:if(4)=4*jf(3)if(4)=24↓↑

if(3)=3*jf(2)if(3)=6↓↑

if(2)=2*jf(1)if(2)=2↓↑

if(1)=1*jf(0)if(1)=1↓↑

if(0)=1

遞歸調(diào)用分成兩個(gè)階段完成。第一階段是遞進(jìn)階段(↓所指方向),即遞歸的調(diào)用階段,完成轉(zhuǎn)化階段的處理。第二階段是回歸階段(↑所指方向),也就是遞歸的返回階段,即由特定問(wèn)題的解遞推出所求問(wèn)題的解。從一般意義上講,這也就是嵌套調(diào)用的逐級(jí)調(diào)用,逐層返回。不過(guò),這里調(diào)用的是函數(shù)自身,而且一般調(diào)用的次數(shù)比較多。遞歸調(diào)用的實(shí)現(xiàn)要用到堆棧,用堆棧來(lái)保留調(diào)用現(xiàn)場(chǎng)。遞歸調(diào)用實(shí)際上是多重嵌套調(diào)用的一種特殊情況。遞歸調(diào)用的次數(shù)稱為遞歸的深度。例7-13

計(jì)算mn

的遞歸函數(shù)。方法一:①轉(zhuǎn)化:mn→mn?1→mn?2→…→m2→m1→m0。轉(zhuǎn)化的規(guī)則是:mn=m*mn?1。②終止:n=0,m0=1。相應(yīng)的遞歸函數(shù)為:

longintmn(m,n) /*計(jì)算m的n次方的遞歸函數(shù)*/ intm,n;

{longintj;

if(n>0)j=m*mn(m,n?1); /*遞歸調(diào)用*/ elsej=1; /*遞歸終止*/ return(j);

}

方法二:①轉(zhuǎn)化:

n為偶數(shù),mn?→mn/2?→?…?→?m0,規(guī)則為mn=(mn/2)2;

n為奇數(shù),mn→m(n?1)/2→…→m0,規(guī)則為mn=m*(m(n?1)/2)2。②終止:n=0,m0=1。相應(yīng)的遞歸函數(shù)請(qǐng)讀者自己定義。采用方法二,遞歸調(diào)用的次數(shù)比方法一要少,效率要高。例7-14

用遞歸方法計(jì)算Fibonacci數(shù)列的第n項(xiàng)函數(shù)。①轉(zhuǎn)化:n>2,f(n)=f(n-1)+f(n-2)②終止:n=1、2,f(1)=f(2)=1相應(yīng)的遞歸函數(shù)為:

intfib(n)/*計(jì)算Fibonacci數(shù)列的第n項(xiàng)*/intn;{intj;if(n>2)j=f(n-1)+f(n-2);/*遞歸調(diào)用*/elsej=1;/*遞歸終止*/return(j);}

例7-15

年齡問(wèn)題。有5個(gè)人坐在一起,問(wèn)第5個(gè)人多少歲,他說(shuō)比第4個(gè)人大2歲。問(wèn)第4個(gè)人多少歲,他說(shuō)比第3個(gè)人大2歲。問(wèn)第3個(gè)人多少歲,又說(shuō)比第2個(gè)人大2歲。問(wèn)第2個(gè)人多少歲,說(shuō)比第1個(gè)人大2歲。最后問(wèn)第1個(gè)人多少歲,他說(shuō)是10歲。請(qǐng)問(wèn)第5個(gè)人多少歲?。①轉(zhuǎn)化:n>1,age(n)=age(n-1)+2②終止:n=1,age(1)=10

age(n)/*求年齡的遞歸函數(shù)*/intn;{inta;/*用作存放函數(shù)的返回值*/if(n==1)a=10;elsea=age(n-1)+2;return(a);}main()/*主函數(shù)*/{printf(″第5個(gè)人的年齡=%d\n″,age(5));}運(yùn)行結(jié)果:第5個(gè)人的年齡=18

7.5變量的作用域

7.5.1局部變量

(1)在一個(gè)函數(shù)內(nèi)部定義的變量是局部變量,只能在函數(shù)內(nèi)部使用。

(2)在主函數(shù)內(nèi)部定義的變量也是局部變量,其它函數(shù)也不能使用主函數(shù)中的變量。

(3)形式參數(shù)是局部變量。

(4)在復(fù)合語(yǔ)句中定義的變量是局部于復(fù)合語(yǔ)句的變量,只能在復(fù)合語(yǔ)句塊中使用。

(5)局部變量在函數(shù)被調(diào)用的過(guò)程中占有存儲(chǔ)單元。

(6)不同函數(shù)中可以使用同名變量。例如,有如下程序:main(){inta=1;intb=2;/*a,b為局部變量*/{intb=1;/*此b非前b,語(yǔ)句塊中局部變量*/printf(″復(fù)合語(yǔ)句中a=%d,b=%d\n″,a,b);}printf(″復(fù)合語(yǔ)句外a=%d,b=%d\n″,a,b);}運(yùn)行結(jié)果:復(fù)合語(yǔ)句中a=1,b=1

復(fù)合語(yǔ)句外a=1,b=27.5.2全局變量(1)在函數(shù)外部定義的變量是全局變量,其作用域是變量定義位置至整個(gè)程序文件結(jié)束。

(2)使用全局變量,可增加函數(shù)間數(shù)據(jù)聯(lián)系的渠道。全局變量可以將數(shù)據(jù)帶入在作用域范圍內(nèi)的函數(shù),也可以將數(shù)據(jù)帶回在作用域范圍內(nèi)的其它函數(shù)。inta,b;/*a,b為全局變量*/ints(){a=a*a;/*函數(shù)中a、b即為前定義的全局變量*/b=b*b;return(a+b);}main(){intsum;a=2;b=3;sum=s();printf(″sum=%d,a=%d,b=%d″,sum,a,b);}運(yùn)行結(jié)果:sum=13,a=4,b=9

當(dāng)然,這也是一個(gè)遞推問(wèn)題,我們可直接用循環(huán)來(lái)處理。使用遞歸算法層次分明,形式簡(jiǎn)練,可讀性強(qiáng),符合人們的思維習(xí)慣。對(duì)一些能夠用遞歸方法編程的問(wèn)題,盡量使用遞歸。但使用遞歸方法編寫(xiě)的程序執(zhí)行時(shí)的時(shí)間、空間開(kāi)銷(xiāo)比較大,這也要求慎用遞歸。此時(shí)可改用迭代的方法或遞推的方法,用循環(huán)實(shí)現(xiàn)。(3)提前引用外部變量,需對(duì)外部變量進(jìn)行說(shuō)明,或稱申明。形式: extern類(lèi)型變量表;作用:說(shuō)明這些變量是已在外部定義過(guò)的變量。例如,有如下程序:

main(){externinta,b;/*外部變量說(shuō)明*/

}inta,b;/*外部變量定義*/…

說(shuō)明:①這樣還不如將外部變量提前定義,先定義、后使用。②變量的定義與說(shuō)明同前面介紹過(guò)的函數(shù)的定義與說(shuō)明類(lèi)似,變量不能重復(fù)定義,但可以多次說(shuō)明。(4)使用程序中非本程序文件的外部變量,也要對(duì)使用的外部變量進(jìn)行同上的申明,或用文件包含處理。

(5)局部變量如與外部變量同名,則在局部變量的作用域內(nèi),外部變量存在,但不可見(jiàn),外部變量的作用被屏蔽。

(6)全局變量在程序運(yùn)行過(guò)程中均占用存儲(chǔ)單元。

(7)在編程時(shí),原則上盡量少用全局變量;能用局部變量,不用全局變量,要避免局部變量全局化。7.6變量的存儲(chǔ)類(lèi)別7.6.1變量的存儲(chǔ)類(lèi)別

內(nèi)存中供用戶使用的存儲(chǔ)空間分為代碼區(qū)與數(shù)據(jù)區(qū)兩個(gè)部分。變量存儲(chǔ)在數(shù)據(jù)區(qū),數(shù)據(jù)區(qū)又可分為靜態(tài)存儲(chǔ)區(qū)與動(dòng)態(tài)存儲(chǔ)區(qū)。靜態(tài)存儲(chǔ)是指在程序運(yùn)行期間給變量分配固定存儲(chǔ)空間的方式。如全局變量存放在靜態(tài)存儲(chǔ)區(qū)中,程序運(yùn)行時(shí)分配空間,程序運(yùn)行完釋放。

動(dòng)態(tài)存儲(chǔ)是指在程序運(yùn)行時(shí)根據(jù)實(shí)際需要?jiǎng)討B(tài)分配存儲(chǔ)空間的方式。如形式參數(shù)存放在動(dòng)態(tài)存儲(chǔ)區(qū)中,在函數(shù)調(diào)用時(shí)分配空間,調(diào)用完成釋放。對(duì)于靜態(tài)存儲(chǔ)方式的變量可在編譯時(shí)初始化,默認(rèn)初值為0或空字符。對(duì)動(dòng)態(tài)存儲(chǔ)方式的變量如不賦初值,則它的值是一個(gè)不確定的值。在C語(yǔ)言中,具體的存儲(chǔ)類(lèi)別有自動(dòng)(auto)、寄存器(register)、靜態(tài)(static)及外部(extern)四種。靜態(tài)存儲(chǔ)類(lèi)別與外部存儲(chǔ)類(lèi)別變量存放在靜態(tài)存儲(chǔ)區(qū),自動(dòng)存儲(chǔ)類(lèi)別變量存放在動(dòng)態(tài)存儲(chǔ)區(qū),寄存器存儲(chǔ)類(lèi)別直接送寄存器。變量存儲(chǔ)類(lèi)別定義方法:

存儲(chǔ)類(lèi)別類(lèi)型變量表;例如:(1)a,b,c為整型自動(dòng)存儲(chǔ)類(lèi)別變量:autointa,b,c;(2)x,y,z為雙精度型靜態(tài)存儲(chǔ)類(lèi)別變量:staticdoublex,y,z;7.6.2局部變量的存儲(chǔ)方式(1)局部變量一般用自動(dòng)方式存儲(chǔ),用保留字auto加以定義,此時(shí)稱為自動(dòng)變量,是動(dòng)態(tài)存儲(chǔ),在函數(shù)的調(diào)用過(guò)程中存在,由編譯系統(tǒng)自動(dòng)處理。例如:

voidf(){autointi,j;autofloatx,y;/*局部變量i,j,x,y以自動(dòng)方式存儲(chǔ)*/

}

…(2)如果希望函數(shù)調(diào)用完后局部變量的值被保留,不釋放其所占存儲(chǔ)單元,這時(shí)必須將其存儲(chǔ)方式定義為靜態(tài)存儲(chǔ)方式,用保留字static加以定義。用靜態(tài)方式存儲(chǔ)的局部變量稱為局部靜態(tài)變量,在函數(shù)調(diào)用完后其值被保留,由于“局部”的作用域,這個(gè)保留的值其它函數(shù)并不能使用,只有本函數(shù)能夠使用。例7-16

計(jì)算1到5的階乘。intjf(n)intn;{staticintf=1;f=f*n;return(f);}main(){inti;for(i=1;i<=5;i++)

printf(″%d!=%d\n″,i,jf(i));}運(yùn)行結(jié)果為:1!=12!=23!=64!=245!=120

每次調(diào)用函數(shù)jf(i)時(shí),計(jì)算出i!,同時(shí)該值被保留,可供下次調(diào)用函數(shù)求下一個(gè)階乘使用,這個(gè)保留的值其它函數(shù)不能使用。如果函數(shù)jf(?)中變量f不定義為局部靜態(tài)變量,則每次調(diào)用都被初始化為1,運(yùn)行結(jié)果為:

1!=1 2!=2 3!=3 4!=45!=5(3)如果對(duì)數(shù)據(jù)的讀寫(xiě)頻繁且存取速度要求較快,C語(yǔ)言允許用寄存器方式直接處理變量,即用保留字register對(duì)變量加以描述,此時(shí)該變量稱為寄存器變量。例如:

longsum(n) intn;

{inti;

registerlongs=0;/*s定義為寄存器變量*/ for(i=1;i<=n;i++) s+=i;

return(s);

}(4)局部變量的缺省存儲(chǔ)方式是自動(dòng)存儲(chǔ)方式。7.6.3全局變量的存儲(chǔ)方式(1)全局變量一般用外部存儲(chǔ)方式存儲(chǔ),用保留字extern加以定義。此時(shí),變量的作用域是構(gòu)成整個(gè)程序的所有程序文件,也就是定義的外部變量可供其它程序文件使用。例如,程序由兩個(gè)程序文件file1.c與file2.c組成。/*file1.c*/externinta;/*定義extern存儲(chǔ)方式變量a*/main(){intpow();intn;intp;scanf(″%d″,&n);p=pow(n);printf(″p=%d\n″,p);}/*file2.c*/externinta;/*申明本文件中使用的是已定義的外部變量a*/intpow(x)intx;{inti,t=1;for(i=1;i<=x;i++)t*=i;return(t);}2)如果希望全局變量?jī)H限于本程序文件使用,而其它程序文件中不能引用,這時(shí)必須將其存儲(chǔ)方式定義為靜態(tài)存儲(chǔ)方式,用保留字static加以定義。此時(shí)稱為靜態(tài)外部變量。例如,在上例文件file1.c中,如果作這樣的定義:staticinta;則變量a的作用域被縮小至本程序文件file1.c,文件file2.c中不能引用。

值得注意的是,對(duì)全局變量加static定義為靜態(tài)存儲(chǔ)方式,并不意味著這才是靜態(tài)存儲(chǔ),而不加static是動(dòng)態(tài)存儲(chǔ)。兩種形式的全局變量(外部變量)其實(shí)都是靜態(tài)存儲(chǔ),都是在編譯時(shí)分配存儲(chǔ)空間的,但作用域不同。使用靜態(tài)外部變量,有利于隔離錯(cuò)誤,有利于模塊化程序設(shè)計(jì)。(3)全局變量的缺省存儲(chǔ)方式是外部存儲(chǔ)方式。前面章節(jié)中的程序沒(méi)有見(jiàn)到變量的存儲(chǔ)類(lèi)別定義,實(shí)際上采用變量的缺省存儲(chǔ)方式。對(duì)局部變量采用auto方式,對(duì)全局變量采用extern方式。1.變量定義的一般形式

存儲(chǔ)類(lèi)別數(shù)據(jù)類(lèi)型變量表;2.變量定義的作用①規(guī)定了變量的取值范圍。②規(guī)定了變量進(jìn)行的運(yùn)行操作。③規(guī)定了變量的作用域。④規(guī)定了變量的存儲(chǔ)方式。⑤規(guī)定了變量占用的存儲(chǔ)空間。7.6.4變量小結(jié)3.局部變量和全局變量

局部變量:①自動(dòng)變量,即動(dòng)態(tài)局部變量(離開(kāi)函數(shù),值就消失).②靜態(tài)局部變量(離開(kāi)函數(shù),值仍保留)。③寄存器變量(離開(kāi)函數(shù),值就消失)。④形式參數(shù)可以定義為自動(dòng)變量或寄存器變量。全局變量:①靜態(tài)外部變量(只限本程序文件使用)。②外部變量(即非靜態(tài)的外部變量,允許其它程序文件引用)。4.動(dòng)態(tài)存儲(chǔ)和靜態(tài)存儲(chǔ)動(dòng)態(tài)存儲(chǔ):①自動(dòng)變量(函數(shù)內(nèi)有效)。②寄存器變量(函數(shù)內(nèi)有效)。③形式參數(shù)。靜態(tài)存儲(chǔ):①靜態(tài)局部變量。函數(shù)內(nèi)有效。②靜態(tài)外部變量。本程序文件有效。③外部變量。整個(gè)程序有效。5.靜態(tài)存儲(chǔ)區(qū)和動(dòng)態(tài)存儲(chǔ)區(qū)

從變量值存放的位置可將變量存儲(chǔ)區(qū)分為靜態(tài)存儲(chǔ)區(qū)和動(dòng)態(tài)存儲(chǔ)區(qū):(1)內(nèi)存中靜態(tài)存儲(chǔ)區(qū): ①靜態(tài)局部變量。 ②靜態(tài)外部變量。 ③外部變量。(2)動(dòng)態(tài)存儲(chǔ)區(qū):①自動(dòng)變量。②形式參數(shù)。③寄存器變量。

例7-17

仔細(xì)閱讀程序,注意變量的作用域#,存儲(chǔ)類(lèi)別,分析程序的運(yùn)行結(jié)果。voidf1(x,y){autointi;staticintj;/*調(diào)用完,j值保留*/printf("i=%5d,j=%5d\n",i,j);i=x+y;j+=x+y;printf("i=%5d,j=%5d\n",i,j);printf("x=%5d,y=%5d\n",x,y);}/*函數(shù)f1尾*/staticintk,l,m;/*在本程序文件內(nèi)使用*/voidf2(a,b,c)inta,b,c;{k=a+b+c;

l=a*b*c;

m=k+l;

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

printf("k=%5d,l=%5d,m=%5d\n",k,l,m);}/*函數(shù)f2尾*/main(?){intd,e,f,g,h;inti,j,x,y,a,b,c;

printf("請(qǐng)輸入d,e,f,g,h:");scanf("%d,%d,%d,%d,%d",&d,&e,&f,&g,&h);printf("第一次調(diào)用函數(shù)f1(?):\n");f1(d,e);printf("i=%5d,j=%5d\n",i,j);printf("x=%5d,y=%5d\n",x,y);printf("d=%5d,e=%5d\n",d,e);printf("第二次調(diào)用函數(shù)f1(?):\n");f1(d,e);printf("i=%5d,j=%5d\n",i,j);printf("調(diào)用函數(shù)f2(?)\n");

f2(f,g,h);printf("k=%5d,l=%5d,m=%5d\n",k,l,m);printf("a=%5d,b=%5d,c=%5d\n",a,b,c);printf("f=%5d,g=%5d,h=%5d\n",f,g,h);}運(yùn)行結(jié)果:請(qǐng)輸入d,e,f,g,h:1,2,3,4,5第一次調(diào)用函數(shù)f1(?):i= 34(隨機(jī)值),j=0i= 3,?j=3x= 1,y=2 /*以上在函數(shù)f1(?)中輸出*/i= 34(隨機(jī)值),?j=1985(隨機(jī)值)x=?19(隨機(jī)值),y=2340(隨機(jī)值)d= 1,e=2 /*以上在main(?)函數(shù)中輸出*/第二次調(diào)用函數(shù)f1(?):i= 34(隨機(jī)值),j=3i= 3,j=6x= 1,y=2 /*以上在函數(shù)f1(?)中輸出*/i= 34(隨機(jī)值),j=1985(隨機(jī)值) /*在main(?)函數(shù)中輸出*/調(diào)用函數(shù)f2(?):a= 3,b=4,?c=5k= 12,l=60,m=72 /*以上在函數(shù)f2(?)中輸出*/k= 12,l=60,m=72a= 13(隨機(jī)值),b=124(隨機(jī)值),c=2525(隨機(jī)值)f= 3,g=4,h=5 /*以上在main(?)函數(shù)中輸出*/7.7結(jié)構(gòu)化程序設(shè)計(jì)方法7.7.1程序設(shè)計(jì)基本手段

抽象、枚舉與歸納是程序設(shè)計(jì)的基本手段,也可看作是程序設(shè)計(jì)的基本原則。程序設(shè)計(jì)語(yǔ)言與程序本身便是一個(gè)抽象。變量的概念是它當(dāng)前值的抽象,一般地,數(shù)據(jù)是對(duì)要加工處理的客觀對(duì)象之抽象,各類(lèi)控制結(jié)構(gòu)是對(duì)計(jì)算機(jī)操作之抽象,算法是對(duì)問(wèn)題的抽象。按此,抽象算法對(duì)一些抽象數(shù)據(jù)實(shí)施一系列抽象操作,最終把抽象算法具體化到計(jì)算機(jī)程序。7.7.2模塊化程序設(shè)計(jì)

一個(gè)程序由若干模塊組成,函數(shù)是C語(yǔ)言中模塊的實(shí)現(xiàn)工具,較大的模塊可用一個(gè)程序文件實(shí)現(xiàn)。模塊組裝在一起達(dá)到整個(gè)程序的預(yù)期目的。一個(gè)模塊只做一個(gè)事情,模塊的功能充分獨(dú)立。模塊內(nèi)部的聯(lián)系要緊密,模塊之間的聯(lián)系要少。模塊之間通過(guò)接口(形參或外部變量)通訊,模塊內(nèi)部的實(shí)現(xiàn)細(xì)節(jié)在模塊外部要盡可能不可見(jiàn)。7.7.3結(jié)構(gòu)化程序的書(shū)寫(xiě)和閱讀

例7-18

編寫(xiě)程序,求解方程ax2+bx+c=0。算法提示:

(1)方程系數(shù)的輸入在主函數(shù)中完成。

(2)無(wú)根、無(wú)數(shù)根、一個(gè)根、相等實(shí)根、不等實(shí)根、共軛虛根分別用函數(shù)rf1(?)、rf2(?)、rf3(?)、rf4(?)、rf5(?)、rf6(?)處理,結(jié)果在相應(yīng)函數(shù)中輸出。

(3)程序由六個(gè)子模塊加主控模塊組成。程序如下:/*程序7-18,求解方程a*x*x+b*x+c=0*/floatd; /*判別式,全局變量*/main() /*主控程序*/{floata,b,c; /*方程系數(shù)*/voidrf1(); /*函數(shù)申明*/voidrf2();voidrf3();voidrf4();voidrf5();voidrf6();clrscr();printf("請(qǐng)輸入方程系數(shù)a、b、c:");scanf("%f,%f,%f",&a,&b,&c);d=b*b?4*a*c; /*計(jì)算判別式*/if(a==0)if(b==0)if(c==0)rf1(?); /*調(diào)用函數(shù)rf1(?)解方程0x=0*/elserf2(?); /*調(diào)用函數(shù)rf2(?)解方程0x=c*/elserf3(b,c); /*調(diào)用函數(shù)rf3(?)解方程bx=c*/elseif(d==0)rf4(a,b); /*調(diào)用函數(shù)rf4(?)解方程a*x*x+b*x+c=0,d=0*/elseif(d>0)rf5(a,b,c); /*調(diào)用函數(shù)rf5(?)解方程a*x*x+b*x+c=0,d>0*/elserf6(a,b,c); /*調(diào)用函數(shù)rf6(?)解方程a*x*x+b*x+c=0,d<0*/}voidrf1(?) /*解方程0x=0*/{printf("方程無(wú)數(shù)解!\n");}

voidrf2(?) /*解方程0x=c*/{printf("方程無(wú)解!\n");}

voidrf3(b,c) /*解方程bx=c*/floatb,c;{floatx;x=?c/b;printf("方程的根=%6.2f\n",x);}voidrf4(a,b) /*解方程a*x*x+b*x+c=0,d=0*/floata,b;{floatx;x=?b/(2*a);printf("方程有兩個(gè)相等實(shí)根,根=%6.2f\n",x);}

voidrf5(a,b,c) /*解方程a*x*x+b*x+c=0,d>0*/floata,b,c;{floatx1,x2;x1=(?b+sqrt(d))/(2*a);x2=(?b?sqrt(d))/(2*a);printf("方程第一個(gè)根=%6.2f,第二個(gè)根=%6.2f\n",x1,x2);}voidrf6(a,b,c)/*解方程a*x*x+b*x+c=0,d<0*/floata,b,c;{floatr,i;

r=?b/(2*a);

i=sqrt(?d)/(2*a);

printf("方程第一個(gè)虛根=%6.2f+%6.2fi\n",r,i);

printf("方程第二個(gè)虛根=%6.2f?%6.2fi\n",r,i);

}

例7-19

編寫(xiě)正方形、長(zhǎng)方形、圓、三角形、梯形、平行四邊形等圖形的面積計(jì)算程序。算法提示:

(1)用六個(gè)函數(shù)zs(?)、cs(?)、ys(?)、ss(?)、ts(?)、ps(?)完成相應(yīng)圖形的面積計(jì)算。

(2)整個(gè)程序由這六個(gè)子模塊加退出模塊tc(?)及主控模塊組成。

(3)為反復(fù)計(jì)算面積,在主控程序中用永真循環(huán)處理。退出由退出模塊處理。

(4)由于各圖形的特征描述不一,因此將數(shù)據(jù)輸入及輸出放各函數(shù)中完成。

(5)主控模塊是一個(gè)典型的菜單程序。程序如下:

/*程序7-19編寫(xiě)通用面積計(jì)算程序*/main() /*主控程序*/{charch; /*選擇變量*/voidzs(); /*函數(shù)申明*/voidcs();voidys();voidss();voidds();voidps();voidtc();while(1){clrscr(?); /*界面顯示*/printf("面積計(jì)算程序\n");

printf("Z—正方形面積 C—長(zhǎng)方形面積\n");

printf("Y—圓面積 S—三角形面積\n");printf("T—梯形面積 P—平行四邊形面積\n");

printf("Q—退出程序\n");

printf("請(qǐng)選擇操作(Z/C/Y/S/T/P/Q):");

ch=getchar(?);

switch(ch) /*選擇處理*/{case'z':

case'Z':zs(?);break; /*轉(zhuǎn)計(jì)算機(jī)正方形面積模塊*/case'c':

case'C':cs(?);break; /*轉(zhuǎn)計(jì)算機(jī)長(zhǎng)方形面積模塊*/case'y':

case'Y':ys(?);break; /*轉(zhuǎn)計(jì)算機(jī)圓面積模塊*/case's':

case'S':ss(?);break; /*轉(zhuǎn)計(jì)算三角形圓面積模塊*/case't':

case'T':ds(?);break; /*轉(zhuǎn)計(jì)算梯形面積計(jì)算模塊*/case'p':

case'P':ps(?);break; /*轉(zhuǎn)計(jì)算平行四邊形模塊*/case'q':

case'Q':tc(?);break; /*轉(zhuǎn)退出模塊*/default:printf("選擇錯(cuò)誤!");

}}}voidzs(?) /*計(jì)算正方形面積*/{floata;floats;printf("請(qǐng)輸入正方形的邊長(zhǎng):");scanf("%f",&a);s=a*a;printf("所求正方形面積=%7.3f\n",s);}

voidcs(?) /*計(jì)算長(zhǎng)方形面積*/{floata,b;floats;printf("請(qǐng)輸入長(zhǎng)方形的長(zhǎng)和寬:");scanf("%f,%f",&a,&b);s=a*b;printf("所求長(zhǎng)方形面積=%7.3f\n",s);}#definePI3.14159voidys(?) /*計(jì)算圓面積*/{floatr;

floats;

printf("請(qǐng)輸入圓的半徑:");

scanf("%f",&r);

s=PI*r*r;

printf("所求圓面積=%7.3f\n",s);

}voidss(?)/*計(jì)算三角形面積*/{floata,b,c;

floatl;

intflag;

floats;

printf("請(qǐng)輸入三角形的三邊:");

scanf("%f,%f,%f",&a,&b,&c);

flag=(a+b>c)&&(b+c>a)&&(c+a>b);

if(flag)?{l=0.5*(a+b+c);

s=sqrt(l*(l?a)*(l?b)*(1?c));

printf("所求三角形面積=%7.3f\n",s);

}elseprintf("不能構(gòu)成三角形!\n");}voidts(?)/*計(jì)算梯形面積*/{floata,b,h;

floats;

printf("請(qǐng)輸入梯形的上底,下底,高:");

scanf("%f,%f,%f",&a,&b,&h);

s=(a+b)*h*0.5;

printf("所求梯形面積=%7.3f\n",s);

}voidps(?) /*計(jì)算平行四邊形面積*/{floata,h;

floats;

printf("請(qǐng)輸入平行四邊形的底和高:");

scanf("%f,%f",&a,&h);

s=a*h;

printf("所求平行四邊形面積=%7.3f\n",s);}voidtc(?) /*退出程序*/{printf("退出面積計(jì)算程序!");

exit(0);

}

例7-20

找出100~1000之間的素?cái)?shù)、完數(shù)、回文數(shù)、水仙花數(shù)等特殊數(shù)。算法提示:

(1)定義四個(gè)函數(shù)ss(?)、ws(?)、hs(?)、shs(?)求出相應(yīng)的特殊數(shù)。

(2)主程序僅包含函數(shù)ss(?)、ws(?)、hs(?)、shs(?)的調(diào)用。整個(gè)程序結(jié)構(gòu)清晰,可讀性極好。程序如下:/*程序7-20,計(jì)算100~1000之間的特殊數(shù)*/main() /*主程序*/{voidss(); /*函數(shù)申明*/voidws();voidhs();voidshs();printf(″計(jì)算100~1000之間的特殊數(shù)\n″);ss(); /*調(diào)用函數(shù)ss()、ws()、hs()、shs()求出相應(yīng)特殊數(shù)*/ws();hs();shs();}voidss() /*計(jì)算100~1000之間的素?cái)?shù)*/{inti,j;intp;printf(″100~1000之間素?cái)?shù)如下:\n″);for(i=100;i<=1000;i++)

{for(p=1,j=2;j<=i;j++)

if(i%j==0){p==0;break;}if(p)printf(″%8d″,i);}printf(″\n″);}voidws(?) /*找出100~1000之間的完數(shù)*/{inti,j;

ints;

printf("100~1000之間的完數(shù)為:\n");

for(i=100;i<=1000;i++){for(s=0,j=1;j<i;j++)if(i%j==0){s+=j;break;}if(s==i)printf("%8d",i);

}printf("\n");}voidhs(?) /*找出100~100

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 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)論