模塊化程序設(shè)計(jì)(函數(shù))_第1頁
模塊化程序設(shè)計(jì)(函數(shù))_第2頁
模塊化程序設(shè)計(jì)(函數(shù))_第3頁
模塊化程序設(shè)計(jì)(函數(shù))_第4頁
模塊化程序設(shè)計(jì)(函數(shù))_第5頁
已閱讀5頁,還剩90頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第四幸模塊也世本世計(jì)(&^)

莆田學(xué)院現(xiàn)代教育技術(shù)中心

2004年3月制作

一、模塊化設(shè)計(jì)與函數(shù)

?把大型軟件按照規(guī)定的原則劃分成一個(gè)個(gè)較小的、相

對獨(dú)立但又相互關(guān)聯(lián)的模塊,叫做模塊化設(shè)計(jì)。

?1965年,GAMiller在他的著名文章“奇妙的數(shù)字

7±2——人類信息處理能力的限度”中指出,普通

人分辨或記憶同一類信息的不同品種或等級的數(shù)量一

般不超過5?9項(xiàng)。這表明,要使人的智力能足以管

理好程序,應(yīng)該堅(jiān)持模塊化設(shè)計(jì)。正如不分段的長篇

文章可能使讀者感到頭痛一樣,大型的單模塊軟件不

僅可讀性差,可靠性也常常難以保證。

?C語言中,模塊化設(shè)計(jì)的重要工具是“自定義函數(shù)”。

莆田學(xué)院現(xiàn)代教育技術(shù)中心2004年3月

???

一、模塊化設(shè)計(jì)與函數(shù)H:

???

【例一】參見P5例1.3intmax(intx,inty)/*被調(diào)函數(shù)*/

#include<stdio.h>(

#include<conio.h>intz;

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

if(x>y)

{

inta,b,c;z=x;

intmax(intjnt);/*函數(shù)原型*/else

clrscr();z=y;

printf("lnputa,b=");returnz;

scanf("%d,%dH,&a,&b);}

c=max(a,b);

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

}

莆田學(xué)院現(xiàn)代教育技術(shù)中心2004WI

一、模塊化設(shè)計(jì)與函數(shù)

本章的學(xué)習(xí)首先要討論一

①什么是函數(shù)?

②為什么要使用函數(shù)?

③函數(shù)有哪些類型?

④如何自己定義一個(gè)函數(shù)?

⑤如何調(diào)用一個(gè)函數(shù)?

⑥函數(shù)學(xué)習(xí)的難點(diǎn)是什么?

莆田學(xué)院現(xiàn)代教育技術(shù)中心2004年3月

、模塊化設(shè)計(jì)與函數(shù)

①什么是函數(shù)?

什么是函數(shù)?

②為什么要使用函數(shù)?

③函數(shù)有哪些類型?一個(gè)獨(dú)立的程序模塊,

④如何自己定義一個(gè)可以定義自己的變量

函數(shù)?(僅在本函數(shù)內(nèi)有效),

⑤如何調(diào)用一個(gè)函數(shù)?擁有自己的存儲空間。

可以被其他函數(shù)或自身

⑥函數(shù)學(xué)習(xí)的難點(diǎn)是調(diào)用(主函數(shù)除外)。

什么?

莆田學(xué)院現(xiàn)代教育技術(shù)中心2004年3月

模塊化設(shè)計(jì)與函數(shù)

力旦X蜘2

如果把編程比做制造一臺為什么要使用函數(shù)?

機(jī)器,函數(shù)就好比其零部?便于實(shí)現(xiàn)模塊化設(shè)計(jì)

件。便于團(tuán)隊(duì)開發(fā)

?可謳這些“零部件”單獨(dú)?

?便于使用現(xiàn)有的或別人的

設(shè)計(jì)、調(diào)試、測試好,用程序模塊提高編程效能

時(shí)拿出來裝配,再總體調(diào)

試。在C程序設(shè)計(jì)中,通常:

>將一個(gè)大程序分成幾個(gè)子

?這些“零部件”可以是自

己設(shè)計(jì)制造/別人設(shè)計(jì)制造程序模塊(自定義函數(shù))

/現(xiàn)在的標(biāo)準(zhǔn)產(chǎn)品>將常用功能做成標(biāo)準(zhǔn)模塊

(標(biāo)準(zhǔn)函數(shù))放在函數(shù)庫

中供其他程序調(diào)用

莆田學(xué)院現(xiàn)代教育技術(shù)中心2004年3月

一、模塊化設(shè)計(jì)與函數(shù)

【例二】編寫一個(gè)兒童算術(shù)能力測試軟件

一、模塊化設(shè)*Let*try…

【例二】編寫一個(gè)兒童餐宿

main()

/*定義所用函數(shù)*/

charans='y';cover(){}/*軟件封面顯示函數(shù)*/

clrscr();password(){}/*密碼檢查函數(shù)*/

cover();/*調(diào)用軟件封面顯示函數(shù)7question(){}/*產(chǎn)生題目函數(shù)*/

password();/*調(diào)用密碼檢查函數(shù)*/answers(){}/*接受回答函藪*/

=,

while(ans=='y'||ans=Y')marks(){}/*評分函數(shù)*/

/*調(diào)用產(chǎn)生題目函數(shù)*/

{question();results(){}/*結(jié)果顯示函數(shù)*/

answers();/*調(diào)用接受回答函數(shù)7

marks();/*調(diào)用評分函數(shù)7

/*調(diào)用結(jié)果顯示函數(shù)*/

results();■這些函數(shù)現(xiàn)在不編程或還不會

printf("是否繼續(xù)練習(xí)?(Y/N)\n)編程,可先放空。

ans=getch();■可以多人合作,每人完成若干

}個(gè)函數(shù)(模塊化)。

printf("謝謝使用,再見!)■可在另一個(gè)源程序文件中定義。

}

一、模塊化設(shè)計(jì)與函數(shù)

①什么是函數(shù)?函數(shù)有哪些類型?

根據(jù)函數(shù)的來源,可分為:

②為什么要使用函數(shù)??庫函數(shù)(標(biāo)準(zhǔn)函數(shù))

③函數(shù)有哪些類型?由系統(tǒng)提供,編程時(shí)可直接

使用之

④如何自己定義一個(gè)?自定義函數(shù)

函數(shù)?由編程者自己編寫,使用時(shí)

⑤如何調(diào)用一個(gè)函數(shù)?要“先定義后使用”

⑥函數(shù)學(xué)習(xí)的難點(diǎn)是根據(jù)使用的方式,可分為:

什么??無參函數(shù)

?有參函數(shù)(函數(shù)內(nèi)需要使

用主調(diào)函數(shù)中的數(shù)據(jù))

莆田學(xué)院現(xiàn)代教育技術(shù)中心2004年3月

、模塊化設(shè)計(jì)與函數(shù)

①什么是函數(shù)?如何自己定義一個(gè)函數(shù)?

②為什么要使用函數(shù)?(見后)

③函數(shù)有哪些類型?如何調(diào)用一個(gè)函數(shù)?

④如何自己定義一個(gè)(見后)

函數(shù)?函數(shù)部分學(xué)習(xí)的難點(diǎn)是什么?

⑤如何調(diào)用一個(gè)函數(shù)?■函數(shù)的概念

⑥函數(shù)學(xué)習(xí)的難點(diǎn)是■形參/實(shí)參/返回值的概念

■遞歸算法

什么?■變量的作用域和生存期

莆田學(xué)院現(xiàn)代教育技術(shù)中心2004年3月

一、模塊化設(shè)計(jì)與函數(shù)::

??

函數(shù)使用常識:P144

?一個(gè)源文件由一個(gè)或多個(gè)函數(shù)組成,可為多個(gè)C程序公用。

?C語言是以源文件為單位而不以函數(shù)為單位進(jìn)行編譯的。

?一個(gè)c程序由一個(gè)或多個(gè)源(程序)文件組成——可分別

編寫、編譯和調(diào)試。

?c程序執(zhí)行總是從main函數(shù)開始,一般情況下調(diào)用其它

函數(shù)后總是回到main函數(shù),最后在main函數(shù)中結(jié)束整個(gè)

程序的運(yùn)行。

?所有函數(shù)都是平行的、互相獨(dú)立的,即在一個(gè)函數(shù)內(nèi)只

能調(diào)用其他函數(shù),不能再定義一個(gè)函數(shù)(嵌套定義)。

?一個(gè)函數(shù)可以調(diào)用其他函數(shù)或其本身,但任何函數(shù)均不

可調(diào)用main函數(shù)。

莆田學(xué)院現(xiàn)代教育技術(shù)中心2004年3月

二、函數(shù)的定義:::

???

函數(shù)定義——“制造自己的函數(shù)”。P144

1、函數(shù)定義的一般形式(參見例一)

函數(shù)返回值的數(shù)據(jù)類型函數(shù)名(類型名變量名1,類型名變量名2,…,

{聲明靦姻標(biāo)識符形參表

處理語句

【注意】無形參表的即無參函數(shù)。無函數(shù)體的為“空函

數(shù)”。如果函數(shù)返回值的數(shù)據(jù)類型為int,可以省略之。

傳統(tǒng)方式見P146。

莆田學(xué)院現(xiàn)代教育技術(shù)中心2004年3月

二、函數(shù)的定義

?????

把程序控制權(quán)從函數(shù)返回函數(shù)調(diào)用點(diǎn)有三種方法:

?執(zhí)行到函數(shù)結(jié)束的右花括號時(shí)(如果函數(shù)沒有返回值);

?執(zhí)行到如下語句(如果函數(shù)沒有返回值):

return;

?把返回值返回調(diào)用處(見例一)

return表達(dá)式;

形式:return(x);return(x+y);return(x>y?x:y);

語句中圓括號亦可省略。

莆田學(xué)院現(xiàn)代教育技術(shù)中心2004年3月

二、函數(shù)的定義

【注意】

如果函數(shù)值類型與return語句表達(dá)式值的類型

不一致,以函數(shù)類型為準(zhǔn)(數(shù)值型會自動(dòng)進(jìn)行

類型轉(zhuǎn)換)。

如果明確表示不需返回值,應(yīng)使用void作函

數(shù)返回值的數(shù)據(jù)類型,否則即使沒有return語句,

仍將帶回一個(gè)不確定的值(見P149說明)。

莆田學(xué)院現(xiàn)代教育技術(shù)中心2004年3月

三、函數(shù)的調(diào)用

1、庫函數(shù)的調(diào)用

必須在源程序中用include命令將定義該庫函數(shù)的頭文件

“包含進(jìn)來”。

調(diào)用方式:

?獨(dú)立語句執(zhí)行某項(xiàng)操作,如

clrscr(),printf("lnputa,b=")等

?表達(dá)式中作運(yùn)算對象,如

a=sqrt(x)+pow(r,3),c=exp(a)等

莆田學(xué)院現(xiàn)代教育技術(shù)中心2004年3月

三、函數(shù)的調(diào)用舉:

2、自定義函數(shù)

自定義函數(shù)和變量一樣,在其主調(diào)函數(shù)中也必須“先聲明,

后使用”。

如例一中的intmax(intjnt);/*函數(shù)原型*/

例一中的自定義函數(shù)聲明也可以用以下兩種形式:

intmax(intx,inty);(多余,因?yàn)榫幾g系統(tǒng)并不檢查參數(shù)名)

或intmax();(編譯系統(tǒng)將不檢查參數(shù)類型和參數(shù)個(gè)數(shù))

以下情況時(shí),被調(diào)函數(shù)在主調(diào)函數(shù)中可以不先聲明:0754

被調(diào)函數(shù)的返回值為整型時(shí)函數(shù)值是整型(int)或字符型

(char)時(shí)——系統(tǒng)自動(dòng)按整型說明;

被調(diào)函數(shù)的定義出現(xiàn)在主調(diào)函數(shù)之前時(shí)

在所有函數(shù)定義之前,在函數(shù)的外部已做了函數(shù)聲明時(shí)

調(diào)用方式同庫函數(shù)。

莆田學(xué)院現(xiàn)代教育技術(shù)中心2004年3月

三、函數(shù)的調(diào)用

4、函數(shù)的嵌套調(diào)用P155例8.6

floatf(floatx)

(main()

???(

???

}

f1=f(x1);

floatxpoint(floatx1,floatx2)f2=f(x2);

(???

調(diào)用、

y=…f(x1)f(x2)x=root(x1,x2);

}???

floatroot(floatx1,floatx2);}

(

y1=f(x1)

x=xpoint(x1,x2)例8.6嵌套調(diào)用關(guān)系(簡化)

y=f(x)

)莆田學(xué)院現(xiàn)代教育技術(shù)中心2004年3月

三、函數(shù)的調(diào)用

4、函數(shù)的嵌套調(diào)用P155

莆田學(xué)院現(xiàn)代教育技術(shù)中心2004年3月

例8.6模塊劃劃分情況

f(x)

根據(jù)所給X值,求

y=x3-5x2+16x-80

返回y值,即與x對應(yīng)的

f(x)值

,代教育技術(shù)中心2004年3月

補(bǔ)充內(nèi)容:

計(jì)算方法與計(jì)算機(jī)數(shù)值求解

《計(jì)算方法》工程數(shù)學(xué)之一

一、計(jì)算方法研究內(nèi)容:

?高次方程求根

?矩陣運(yùn)算求解(通常歸到《線性代數(shù)》中)

?常微分方程數(shù)值求解

?線性方程組求解

?函數(shù)插值

計(jì)算方法研究求解的算法,通過計(jì)算機(jī)程序數(shù)值

求解。

莆田學(xué)院現(xiàn)代教育技術(shù)中心2004年3月

計(jì)算方法與計(jì)算機(jī)數(shù)值求解

二、高次方程求根(近似解)

基本思路

方程千(X)=0處的X稱為該方程的根

解法步驟:

1、初始近似值(逐步掃描法——異號必有根)

2、逐步精確化(誤差小于某許可值時(shí),為所求近似根)

?二分法P121習(xí)題6.13]

?迭代法P121習(xí)題6.11I

?牛頓法「121習(xí)題6.12|考試內(nèi)容!!

?弦截法P155例8.6,

莆田學(xué)院現(xiàn)代教育技術(shù)中心2004年3月

例8.6“弦截法”原理

甫田學(xué)院現(xiàn)代教育技術(shù)中心2004年3月

二分法:

設(shè)方程f(x)=O在區(qū)間(a,b)有

一個(gè)根,取其中點(diǎn)xo=(a+b)/2。

如果f(xo)與f(a)同號,則版在xoy

右側(cè),耳運(yùn)二xo,b不變,否則取

b=xo,a不變。這樣就得到一個(gè)新

的變小了的有根區(qū)間(a,b)。對

此新的有根區(qū)間進(jìn)行同樣的處

理,這樣就可得到更小的有根

區(qū)間……當(dāng)|a-b|"時(shí),對應(yīng)的

xo即為所求根之近似解。

e為允許的誤差

莆田學(xué)院現(xiàn)代教育技術(shù)中心2004年3月

迭代法:例:::

設(shè)有方程f(x)=O求方程x3-X-1=0

先設(shè)法將它化為在x=1.5附近的一個(gè)根。

x=g(x)步驟:

于是得到“迭代公式”:將方程改造為迭代公式

Xn=g(Xn-1)

從給定的初始近似值X。出發(fā),反

復(fù)利用迭代公式求出

用xo=1.5代入,求得

X0,X1,X2,X3,...,Xn-15Xn

xi=1.35721

當(dāng)|Xn-Xn」|“時(shí),對應(yīng)的Xn即為

再代入,求得

所求根之近似解。

X2=1.33086

直至lJ|Xn-Xn-1"為止。

e為允許的誤差

e為允許的誤差

莆田學(xué)院現(xiàn)代教育技術(shù)中心2004年3月

???

牛頓法:又稱“牛頓切線法”(求值速度更快)。

設(shè)有方程f(x)=O

若已知它在X0附近有根,

由其切線方程

y=f(xo)-fJ(xo)(x-xo)

可得到“迭代公式”:

Xn+1=Xn-f(Xn)/f((Xn)

從給定的初始近似值XO出發(fā),反復(fù)利用迭代公式求出

X0,X1,X2,X3,...,Xn-1JXn

當(dāng)|Xn-Xn-11"時(shí),對應(yīng)的Xn即為所求根之近似解。

e為允許的誤差f'(X)為方程f(x)的一階導(dǎo)數(shù)(斜率)

莆田學(xué)院現(xiàn)代教育技術(shù)中心2004年3月

I、函數(shù)的遞歸調(diào)用

1、遞歸的概念P158

?直接遞歸調(diào)用調(diào)用函數(shù)的過程中又調(diào)用該函數(shù)本身

?間接遞歸調(diào)用調(diào)用fl函數(shù)的過程中調(diào)用f2函數(shù),而f2中又需要

調(diào)用fl°

以上均為無終止遞歸調(diào)用。

為此,一般要用if語句來控制使遞歸過程到某一條件滿足時(shí)結(jié)

O

Af函數(shù)

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

直接遞歸調(diào)用間接遞歸調(diào)用

莆田學(xué)院現(xiàn)代教育技術(shù)中心2004年3月

I、函數(shù)的遞歸調(diào)用

2、遞歸算法

類似于數(shù)學(xué)證明中的反推法,從后一結(jié)果與前一結(jié)果的關(guān)

系中尋找其規(guī)律性。

歸納法可以分為:

■遞推法從初值出發(fā),歸納出新值與舊值間直到最后值為止存

在的關(guān)系。

要求通過分析得到:初值+遞推公式

編程:通過循環(huán)控制結(jié)構(gòu)實(shí)現(xiàn)(循環(huán)的終值是最后值)

■遞歸法從結(jié)果出發(fā),歸納出后一結(jié)果與前一結(jié)果直到初值為

止存在的關(guān)系。

要求通過分析得到:初值+遞歸函數(shù)

編程:設(shè)計(jì)一個(gè)函數(shù)(遞歸函數(shù)),這個(gè)函數(shù)不斷使用下

一級值調(diào)用自身,直到結(jié)果已知處——選擇控制結(jié)構(gòu)。

莆田學(xué)院現(xiàn)代教育技術(shù)中心2004年3月

、函數(shù)的遞歸調(diào)用

莆田學(xué)院現(xiàn)代教育技術(shù)中心2004年3月

【例一】小160例8.8)用遞歸法求口!

分析比較:

遞推法朝法

0I=1分析得Sn=n!的求解nl=(n—1)1Xn分析得f(n)=n!的求解

11=01X1「1(n=1,0)(n-1)l=(n-2)!x(n-1)r1(n=1.0)

2!=11X2Sn=v(n-2)l=(n-3)lx(n-2)f(n戶

ISn-1Xn^f(n-1)xn

3!=21X3(n—3)l=(n—4)!x(n—3)

(n>1)(n>1)

m=(n-l)!Xn其中Sn-1先求出21=1Ix2其中Un-1)未求出

實(shí)際上,遞歸程序分兩個(gè)階段執(zhí)行——

①回推(調(diào)用):欲求n!一先求(n-1)!—(n-2)!T…-1!若1!已知,回推結(jié)束。

②遞推(回代):知道1!72!可求出—3!―…—n!

莆田學(xué)院現(xiàn)代教育技術(shù)中心2004年3月

???

程序如下:

main()

floatfac(intx)

intn;

floats;intf;

floatfac();if(x==0||x==1)

clrscr();f=1;

else

printf("lnputn=");

f=fac(x-1)*x;

scanf(H%d",&n);

returnf;

s=fac(n);)

printf("%d!=%.Of",n,s);

)

2004年3月

【例二】有5個(gè)人,第5個(gè)人說他比第4個(gè)人大2

歲,第4個(gè)人說他對第3個(gè)人大2歲,第3個(gè)人說

他對第2個(gè)人大2歲,第2個(gè)人說他比第1個(gè)人大2

歲,第1個(gè)人說他10歲。求第5個(gè)人多少歲。

(P158例8.7)

通過分析,設(shè)計(jì)遞歸函數(shù)如下:

10(n=1)

age(n)=,

age(n-1)+2(n>1)

莆田學(xué)院現(xiàn)代教育技術(shù)中心2004年3月

程序如下:

age(intn)

{

intc;遞歸函數(shù):

if(n==1)c=10;10(n=1)

elsec=age(n-1)+2;age(n)=,

returnc;

age(n-1)+2(n>1)

}

main()

(

clrscr();請看看單步運(yùn)行的情況

printf("%d",age(5));

}

2004年3月

c=18C爭f皆院現(xiàn)代教育技術(shù)中心2004年3月c=14c=12

【例三】在屏幕上顯示楊輝三角形

分析:

若起始行為第1行

則:

第X行有X個(gè)值

對第X行第y列(不計(jì)左側(cè)空格時(shí))

其值可用以下遞歸函數(shù)表示:

15101051

1(y=1或y=x)

c(x,y尸

c(x-1,y-1)+c(x-1,y)

莆田學(xué)院現(xiàn)代教育技術(shù)中心2004年3月

程序如下:遞歸函數(shù):

fl(y=1或y=x)

main()c(x,y)=[

{c(x-1,y-1)+c(x-1,y)

inti,j,n;

clrscr();intc(intx,inty)

printf("lnputn=");intz;

scanf("%d",&n);

if(y==1||y==x)

for(i=1;i<=n;i++)return1;

(else

for(j=O;j<=n-i;j++)

printff'");z=c(x-1,y-1)+c(x-1,y);

for(j=1;j<=i;j++)returnz;

n

printf("%3d,c(i,j));}

H

printf("\n);}

}

)

技術(shù)中心2004年3月

【例四】Fibonacci數(shù)列問題。

結(jié)果:

「1(n=1)

遞歸函數(shù):fib(n)=<1(n=2)n=12,s=376

〔fib(n-1)+fib(n-2)(n>1)

程序如下:

main()

fib(intn)

(

(inti,s=0;

intf;

clrscr();

if(n==1||n==2)

f=1;for(i=1;i<=12;i++)

elses=s+fib(i);

f=fib(n-1)+fib(n-2);

printf("n=12,s=%d",s);

return(f);

}}

莆田學(xué)院現(xiàn)代教育技術(shù)中心2004年3月

???

【例五】運(yùn)行下列程序,當(dāng)輸入字符序列

AB$CDE并回車時(shí),程序的輸出結(jié)果是什么?

#include<stdio.h>

rev()

(

charc;

c=getchar();

if(c=='$')printf("%c",c);

else

{rev();

printf("%c",c);

}

)

main()

(

rev();

)院現(xiàn)代教育技術(shù)中心2004年3月

【例六】反向輸出一個(gè)整數(shù)(非數(shù)值問題)::

??

非數(shù)值問題的分析無法象數(shù)值問題那樣能得出一個(gè)初值和遞歸函數(shù)

式,但思路是相同的。

分析方法:

①簡化問題:設(shè)要輸出的正整數(shù)只有一位,則“反向輸出”問題可

簡化為輸出一位整數(shù)。

②對大于10的正整數(shù),邏輯上可分為兩部分:個(gè)位上的數(shù)字和個(gè)位

以前的全部數(shù)字。將個(gè)位以前的全部數(shù)字看成一個(gè)整體,則為了反向輸

出這個(gè)大于10的正整數(shù),可按以下步驟:

a、輸出個(gè)位上的數(shù)字;

b、將個(gè)位除外的其他數(shù)字作為一個(gè)新的整數(shù),重復(fù)a步驟的操作。

其中b問題只是對原問題在規(guī)模上進(jìn)行了縮小——遞歸。

所以,可將反向輸出一個(gè)正整數(shù)x的算法歸納為:

if(x為一位整數(shù))

輸出x;

else

{輸出x的個(gè)位數(shù)字;

對剩余數(shù)字組成的新整數(shù)重復(fù)“反向輸出”操作;

}

莆田學(xué)院現(xiàn)代教育技術(shù)中心2004年3月

【例六】反向輸出一個(gè)整數(shù)(非數(shù)值問題)

程序如下:

I/*反向輸出整數(shù)X*/

#include<stdio.h>voidprintn(intx)

voidmain()(

/*若X為一位整數(shù)*/

(

voidprintn(intx);if(x>=0&&x<=9)

intn;printf("%d",x);

/*若x為多位整數(shù)*/

printf("lnputn=");else

scanf("%d",&n);(

/*輸出其個(gè)位,并形成新的X*/

if(n<0)

{n=-n;putchar('-');}printf("%d",x%10);

printn(x/10);

printn(n);)

)}_______________________________

莆田學(xué)院現(xiàn)代教育技術(shù)中心2004年3月

【例七】漢諾塔(TowerofHanoi)問題。

也是一個(gè)非數(shù)值問題。P161例8.9

1

2

n-1

n-

a.0c(借助):

分析方法:

①簡化問題:設(shè)盤子只有一個(gè),則本問題可簡化為a-b。

②對于大于一個(gè)盤子的情況,邏輯上可分為兩部分:第n個(gè)盤子和除n

以外的n-1個(gè)盤子。如果將除n以外的n-1個(gè)盤子看成一個(gè)整體,則要

解決本問題,可按以下步驟:

a、將a桿上n?1個(gè)盤子借助于b先移到c桿;a—c(n-1,a,c,b)

b、將a桿上第n個(gè)盤子從a移到b桿;a-b

c、將c桿上n?1個(gè)盤子借助a移到b桿。c—b(n-1,c,b,a)

莆田學(xué)院現(xiàn)代教育技術(shù)中心2004年3月

???

五、變量的存儲類型:懣

????

?模塊化設(shè)計(jì)要求研究不同模塊(函數(shù)、源文件)

間變量的關(guān)系。

?變量兩大屬性:?數(shù)據(jù)類型-存儲類別

[、數(shù)據(jù)類型(復(fù)習(xí))

通過變毒說明(定義)來規(guī)定其數(shù)據(jù)類型:

格式數(shù)據(jù)類型關(guān)鍵字變量名

如chara;

intb,c;

floatx,y;

為什么使用變量前要先對其數(shù)據(jù)類型進(jìn)行"說明”——好比

看電影前先買票訂座

?預(yù)留存袍空間(如char型為1個(gè)字節(jié),int型為2個(gè)字節(jié)…)

?確定存儲方式(如char型存放ASCII值,int型存放補(bǔ)碼值…)

莆田學(xué)院現(xiàn)代教育技術(shù)中心2004年3月

一個(gè)變量的數(shù)據(jù)類型定義后,就規(guī)定了該變量只能存儲相應(yīng)

類型的數(shù)據(jù)。如定義intx,貝ijx只能存放整型數(shù),如果

x=3.14159,會被自動(dòng)轉(zhuǎn)為整型存放。

示意圖

字符型01100001(字符d)

用一個(gè)字節(jié)存放該字符的ASCII值(ASCII值表見P374)

整型0110000111001101(十進(jìn)制數(shù)25037)

用兩個(gè)字節(jié)存放該數(shù)值的補(bǔ)碼

實(shí)型01100001.......10100010101010|1!

尾數(shù)(補(bǔ)碼)指數(shù)(階碼)

注:第一位均為符號位

莆田學(xué)院現(xiàn)代教育技術(shù)中心2004年3月

五、變量的存儲類型

?變量兩大屬性:?數(shù)據(jù)類型?存儲類別

2、存儲類另[J

規(guī)定了變量在計(jì)算機(jī)內(nèi)部的存放位置f決定變量的“壽命”

(何時(shí)“生”,何時(shí)“滅”)

一個(gè)完整的變量說明格式如下:

存儲類別數(shù)據(jù)類型變量名

如staticintx,y;

C程序的存儲類別有:

■register型(寄存器型)

■auto型(自動(dòng)變量型)

■static型(靜態(tài)變量型)

■extern型(外部變量型)

莆田學(xué)院現(xiàn)代教育技術(shù)中心2004年3月

數(shù)據(jù)區(qū)

莆田學(xué)院現(xiàn)代教育技術(shù)中心2004年3月

???

C程序的變量存儲類別

■register型(寄存器型)

CPU

變量值存放在運(yùn)算器的寄存

器中——存取速度快,一般運(yùn)算器隹制器

只允許2?3個(gè),且限于char寄存器

型和int型,通常用于循環(huán)變

用戶工作區(qū)

量(在微機(jī)的中實(shí)際

TurboC數(shù)據(jù)區(qū)

上自動(dòng)轉(zhuǎn)為auto型)。

■auto型(自動(dòng)變量型)

變量值存放在主存儲器的動(dòng)

態(tài)存儲區(qū)(堆棧方式);

優(yōu)點(diǎn)---同一內(nèi)存區(qū)可被不變量的生存期

同變量反復(fù)使用。靜態(tài)存儲區(qū)中的變量與程序“共存亡”

以上兩種變量均屬于“動(dòng)態(tài)動(dòng)態(tài)存儲區(qū)中的變量與函數(shù)“共存亡”

存儲型”,即調(diào)用函數(shù)時(shí)才寄存器中的變量同動(dòng)態(tài)存儲區(qū)

為這些變量分配單元,函數(shù)

調(diào)用結(jié)束其值自動(dòng)消失。

莆田學(xué)院現(xiàn)代教育技術(shù)中心2004年3月

C程序的變量存儲類別

■static型(靜態(tài)變量型)

變量值存放在主存儲器的靜未說明存儲類別時(shí),

態(tài)存儲區(qū)函數(shù)內(nèi)定義的變量默認(rèn)為aut。型

程序執(zhí)行開始至結(jié)束,始終函數(shù)外定義的變量默認(rèn)為extern型。

占用該存儲空間

■extern型(外部變量型)動(dòng)態(tài)存儲區(qū)j數(shù)據(jù)區(qū)

同上,其值可供其他源文件

使用

以上兩種均屬于“靜態(tài)存儲”變量的生存期

性質(zhì),即從變量定義處開始,靜態(tài)存儲區(qū)中的變量與程序“共存亡”

在整個(gè)程序執(zhí)行期間其值都動(dòng)態(tài)存儲區(qū)中的變量與函數(shù)“共存亡”

存在(大都可用!!)寄存器中的變量同動(dòng)態(tài)存儲區(qū)

莆田學(xué)院現(xiàn)代教育技術(shù)中心2004年3月

e

六、局部變量與全局變量P168::

I、局部變量一一函數(shù)內(nèi)部或復(fù)合語句內(nèi)定義的變量

rauto(默認(rèn))]所在函數(shù)調(diào)用結(jié)束時(shí),其值自動(dòng)消失

局部變量JregisterJ如不賦初值,取不確定值為初值

Lstatic所有函數(shù)調(diào)用結(jié)束,其值仍保留

如不賦初值,取初值為0(數(shù)值型)或空格(字符型)

所有形參都是局部變量;

局部變量只在本函數(shù)或本復(fù)合語句內(nèi)才能使用,

在此之外不能使用(視為不存在)main函數(shù)也

不例外。

莆田學(xué)院現(xiàn)代教育技術(shù)中心2004年3月

【例一】求程序運(yùn)行結(jié)果

main()

變量跟蹤

(

inta=2,i;main()f函數(shù)

clrscr();。ibcf(Q)

for(i=0;i<3;i++)200->147

printf("%4d",f(a));1Of158

)2Of169

f(inta)

【結(jié)果】789

(

intb=0;

如果去掉static呢?

staticintc=3;

b++;c++;【結(jié)果】777

returna+b+c;

}技術(shù)中心2004年3月

【例二】求程序運(yùn)行結(jié)果

main()

變量跟蹤

(

intk=4,m=1,p;main()func函數(shù)

clrscr();kmabmi

p=func(k,m);41410-82一3

printf("%d,",p);41418-173—12

p=func(k,m);

printf("%d",p);【結(jié)果】8,17

)

func(inta,intb)

{staticintm=0,i=2;如果去掉static呢?

i+=m+1;

m=i+a+b;【結(jié)果】8,8

returnm;

)技術(shù)中心2004年3月

【例二】求程序運(yùn)行結(jié)果

#include<stdio.h>

main()

(

inta=3,b=2,c=1;

(

intb=5,c=12;

c-=b*2;

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

a+=c;

)

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

}

【結(jié)果】a=3,b=5,c=2

a=5,b=2,c=1

莆田學(xué)院現(xiàn)代教育技術(shù)中心2004年3月

7\>局部變重與全局變至P169

2、全局變量一一在函數(shù)之外定義的變量

rextern(默認(rèn))允許本源文件中其他函數(shù)及其他源文件使用

全局變量《

static只限本源文件中使用

所有全局變量加不加static,都屬于靜態(tài)存儲,

如不賦初值,取初值為0(數(shù)值型)或空格(字符

型)(注意與函數(shù)內(nèi)部定義的static型局部變量的區(qū)

別)

莆田學(xué)院現(xiàn)代教育技術(shù)中心2004年3月

2、全局變量----在函數(shù)之外定義的才去掉第一行試

A試..

?有效作用范圍:從定義變量

位置開始直到本源文件結(jié)束

?如果需要將全局變量的作用【例三】求程序運(yùn)行結(jié)果

范圍擴(kuò)展至整個(gè)源文件——externintx,y;

法1全部在源文件開頭處定main()

義(

法2在弓|用函數(shù)內(nèi),用externclrscr();

說明printf("x=%d,y=%d\n",x,y);

法3在源文件開頭處,用}

extern說明intx=100,y=200;

如果要將全局變量作用范圍擴(kuò)展結(jié)果:x=100,y=200

到其他源文件,只需在使用這些

變量的文件中對變量用extern加

以說明。莆田學(xué)院現(xiàn)代教育技術(shù)中心2004年3月

【例四】求程序運(yùn)行結(jié)果

inta=3,b=5;

max(inta,intb)

(

如果主函數(shù)中沒有inta=8,

intc;

結(jié)果?

c=a>b?a:b;

returnc;

【結(jié)果】5

}

main()如果讓主函數(shù)中inta=4或

(a=-l,結(jié)果?

inta=8;

printf("%d\n",max(a,b));【結(jié)果】均為5

}

莆田學(xué)院現(xiàn)代教育技術(shù)中心2004年3月

【例五】求程序運(yùn)行結(jié)果

voidnum()

{externintx,y;

inta=15,b=10;

x=a-b;【結(jié)果】5,25

y=a+b;

}

intx,y;如果第二行不加上extern呢?

main()

{inta=7,b=5;

x=a+b;

【結(jié)果】12,2

y=a-b;

num();

printf("%d,%d\n",x,y);

}

2004年3月

【例六】求程序運(yùn)行結(jié)果

inta;

fun(inti)

(

a+=2*i;

returna;

}

main()

(

【結(jié)果】

inta=10;20,10

clrscr();

printf("%d,%d\n"Jfun(a),a);

}

莆田學(xué)院現(xiàn)代教育技術(shù)中心2004年3月

七、編譯預(yù)處理::

?編譯預(yù)處理:P187

?宏定義?文件包含?條件編譯

【編譯】C編譯系統(tǒng)對源程序進(jìn)行:詞法和語法

分析,代碼生成,優(yōu)化T.OBJ文件

【編譯預(yù)處理】編譯前對源程序進(jìn)行一些預(yù)加工

(改善程序設(shè)計(jì)環(huán)境/模塊化設(shè)計(jì))

?編譯預(yù)處理命令均以#開頭,未尾不加分號

?可出現(xiàn)在程序的任何位置,其作用范圍:出現(xiàn)

點(diǎn)至所在源程序未尾。

莆田學(xué)院現(xiàn)代教育技術(shù)中心2004年3月

C語言程序的加工過程

沒有預(yù)處理命令的目標(biāo)程序文件

C語言源程序文件

可執(zhí)行程序文件

exe

函數(shù)庫

莆田學(xué)院現(xiàn)代教育技術(shù)中心2004年3月

七、編譯預(yù)處理:r

1、宏定義

格式#define宏名宏體

宏名和宏體均為字符串,前者必須符合標(biāo)識符

命名規(guī)則。預(yù)處理時(shí)在程序中用宏體替換宏名。

注意:可以用

#undef宏名

終止該宏名的作用范圍。P189

莆田學(xué)院現(xiàn)代教育技術(shù)中心2004年3月

七、編譯預(yù)處理

①定義符號常量

【例一】

#defineM3結(jié)果:NN=85*NN=40

#defineN(M+1)5

#defineNNN*N/2

【討論】

main()

如果第二行改為:

(#defineNM+1

clrscr();

printf("NN=%d,",NN);

結(jié)果:NN=6,5*NN=18

printf("5*NN=%d\n",5*NN);

)

中心2004年3月

七、編譯預(yù)處理

①定義符號常量

【例二】

結(jié)果:

#defineOK10K=1

main()

(【討論】

printf("OK=%d\n",OK);程序中用雙括號括起來

}的字符串中的字符即使

與宏名相同,也不進(jìn)行

替換。

莆田學(xué)院現(xiàn)代教育技術(shù)中心2004年3月

七、編譯預(yù)處理

②帶參數(shù)的宏定義

格式#define宏名(參數(shù)表)宏體

【例二】

#definePI3.14159

#defines(r)Pl*r*r結(jié)果:

main()r=1,s=3.141590

(

floata=1,sum;

sum=s(a);

n

printf(r=%.Of,s=%f\n",aJsum);

)

莆田學(xué)院現(xiàn)代教育技術(shù)中心2004年3月

七、編譯預(yù)處理

②帶參數(shù)的宏定義

【例三】

結(jié)果:9.5

#definePT5.5

#defines(A)PT*A*As(a+b)=5.5X1+2X1+2=9.5

main()

【討論】注意s(a+b)

(不是函數(shù),它不做任

inta=1,b=2;何計(jì)算(如果是函數(shù),

則s(a+b)為s(3),結(jié)果

,H

printf('%4.1f\n,s(a+b));49.5)

)

莆田學(xué)院現(xiàn)代教育技術(shù)中心2004年3月

七、編譯預(yù)處理

②帶參數(shù)的宏定義

【例四】選擇正確答案

include"stdio.h"

#defineSUM(y)1+y

main()

(

intx=2;結(jié)果:B

printf(,,%d\n,,,SUM(5)*x);

)

10111215

莆田學(xué)院現(xiàn)代教育技術(shù)中心2004年3月

2、文件包含P194::

?include<>標(biāo)準(zhǔn)方式

只按標(biāo)準(zhǔn)方式(系統(tǒng)存放C庫函數(shù)頭文件所在目

錄)查找所要包含的文件

對TC,默認(rèn)只在\tc\include目錄下查找

?#include"“

先在源文件所在目錄找指定頭文件,若無再按

標(biāo)準(zhǔn)方式找(更保險(xiǎn))

莆田學(xué)院現(xiàn)代教育技術(shù)中心2004年3月

文件包含命令的處理過程

?首先尋找所要求包含的文件,如果找到,就

用這個(gè)文件的全部內(nèi)容取代當(dāng)前文件里的這

個(gè)包含命令行。被替換進(jìn)來的文件里仍然可

以有文件包含等預(yù)處理命令行,這些預(yù)處理

也會被處理。

莆田學(xué)院現(xiàn)代教育技術(shù)中心2004年3月

文件包含示意圖

stdarg.h

頭文件stdio.hstdio.h

#include<stdio.h(系統(tǒng)提供)stdarg.h

編譯/連接

#include<math.hmath.h

area.c

源程序area.c

頭文件math.harea.exe

(用戶編寫)

(系統(tǒng)提供)(可執(zhí)行程序)

第一章例一中,area.c文件本身只有12行,stdio.h有187行,

math.h有107行,實(shí)際上stdio.h本身還包括一個(gè)24行的頭文件stdarg.h。

“文件包含”是在編譯后連接時(shí)“包含”進(jìn)可執(zhí)行程序的。

比較:area.c1kb;area.obj1kb;area.exe26kb

莆田學(xué)院現(xiàn)代教育技術(shù)中心2004年3月

3、條件編譯P196

?根據(jù)條件決定是否編譯某一組語句。常用形式:

①如果標(biāo)識符被定義過*如果標(biāo)識符未被定義過

#ifdef標(biāo)識符#ifndef標(biāo)識符

程序段1程序段1/*編譯此程序段*/

#else#else/*#else部分可省略*/

程序段2程序段2/*反之,編譯此程序段7

#endif#endif

*此處指標(biāo)識符等命令定義過。

莆田學(xué)院現(xiàn)代教育技術(shù)中心2004年3月

3、條件編譯P196

②#if表達(dá)式/*如果表達(dá)式為真*/

程序段1/*編譯程序段1*/

#else

程序段2/否則*編譯程序段2*/

#endif

如果用:

亦可實(shí)現(xiàn)以上功能,但

if表達(dá)式程序段1,2均要編譯。

程序段1如果它們比較大,生成

else的exe文件就很大。

程序段2

莆田學(xué)院現(xiàn)代教育技術(shù)中心2004年3月

3、條件編譯P196

【例一】結(jié)果:二西工3

#defineDEBUG0

main()a=10,b=2匕

(c=0C_只輸出

inta=10,b=20,c;【討論]:J弋?

clrscr();

如果#defineQ)EBUG呢?

c=a/b;

#ifdefDEBUG如果沒有#0加形行呢?

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

#endif

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

)

年3月

課堂提問:

1、如何判斷一個(gè)變量是局部變量還是全局變量?

2、定義一個(gè)變量時(shí),如果沒有規(guī)定存儲類型,

其默認(rèn)的存儲類型是什么?

3、如果程序中有這樣一個(gè)語句

staticintx;

出現(xiàn)在程序的不同位置其含義是否相同?其

初值是多少?

莆田學(xué)院現(xiàn)代教育技術(shù)中心2004年3月

課堂提問:

4、以下程序運(yùn)行時(shí)出錯(cuò)提示為:

undefinedsymbolYinfunctionmain

如何改正?

法將intx;放到王函數(shù)之內(nèi)

將intx;放到主函數(shù)之上

在主函數(shù)之內(nèi)加一語句

externx;或一xt一rnintx;

法4:在主函數(shù)之上加一語句

externx;或一xt一rnintx;

莆田學(xué)院現(xiàn)代教育技術(shù)中心2004年3月

課堂提問:5、以下程序運(yùn)行結(jié)果是o

fun3(intx)

sta

溫馨提示

  • 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

提交評論